Files
2022-10-26 12:25:11 +08:00

170 lines
5.8 KiB
C++

// managerspeedtree.h
#ifndef _3DRENDERER_MANAGERSPEEDTREE_H_
#define _3DRENDERER_MANAGERSPEEDTREE_H_
#include "managerbase.h"
#include <programcommon/wzhashtable.h>
#include <list>
#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<HANDLE> STHANDLE_LIST ;
class CManagerSpeedTree : public CManagerBase
{
protected:
//로딩된 트리 저장
CWzHashTableStr<HANDLE> m_htsTreeLoaded; //파일이름 으로
CWzHashTable<HANDLE, WzID> m_htTreeWzID; //WzID로 접근
STHANDLE_LIST m_lsTreeRef; //순차적으로 접근
//배치된(그려진) 트리
CWzHandleManager<HANDLE> 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<CSpeedTreeDrawInfo*>& 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_