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

📄 l_bsp_q2.c

📁 quakeIII源码这个不用我多说吧
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.

This file is part of Quake III Arena source code.

Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

#include "l_cmd.h"
#include "l_math.h"
#include "l_mem.h"
#include "l_log.h"
#include "l_poly.h"
#include "../botlib/l_script.h"
#include "q2files.h"
#include "l_bsp_q2.h"
#include "l_bsp_ent.h"

#define q2_dmodel_t			dmodel_t
#define q2_lump_t				lump_t
#define q2_dheader_t			dheader_t
#define q2_dmodel_t			dmodel_t
#define q2_dvertex_t			dvertex_t
#define q2_dplane_t			dplane_t
#define q2_dnode_t			dnode_t
#define q2_texinfo_t			texinfo_t
#define q2_dedge_t			dedge_t
#define q2_dface_t			dface_t
#define q2_dleaf_t			dleaf_t
#define q2_dbrushside_t		dbrushside_t
#define q2_dbrush_t			dbrush_t
#define q2_dvis_t				dvis_t
#define q2_dareaportal_t	dareaportal_t
#define q2_darea_t			darea_t

#define q2_nummodels			nummodels
#define q2_dmodels			dmodels
#define q2_numleafs			numleafs
#define q2_dleafs				dleafs
#define q2_numplanes			numplanes
#define q2_dplanes			dplanes
#define q2_numvertexes		numvertexes
#define q2_dvertexes			dvertexes
#define q2_numnodes			numnodes
#define q2_dnodes				dnodes
#define q2_numtexinfo		numtexinfo
#define q2_texinfo			texinfo
#define q2_numfaces			numfaces
#define q2_dfaces				dfaces
#define q2_numedges			numedges
#define q2_dedges				dedges
#define q2_numleaffaces		numleaffaces
#define q2_dleaffaces		dleaffaces
#define q2_numleafbrushes	numleafbrushes
#define q2_dleafbrushes		dleafbrushes
#define q2_dsurfedges		dsurfedges
#define q2_numbrushes		numbrushes
#define q2_dbrushes			dbrushes
#define q2_numbrushsides	numbrushsides
#define q2_dbrushsides		dbrushsides
#define q2_numareas			numareas
#define q2_dareas				dareas
#define q2_numareaportals	numareaportals
#define q2_dareaportals		dareaportals

void GetLeafNums (void);

//=============================================================================

int				nummodels;
dmodel_t			*dmodels;//[MAX_MAP_MODELS];

int				visdatasize;
byte				*dvisdata;//[MAX_MAP_VISIBILITY];
dvis_t			*dvis;// = (dvis_t *)dvisdata;

int				lightdatasize;
byte				*dlightdata;//[MAX_MAP_LIGHTING];

int				entdatasize;
char				*dentdata;//[MAX_MAP_ENTSTRING];

int				numleafs;
dleaf_t			*dleafs;//[MAX_MAP_LEAFS];

int				numplanes;
dplane_t			*dplanes;//[MAX_MAP_PLANES];

int				numvertexes;
dvertex_t		*dvertexes;//[MAX_MAP_VERTS];

int				numnodes;
dnode_t			*dnodes;//[MAX_MAP_NODES];

//NOTE: must be static for q2 .map to q2 .bsp
int				numtexinfo;
texinfo_t		texinfo[MAX_MAP_TEXINFO];

int				numfaces;
dface_t			*dfaces;//[MAX_MAP_FACES];

int				numedges;
dedge_t			*dedges;//[MAX_MAP_EDGES];

int				numleaffaces;
unsigned short	*dleaffaces;//[MAX_MAP_LEAFFACES];

int				numleafbrushes;
unsigned short	*dleafbrushes;//[MAX_MAP_LEAFBRUSHES];

int				numsurfedges;
int				*dsurfedges;//[MAX_MAP_SURFEDGES];

int				numbrushes;
dbrush_t			*dbrushes;//[MAX_MAP_BRUSHES];

int				numbrushsides;
dbrushside_t	*dbrushsides;//[MAX_MAP_BRUSHSIDES];

int				numareas;
darea_t			*dareas;//[MAX_MAP_AREAS];

int				numareaportals;
dareaportal_t	*dareaportals;//[MAX_MAP_AREAPORTALS];

#define MAX_MAP_DPOP			256
byte				dpop[MAX_MAP_DPOP];

//
char brushsidetextured[MAX_MAP_BRUSHSIDES];

//#ifdef ME

int bspallocated = false;
int allocatedbspmem = 0;

void Q2_AllocMaxBSP(void)
{
	//models
	nummodels = 0;
	dmodels = (dmodel_t *) GetClearedMemory(MAX_MAP_MODELS * sizeof(dmodel_t));
	allocatedbspmem += MAX_MAP_MODELS * sizeof(dmodel_t);
	//vis data
	visdatasize = 0;
	dvisdata = (byte *) GetClearedMemory(MAX_MAP_VISIBILITY * sizeof(byte));
	dvis = (dvis_t *) dvisdata;
	allocatedbspmem += MAX_MAP_VISIBILITY * sizeof(byte);
	//light data
	lightdatasize = 0;
	dlightdata = (byte *) GetClearedMemory(MAX_MAP_LIGHTING * sizeof(byte));
	allocatedbspmem += MAX_MAP_LIGHTING * sizeof(byte);
	//entity data
	entdatasize = 0;
	dentdata = (char *) GetClearedMemory(MAX_MAP_ENTSTRING * sizeof(char));
	allocatedbspmem += MAX_MAP_ENTSTRING * sizeof(char);
	//leafs
	numleafs = 0;
	dleafs = (dleaf_t *) GetClearedMemory(MAX_MAP_LEAFS * sizeof(dleaf_t));
	allocatedbspmem += MAX_MAP_LEAFS * sizeof(dleaf_t);
	//planes
	numplanes = 0;
	dplanes = (dplane_t *) GetClearedMemory(MAX_MAP_PLANES * sizeof(dplane_t));
	allocatedbspmem += MAX_MAP_PLANES * sizeof(dplane_t);
	//vertexes
	numvertexes = 0;
	dvertexes = (dvertex_t *) GetClearedMemory(MAX_MAP_VERTS * sizeof(dvertex_t));
	allocatedbspmem += MAX_MAP_VERTS * sizeof(dvertex_t);
	//nodes
	numnodes = 0;
	dnodes = (dnode_t *) GetClearedMemory(MAX_MAP_NODES * sizeof(dnode_t));
	allocatedbspmem += MAX_MAP_NODES * sizeof(dnode_t);
	/*
	//texture info
	numtexinfo = 0;
	texinfo = (texinfo_t *) GetClearedMemory(MAX_MAP_TEXINFO * sizeof(texinfo_t));
	allocatedbspmem += MAX_MAP_TEXINFO * sizeof(texinfo_t);
	//*/
	//faces
	numfaces = 0;
	dfaces = (dface_t *) GetClearedMemory(MAX_MAP_FACES * sizeof(dface_t));
	allocatedbspmem += MAX_MAP_FACES * sizeof(dface_t);
	//edges
	numedges = 0;
	dedges = (dedge_t *) GetClearedMemory(MAX_MAP_EDGES * sizeof(dedge_t));
	allocatedbspmem += MAX_MAP_EDGES * sizeof(dedge_t);
	//leaf faces
	numleaffaces = 0;
	dleaffaces = (unsigned short *) GetClearedMemory(MAX_MAP_LEAFFACES * sizeof(unsigned short));
	allocatedbspmem += MAX_MAP_LEAFFACES * sizeof(unsigned short);
	//leaf brushes
	numleafbrushes = 0;
	dleafbrushes = (unsigned short *) GetClearedMemory(MAX_MAP_LEAFBRUSHES * sizeof(unsigned short));
	allocatedbspmem += MAX_MAP_LEAFBRUSHES * sizeof(unsigned short);
	//surface edges
	numsurfedges = 0;
	dsurfedges = (int *) GetClearedMemory(MAX_MAP_SURFEDGES * sizeof(int));
	allocatedbspmem += MAX_MAP_SURFEDGES * sizeof(int);
	//brushes
	numbrushes = 0;
	dbrushes = (dbrush_t *) GetClearedMemory(MAX_MAP_BRUSHES * sizeof(dbrush_t));
	allocatedbspmem += MAX_MAP_BRUSHES * sizeof(dbrush_t);
	//brushsides
	numbrushsides = 0;
	dbrushsides = (dbrushside_t *) GetClearedMemory(MAX_MAP_BRUSHSIDES * sizeof(dbrushside_t));
	allocatedbspmem += MAX_MAP_BRUSHSIDES * sizeof(dbrushside_t);
	//areas
	numareas = 0;
	dareas = (darea_t *) GetClearedMemory(MAX_MAP_AREAS * sizeof(darea_t));
	allocatedbspmem += MAX_MAP_AREAS * sizeof(darea_t);
	//area portals
	numareaportals = 0;
	dareaportals = (dareaportal_t *) GetClearedMemory(MAX_MAP_AREAPORTALS * sizeof(dareaportal_t));
	allocatedbspmem += MAX_MAP_AREAPORTALS * sizeof(dareaportal_t);
	//print allocated memory
	Log_Print("allocated ");
	PrintMemorySize(allocatedbspmem);
	Log_Print(" of BSP memory\n");
} //end of the function Q2_AllocMaxBSP

void Q2_FreeMaxBSP(void)
{
	//models
	nummodels = 0;
	FreeMemory(dmodels);
	dmodels = NULL;
	//vis data
	visdatasize = 0;
	FreeMemory(dvisdata);
	dvisdata = NULL;
	dvis = NULL;
	//light data
	lightdatasize = 0;
	FreeMemory(dlightdata);
	dlightdata = NULL;
	//entity data
	entdatasize = 0;
	FreeMemory(dentdata);
	dentdata = NULL;
	//leafs
	numleafs = 0;
	FreeMemory(dleafs);
	dleafs = NULL;
	//planes
	numplanes = 0;
	FreeMemory(dplanes);
	dplanes = NULL;
	//vertexes
	numvertexes = 0;
	FreeMemory(dvertexes);
	dvertexes = NULL;
	//nodes
	numnodes = 0;
	FreeMemory(dnodes);
	dnodes = NULL;
	/*
	//texture info
	numtexinfo = 0;
	FreeMemory(texinfo);
	texinfo = NULL;
	//*/
	//faces
	numfaces = 0;
	FreeMemory(dfaces);
	dfaces = NULL;
	//edges
	numedges = 0;
	FreeMemory(dedges);
	dedges = NULL;
	//leaf faces
	numleaffaces = 0;
	FreeMemory(dleaffaces);
	dleaffaces = NULL;
	//leaf brushes
	numleafbrushes = 0;
	FreeMemory(dleafbrushes);
	dleafbrushes = NULL;
	//surface edges
	numsurfedges = 0;
	FreeMemory(dsurfedges);
	dsurfedges = NULL;
	//brushes
	numbrushes = 0;
	FreeMemory(dbrushes);
	dbrushes = NULL;
	//brushsides
	numbrushsides = 0;
	FreeMemory(dbrushsides);
	dbrushsides = NULL;
	//areas
	numareas = 0;
	FreeMemory(dareas);
	dareas = NULL;
	//area portals
	numareaportals = 0;
	FreeMemory(dareaportals);
	dareaportals = NULL;
	//
	Log_Print("freed ");
	PrintMemorySize(allocatedbspmem);
	Log_Print(" of BSP memory\n");
	allocatedbspmem = 0;
} //end of the function Q2_FreeMaxBSP

#define WCONVEX_EPSILON		0.5

int InsideWinding(winding_t *w, vec3_t point, int planenum)
{
	int i;
	float dist;
	vec_t *v1, *v2;
	vec3_t normal, edgevec;
	dplane_t *plane;

	for (i = 1; i <= w->numpoints; i++)
	{
		v1 = w->p[i % w->numpoints];
		v2 = w->p[(i + 1) % w->numpoints];

		VectorSubtract(v2, v1, edgevec);
		plane = &dplanes[planenum];
		CrossProduct(plane->normal, edgevec, normal);
		VectorNormalize(normal);
		dist = DotProduct(normal, v1);
		//
		if (DotProduct(normal, point) - dist > WCONVEX_EPSILON) return false;
	} //end for
	return true;
} //end of the function InsideWinding

int InsideFace(dface_t *face, vec3_t point)
{
	int i, edgenum, side;
	float dist;
	vec_t *v1, *v2;
	vec3_t normal, edgevec;
	dplane_t *plane;

	for (i = 0; i < face->numedges; i++)
	{
		//get the first and second vertex of the edge
		edgenum = dsurfedges[face->firstedge + i];
		side = edgenum < 0;
		v1 = dvertexes[dedges[abs(edgenum)].v[side]].point;
		v2 = dvertexes[dedges[abs(edgenum)].v[!side]].point;
		//create a plane through the edge vector, orthogonal to the face plane
		//and with the normal vector pointing out of the face
		VectorSubtract(v1, v2, edgevec);
		plane = &dplanes[face->planenum];
		CrossProduct(plane->normal, edgevec, normal);
		VectorNormalize(normal);
		dist = DotProduct(normal, v1);
		//
		if (DotProduct(normal, point) - dist > WCONVEX_EPSILON) return false;
	} //end for
	return true;
} //end of the function InsideFace
//===========================================================================
// returns the amount the face and the winding overlap
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
float Q2_FaceOnWinding(q2_dface_t *face, winding_t *winding)
{

⌨️ 快捷键说明

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