/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.15 * ³» ¿ë : Àå¸é °ü¸®ÀÚ * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "SceneTree.h" #include "CullingProcess.h" #include "VisibleArray.h" #include "VisibleArraySorter.h" #include "IndexGenerator.h" class cRay; class cCamera; class cTerrain; class cAreaGroup; class cAreaSceneNode; class cAreaSceneNodeParam; class cLightSceneNode; class cLightSceneNodeParam; class cSoundSceneNode; class cSoundSceneNodeParam; class cStaticSceneNode; class cManagedStaticSceneNode; class cStaticSceneNodeParam; class cDynamicSceneNode; class cHeroSceneNode; class cPlayerSceneNode; class cPlayerSceneNodeParam; class cMonsterSceneNode; class cTransMonSceneNode; class cMonsterSceneNodeParam; class cRefereeSceneNode; class cNpcSceneNode; class cNpcSceneNodeParam; class cVehicleSceneNode; class cVehicleSceneNodeParam; class cEffectSceneNode; class cEffectSceneNodeParam; class cDropItemSceneNode; class cDropItemSceneNodeParam; class cMapPortalSceneNode; class cMapPortalSceneNodeParam; class cUserPortalSceneNode; class cUserPortalSceneNodeParam; class cCardSceneNode; class cCardSceneNodeParam; class cGatheringSceneNode; class cGatheringSceneNodeParam; class cDoorSceneNode; class cDoorSceneNodeParam; class cDepthPlane; class cPlane; class cShadowGeometry; class cRibbonGeometry; class cBaseObject; struct sObject; struct sDoorInfo; enum eNameCardOption; /// Àå¸é ÆÄÀÏ Çì´õ #pragma pack( push, 1 ) class cSceneFileHeader { public: /// ½Äº° ÄÚµå char mCode[10]; /// ¹öÀü unsigned int mVersion; /// Àå¸é Æ®¸® Á¤º¸ NiPoint3 mCenter; float mMinRadius; float mMaxRadius; /// Àå¸é ³ëµå ¼ö unsigned int mNumSceneNodes; }; class cSoundSceneFileHeader { public: /// ½Äº° ÄÚµå char mCode[10]; /// ¹öÀü unsigned int mVersion; /// Àå¸é ³ëµå ¼ö unsigned int mNumSceneNodes; }; #pragma pack( pop ) /// Àå¸é °ü¸®ÀÚ /// Àå¸é ³ëµå¸¦ »ý¼º, Á¦°ÅÇÏ´Â °ü¸®ÀÚÀÌ´Ù. /// Àå¸éÀ» ·»´õ¸µÇϰí, /// Ãæµ¹ °Ë»ç, °¡½Ã¼º °Ë»ç, Á¤·Ä µîÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. class cSceneManager { friend class cLightAgent; static cSceneManager* mSingleton; public: cSceneManager(); ~cSceneManager(); /// ¾îÇø®ÄÉÀÌ¼Ç ½ÃÀÛ ¹× Á¾·á ½ÃÁ¡ bool Init(); void Exit(); /// Áö¿ò void Clear(); /// ÃʱâÈ­ bool Init( const NiPoint3& center, float minRadius, float maxRadius ); /// ·Îµù // bool Load( const cString& pathName ); bool LoadEnv6( cFileLoader& loader ); bool LoadEnv7( cFileLoader& loader ); bool LoadEnv8( cFileLoader& loader ); bool LoadEnv9( cFileLoader& loader ); bool LoadEnv10( cFileLoader& loader ); bool LoadGlobalArea6( cFileLoader& loader ); bool LoadGlobalArea7( cFileLoader& loader ); bool LoadGlobalArea8( cFileLoader& loader ); bool LoadGlobalArea9( cFileLoader& loader ); bool LoadGlobalArea10( cFileLoader& loader ); bool LoadAreaGroup( unsigned int mapIndex, unsigned char mapMode ); /// load process¿ë ÇÔ¼ö bool LoadSceneHeader( cFileLoader& loader, unsigned int& outNum ); bool LoadSoundSceneHeader( cFileLoader& loader, unsigned int& outNum ); /// return error event( -1:¿À·ù, 0:·Îµù¿Ï·á, 1~:ÁøÇà¼ö) int LoadSceneNode( cFileLoader& loader, unsigned int loadCount=1 ); int LoadSoundSceneNode( cFileLoader& loader, unsigned int loadCount=1 ); int LoadSceneNode6( cFileLoader& loader, unsigned int loadCount ); int LoadSceneNode7( cFileLoader& loader, unsigned int loadCount ); int LoadSceneNode8( cFileLoader& loader, unsigned int loadCount ); int LoadSceneNode9( cFileLoader& loader, unsigned int loadCount ); int LoadSceneNode10( cFileLoader& loader, unsigned int loadCount ); int LoadSceneNode11( cFileLoader& loader, unsigned int loadCount ); int LoadSceneNode12( cFileLoader& loader, unsigned int loadCount ); int LoadSoundNode11( cFileLoader& loader, unsigned int loadCount ); /// Æ©Å丮¾ó¿¡¼­¸¸ ·ÎµåÇØ¾ß ÇÏ´Â µ¥ÀÌÅ͵é bool LoadTutorialScene(); /// ó¸® void Process( unsigned long deltaTime, unsigned long accumTime ); /// ·»´õ¸µ void Render(); void RenderZFalseDamage(); void RenderShadow(); void RenderTrail(); /// 2D °´Ã¼ ·£´õ¸µ (¸»Ç³¼± etc.) void Render2D(); void PreRender2D(); /// °¡½Ã ·¹º§ °Å¸® void SetLevelDistance( float dist0, float dist1, float dist2 ); /// È­¸é »óÀÇ ÁÂÇ¥¿¡ ´ëÀÀÇÏ´Â Àå¸é ³ëµåµéÀ» ¸®ÅÏ /// »ï°¢Çü ´ÜÀ§·Î °Ë»çÇÑ´Ù. bool PickStatics( tArray* pickedArray, int mouseX, int mouseY, bool sortByDistance = false ); bool PickDynamics( tArray* pickedArray, int mouseX, int mouseY, bool sortByDistance = false ); bool PickManagedStatics( tArray* pickedArray, int mouseX, int mouseY, bool sortByDistance = false ); /// ¹ÝÁ÷¼±°ú Ãæµ¹ÇÏ´Â Àå¸é ³ëµåµéÀ» ¼öÁý /// »ï°¢Çü ´ÜÀ§·Î °Ë»çÇÑ´Ù. bool PickStatics( tArray* pickedArray, const cRay& ray, bool camRay, float maxDistance, bool sortByDistance = false ); bool PickDynamics( tArray* pickedArray, const cRay& ray, float maxDistance, bool sortByDistance = false ); bool PickManagedStatics( tArray* pickedArray, const cRay& ray, float maxDistance, bool sortByDistance = false ); bool PickMapportal( tArray* pickedArray, const cRay& ray, float maxDistance, bool sortByDistance = false ); /// ±¸¿Í Ãæµ¹ÇÏ´Â Àå¸é ³ëµåµéÀ» ¼öÁý /// ±¸ ´ÜÀ§·Î °Ë»çÇÑ´Ù. bool Pick_Kind( tArray* pickedArray, const cSphere& sphere, cSceneNode::eType type ); bool Pick_Type( tArray* pickedArray, const cSphere& sphere, cSceneNode::eType type ); bool PickAreas( tArray* pickedArray, const cSphere& sphere ); bool PickLights( tArray* pickedArray, const cSphere& sphere ); bool PickSounds( tArray* pickedArray, const cSphere& sphere ); cBaseObject* PickPlane( int mouseX, int mouseY ); /// ¿µ¿ª Àå¸é ³ëµå¸¦ »ý¼º cAreaSceneNode* CreateArea( cAreaSceneNodeParam& param ); /// Á¶¸í Àå¸é ³ëµå¸¦ »ý¼º cLightSceneNode* CreateLight( cLightSceneNodeParam& param ); /// »ç¿îµå Àå¸é ³ëµå¸¦ »ý¼º cSoundSceneNode* CreateEnvSound( cSoundSceneNodeParam& param ); cSoundSceneNode* CreateEffectSound( cSoundSceneNodeParam& param ); void UpdateSoundGain(); void ActiveSoundNodeAll( bool active ); /// Á¤Àû Àå¸é ³ëµå¸¦ »ý¼º cStaticSceneNode* CreateStatic( cStaticSceneNodeParam& param ); cDropItemSceneNode* CreateDropItem( cDropItemSceneNodeParam& param ); cGatheringSceneNode* CreateGathering( cGatheringSceneNodeParam& param ); cMapPortalSceneNode* CreateMapPortal( unsigned long scriptIdx, NiPoint3 pos, NiMatrix3 rot ); cUserPortalSceneNode* CreateUserPortal( unsigned long portalIdx, unsigned long ownerIdx, unsigned long scriptIdx, NiPoint3 pos ); cCardSceneNode* CreateCard( cCardSceneNodeParam& param ); /// °ü¸® °´Ã¼ »ý¼º¿ë ¿ÜºÎ ÀÎÅÍÆäÀ̽º cPlayerSceneNode* CreatePlayer( cPlayerSceneNodeParam& param ); cMonsterSceneNode* CreateMonster( cMonsterSceneNodeParam& param ); cTransMonSceneNode* CreateTransMonster( cMonsterSceneNodeParam& param, bool IsHero ); cNpcSceneNode* CreateNPC( cNpcSceneNodeParam& param ); cEffectSceneNode* CreateEffect( cEffectSceneNodeParam& param ); cEffectSceneNode* CreateSelfEffect( cString pathName, bool distCheck, NiTransform& trans, bool bLoop ); cEffectSceneNode* CreateDamageEffect( cEffectSceneNodeParam& param, bool IsMiss, bool zFalse ); cHeroSceneNode* CreateHero( cPlayerSceneNodeParam& param ); cVehicleSceneNode* CreateVehicle( cVehicleSceneNodeParam& param ); cRefereeSceneNode* CreateReferee( cSceneNodeParam& param ); cDoorSceneNode* CreateDoor( unsigned long index );//cDoorSceneNodeParam& param ); /// °ü¸® °´Ã¼ÀÇ Á¦°Å¿ë ¿ÜºÎ ÀÎÅÍÆäÀ̽º bool DestroyDynamic( cSceneNode* node ); bool DestroyDropItemNode( cSceneNode* node ); bool DestroyMapPortalNode( cSceneNode* node ); bool DestroyGathringNode( cSceneNode* node ); bool DestroyStaticNode( cSceneNode* node ); bool DestroyDoorNode( cSceneNode* node ); void RemoveAllDoorNode(); /// Deletelist¿¡¼­ Á¦°ÅÇÏÁö ¾Ê°í ¿ÜºÎ¿¡¼­ ÀÓÀǷΠȣÃâÇÏ´Â °æ¿ì´Â DelListRemove = ture·Î ¼³Á¤ÇϽÿÀ bool DestroyEffectNode( cSceneNode* node ); bool DestroySoundNode( cSceneNode* node ); /// Á¦°Å µÇ¾î¾ß ÇÒ ÀÌÆåÆ® ³ëµå¿¡ ´ëÇÑ Ã³¸® void AddDeleteEffectNode( cEffectSceneNode* node ); void AddDeleteGatheringNode( cGatheringSceneNode* node ); void AddDeleteSoundNode( cSoundSceneNode* node ); void AddDeleteDoorNode( cDoorSceneNode* node ); /// ¸ðµç ³ëµåµéÀ» Á¦°Å void DestroyAll(); /// Àüü ¿µ¿ª ³ëµå cAreaSceneNode* GetGlobalArea(); void AddVisibleShadowGeom( cShadowGeometry* geom ); void AddVisibleTrailGeom( cRibbonGeometry* geom ); void AddPlane( cPlane* pPlane ); void AddVisibleDynamicNode( cDynamicSceneNode* node ); /// inline void SetScreenShotMode( bool enable ) { mScreenShotMode = enable; } inline bool IsScreenShotMode() { return mScreenShotMode; } inline const tArray* GetVisibleDynamicSceneArray() { return &mVisibleDynamicNodeArray; } unsigned int CalcVisibleLevel( cStaticSceneNode* n ); bool CalcDynamicVisibleLevel( cSceneNode* n ); cEffectSceneNode* GetEffectSceneNode( unsigned long effectIdx ); cSoundSceneNode* GetSoundSceneNode( unsigned long soundIdx ); cDynamicSceneNode* GetDynamicSceneNode( unsigned long dynIdx ); cDropItemSceneNode* GetDropItemSceneNode( unsigned long nodeIdx ); cGatheringSceneNode* GetGatheringSceneNode( unsigned long nodeIdx ); cStaticSceneNode* GetStaticSceneNode( unsigned long nodeIdx ); cManagedStaticSceneNode* GetManagedStaticNode( unsigned int type, unsigned long nodeIdx ); /// °ËÁõÄÚµå bool IsValidEffectNode( cEffectSceneNode* node ); bool IsValidEffectNode( unsigned long idx, cEffectSceneNode* node ); bool IsValidSoundNode( cSoundSceneNode* node ); bool IsValidSoundNode( unsigned long idx, cSoundSceneNode* node ); bool IsValidDynamicNode( cDynamicSceneNode* node ); bool IsValidDynamicNode( unsigned long idx, cDynamicSceneNode* node ); void SetLoadingFlag( bool set ) { mEnableLoading = set; } void OnVisibleModifierPocess( cSceneNode* node ); void ShowDepthPlane( bool show ) { mShowDepthPlane = show; } sDoorInfo* DisableDoorMove( NiPoint2 startPos, NiPoint2 goalPos ); protected: /// ³ëµå¸¦ Ãß°¡ bool AddAreaNode( cSceneNode* node ); bool AddLightNode( cSceneNode* node ); bool AddEffectSoundNode( cSceneNode* node ); bool AddEnvSoundNode( cSceneNode* node ); bool AddStaticNode( cSceneNode* node ); bool AddDropItemNode( cSceneNode* node ); bool AddGatheringNode( cSceneNode* node ); bool AddMapPotalNode( cSceneNode* node ); bool AddDynamicNode( cSceneNode* node ); bool AddEffectNode( cEffectSceneNode* node ); bool AddDoorNode( unsigned long index, cSceneNode* node ); void DelNodeProcess(); public: /// ´ÜÀÏü¸¦ ¸®ÅÏ static cSceneManager* GetSingleton(); protected: bool mEnableLoading; /// ¹öÀü unsigned int mVersion; cIndexGenerator mAreaNodeIndexGen; cIndexGenerator mLightNodeIndexGen; cIndexGenerator mSoundIndexGen; cIndexGenerator mStaticNodeIndexGen; cIndexGenerator mDropItemNodeIndexGen; cIndexGenerator mGatheringNodeIndexGen; cIndexGenerator mMapPortalNodeIndexGen; cIndexGenerator mDynamicNodeIndexGen; cIndexGenerator mEffectIndexGen; typedef tPointerHashMap cAreaMap; typedef tPointerHashMap cLightMap; typedef tPointerHashMap cSoundMap; typedef tPointerHashMap cNodeMap; /// Æ®¸® /// °ø°£À» ºÐÇÒÇÏ¿© ³ëµåµéÀ» °èÃþÀûÀ¸·Î °ü¸®ÇÑ´Ù. /// Ãæµ¹ °Ë»ç ¹× ÄøµÀ» È¿À²ÀûÀ¸·Î ¼öÇàÇϱâÀ§ÇØ »ç¿ëÇÑ´Ù. cSceneTree mNodeTree; cAreaMap mAreaArray; cLightMap mLightArray; cSoundMap mSoundArray; /// ij¸¯ÅÍ (PC, NPC, Monster) cNodeMap mDynamicObjectArray; /// ¾ÆÀÌÅÛ cNodeMap mDropItemArray; /// äÁý °´Ã¼ cNodeMap mGatheringArray; /// ¸ÊÀ̵¿ Potal°´Ã¼ cNodeMap mMapPortalArray; /// °ü¸® °ÔÀÌÆ® °´Ã¼ cNodeMap mDoorArray; /// ȯ°æ °´Ã¼ ³ëµå ¹è¿­ cNodeMap mStaticObjectArray; /// ÀÌÆåÆ® (Æ®¸®·Î °ü¸®ÇÒ ÇÊ¿ä ¾øÀ½) cNodeMap mEffectNodeArray; /// ³ëµå ½º½º·Î »èÁ¦¿ë typedef tPointerList cDelNodeList; cDelNodeList mDelEffectList; cDelNodeList mDelGatheringList; cDelNodeList mDelSoundList; cDelNodeList mDelDoorList; /// 2D Æò¸é °´Ã¼ °ü¸® typedef tPointerArray cPlaneArray; cPlaneArray mPlaneArray; /// °ÔÀÓ BaseObj¿¡ ´ëÀÀÇÑ SceneNode¸¦ °Å¸®º° SortingÇϱâÀ§ÇØ »ç¿ëÇÑ´Ù. tArray mVisibleDynamicNodeArray; /// °¡½Ã ·¹º§ °Å¸® float mSqaredLevelDistance0; float mSqaredLevelDistance1; float mSqaredLevelDistance2; /// Äøµ cCullingProcess mCuller; cCullingProcess mDamageCuller; cModifierProcess mModifierProcess; /// ¹ÝÅõ¸í ³ëµå °¡½Ã ¹è¿­ cVisibleArray mAlphaArray; cVisibleArray mAlphaTestArray; cVisibleArray mDamageArray; /// ¹ÝÅõ¸í ³ëµå °¡½Ã ¹è¿­ Á¤·ÄÀÚ cAlphaArraySorter mAlphaArraySorter; cAlphaArraySorter mDamageSorter; /// ºÒÅõ¸í ³ëµå °¡½Ã ¹è¿­ cVisibleArray mSolidArray; /// ºÒÅõ¸í ³ëµå °¡½Ã ¹è¿­ Á¤·ÄÀÚ cSolidArraySorter mSolidArraySorter; /// ÇÈÅ·µÈ Àå¸é ³ëµå ¹è¿­ typedef tArray cPickedArray; cPickedArray mPickedArray; /// Àüü ¿µ¿ª ³ëµå cAreaSceneNode* mGlobalArea; /// ¿µ¿ª ±×·ì typedef tHashMap cAreaGroupMap; cAreaGroupMap mAreaGroupMap; /// ÅØ½ºÃ³ ¸Ê typedef tHashMap cTextureMap; cTextureMap mTextureMap; /// ±×¸²ÀÚ °¡½Ã ¹è¿­ typedef tPointerArray cShadowGeomArray; cShadowGeomArray mShadowGeomArray; /// typedef tPointerArray cTrailGeomArray; cTrailGeomArray mTrailGeomArray; /// bool mScreenShotMode; bool mShowDepthPlane; NiPoint3 mHeroPos; }; inline cAreaSceneNode* cSceneManager::GetGlobalArea() { return mGlobalArea; } inline void cSceneManager::SetLevelDistance( float dist0, float dist1, float dist2 ) { mSqaredLevelDistance0 = dist0 * dist0; mSqaredLevelDistance1 = dist1 * dist1; mSqaredLevelDistance2 = dist2 * dist2; } inline void cSceneManager::AddVisibleShadowGeom( cShadowGeometry* geom ) { assert( geom ); mShadowGeomArray.PushBack( geom ); } inline void cSceneManager::AddVisibleTrailGeom( cRibbonGeometry* geom ) { assert( geom ); mTrailGeomArray.PushBack( geom ); } inline cEffectSceneNode* cSceneManager::GetEffectSceneNode( unsigned long effectIdx ) { return (cEffectSceneNode*)mEffectNodeArray.GetAt( effectIdx ); } inline cSoundSceneNode* cSceneManager::GetSoundSceneNode( unsigned long soundIdx ) { return (cSoundSceneNode*)mSoundArray.GetAt( soundIdx ); } inline cDynamicSceneNode* cSceneManager::GetDynamicSceneNode( unsigned long dynIdx ) { return (cDynamicSceneNode*)mDynamicObjectArray.GetAt( dynIdx ); } inline cDropItemSceneNode* cSceneManager::GetDropItemSceneNode( unsigned long nodeIdx ) { return (cDropItemSceneNode*)mDropItemArray.GetAt( nodeIdx ); } inline cGatheringSceneNode* cSceneManager::GetGatheringSceneNode( unsigned long nodeIdx ) { return (cGatheringSceneNode*)mGatheringArray.GetAt( nodeIdx ); } inline cStaticSceneNode* cSceneManager::GetStaticSceneNode( unsigned long nodeIdx ) { return (cStaticSceneNode*) mStaticObjectArray.GetAt( nodeIdx ); } inline cSceneManager* cSceneManager::GetSingleton() { return mSingleton; } #define SCENEMAN cSceneManager::GetSingleton()