some cleanup of map texture loading and related code (mainly better support for untex...
[xonotic/darkplaces.git] / model_brush.h
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19 */
20
21 #ifndef MODEL_BRUSH_H
22 #define MODEL_BRUSH_H
23
24 /*
25 ==============================================================================
26
27 BRUSH MODELS
28
29 ==============================================================================
30 */
31
32
33 //
34 // in memory representation
35 //
36 typedef struct
37 {
38         vec3_t          position;
39 }
40 mvertex_t;
41
42 #define SIDE_FRONT      0
43 #define SIDE_BACK       1
44 #define SIDE_ON         2
45
46
47 // plane_t structure
48 typedef struct mplane_s
49 {
50         vec3_t  normal;
51         float   dist;
52         int             type;                   // for texture axis selection and fast side tests
53         // LordHavoc: faster than id's signbits system
54         int (*BoxOnPlaneSideFunc) (vec3_t emins, vec3_t emaxs, struct mplane_s *p);
55 }
56 mplane_t;
57
58 typedef struct texture_s
59 {
60         // name
61         char name[16];
62         // size
63         unsigned int width, height;
64         // SURF_ flags
65         unsigned int flags;
66
67         // base texture without fullbrights, never NULL
68         rtexture_t *texture;
69         // fullbrights texture, NULL if no fullbrights used
70         rtexture_t *glowtexture;
71         // alpha texture (used for fogging), NULL if opaque
72         rtexture_t *fogtexture;
73
74         // total frames in sequence and alternate sequence
75         int anim_total[2];
76         // direct pointers to each of the frames in the sequences
77         // (indexed as [alternate][frame])
78         struct texture_s *anim_frames[2][10];
79         // set if animated or there is an alternate frame set
80         // (this is an optimization in the renderer)
81         int animated;
82 }
83 texture_t;
84
85
86 #define SURF_PLANEBACK          2
87 #define SURF_DRAWSKY            4
88 #define SURF_DRAWTURB           0x10
89 #define SURF_LIGHTMAP           0x20
90 #define SURF_DRAWNOALPHA        0x100
91 #define SURF_DRAWFULLBRIGHT     0x200
92 #define SURF_LIGHTBOTHSIDES     0x400
93 #define SURF_CLIPSOLID          0x800 // this polygon can obscure other polygons
94
95 typedef struct
96 {
97         unsigned short  v[2];
98 }
99 medge_t;
100
101 typedef struct
102 {
103         float           vecs[2][4];
104         texture_t       *texture;
105         int                     flags;
106 }
107 mtexinfo_t;
108
109 typedef struct surfvertex_s
110 {
111         // position
112         float v[3];
113         // offset into lightmap (used by vertex lighting)
114         int lightmapoffset;
115         // texture coordinates
116         float st[2];
117         // lightmap coordinates
118         float uv[2];
119 }
120 surfvertex_t;
121
122 // LordHavoc: replaces glpoly, triangle mesh
123 typedef struct surfmesh_s
124 {
125         // can be multiple meshs per surface
126         struct surfmesh_s *chain;
127         int numverts;
128         int numtriangles;
129         surfvertex_t *vertex;
130         int *index;
131 }
132 surfmesh_t;
133
134 typedef struct msurface_s
135 {
136         // should be drawn if visframe == r_framecount (set by WorldNode functions)
137         int                     visframe;
138
139         // the node plane this is on, backwards if SURF_PLANEBACK flag set
140         mplane_t        *plane;
141         // SURF_ flags
142         int                     flags;
143         struct Cshader_s        *shader;
144         struct msurface_s       *chain; // shader rendering chain
145
146         // look up in model->surfedges[], negative numbers are backwards edges
147         int                     firstedge;
148         int                     numedges;
149
150         short           texturemins[2];
151         short           extents[2];
152
153         mtexinfo_t      *texinfo;
154         texture_t       *currenttexture; // updated (animated) during early surface processing each frame
155
156         // index into d_lightstylevalue array, 255 means not used (black)
157         qbyte           styles[MAXLIGHTMAPS];
158         // RGB lighting data [numstyles][height][width][3]
159         qbyte           *samples;
160         // stain to apply on lightmap (soot/dirt/blood/whatever)
161         qbyte           *stainsamples;
162
163         // these fields are generated during model loading
164         // the lightmap texture fragment to use on the surface
165         rtexture_t *lightmaptexture;
166         // the stride when building lightmaps to comply with fragment update
167         int                     lightmaptexturestride;
168         // mesh for rendering
169         surfmesh_t      *mesh;
170
171         // these are just 3D points defining the outline of the polygon,
172         // no texcoord info (that can be generated from these)
173         int                     poly_numverts;
174         float           *poly_verts;
175
176         // these are regenerated every frame
177         // lighting info
178         int                     dlightframe;
179         int                     dlightbits[8];
180         // avoid redundent addition of dlights
181         int                     lightframe;
182         // only render each surface once
183         int                     worldnodeframe;
184         // marked when surface is prepared for the frame
185         int                     insertframe;
186
187         // these cause lightmap updates if regenerated
188         // values currently used in lightmap
189         unsigned short cached_light[MAXLIGHTMAPS];
190         // if lightmap was lit by dynamic lights, force update on next frame
191         short           cached_dlight;
192         // to cause lightmap to be rerendered when v_overbrightbits changes
193         short           cached_lightscalebit;
194         // rerender lightmaps when r_ambient changes
195         float           cached_ambient;
196 }
197 msurface_t;
198
199 #define SHADERSTAGE_SKY 0
200 #define SHADERSTAGE_NORMAL 1
201 #define SHADERSTAGE_COUNT 2
202
203 // change this stuff when real shaders are added
204 typedef struct Cshader_s
205 {
206         void (*shaderfunc[SHADERSTAGE_COUNT])(msurface_t *firstsurf);
207         // list of surfaces using this shader (used during surface rendering)
208         msurface_t *chain;
209 }
210 Cshader_t;
211
212 extern Cshader_t Cshader_wall_vertex;
213 extern Cshader_t Cshader_wall_lightmap;
214 extern Cshader_t Cshader_wall_fullbright;
215 extern Cshader_t Cshader_water;
216 extern Cshader_t Cshader_sky;
217
218 // warning: if this is changed, references must be updated in cpu_* assembly files
219 typedef struct mnode_s
220 {
221 // common with leaf
222         int                                     contents;               // 0, to differentiate from leafs
223
224         struct mnode_s          *parent;
225         struct mportal_s        *portals;
226
227         // for bounding box culling
228         vec3_t                          mins;
229         vec3_t                          maxs;
230
231 // node specific
232         mplane_t                        *plane;
233         struct mnode_s          *children[2];
234
235         unsigned short          firstsurface;
236         unsigned short          numsurfaces;
237 }
238 mnode_t;
239
240 typedef struct mleaf_s
241 {
242 // common with node
243         int                                     contents;               // will be a negative contents number
244
245         struct mnode_s          *parent;
246         struct mportal_s        *portals;
247
248         // for bounding box culling
249         vec3_t                          mins;
250         vec3_t                          maxs;
251
252 // leaf specific
253         int                                     visframe;               // visible if current (r_framecount)
254         int                                     worldnodeframe; // used by certain worldnode variants to avoid processing the same leaf twice in a frame
255         int                                     portalmarkid;   // used by polygon-through-portals visibility checker
256
257         // LordHavoc: leaf based dynamic lighting
258         int                                     dlightbits[8];
259         int                                     dlightframe;
260
261         qbyte                           *compressed_vis;
262
263         msurface_t                      **firstmarksurface;
264         int                                     nummarksurfaces;
265         qbyte                           ambient_sound_level[NUM_AMBIENTS];
266 }
267 mleaf_t;
268
269 typedef struct
270 {
271         dclipnode_t     *clipnodes;
272         mplane_t        *planes;
273         int                     firstclipnode;
274         int                     lastclipnode;
275         vec3_t          clip_mins;
276         vec3_t          clip_maxs;
277         vec3_t          clip_size;
278 }
279 hull_t;
280
281 typedef struct mportal_s
282 {
283         struct mportal_s *next; // the next portal on this leaf
284         mleaf_t *here; // the leaf this portal is on
285         mleaf_t *past; // the leaf through this portal (infront)
286         mvertex_t *points;
287         int numpoints;
288         mplane_t plane;
289         int visframe; // is this portal visible this frame?
290 }
291 mportal_t;
292
293 typedef struct mlight_s
294 {
295         vec3_t origin;
296         float falloff;
297         vec3_t light;
298         float subtract;
299         vec3_t spotdir;
300         float spotcone; // cosine of spotlight cone angle (or 0 if not a spotlight)
301         float distbias;
302         int style;
303         int numleafs; // used only for loading calculations, number of leafs this shines on
304 }
305 mlight_t;
306
307 extern rtexture_t *r_notexture;
308 extern texture_t r_notexture_mip;
309
310 struct model_s;
311 void Mod_LoadBrushModel (struct model_s *mod, void *buffer);
312 void Mod_BrushInit(void);
313 void Mod_FindNonSolidLocation(vec3_t pos, struct model_s *mod);
314
315 #endif
316