⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xoctree.h

📁 VC++ DEMO, used for the beginners and the amour
💻 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 + -