📄 l_bsp_q2.c
字号:
/*
===========================================================================
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 + -