client/EterGrnLib/LODController.h

305 lines
7.4 KiB
C++
Raw Blame History

#pragma once
#pragma warning(disable:4786)
#include <deque>
#include "Thing.h"
#include "ModelInstance.h"
class CGrannyLODController : public CGraphicBase
{
public:
static void SetMinLODMode(bool isEnable);
public:
struct FSetLocalTime
{
float fLocalTime;
void operator() (CGrannyLODController * pController)
{
pController->SetLocalTime(fLocalTime);
}
};
struct FUpdateTime
{
float fElapsedTime;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->UpdateTime(fElapsedTime);
}
};
struct FUpdateLODLevel
{
float fDistanceFromCenter;
float fDistanceFromCamera;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->UpdateLODLevel(fDistanceFromCenter, fDistanceFromCamera);
}
};
struct FRenderWithOneTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderWithOneTexture();
}
};
struct FBlendRenderWithOneTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->BlendRenderWithOneTexture();
}
};
struct FRenderWithTwoTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderWithTwoTexture();
}
};
struct FBlendRenderWithTwoTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->BlendRenderWithTwoTexture();
}
};
struct FRenderToShadowMap
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderToShadowMap();
}
};
struct FRenderShadow
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderShadow();
}
};
struct FDeform
{
const D3DXMATRIX * mc_pWorldMatrix;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->Deform(mc_pWorldMatrix);
}
};
struct FDeformNoSkin
{
const D3DXMATRIX * mc_pWorldMatrix;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->DeformNoSkin(mc_pWorldMatrix);
}
};
struct FDeformAll
{
const D3DXMATRIX * mc_pWorldMatrix;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->DeformAll(mc_pWorldMatrix);
}
};
struct FCreateDeviceObjects
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->CreateDeviceObjects();
}
};
struct FDestroyDeviceObjects
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->DestroyDeviceObjects();
}
};
struct FBoundBox
{
D3DXVECTOR3* m_vtMin;
D3DXVECTOR3* m_vtMax;
FBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
{
m_vtMin = vtMin;
m_vtMax = vtMax;
}
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->GetBoundBox(m_vtMin, m_vtMax);
}
};
struct FResetLocalTime
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->ResetLocalTime();
}
};
struct FReloadTexture
{
void operator () (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->ReloadTexture();
}
};
struct FSetMotionPointer
{
const CGrannyMotion * m_pMotion;
float m_speedRatio;
float m_blendTime;
int m_loopCount;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->SetMotionPointer(m_pMotion, m_blendTime, m_loopCount, m_speedRatio);
}
};
struct FChangeMotionPointer
{
const CGrannyMotion * m_pMotion;
float m_speedRatio;
int m_loopCount;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->ChangeMotionPointer(m_pMotion, m_loopCount, m_speedRatio);
}
};
struct FEndStopMotionPointer
{
const CGrannyMotion * m_pMotion;
void operator () (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->SetMotionAtEnd();
}
};
CGrannyLODController();
virtual ~CGrannyLODController();
void Clear();
void CreateDeviceObjects();
void DestroyDeviceObjects();
void AddModel(CGraphicThing * pThing, int iSrcModel, CGrannyLODController * pSkelLODController=NULL);
void AttachModelInstance(CGrannyLODController * pSrcLODController, const char * c_szBoneName);
void DetachModelInstance(CGrannyLODController * pSrcLODController);
void SetLODLimits(float fNearLOD, float fFarLOD);
void SetLODLevel(BYTE bLODLevel);
BYTE GetLODLevel() { return m_bLODLevel; }
void SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage);
void SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData);
void SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower);
void RenderWithOneTexture();
void RenderWithTwoTexture();
void BlendRenderWithOneTexture();
void BlendRenderWithTwoTexture();
void Update(float fElapsedTime, float fDistanceFromCenter, float fDistanceFromCamera);
void UpdateLODLevel(float fDistanceFromCenter, float fDistanceFromCamera);
void UpdateTime(float fElapsedTime);
void UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float fElapsedTime);
void Deform(const D3DXMATRIX * c_pWorldMatrix);
void DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix);
void DeformAll(const D3DXMATRIX * c_pWorldMatrix);
void RenderToShadowMap();
void RenderShadow();
void ReloadTexture();
void GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax);
bool Intersect(const D3DXMATRIX * c_pMatrix, float * u, float * v, float * t);
void SetLocalTime(float fLocalTime);
void ResetLocalTime();
void SetMotionPointer(const CGrannyMotion * c_pMotion, float fBlendTime, int iLoopCount, float speedRatio);
void ChangeMotionPointer(const CGrannyMotion * c_pMotion, int iLoopCount, float speedRatio);
void SetMotionAtEnd();
BOOL isModelInstance();
CGrannyModelInstance* GetModelInstance();
bool HaveBlendThing() { return 0 != GetModelInstance() ? GetModelInstance()->HaveBlendThing() : false; } // NOTE: GetModelInstance() == 0<><30> <20><> Ŭ<><C5AC> ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(2012. 05. 07)
protected:
void SetCurrentModelInstance(CGrannyModelInstance * pgrnModelInstance);
void RefreshAttachedModelInstance();
void __ReserveSharedDeformableVertexBuffer(DWORD deformableVertexCount);
protected:
float m_fLODDistance;
DWORD m_dwLODAniFPS;
//// Attaching Link Data
// Data of Parent Side
typedef struct SAttachingModelData
{
CGrannyLODController * pkLODController;
std::string strBoneName;
} TAttachingModelData;
std::vector<TAttachingModelData> m_AttachedModelDataVector;
// Data of Child Side
CGrannyLODController * m_pAttachedParentModel;
BYTE m_bLODLevel;
CGrannyModelInstance * m_pCurrentModelInstance;
// WORK
std::deque<CGrannyModelInstance *> m_que_pkModelInst;
CGraphicVertexBuffer* m_pkSharedDeformableVertexBuffer;
// END_OF_WORK
};