forked from metin2/client
305 lines
7.4 KiB
C
305 lines
7.4 KiB
C
|
#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
|
|||
|
};
|