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

91 lines
7.8 KiB
C++

// managervbfill.h
#ifndef _3DRENDERER_MANAGERVBFILL_H_
#define _3DRENDERER_MANAGERVBFILL_H_
#include "managerbase.h"
#include "managerd3d.h"
#include "managerwzdloader.h"
#define INSTANCING_START_INDEX 21.0f
enum ENUM_OWN_VB_TYPE
{
EOVT_TERRAIN = 0,
EOVT_UNIT,
EOVT_LIGHTMAPUV = 3,
EOVT_TERRAIN_TANGENT_BINORMAL = 4,
};
enum ENUM_OWN_IB_TYPE
{
EOIT_DWORD = 0,
EOIT_WORD,
};
class CManagerVBFill : public CManagerBase, CManagerD3D
{
public:
CManagerVBFill(void);
virtual ~CManagerVBFill(void);
virtual void Clear();
virtual BOOL Create( CDrawBase *pParentDraw, void *pParam);
virtual void Destroy();
virtual void OnLostDevice();
virtual void OnResetDevice();
// Own Vertex / Index Buffer 관련
public:
virtual HANDLE MakeOwnVertexBuffer( int iNumVertices, ENUM_OWN_VB_TYPE eOvt);
virtual void DeleteOwnVertexBuffer( HANDLE hOwnVertexBuffer);
virtual HANDLE MakeOwnIndexBuffer( int iNumVertices, ENUM_OWN_IB_TYPE eOit);
virtual void DeleteOwnIndexBuffer( HANDLE hOwnIndexBuffer);
virtual BOOL FillOwnVertexBuffer( HANDLE hOwnVertexBuffer, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, int iPosVertDataSize = sizeof ( WzVector), int iPosVertMapDataSize = sizeof ( int), int iColorDataSize = sizeof ( WzColor), int iUVDataSize = sizeof ( WzUVVert), int iNorVertDataSize = sizeof(WzVector));
virtual BOOL FillOwnVertexBufferPartially( HANDLE hOwnVertexBuffer, int *piVertexIndex, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, int iPosVertDataSize = sizeof ( WzVector), int iPosVertMapDataSize = sizeof ( int), int iColorDataSize = sizeof ( WzColor), int iUVDataSize = sizeof ( WzUVVert), int iNorVertDataSize = sizeof(WzVector)); // 전체가 아닌 특정 Triangle 만 갱신하기
virtual BOOL FillOwnVertexBufferUsingRefIndex( HANDLE hOwnVertexBuffer, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, int* piRefIndex, int iPosVertDataSize = sizeof ( WzVector), int iPosVertMapDataSize = sizeof ( int), int iColorDataSize = sizeof ( WzColor), int iUVDataSize = sizeof ( WzUVVert), int iNorVertDataSize = sizeof(WzVector), int iRefIndexDataSize = sizeof(int));
virtual BOOL FillOwnVertexBufferPartiallyUsingRefIndex( HANDLE hOwnVertexBuffer, int *piVertexIndex, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, CWzArray<int>* parRef, CWzArray<int>* parRefSeq, int iPosVertDataSize = sizeof ( WzVector), int iPosVertMapDataSize = sizeof ( int), int iColorDataSize = sizeof ( WzColor), int iUVDataSize = sizeof ( WzUVVert), int iNorVertDataSize = sizeof(WzVector)); // 전체가 아닌 특정 Triangle 만 갱신하기
virtual BOOL FillOwnVertexBufferTerrain( HANDLE hOwnVertexBuffer, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzColor *pwcAlphaLayer, int iPosVertDataSize = sizeof ( WzVector), int iPosVertMapDataSize = sizeof ( int), int iColorDataSize = sizeof ( WzColor), int iUVDataSize = sizeof ( WzUVVert));
virtual BOOL FillOwnVertexBufferTerrainPartially( HANDLE hOwnVertexBuffer, int *piVertexIndex, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzColor *pwcAlphaLayer, int iPosVertDataSize = sizeof ( WzVector), int iPosVertMapDataSize = sizeof ( int), int iColorDataSize = sizeof ( WzColor), int iUVDataSize = sizeof ( WzUVVert)); // 전체가 아닌 특정 Triangle 만 갱신하기
virtual BOOL FillOwnVertexBufferbyTriangle( HANDLE hOwnVertexBuffer, int iNumTriangle, WzVector *pwvVertex, WzUVVert *pwUVs, int *piVertexMap, int *piUVMap, WzColor *pwcColor, int iVertDataSize = sizeof ( WzVector), int iUVVertSize = sizeof ( WzUVVert), int iIndexSize = 3 * sizeof ( int), int iColorDataSize = sizeof ( WzColor));
virtual BOOL FillOwnVertexBufferbySelectedTriangle( HANDLE hOwnVertexBuffer, int *piTriangleIndex, int iNumTriangle, WzVector *pwvVertex, WzUVVert *pwUVs, int *piVertexMap, int *piUVMap, WzColor *pwcColor, int iVertDataSize = sizeof ( WzVector), int iUVVertSize = sizeof ( WzUVVert), int iIndexSize = 3 * sizeof ( int), int iColorDataSize = sizeof ( WzColor)); // 전체가 아닌 특정 Triangle 만 갱신하기
virtual BOOL FillOwnVertexBufferBasisVector(HANDLE hOwnVertexBuffer, int nVertexCount, WzVector* pwvBasisVector, int* pnFaceIndices, int nBasisVectorStride, int nIndexStride );
// 블렌딩버퍼
virtual BOOL FillOwnVertexBufferBlend( HANDLE hOwnVertexBuffer, int iMaxLayer, CWzArray<int>* pBlendIndex, CWzArray<DWORD>* pBlendColor, int iBlendColorSize, float* fColor, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, int iPosVertDataSize = sizeof(WzVector), int iPosVertMapDataSize = sizeof(int), int iColorDataSize = sizeof(WzColor), int iUVDataSize = sizeof(WzUVVert), int iNorVertDataSize = sizeof(WzVector));
virtual BOOL FillOwnVertexBufferBlendPartially( HANDLE hOwnVertexBuffer, int iMaxLayer, CWzArray<int>* pBlendIndex, CWzArray<DWORD>* pBlendColor, int iBlendColorSize, float* fColor, int iMaxVertex, int *piVertexIndex, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, int iPosVertDataSize = sizeof(WzVector), int iPosVertMapDataSize = sizeof(int), int iColorDataSize = sizeof(WzColor), int iUVDataSize = sizeof(WzUVVert), int iNorVertDataSize = sizeof(WzVector)); // 전체가 아닌 특정 Triangle 만 갱신하기
virtual BOOL FillOwnVertexBufferBlendPartiallyUsingRefIndex( HANDLE hOwnVertexBuffer, int iMaxLayer, CWzArray<int>* pBlendIndex, CWzArray<DWORD>* pBlendColor, int iBlendColorSize, float* fColor, int iMaxVertex, int *piVertexIndex, WzVector *pwvPosVert, int iNumVertex, int *piPosVertMap, WzColor *pwcColor, WzUVVert *pwUVs, WzVector *pwvNorVert, CWzArray<int>* parRef, CWzArray<int>* parRefSeq, int iPosVertDataSize = sizeof(WzVector), int iPosVertMapDataSize = sizeof(int), int iColorDataSize = sizeof(WzColor), int iUVDataSize = sizeof(WzUVVert), int iNorVertDataSize = sizeof(WzVector)); // 전체가 아닌 특정 Triangle 만 갱신하기
// Wzd rendering 시 가속 관련
public:
BOOL MakeWzdVertexBuffer( CWzdBase *pWzd);
void DeleteWzdVertexBuffer( CWzdBase *pWzd);
BOOL UpdateWzdVertexBuffer( CWzdBase *pWzd, int iMeshGroup, HANDLE hVB, HANDLE hIB);
protected:
void FillWzdVertexBuffer( CWzdBase *pWzd, int iMeshGroup, BYTE *pbyBuffer, CWzArray<WORD> *parTriListInGroup, int *piNumGroup);
void FillWzdIndexBuffer( CWzdBase *pWzd, int iMeshGroup, BYTE *pbyBuffer, CWzArray<WORD> *parTriListInGroup, int iNumGroup);
protected:
// 새 포맷용(IB사용) 테스트(차후 기존함수로 통합) - 현재 Shader만 적용!
void New_FillWzdVertexBuffer( CWzdBase *pWzd, int iMeshGroup, BYTE *pbyBuffer, CWzArray<WORD> *parTriListInGroup, int *piNumGroup, UINT uiFVFSize);
void New_FillWzdIndexBuffer( CWzdBase *pWzd, int iMeshGroup, BYTE *pbyBuffer, CWzArray<WORD> *parTriListInGroup, int iNumGroup, ENUM_OWN_IB_TYPE eOwnIBType);
// 메쉬 분할
protected:
int bsfs_GenerateBoneSplitInfo( St_BoneSplitInfo *apBSI, CWzArray<WORD> *parTriListInGroup, CWzArray<int> *parGroupIndexOfTri, CWzdBase *pWzd, int iMeshGroup);
void bsfs_RestoreBoneSplitInfo( St_BoneSplitInfo *apBSI, int iCountGroup, CWzdBase *pWzd, int iMeshGroup);
int bsfs_ComputeBoneIndex(int* piOut, int nPallete, St_BoneSplitInfo* pBSI, WzFace *pFace,WzMeshVertex *pwmvVertices,WzSkinningInfo *pwsiList,WzMeshGroup *pwmg);
void bsfs_ReAlignment(St_BoneSplitInfo *apBSI ,int iGoupCount, int* piNeedRelocationBone ,int iNumNode);
public:
void FillLightMapVertexBuffer( CWzdBase *pWzd, int iMeshGroup, BYTE *pbyBuffer, CWzArray<WORD> *parTriListInGroup, int *piNumGroup);
BOOL UpdateLightMapVertexBuffer( CWzdBase *pWzd, int iMeshGroup, HANDLE hVB, HANDLE hIB);
public:
virtual BOOL LockIndexBuffer( HANDLE hIB, void** ppIndex);
virtual void UnlockIndexBuffer( HANDLE hIB);
};
#endif // _3DRENDERER_MANAGERVBFILL_H_