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

📄 bspnode.h

📁 BSP地形系统和光照贴图的技术详解
💻 H
字号:
// Bsp.h: interface for the CBspNode class.
//
//////////////////////////////////////////////////////////////////////


#if !defined(AFX_BSP_H__798749D6_4E89_4C34_8798_B311BEE024B9__INCLUDED_)
#define AFX_BSP_H__798749D6_4E89_4C34_8798_B311BEE024B9__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <d3dx8.h>
#include "d3dfont.h"
#include "portal.h"

#define POINT_FRONT 1
#define POINT_BACK  2
#define POINT_ON    3

#define FACE_FRONT      1
#define FACE_BACK       2
#define FACE_ON         3
#define FACE_SPLIT		4

#define EPSILON    0.001f
#define BSP_BOGUS  99999

#define BSP_NODE 0
#define BSP_LEAF 1

#define		STR_MAX			200

#define	MAX_PORTALS_ON_LEAF		128

struct BSPVERTEX
{
    D3DXVECTOR3 pos;       // vertex position
	float		u, v;
};

typedef struct
{
	LPDIRECT3DTEXTURE8	texture;
	char				name[STR_MAX];
} TEXTUREDATA;

typedef struct tagTRIANGLEINDEX
{
	WORD	_0, _1, _2;
} TRIANGLEINDEX, *PTRIANGLEINDEX, *LPTRIANGLEINDEX;


#define D3DFVF_BSPVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)

class CFace
{
public:
	BOOL m_bInside;
	
	
	BSPVERTEX*		m_vList;
	int				m_nNum;
	int				m_nPlane;
	BOOL			m_bUsed;
	BOOL			m_bCollision;
	BOOL			m_bDelete;
	CFace*			m_pNext;
	CFace*			m_pPrev;
	int				m_nTexture;
	int				m_nLightMap;
	
	CFace();
	virtual ~CFace();
	
	static CFace*		CreateFace();
	BOOL				AddNext( CFace* pNext );
	BOOL				MakePlane( BSPVERTEX* v, int n );
	BOOL				SetVertexList( BSPVERTEX* pList );
	BOOL				AddTail( CFace* pTail );
};

class CThing
{
public:
	BSPVERTEX*		m_pFaceList;
	int				m_nObjectType;
	BSPVERTEX*		m_pVertex;
	int				m_nVertexCount;
	TRIANGLEINDEX*	m_pTriangleIndex;
	TRIANGLEINDEX*	m_pTIndex;
	int				m_nFaceCount;
	TEXTUREDATA*	m_pTXData;
	int				m_nTexCnt;
	D3DXVECTOR3*	m_pTVtx;
	int				m_nTCount;
	int				m_nTFCount;
	D3DXPLANE		m_planes[32];
	int				m_nTotalPlane;

	CThing()
	{
		m_nTotalPlane		= 0;
		m_nTCount			= 0;
		m_nTFCount			= 0;
		m_pTVtx				= NULL;
		m_pTXData			= NULL;
		m_pTriangleIndex	= NULL;
		m_pTIndex			= NULL;
		m_nFaceCount		= 0;	
		m_pVertex			= NULL;
		m_nVertexCount		= 0;
		m_pFaceList			= NULL;
		m_nObjectType		= -1;
		m_nTexCnt			= 0;
	};
	virtual ~CThing()
	{
/*		CFace* curr = NULL, * next = NULL;
		for( curr = m_pFaceList ; curr ; curr = next )
		{
			next = curr->m_pNext;
			delete curr;
		}*/
		delete[] m_pFaceList;
		if( m_pTXData )
			delete[] m_pTXData;
	};

	int GetTextureIndex( LPSTR szName )
	{
		if( m_nTexCnt <= 0 )
		return -1;

		for( int i = 0 ; i < m_nTexCnt ; i++ )
		{
			if( !strcmp( m_pTXData[i].name, szName ) )
				return i;
		}

		return -1;
	};
	void		InitThing();
	int			FindSamePlane(D3DXPLANE &plane);
	BOOL		ComparePlane(D3DXPLANE &a, D3DXPLANE &b);
};


class CFrustum  
{
	D3DXVECTOR3	m_vtx[8];
	D3DXPLANE	m_plane[6];
public:
	CFrustum();
	virtual ~CFrustum();
	BOOL	Make( D3DXMATRIX* pmatViewProj );
	int		IsIn( D3DXVECTOR3* pVec );
	BOOL	Draw( LPDIRECT3DDEVICE8 pDev );
};

class CWinding
{
public:
	int				n;
	D3DXVECTOR3		vPoint[8];

public:
	CWinding();
	virtual ~CWinding();
};

class CLight  
{
public:
	D3DXVECTOR3		m_vPosition;
	int				m_radius;

	CLight( ){};
	CLight( int radius )
	{
		m_radius = radius;
	};
	CLight( D3DXVECTOR3 pos, int radius )
	{ 
		m_vPosition = pos;
		m_radius = radius; 
	};
	virtual ~CLight(){};

};


class CBspNode  
{
public:
	class CPortal  
	{
	public:
		CPortal*		m_pNext[2];
		CBspNode*		m_pNode[2];
		CWinding*		m_pWinding;
		D3DXPLANE		m_plane;
		BOOL			m_bRender;
		CPortal*		m_visPortals[MAX_PORTALS_ON_LEAF];
		int				m_nVisCnt;
		int				m_nFaceCnt;
		CFace**			m_ppFaceList;

	public:
		CPortal();
		virtual ~CPortal();

		void		AddPortalToNodes( CBspNode *front, CBspNode *back );
		void		Render( LPDIRECT3DDEVICE8 pd3dDevice );
		void		RemovePortalFromNode ( CBspNode *l );
	};
	
public:
	// Data for Node
	CBspNode *		m_pFront;
	CBspNode *		m_pBack;
	D3DXPLANE		m_plane;

	CPortal*		m_pPortals;

	TEXTUREDATA*	m_pTXData;

	
	// Data for Leaf
	BOOL			m_bIsSolid;
	BOOL			m_bIsLeaf;
	BOOL			m_bRender;


	D3DXVECTOR3		m_vMin;
	D3DXVECTOR3		m_vMax;
	CFace*			m_pFaceList;

	CBspNode();
	virtual ~CBspNode();
	BOOL			SetFaceList( CFace* pFace );
	BOOL			SetFrontNode( CBspNode* pNode );
	BOOL			SetBackNode( CBspNode* pNode );
	BOOL			Render(LPDIRECT3DDEVICE8 pd3dDevice, CD3DFont* pFont );
	BOOL			IsCollision( BOOL &b, D3DXVECTOR3 &v, CBspNode* & render_start);
	int				ClassifyPoint(D3DXVECTOR3 &v);
	int				GetFaceCount();
	void			InitRender();
};



#endif // !defined(AFX_BSP_H__798749D6_4E89_4C34_8798_B311BEE024B9__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -