bsp.h

来自「《光线引擎演示程序》执行程序+源代码,《光线引擎演示程序》执行程序+源代码」· C头文件 代码 · 共 270 行

H
270
字号
/*==========================================================================;
 *
 *  光线游戏引擎(Light Game Engine)
 *
 *  版权所有 (C) 2005-2007 康 旭。 保留所有权利。
 *  Copyright (C) KangXu.  All Rights Reserved.
 *
 *  文件:   LightBsp.h
 *  内容:   室内场景 BSP 函数
 *
 ****************************************************************************/


/*! \file bsp.h * 室内场景函数. * 此文件是室内场景函数头文件. */


#define LIGHT_MAX_BSP_HOMEPLACE   256 // 最大玩家出生点数

// 玩家出生点结构
typedef struct homeplace_s
{
	vec3_t pos;   // 玩家位置
	float  angle; // 玩家角度
} homeplace_t;

// 场景数据结构
typedef struct bsp_data_s
{
	int    NumHomeplace;                             // 玩家出生点数
	homeplace_t Homeplaces[LIGHT_MAX_BSP_HOMEPLACE]; // 玩家出生点列表

} bsp_data_t;


/*! \class LightBsp * \brief 室内场景类 * *  本类负责地图文件的读取和显示,场景管理,是引擎的核心部分。 *  每个 LightBsp 实例都必须通过 LightEngine 类的 NewBsp 方法分配。  */

class LightBsp
{

public:

	/*! \fn void Lighteness( float lighteness ) = 0	 *  \brief 设置地图亮度值(必须在读取地图之前设置才有效,缺省值为 10 )	 *	 *  设置地图亮度值(必须在读取地图之前设置才有效,缺省值为 10 )	 *	 *  \param float lighteness 地图亮度值	 *	 *  \return 无	 *	 *  \see 
	 */
	virtual void Lighteness( float lighteness ) = 0;

	/*! \fn bool Load(const char *strFileName) = 0	 *  \brief 将指定的 .bsp 室内场景文件读入内存	 *	 *  将指定的 .bsp 室内场景文件读入内存	 *	 *  \param float lighteness 地图文件名	 *	 *  \return 如果函数调用成功,返回非零值;如果函数调用失败,返回零。	 *	 *  \see 
	 */
	virtual bool Load(const char *strFileName) = 0;
	
	/*! \fn int FindLeaf( float x, float y, float z ) = 0	 *  \brief 查询指定点所在的叶节点(返回索引)	 *	 *  查询指定点所在的叶节点(返回索引)	 *	 *  \param float x 该点的 x 坐标值	 *	 *  \param float y 该点的 y 坐标值	 *	 *  \param float z 该点的 z 坐标值	 *	 *  \return 该点所在叶节点的索引值	 *	 *  \see 
	 */
	virtual int FindLeaf( float x, float y, float z ) = 0;

	/*! \fn int AttachModel( LightModelMD3 *model ) = 0	 *  \brief 将指定模型与地图绑定	 *	 *  将指定模型与地图绑定	 *	 *  \param LightModelMD3 *model 要绑定的模型	 *	 	 *  \return 如果函数调用成功,返回非零值;如果函数调用失败,返回零。	 *	 *  \see 
	 */
	virtual int AttachModel( LightModelMD3 *model ) = 0;

	/*! \fn int GetData( bsp_data_t * bsp_data ) = 0	 *  \brief 查询室内场景数据	 *	 *  查询室内场景数据,包括玩家出生点等数据	 *	 *  \param bsp_data_t * bsp_data 要返回数据的结构指针	 *	 	 *  \return 如果函数调用成功,返回非零值;如果函数调用失败,返回零。	 *	 *  \see 
	 */
	virtual int GetData( bsp_data_t * bsp_data ) = 0;


	// 场景渲染模式标志位
	#define LIGHT_RENDERMODE_TEXTURE   1  // 纹理
    #define LIGHT_RENDERMODE_LIGHTMAP  2  // 光照图
    #define LIGHT_RENDERMODE_LINE      4  // 线框

	/*! \fn void RenderMode( unsigned long mode ) = 0	 *  \brief 设置场景渲染模式	 *	 *  设置场景渲染模式	 *	 *  \param unsigned long mode 场景渲染模式	 *	 	 *  \return 该函数无返回值	 *	 *  \see 
	 */
	virtual void RenderMode( unsigned long mode ) = 0;

	/*! \fn void Render( float x, float y, float z ) = 0	 *  \brief 以指定的视点渲染场景	 *	 *  以指定的视点渲染场景	 *	 *  \param float x 该点的 x 坐标值	 *	 *  \param float y 该点的 y 坐标值	 *	 *  \param float z 该点的 z 坐标值	 *	 *  \return 该点所在叶节点的索引值	 *	 *  \see 
	 */
	virtual void Render( float x, float y, float z ) = 0;

	/*! \fn void RenderProjection() = 0	 *  \brief 以投影纹理模式渲染场景	 *	 *  以投影纹理模式渲染场景	 *	 *  \param 无	 *	 *  \return 无	 *	 *  \see 
	 */
	virtual void RenderProjection() = 0;

	/*! \fn  void RenderBlendFace() = 0	 *  \brief 渲染场景中的透明面	 *	 *  渲染场景中的透明面	 *	 *  \param 无	 *	 *  \return 无	 *	 *  \see 
	 */
	virtual void RenderBlendFace() = 0;

	/*! \fn CVector3 TraceRay(CVector3 vStart, CVector3 vEnd) = 0	 *  \brief 测试指定的线段与场景中的凸体是否发生碰撞	 *	 *  测试指定的线段与场景中的凸体是否发生碰撞	 *	 *  \param CVector3 vStart 线段起始点	 *	 *  \param CVector3 vEnd 线段结束点	 *	 	 *  \return CVector3 发生碰撞的点	 *	 *  \see 
	 */
	virtual CVector3 TraceRay(CVector3 vStart, CVector3 vEnd) = 0;

	/*! \fn  CVector3 TraceSphere(CVector3 vStart, CVector3 vEnd, float radius) = 0	 *  \brief 测试指定的球体与场景中的凸体是否发生碰撞	 *	 *  测试指定的球体与场景中的凸体是否发生碰撞	 *	 *  \param CVector3 vStart 线段起始点	 *	 *  \param CVector3 vEnd 线段结束点	 *	 	 *  \param float radius 球体的半径	 *	 	 *  \return CVector3 发生碰撞的点	 *	 *  \see 
	 */
	virtual CVector3 TraceSphere(CVector3 vStart, CVector3 vEnd, float radius) = 0;

	/*! \fn  CVector3 TraceBox(CVector3 vStart, CVector3 vEnd, CVector3 vMin, CVector3 vMax) = 0	 *  \brief 测试指定的包围盒(AABB)与场景中的凸体是否发生碰撞	 *	 *  测试指定的包围盒(AABB)与场景中的凸体是否发生碰撞	 *	 *  \param CVector3 vStart 线段起始点	 *	 *  \param CVector3 vEnd 线段结束点	 *	 	 *  \param CVector3 vMin 包围盒(AABB)对角线顶点	 *	 	 *  \param CVector3 vMax 包围盒(AABB)对角线另一个顶点	 *	 	 *  \return CVector3 发生碰撞的点	 *	 *  \see 
	 */
	virtual CVector3 TraceBox(CVector3 vStart, CVector3 vEnd, CVector3 vMin, CVector3 vMax) = 0;

	/*! \fn  bool IsOnGround() = 0	 *  \brief 查询最后一次碰撞检测是否与地面发生碰撞	 *	 *  查询最后一次碰撞检测是否与地面发生碰撞	 *	 *  \param 无	 *	 *  \return 如果与地面发生碰撞,返回 TRUE ,否则返回 FALSE ;	 *	 *  \see 
	 */
	virtual bool IsOnGround() = 0;

	/*! \fn  bool Collided() = 0	 *  \brief 查询最后一次碰撞检测是否发生碰撞	 *	 *  查询最后一次碰撞检测是否发生碰撞	 *	 *  \param 无	 *	 *  \return 如果发生碰撞,返回 TRUE ,否则返回 FALSE ;	 *	 *  \see 
	 */
	virtual bool Collided() = 0;

	/*! \fn  void Destroy() = 0	 *  \brief 释放地图所占内存	 *	 *  释放地图所占内存	 *	 *  \param 无	 *	 *  \return 无	 *	 *  \see 
	 */
	virtual void Destroy() = 0;
};

⌨️ 快捷键说明

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