📄 xoctree.h
字号:
#ifdef CGE_HEADER_H
#ifndef CGE_OCTREE_H
#define CGE_OCTREE_H
namespace CGE
{
namespace CULLING
{
enum
{
TOP_LEFT_FRONT = 0, // 0
TOP_LEFT_BACK, // 1
TOP_RIGHT_BACK, // etc...
TOP_RIGHT_FRONT,
BOTTOM_LEFT_FRONT,
BOTTOM_LEFT_BACK,
BOTTOM_RIGHT_BACK,
BOTTOM_RIGHT_FRONT
};
typedef class XOCTREE
{
public:
struct Triangle
{
UINT m_nVertIndices[3];
UINT m_nMarshalID;
DWORD m_nLastDrawnTime;
Triangle()
{
m_nLastDrawnTime = 0;
m_nMarshalID = 0;
}
};
struct Node
{
BOOL m_bSubDivided;
FLOAT m_fCubeSize;
D3DXVECTOR3 m_vCenter;
Node * m_pChildNode[8];
std::vector<Triangle*> m_vTriangles;
Node()
{
m_vTriangles.clear();
m_vCenter.x = m_vCenter.y = m_vCenter.z = 0;
m_bSubDivided = 0;
memset(m_pChildNode,0,sizeof(m_pChildNode));
}
~Node()
{
for ( int i = 0; i < 8; ++i)
{
SAFE_DELETE(m_pChildNode[i]);
}
m_vTriangles.clear();
}
};
struct Marshal
{
BYTE *m_vbOfVB; // Pointer to vertex data
DWORD m_NumOfTri; // # polygons in group
DWORD m_NumOfTriToDraw; // # polygon to draw
LPDIRECT3DVERTEXBUFFER8 m_pVB; // Vertex data to draw
Marshal() { m_NumOfTriToDraw = m_NumOfTri = 0;m_pVB = 0;} // Clear # polygons
~Marshal() { SAFE_RELEASE(m_pVB); } // Free vertex buffer
};
XOCTREE();
virtual ~XOCTREE();
FLOAT m_fSceneDimension; // SceneDimension;
FLOAT m_fMaxNodeSize; // Maximum node size
DWORD m_nDrawnTime;
LONG m_nMaxTriangles; // Maximum node triangles
LPD3DXMESH m_OddSceneMesh;
Node * m_ParentNode;
BYTE * m_vbOfMesh;
DWORD m_vsOfMesh;
std::vector<Triangle> m_vTriangles;
std::vector<Marshal> m_vMarshals;
std::vector<D3DMATERIAL8> m_vMaterials;
std::vector<LPDIRECT3DTEXTURE8> m_vTextures;
public:
VOID SearchPotentialCollisions(Node *pNode, const D3DXVECTOR3 & vStartPos, const D3DXVECTOR3 &vEndPos,const D3DXVECTOR3 &vScale, std::vector<Triangle *> &list);
BOOL CollisionInScene(D3DXVECTOR3 &vStartPos, D3DXVECTOR3 vScale, D3DXVECTOR3 &vVelocity);
BOOL CollisionDetection(D3DXVECTOR3 &vStartPos, D3DXVECTOR3 vRadiusVector, D3DXVECTOR3 vVelocity, FLOAT fStaticFriction, FLOAT fFriction);
VOID CullNode(LPFRUSTUM Frustum,Node * pNode);
VOID AssignTrianglesToNode(Node * pNode,LONG Amount);
BOOL IsTriangleInside( Triangle * pTriangle,D3DXVECTOR3 vCenter,FLOAT fDimension);
LONG CalculateTriangle(D3DXVECTOR3 vCenter,FLOAT fDimension);
VOID CreateSceneNode(Node * pNode,D3DXVECTOR3 vCenter, FLOAT fDimension);
VOID SetSceneDimensions(LPD3DXMESH SceneMesh,D3DXVECTOR3 vMin,D3DXVECTOR3 vMax);
VOID SetMaxTriangle(LONG mt) { m_nMaxTriangles = mt; }
VOID SetMaxNodeSize(FLOAT mns) { m_fMaxNodeSize = mns; }
VOID NodeInScene(LPDIRECT3DDEVICE8 device,LPFRUSTUM Frustum,FLOAT fZDistance = 0.0f);
D3DXVECTOR3 GetNewNodeCenter(D3DXVECTOR3 vCenter, FLOAT fSize, INT nodeID);
}*LPXOCTREE;
CGE_INLINE XOCTREE::XOCTREE()
{
// Set the dimensions of the box to false
m_fSceneDimension = 0;
m_nDrawnTime = 0;
m_vbOfMesh = 0;
m_OddSceneMesh = 0;
// Set the triangle list to NULL
m_vMaterials.clear();
m_vTextures.clear();
m_vMarshals.clear();
m_vTriangles.clear();
}
CGE_INLINE XOCTREE::~XOCTREE()
{
// Free the triangle data if it's not NULL
m_vMaterials.clear();
m_vTextures.clear();
m_vMarshals.clear();
m_vTriangles.clear();
SAFE_RELEASE(m_OddSceneMesh);
}
}
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -