1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 
23 #include "q_shared.h"
24 #include "qcommon.h"
25 #include "cm_polylib.h"
26 
27 #define	MAX_SUBMODELS			256
28 #define	BOX_MODEL_HANDLE		255
29 #define CAPSULE_MODEL_HANDLE	254
30 
31 
32 typedef struct {
33 	cplane_t	*plane;
34 	int			children[2];		// negative numbers are leafs
35 } cNode_t;
36 
37 typedef struct {
38 	int			cluster;
39 	int			area;
40 
41 	int			firstLeafBrush;
42 	int			numLeafBrushes;
43 
44 	int			firstLeafSurface;
45 	int			numLeafSurfaces;
46 } cLeaf_t;
47 
48 typedef struct cmodel_s {
49 	vec3_t		mins, maxs;
50 	cLeaf_t		leaf;			// submodels don't reference the main tree
51 } cmodel_t;
52 
53 typedef struct {
54 	cplane_t	*plane;
55 	int			surfaceFlags;
56 	int			shaderNum;
57 } cbrushside_t;
58 
59 typedef struct {
60 	int			shaderNum;		// the shader that determined the contents
61 	int			contents;
62 	vec3_t		bounds[2];
63 	int			numsides;
64 	cbrushside_t	*sides;
65 	int			checkcount;		// to avoid repeated testings
66 } cbrush_t;
67 
68 
69 typedef struct {
70 	int			checkcount;				// to avoid repeated testings
71 	int			surfaceFlags;
72 	int			contents;
73 	struct patchCollide_s	*pc;
74 } cPatch_t;
75 
76 
77 typedef struct {
78 	int			floodnum;
79 	int			floodvalid;
80 } cArea_t;
81 
82 typedef struct {
83 	char		name[MAX_QPATH];
84 
85 	int			numShaders;
86 	dshader_t	*shaders;
87 
88 	int			numBrushSides;
89 	cbrushside_t *brushsides;
90 
91 	int			numPlanes;
92 	cplane_t	*planes;
93 
94 	int			numNodes;
95 	cNode_t		*nodes;
96 
97 	int			numLeafs;
98 	cLeaf_t		*leafs;
99 
100 	int			numLeafBrushes;
101 	int			*leafbrushes;
102 
103 	int			numLeafSurfaces;
104 	int			*leafsurfaces;
105 
106 	int			numSubModels;
107 	cmodel_t	*cmodels;
108 
109 	int			numBrushes;
110 	cbrush_t	*brushes;
111 
112 	int			numClusters;
113 	int			clusterBytes;
114 	byte		*visibility;
115 	qboolean	vised;			// if false, visibility is just a single cluster of ffs
116 
117 	int			numEntityChars;
118 	char		*entityString;
119 
120 	int			numAreas;
121 	cArea_t		*areas;
122 	int			*areaPortals;	// [ numAreas*numAreas ] reference counts
123 
124 	int			numSurfaces;
125 	cPatch_t	**surfaces;			// non-patches will be NULL
126 
127 	int			floodvalid;
128 	int			checkcount;					// incremented on each trace
129 } clipMap_t;
130 
131 
132 // keep 1/8 unit away to keep the position valid before network snapping
133 // and to avoid various numeric issues
134 #define	SURFACE_CLIP_EPSILON	(0.125)
135 
136 extern	clipMap_t	cm;
137 extern	int			c_pointcontents;
138 extern	int			c_traces, c_brush_traces, c_patch_traces;
139 extern	cvar_t		*cm_noAreas;
140 extern	cvar_t		*cm_noCurves;
141 extern	cvar_t		*cm_playerCurveClip;
142 
143 // cm_test.c
144 
145 // Used for oriented capsule collision detection
146 typedef struct
147 {
148 	qboolean	use;
149 	float		radius;
150 	float		halfheight;
151 	vec3_t		offset;
152 } sphere_t;
153 
154 typedef struct {
155 	vec3_t		start;
156 	vec3_t		end;
157 	vec3_t		size[2];	// size of the box being swept through the model
158 	vec3_t		offsets[8];	// [signbits][x] = either size[0][x] or size[1][x]
159 	float		maxOffset;	// longest corner length from origin
160 	vec3_t		extents;	// greatest of abs(size[0]) and abs(size[1])
161 	vec3_t		bounds[2];	// enclosing box of start and end surrounding by size
162 	vec3_t		modelOrigin;// origin of the model tracing through
163 	int			contents;	// ored contents of the model tracing through
164 	qboolean	isPoint;	// optimized case
165 	trace_t		trace;		// returned from trace call
166 	sphere_t	sphere;		// sphere for oriendted capsule collision
167 } traceWork_t;
168 
169 typedef struct leafList_s {
170 	int		count;
171 	int		maxcount;
172 	qboolean	overflowed;
173 	int		*list;
174 	vec3_t	bounds[2];
175 	int		lastLeaf;		// for overflows where each leaf can't be stored individually
176 	void	(*storeLeafs)( struct leafList_s *ll, int nodenum );
177 } leafList_t;
178 
179 
180 int CM_BoxBrushes( const vec3_t mins, const vec3_t maxs, cbrush_t **list, int listsize );
181 
182 void CM_StoreLeafs( leafList_t *ll, int nodenum );
183 void CM_StoreBrushes( leafList_t *ll, int nodenum );
184 
185 void CM_BoxLeafnums_r( leafList_t *ll, int nodenum );
186 
187 cmodel_t	*CM_ClipHandleToModel( clipHandle_t handle );
188 qboolean CM_BoundsIntersect( const vec3_t mins, const vec3_t maxs, const vec3_t mins2, const vec3_t maxs2 );
189 qboolean CM_BoundsIntersectPoint( const vec3_t mins, const vec3_t maxs, const vec3_t point );
190 
191 // cm_patch.c
192 
193 struct patchCollide_s	*CM_GeneratePatchCollide( int width, int height, vec3_t *points );
194 void CM_TraceThroughPatchCollide( traceWork_t *tw, const struct patchCollide_s *pc );
195 qboolean CM_PositionTestInPatchCollide( traceWork_t *tw, const struct patchCollide_s *pc );
196 void CM_ClearLevelPatches( void );
197