/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.15 * ³» ¿ë : Àå¸é °ü¸®ÀÚ * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "SceneTree.h" //#include "CullingProcess.h" #include "VisibleArray.h" #include "VisibleArraySorter.h" #include "../Client/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 ); // /// ó¸® // void Process( unsigned long deltaTime, unsigned long accumTime ); // // /// ·»´õ¸µ // void Render(); // void RenderZFalseDamage(); // void RenderShadow(); // void RenderTrail(); // // /// 2D °´Ã¼ ·£´õ¸µ (¸»Ç³¼± etc.) // void Render2D(); // // /// °¡½Ã ·¹º§ °Å¸® // 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* CreateMapSound( 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 AddSoundNode( 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()