// managerspeedtree.h #ifndef _3DRENDERER_MANAGERSPEEDTREE_H_ #define _3DRENDERER_MANAGERSPEEDTREE_H_ #include "managerbase.h" #include #include #define MAX_SPEED_TREE_DRAW (1024) enum eST_COLOR_TYPE { eST_COLOR_TYPE_APPLY_TERRAIN_COLOR = 1, eST_COLOR_TYPE_MODIFY = 2, }; //Æ®¸® Access class CSpeedTreeDrawInfo { protected: WzBoundingVolume m_wzBV; // ¹Ù¿îµù º¼·ý WzColor m_wcDiffuse; // »ö»ó WzVector m_wvScale; // ½ºÄÉÀÏ WzVector m_wvPos; // Æ÷Áö¼Ç void* m_pUserData; // »ç¿ëÀÚ ÁöÁ¤ µ¥ÀÌÅÍ WzID m_wID; // ³ª¹« Á¾·ù //int m_iID; // ÆíÁýÀ» À§ÇÑ ½Äº° À妽º DWORD m_dwAttr; //_YJ_EDIT_OBJ_COLOR CSpeedTreeDrawInfo(){ m_dwAttr = eST_COLOR_TYPE_APPLY_TERRAIN_COLOR;}//_YJ_EDIT_OBJ_COLOR public: virtual ~CSpeedTreeDrawInfo(){} virtual void SetPosition(WzVector* pwvPos) { m_wvPos=*pwvPos; } virtual void SetScale(WzVector* pwvScale) { m_wvScale.x=pwvScale->x;m_wvScale.y=pwvScale->x;m_wvScale.z=pwvScale->x; }//x°ª¸¸ ¾¸ virtual void SetColor(WzColor wcColor) { m_wcDiffuse=wcColor; } virtual void SetAttr(DWORD dwAttr) {m_dwAttr = dwAttr;}//_YJ_EDIT_OBJ_COLOR virtual WzBoundingVolume GetWzBoundingVolume() { return m_wzBV; } virtual void SetUserData(void* pv) { m_pUserData=pv; } virtual void *GetUserData() { return m_pUserData; } virtual WzID GetWzID() { return m_wID; } WzColor GetColor() { return m_wcDiffuse; } WzVector GetPos() { return m_wvPos; } WzVector GetScale() { return m_wvScale; } DWORD GetAttr() {return m_dwAttr;}//_YJ_EDIT_OBJ_COLOR //CSpeedTreeRT Äø®Á¯ Á¤º¸ ¾ò±â virtual int GetCollisionObjectCount() { return 0; } virtual WzBoundingVolume* GetCollisionObject(int iIndex) { return NULL; } }; struct St_STreeAttribute { float m_afBrightnessFunc[3]; float m_afLod[2]; float m_afWindWaveFunc[3]; }; //Manager Ŭ·¡½º typedef std::list STHANDLE_LIST ; class CManagerSpeedTree : public CManagerBase { protected: //·ÎµùµÈ Æ®¸® ÀúÀå CWzHashTableStr m_htsTreeLoaded; //ÆÄÀÏÀ̸§ À¸·Î CWzHashTable m_htTreeWzID; //WzID·Î Á¢±Ù STHANDLE_LIST m_lsTreeRef; //¼øÂ÷ÀûÀ¸·Î Á¢±Ù //¹èÄ¡µÈ(±×·ÁÁø) Æ®¸® CWzHandleManager m_hmTreePlaced; //-------------------------------------------------------------------------- //°øÅë ¸â¹ö (Global ¼Ó¼º) //-------------------------------------------------------------------------- //¹Ù¶÷ °ü·Ã float m_fWindStrength; //¹Ù¶÷¼¼±â 0.0 = no wind, 1.0 = full strength WzVector m_wvWindDir; //¹Ù¶÷ ¹æÇâ float m_afWindWaveFunc[3]; //¹Ù¶÷ ¼¼±â º¯È­·®, Â÷·Ê´ë·Î min,max,frequency //LOD float m_fNearLOD; float m_fFarLOD; //Brightness float m_afBrightness[3]; //±âŸ float m_fAccumulateTime; CSpeedTreeDrawInfo* m_apDrawInfo[MAX_SPEED_TREE_DRAW]; int m_iDrawCount; public: CManagerSpeedTree(void); virtual ~CManagerSpeedTree(void); virtual void Clear(); virtual BOOL Create( CDrawBase *pParentDraw, void *pParam); virtual void Destroy(); virtual void OnLostDevice(); virtual void OnResetDevice(); //ÅØ½ºÃÄ ÃʱâÈ­ virtual BOOL LoadTexture(char* szComositeMap,char* szCompositeShadow){return true;} //Æ®¸® ·¹ÆÛ·±½º ·Îµå,ÇØÁ¦ virtual WzID LoadTreeRef(WzID wID, const char* szTree){return true;} virtual void DestroyTreeRef(WzID wID){return;} //Æ®¸® ÀνºÅϽº Ãß°¡ »èÁ¦ virtual HANDLE AddTree(WzID wID,WzVector* pPos,WzColor wcColor=WzColor_RGB(255,255,255), WzVector* pScale=NULL, DWORD dwAttr = eST_COLOR_TYPE_APPLY_TERRAIN_COLOR){return INVALID_HANDLE_VALUE;} virtual void RemoveTree(HANDLE hTree){return;} virtual void RemoveAllTree(){} //·¹ÆÛ·±½º ,ÀνºÅϽº °°ÀÌ ÇØÁ¦ virtual void UnloadAllSpeedTrees(){} //Æ®¸® Á¢±Ù virtual CSpeedTreeDrawInfo* GetTreeByHandle(HANDLE hTree){return (CSpeedTreeDrawInfo*)m_hmTreePlaced.GetData(hTree);} //¼Ó¼º virtual void SetAllAttribute(St_STreeAttribute* pSTA); virtual void SetWindStrength(float fStrength){m_fWindStrength = fStrength;} virtual void SetWindDirection(WzVector* pWV){VectorNormalize(&m_wvWindDir,pWV);} virtual void SetWindWaveFunc(float* param3f){memcpy(m_afWindWaveFunc,param3f,sizeof(m_afWindWaveFunc));} virtual void SetLOD(float fNear,float fFar){m_fNearLOD =fNear; m_fFarLOD=fFar;} virtual void SetBrightness(float* param3f){memcpy(m_afBrightness,param3f,sizeof(m_afBrightness));} virtual void GetAllAttribute(St_STreeAttribute* pSTA); virtual float GetWindStrength(){return m_fWindStrength;} virtual WzVector GetWindDirection(){return m_wvWindDir;} virtual void GetWindWaveFunc(float* param3f){memcpy(param3f,m_afWindWaveFunc,sizeof(m_afWindWaveFunc));} virtual void GetLOD(float* pfNear,float* pfFar){*pfNear =m_fNearLOD; *pfFar=m_fFarLOD;} virtual void GetBrightness(float* param3f){memcpy(param3f,m_afBrightness,sizeof(m_afBrightness));} //·»´õ¸µ & etc.... virtual void Render(HANDLE *pHandle,int iDrawCount,bool bSortRender = 1){} //pHandle¿¡ ·»´õ¸µÇÒ ³ª¹«µéÀ» ä¿ö ÁØ´Ù.(¸ð¾Æ¼­ ·»´õ¸µ ÇØ¾ß ºü¸§) virtual void Render(WzID wID,WzVector* pWvPos,WzVector *pScale){} //ID·Î ·»´õ¸µ virtual void Render4ShadowMap(CWzArray& arDraw){} virtual void ProgressFrame(float fDeletaTime, bool bApplyWindWave =false); virtual BOOL IsUseSpeedTree();//½ºÇÇÆ® Æ®¸® »ç¿ë ¿©ºÎ virtual int GetRenderCount(){return m_iDrawCount;} virtual const CSpeedTreeDrawInfo* GetRenderTree(int iAt){return m_apDrawInfo[iAt];} protected: virtual HANDLE hCreateTree( const char* lpszFileName,WzID wID){return NULL;} HANDLE hFindHANDLE( const char *lpszFilePath); HANDLE hGetHandleByWzID(WzID wID); void vAddTreeLoad( const char* lpszKey, HANDLE hHandle,WzID wID); void vRemoveTreeLoad(char* lpszKey,WzID widKey); HANDLE hAddTreePlace(HANDLE hHandle){ return m_hmTreePlaced.Add(hHandle);} void vRemoveTreePlace(HANDLE hHandle){ m_hmTreePlaced.Release(hHandle);m_iDrawCount=0;} }; #endif // _3DRENDERER_MANAGERSPEEDTREE_H_