1 /*
2 ===========================================================================
3
4 Return to Castle Wolfenstein single player GPL Source Code
5 Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company.
6
7 This file is part of the Return to Castle Wolfenstein single player GPL Source Code (RTCW SP Source Code).
8
9 RTCW SP Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 RTCW SP Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with RTCW SP Source Code. If not, see <http://www.gnu.org/licenses/>.
21
22 In addition, the RTCW SP Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the RTCW SP Source Code. If not, please request a copy in writing from id Software at the address below.
23
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
25
26 ===========================================================================
27 */
28
29
30 #ifndef TR_LOCAL_H
31 #define TR_LOCAL_H
32
33 #include "../qcommon/q_shared.h"
34 #include "../qcommon/qfiles.h"
35 #include "../qcommon/qcommon.h"
36 #include "../renderer/tr_public.h"
37 #include "qgl.h"
38 #include "../renderer/iqm.h"
39
40 #define GLE(ret, name, ...) extern name##proc * qgl##name;
41 QGL_1_1_PROCS;
42 QGL_DESKTOP_1_1_PROCS;
43 QGL_1_3_PROCS;
44 QGL_1_5_PROCS;
45 QGL_2_0_PROCS;
46 QGL_3_0_PROCS;
47 QGL_ARB_occlusion_query_PROCS;
48 QGL_ARB_framebuffer_object_PROCS;
49 QGL_ARB_vertex_array_object_PROCS;
50 QGL_EXT_direct_state_access_PROCS;
51 #undef GLE
52
53 #define GL_INDEX_TYPE GL_UNSIGNED_INT
54 typedef unsigned int glIndex_t;
55
56 #define BUFFER_OFFSET(i) ((char *)NULL + (i))
57
58 // 11 bits
59 // can't be increased without changing bit packing for drawsurfs
60 // see QSORT_SHADERNUM_SHIFT
61
62 #define SHADERNUM_BITS 11
63 #define MAX_SHADERS (1<<SHADERNUM_BITS)
64
65 #define MAX_FBOS 64
66 #define MAX_VISCOUNTS 5
67 #define MAX_VAOS 4096
68
69 #define MAX_CALC_PSHADOWS 64
70 #define MAX_DRAWN_PSHADOWS 32 // do not increase past 32, because bit flags are used on surfaces
71 #define PSHADOW_MAP_SIZE 512
72
73 // a trRefEntity_t has all the information passed in by
74 // the client game, as well as some locally derived info
75 typedef struct {
76 refEntity_t e;
77
78 float axisLength; // compensate for non-normalized axis
79
80 qboolean needDlights; // true for bmodels that touch a dlight
81 qboolean lightingCalculated;
82 qboolean mirrored; // mirrored matrix, needs reversed culling
83 vec3_t lightDir; // normalized direction towards light, in world space
84 vec3_t modelLightDir; // normalized direction towards light, in model space
85 vec3_t ambientLight; // color normalized to 0-255
86 vec3_t directedLight;
87 float brightness;
88 } trRefEntity_t;
89
90 typedef struct {
91 vec3_t origin; // in world coordinates
92 vec3_t axis[3]; // orientation in world
93 vec3_t viewOrigin; // viewParms->or.origin in local coordinates
94 float modelMatrix[16];
95 float transformMatrix[16];
96 } orientationr_t;
97
98 typedef enum
99 {
100 IMGTYPE_COLORALPHA, // for color, lightmap, diffuse, and specular
101 IMGTYPE_NORMAL,
102 IMGTYPE_NORMALHEIGHT,
103 IMGTYPE_DELUXE, // normals are swizzled, deluxe are not
104 } imgType_t;
105
106 typedef enum
107 {
108 IMGFLAG_NONE = 0x0000,
109 IMGFLAG_MIPMAP = 0x0001,
110 IMGFLAG_PICMIP = 0x0002,
111 IMGFLAG_CUBEMAP = 0x0004,
112 IMGFLAG_NO_COMPRESSION = 0x0010,
113 IMGFLAG_NOLIGHTSCALE = 0x0020,
114 IMGFLAG_CLAMPTOEDGE = 0x0040,
115 IMGFLAG_GENNORMALMAP = 0x0080,
116 } imgFlags_t;
117
118 typedef struct image_s {
119 char imgName[MAX_QPATH]; // game path, including extension
120 int width, height; // source image
121 int uploadWidth, uploadHeight; // after power of two and picmip but not including clamp to MAX_TEXTURE_SIZE
122 GLuint texnum; // gl texture binding
123
124 int frameUsed; // for texture usage in frame statistics
125
126 int internalFormat;
127 int TMU; // only needed for voodoo2
128
129 imgType_t type;
130 imgFlags_t flags;
131
132 qboolean characterMIP; // independant 'character' mip scale ----(SA) added
133
134 int hash; // for fast building of the backupHash
135
136 struct image_s* next;
137 } image_t;
138
139 #include "tr_extratypes.h"
140 #include "tr_extramath.h"
141 #include "tr_fbo.h"
142 #include "tr_postprocess.h"
143
144 // Ensure this is >= the ATTR_INDEX_COUNT enum below
145 #define VAO_MAX_ATTRIBS 16
146
147 typedef enum
148 {
149 VAO_USAGE_STATIC,
150 VAO_USAGE_DYNAMIC
151 } vaoUsage_t;
152
153 typedef struct vaoAttrib_s
154 {
155 uint32_t enabled;
156 uint32_t count;
157 uint32_t type;
158 uint32_t normalized;
159 uint32_t stride;
160 uint32_t offset;
161 }
162 vaoAttrib_t;
163
164 typedef struct vao_s
165 {
166 char name[MAX_QPATH];
167
168 uint32_t vao;
169
170 uint32_t vertexesVBO;
171 int vertexesSize; // amount of memory data allocated for all vertices in bytes
172 vaoAttrib_t attribs[VAO_MAX_ATTRIBS];
173
174 uint32_t frameSize; // bytes to skip per frame when doing vertex animation
175
176 uint32_t indexesIBO;
177 int indexesSize; // amount of memory data allocated for all triangles in bytes
178 } vao_t;
179
180 //===============================================================================
181
182 typedef enum {
183 SS_BAD,
184 SS_PORTAL, // mirrors, portals, viewscreens
185 SS_ENVIRONMENT, // sky box
186 SS_OPAQUE, // opaque
187
188 SS_DECAL, // scorch marks, etc.
189 SS_SEE_THROUGH, // ladders, grates, grills that may have small blended edges
190 // in addition to alpha test
191 SS_BANNER,
192
193 SS_FOG,
194
195 SS_UNDERWATER, // for items that should be drawn in front of the water plane
196
197 SS_BLEND0, // regular transparency and filters
198 SS_BLEND1, // generally only used for additive type effects
199 SS_BLEND2,
200 SS_BLEND3,
201
202 SS_BLEND6,
203 SS_STENCIL_SHADOW,
204 SS_ALMOST_NEAREST, // gun smoke puffs
205
206 SS_NEAREST // blood blobs
207 } shaderSort_t;
208
209
210 #define MAX_SHADER_STAGES 8
211
212 typedef enum {
213 GF_NONE,
214
215 GF_SIN,
216 GF_SQUARE,
217 GF_TRIANGLE,
218 GF_SAWTOOTH,
219 GF_INVERSE_SAWTOOTH,
220
221 GF_NOISE
222
223 } genFunc_t;
224
225
226 typedef enum {
227 DEFORM_NONE,
228 DEFORM_WAVE,
229 DEFORM_NORMALS,
230 DEFORM_BULGE,
231 DEFORM_MOVE,
232 DEFORM_PROJECTION_SHADOW,
233 DEFORM_AUTOSPRITE,
234 DEFORM_AUTOSPRITE2,
235 DEFORM_TEXT0,
236 DEFORM_TEXT1,
237 DEFORM_TEXT2,
238 DEFORM_TEXT3,
239 DEFORM_TEXT4,
240 DEFORM_TEXT5,
241 DEFORM_TEXT6,
242 DEFORM_TEXT7
243 } deform_t;
244
245 // deformVertexes types that can be handled by the GPU
246 typedef enum
247 {
248 // do not edit: same as genFunc_t
249
250 DGEN_NONE,
251 DGEN_WAVE_SIN,
252 DGEN_WAVE_SQUARE,
253 DGEN_WAVE_TRIANGLE,
254 DGEN_WAVE_SAWTOOTH,
255 DGEN_WAVE_INVERSE_SAWTOOTH,
256 DGEN_WAVE_NOISE,
257
258 // do not edit until this line
259
260 DGEN_BULGE,
261 DGEN_MOVE
262 } deformGen_t;
263
264 typedef enum {
265 AGEN_IDENTITY,
266 AGEN_SKIP,
267 AGEN_ENTITY,
268 AGEN_ONE_MINUS_ENTITY,
269 AGEN_NORMALZFADE, // Ridah
270 AGEN_VERTEX,
271 AGEN_ONE_MINUS_VERTEX,
272 AGEN_LIGHTING_SPECULAR,
273 AGEN_WAVEFORM,
274 AGEN_PORTAL,
275 AGEN_CONST
276 } alphaGen_t;
277
278 typedef enum {
279 CGEN_BAD,
280 CGEN_IDENTITY_LIGHTING, // tr.identityLight
281 CGEN_IDENTITY, // always (1,1,1,1)
282 CGEN_ENTITY, // grabbed from entity's modulate field
283 CGEN_ONE_MINUS_ENTITY, // grabbed from 1 - entity.modulate
284 CGEN_EXACT_VERTEX, // tess.color
285 CGEN_VERTEX, // tess.color * tr.identityLight
286 CGEN_EXACT_VERTEX_LIT, // like CGEN_EXACT_VERTEX but takes a light direction from the lightgrid
287 CGEN_VERTEX_LIT, // like CGEN_VERTEX but takes a light direction from the lightgrid
288 CGEN_ONE_MINUS_VERTEX,
289 CGEN_WAVEFORM, // programmatically generated
290 CGEN_LIGHTING_DIFFUSE,
291 CGEN_FOG, // standard fog
292 CGEN_CONST // fixed color
293 } colorGen_t;
294
295 typedef enum {
296 TCGEN_BAD,
297 TCGEN_IDENTITY, // clear to 0,0
298 TCGEN_LIGHTMAP,
299 TCGEN_TEXTURE,
300 TCGEN_ENVIRONMENT_MAPPED,
301 TCGEN_FIRERISEENV_MAPPED,
302 TCGEN_FOG,
303 TCGEN_VECTOR // S and T from world coordinates
304 } texCoordGen_t;
305
306 typedef enum {
307 ACFF_NONE,
308 ACFF_MODULATE_RGB,
309 ACFF_MODULATE_RGBA,
310 ACFF_MODULATE_ALPHA
311 } acff_t;
312
313 typedef struct {
314 genFunc_t func;
315
316 float base;
317 float amplitude;
318 float phase;
319 float frequency;
320 } waveForm_t;
321
322 #define TR_MAX_TEXMODS 4
323
324 typedef enum {
325 TMOD_NONE,
326 TMOD_TRANSFORM,
327 TMOD_TURBULENT,
328 TMOD_SCROLL,
329 TMOD_SCALE,
330 TMOD_STRETCH,
331 TMOD_ROTATE,
332 TMOD_ENTITY_TRANSLATE,
333 TMOD_SWAP
334 } texMod_t;
335
336 #define MAX_SHADER_DEFORMS 3
337 typedef struct {
338 deform_t deformation; // vertex coordinate modification type
339
340 vec3_t moveVector;
341 waveForm_t deformationWave;
342 float deformationSpread;
343
344 float bulgeWidth;
345 float bulgeHeight;
346 float bulgeSpeed;
347 } deformStage_t;
348
349
350 typedef struct {
351 texMod_t type;
352
353 // used for TMOD_TURBULENT and TMOD_STRETCH
354 waveForm_t wave;
355
356 // used for TMOD_TRANSFORM
357 float matrix[2][2]; // s' = s * m[0][0] + t * m[1][0] + trans[0]
358 float translate[2]; // t' = s * m[0][1] + t * m[0][1] + trans[1]
359
360 // used for TMOD_SCALE
361 float scale[2]; // s *= scale[0]
362 // t *= scale[1]
363
364 // used for TMOD_SCROLL
365 float scroll[2]; // s' = s + scroll[0] * time
366 // t' = t + scroll[1] * time
367
368 // + = clockwise
369 // - = counterclockwise
370 float rotateSpeed;
371
372 } texModInfo_t;
373
374
375 // RF increased this for onfire animation
376 //#define MAX_IMAGE_ANIMATIONS 8
377 #define MAX_IMAGE_ANIMATIONS 16
378
379 typedef struct {
380 image_t *image[MAX_IMAGE_ANIMATIONS];
381 int numImageAnimations;
382 float imageAnimationSpeed;
383
384 texCoordGen_t tcGen;
385 vec3_t tcGenVectors[2];
386
387 int numTexMods;
388 texModInfo_t *texMods;
389
390 int videoMapHandle;
391 qboolean isLightmap;
392 qboolean isVideoMap;
393 } textureBundle_t;
394
395 enum
396 {
397 TB_COLORMAP = 0,
398 TB_DIFFUSEMAP = 0,
399 TB_LIGHTMAP = 1,
400 TB_LEVELSMAP = 1,
401 TB_SHADOWMAP3 = 1,
402 TB_NORMALMAP = 2,
403 TB_DELUXEMAP = 3,
404 TB_SHADOWMAP2 = 3,
405 TB_SPECULARMAP = 4,
406 TB_SHADOWMAP = 5,
407 TB_CUBEMAP = 6,
408 TB_SHADOWMAP4 = 6,
409 NUM_TEXTURE_BUNDLES = 7
410 };
411
412 typedef enum
413 {
414 // material shader stage types
415 ST_COLORMAP = 0, // vanilla Q3A style shader treatening
416 ST_DIFFUSEMAP = 0, // treat color and diffusemap the same
417 ST_NORMALMAP,
418 ST_NORMALPARALLAXMAP,
419 ST_SPECULARMAP,
420 ST_GLSL
421 } stageType_t;
422
423 typedef struct {
424 qboolean active;
425
426 textureBundle_t bundle[NUM_TEXTURE_BUNDLES];
427
428 waveForm_t rgbWave;
429 colorGen_t rgbGen;
430
431 waveForm_t alphaWave;
432 alphaGen_t alphaGen;
433
434 byte constantColor[4]; // for CGEN_CONST and AGEN_CONST
435
436 unsigned stateBits; // GLS_xxxx mask
437
438 acff_t adjustColorsForFog;
439
440 // Ridah
441 float zFadeBounds[2];
442
443 qboolean isDetail;
444 qboolean isFogged; // used only for shaders that have fog disabled, so we can enable it for individual stages
445
446 stageType_t type;
447 struct shaderProgram_s *glslShaderGroup;
448 int glslShaderIndex;
449
450 vec4_t normalScale;
451 vec4_t specularScale;
452
453 } shaderStage_t;
454
455 struct shaderCommands_s;
456
457 // any change in the LIGHTMAP_* defines here MUST be reflected in
458 // R_FindShader() in tr_bsp.c
459 #define LIGHTMAP_2D -4 // shader is for 2D rendering
460 #define LIGHTMAP_BY_VERTEX -3 // pre-lit triangle models
461 #define LIGHTMAP_WHITEIMAGE -2
462 #define LIGHTMAP_NONE -1
463
464 typedef enum {
465 CT_FRONT_SIDED,
466 CT_BACK_SIDED,
467 CT_TWO_SIDED
468 } cullType_t;
469
470 typedef enum {
471 FP_NONE, // surface is translucent and will just be adjusted properly
472 FP_EQUAL, // surface is opaque but possibly alpha tested
473 FP_LE // surface is trnaslucent, but still needs a fog pass (fog surface)
474 } fogPass_t;
475
476 typedef struct {
477 float cloudHeight;
478 image_t *outerbox[6], *innerbox[6];
479 } skyParms_t;
480
481 typedef struct {
482 vec3_t color;
483 float depthForOpaque;
484 } fogParms_t;
485
486
487 typedef struct shader_s {
488 char name[MAX_QPATH]; // game path, including extension
489 int lightmapIndex; // for a shader to match, both name and lightmapIndex must match
490
491 int index; // this shader == tr.shaders[index]
492 int sortedIndex; // this shader == tr.sortedShaders[sortedIndex]
493
494 float sort; // lower numbered shaders draw before higher numbered
495
496 qboolean defaultShader; // we want to return index 0 if the shader failed to
497 // load for some reason, but R_FindShader should
498 // still keep a name allocated for it, so if
499 // something calls RE_RegisterShader again with
500 // the same name, we don't try looking for it again
501
502 qboolean explicitlyDefined; // found in a .shader file
503
504 int surfaceFlags; // if explicitlyDefined, this will have SURF_* flags
505 int contentFlags;
506
507 qboolean entityMergable; // merge across entites optimizable (smoke, blood)
508
509 qboolean isSky;
510 skyParms_t sky;
511 fogParms_t fogParms;
512
513 float portalRange; // distance to fog out at
514 qboolean isPortal;
515
516 cullType_t cullType; // CT_FRONT_SIDED, CT_BACK_SIDED, or CT_TWO_SIDED
517 qboolean polygonOffset; // set for decals and other items that must be offset
518 qboolean noMipMaps; // for console fonts, 2D elements, etc.
519 qboolean noPicMip; // for images that must always be full resolution
520 qboolean characterMip; // use r_picmip2 rather than r_picmip
521
522 fogPass_t fogPass; // draw a blended pass, possibly with depth test equals
523
524 int vertexAttribs; // not all shaders will need all data to be gathered
525
526 // Ridah
527 qboolean noFog;
528
529 int numDeforms;
530 deformStage_t deforms[MAX_SHADER_DEFORMS];
531
532 int numUnfoggedPasses;
533 shaderStage_t *stages[MAX_SHADER_STAGES];
534
535 void ( *optimalStageIteratorFunc )( void );
536
537 double clampTime; // time this shader is clamped to
538 double timeOffset; // current time offset for this shader
539
540 struct shader_s *remappedShader; // current shader this one is remapped too
541
542 struct shader_s *next;
543 } shader_t;
544
545 typedef struct cubemap_s {
546 char name[MAX_QPATH];
547 vec3_t origin;
548 float parallaxRadius;
549 image_t *image;
550 } cubemap_t;
551
552 typedef struct corona_s {
553 vec3_t origin;
554 vec3_t color; // range from 0.0 to 1.0, should be color normalized
555 vec3_t transformed; // origin in local coordinate system
556 float scale; // uses r_flaresize as the baseline (1.0)
557 int id;
558 int flags; // '1' is 'visible'
559 // still send the corona request, even if not visible, for proper fading
560 } corona_t;
561
562 typedef struct dlight_s {
563 vec3_t origin;
564 vec3_t color; // range from 0.0 to 1.0, should be color normalized
565 float radius;
566
567 vec3_t transformed; // origin in local coordinate system
568 int additive; // texture detail is lost tho when the lightmap is dark
569
570 // Ridah
571 int overdraw;
572 // done.
573
574 shader_t *dlshader; //----(SA) adding a shader to dlights, so, if desired, we can change the blend or texture of a dlight
575
576 qboolean forced; //----(SA) use this dlight when r_dynamiclight is either 1 or 2 (rather than just 1) for "important" gameplay lights (alarm lights, etc)
577 //done
578
579 } dlight_t;
580
581 enum
582 {
583 ATTR_INDEX_POSITION = 0,
584 ATTR_INDEX_TEXCOORD = 1,
585 ATTR_INDEX_LIGHTCOORD = 2,
586 ATTR_INDEX_TANGENT = 3,
587 ATTR_INDEX_NORMAL = 4,
588 ATTR_INDEX_COLOR = 5,
589 ATTR_INDEX_PAINTCOLOR = 6,
590 ATTR_INDEX_LIGHTDIRECTION = 7,
591 ATTR_INDEX_BONE_INDEXES = 8,
592 ATTR_INDEX_BONE_WEIGHTS = 9,
593
594 // GPU vertex animations
595 ATTR_INDEX_POSITION2 = 10,
596 ATTR_INDEX_TANGENT2 = 11,
597 ATTR_INDEX_NORMAL2 = 12,
598
599 ATTR_INDEX_COUNT = 13
600 };
601
602 enum
603 {
604 ATTR_POSITION = 1 << ATTR_INDEX_POSITION,
605 ATTR_TEXCOORD = 1 << ATTR_INDEX_TEXCOORD,
606 ATTR_LIGHTCOORD = 1 << ATTR_INDEX_LIGHTCOORD,
607 ATTR_TANGENT = 1 << ATTR_INDEX_TANGENT,
608 ATTR_NORMAL = 1 << ATTR_INDEX_NORMAL,
609 ATTR_COLOR = 1 << ATTR_INDEX_COLOR,
610 ATTR_PAINTCOLOR = 1 << ATTR_INDEX_PAINTCOLOR,
611 ATTR_LIGHTDIRECTION = 1 << ATTR_INDEX_LIGHTDIRECTION,
612 ATTR_BONE_INDEXES = 1 << ATTR_INDEX_BONE_INDEXES,
613 ATTR_BONE_WEIGHTS = 1 << ATTR_INDEX_BONE_WEIGHTS,
614
615 // for .md3 interpolation
616 ATTR_POSITION2 = 1 << ATTR_INDEX_POSITION2,
617 ATTR_TANGENT2 = 1 << ATTR_INDEX_TANGENT2,
618 ATTR_NORMAL2 = 1 << ATTR_INDEX_NORMAL2,
619
620 ATTR_DEFAULT = ATTR_POSITION,
621 ATTR_BITS = ATTR_POSITION |
622 ATTR_TEXCOORD |
623 ATTR_LIGHTCOORD |
624 ATTR_TANGENT |
625 ATTR_NORMAL |
626 ATTR_COLOR |
627 ATTR_PAINTCOLOR |
628 ATTR_LIGHTDIRECTION |
629 ATTR_BONE_INDEXES |
630 ATTR_BONE_WEIGHTS |
631 ATTR_POSITION2 |
632 ATTR_TANGENT2 |
633 ATTR_NORMAL2
634 };
635
636 enum
637 {
638 GENERICDEF_USE_DEFORM_VERTEXES = 0x0001,
639 GENERICDEF_USE_TCGEN_AND_TCMOD = 0x0002,
640 GENERICDEF_USE_VERTEX_ANIMATION = 0x0004,
641 GENERICDEF_USE_FOG = 0x0008,
642 GENERICDEF_USE_RGBAGEN = 0x0010,
643 GENERICDEF_USE_WOLF_FOG_LINEAR = 0x0020,
644 GENERICDEF_USE_WOLF_FOG_EXPONENTIAL = 0x0040,
645 GENERICDEF_USE_BONE_ANIMATION = 0x0080,
646 GENERICDEF_ALL = 0x00FF,
647 GENERICDEF_COUNT = 0x0100,
648 };
649
650 enum
651 {
652 FOGDEF_USE_DEFORM_VERTEXES = 0x0001,
653 FOGDEF_USE_VERTEX_ANIMATION = 0x0002,
654 FOGDEF_USE_WOLF_FOG_LINEAR = 0x0004,
655 FOGDEF_USE_WOLF_FOG_EXPONENTIAL = 0x0008,
656 FOGDEF_USE_BONE_ANIMATION = 0x0010,
657 FOGDEF_ALL = 0x001F,
658 FOGDEF_COUNT = 0x0020,
659 };
660
661 enum
662 {
663 DLIGHTDEF_USE_DEFORM_VERTEXES = 0x0001,
664 DLIGHTDEF_ALL = 0x0001,
665 DLIGHTDEF_COUNT = 0x0002,
666 };
667
668 enum
669 {
670 LIGHTDEF_USE_LIGHTMAP = 0x0001,
671 LIGHTDEF_USE_LIGHT_VECTOR = 0x0002,
672 LIGHTDEF_USE_LIGHT_VERTEX = 0x0003,
673 LIGHTDEF_LIGHTTYPE_MASK = 0x0003,
674 LIGHTDEF_ENTITY_VERTEX_ANIMATION = 0x0004,
675 LIGHTDEF_USE_TCGEN_AND_TCMOD = 0x0008,
676 LIGHTDEF_USE_PARALLAXMAP = 0x0010,
677 LIGHTDEF_USE_SHADOWMAP = 0x0020,
678 LIGHTDEF_ENTITY_BONE_ANIMATION = 0x0040,
679 LIGHTDEF_ALL = 0x007F,
680 LIGHTDEF_COUNT = 0x0080
681 };
682
683 enum
684 {
685 SHADOWMAPDEF_USE_VERTEX_ANIMATION = 0x0001,
686 SHADOWMAPDEF_USE_BONE_ANIMATION = 0x0002,
687 SHADOWMAPDEF_ALL = 0x0003,
688 SHADOWMAPDEF_COUNT = 0x0004
689 };
690
691 enum
692 {
693 GLSL_INT,
694 GLSL_FLOAT,
695 GLSL_FLOAT5,
696 GLSL_VEC2,
697 GLSL_VEC3,
698 GLSL_VEC4,
699 GLSL_MAT16,
700 GLSL_MAT16_BONEMATRIX
701 };
702
703 typedef enum
704 {
705 UNIFORM_DIFFUSEMAP = 0,
706 UNIFORM_LIGHTMAP,
707 UNIFORM_NORMALMAP,
708 UNIFORM_DELUXEMAP,
709 UNIFORM_SPECULARMAP,
710
711 UNIFORM_TEXTUREMAP,
712 UNIFORM_LEVELSMAP,
713 UNIFORM_CUBEMAP,
714
715 UNIFORM_SCREENIMAGEMAP,
716 UNIFORM_SCREENDEPTHMAP,
717
718 UNIFORM_SHADOWMAP,
719 UNIFORM_SHADOWMAP2,
720 UNIFORM_SHADOWMAP3,
721 UNIFORM_SHADOWMAP4,
722
723 UNIFORM_SHADOWMVP,
724 UNIFORM_SHADOWMVP2,
725 UNIFORM_SHADOWMVP3,
726 UNIFORM_SHADOWMVP4,
727
728 UNIFORM_ENABLETEXTURES,
729
730 UNIFORM_DIFFUSETEXMATRIX,
731 UNIFORM_DIFFUSETEXOFFTURB,
732
733 UNIFORM_TCGEN0,
734 UNIFORM_TCGEN0VECTOR0,
735 UNIFORM_TCGEN0VECTOR1,
736
737 UNIFORM_DEFORMGEN,
738 UNIFORM_DEFORMPARAMS,
739
740 UNIFORM_COLORGEN,
741 UNIFORM_ALPHAGEN,
742 UNIFORM_COLOR,
743 UNIFORM_BASECOLOR,
744 UNIFORM_VERTCOLOR,
745
746 UNIFORM_DLIGHTINFO,
747 UNIFORM_LIGHTFORWARD,
748 UNIFORM_LIGHTUP,
749 UNIFORM_LIGHTRIGHT,
750 UNIFORM_LIGHTORIGIN,
751 UNIFORM_MODELLIGHTDIR,
752 UNIFORM_LIGHTRADIUS,
753 UNIFORM_AMBIENTLIGHT,
754 UNIFORM_DIRECTEDLIGHT,
755
756 UNIFORM_PORTALRANGE,
757
758 UNIFORM_FOGDISTANCE,
759 UNIFORM_FOGDEPTH,
760 UNIFORM_FOGEYET,
761 UNIFORM_FOGCOLORMASK,
762
763 UNIFORM_MODELMATRIX,
764 UNIFORM_MODELVIEWPROJECTIONMATRIX,
765
766 UNIFORM_TIME,
767 UNIFORM_VERTEXLERP,
768 UNIFORM_NORMALSCALE,
769 UNIFORM_SPECULARSCALE,
770
771 UNIFORM_VIEWINFO, // znear, zfar, width/2, height/2
772 UNIFORM_VIEWORIGIN,
773 UNIFORM_LOCALVIEWORIGIN,
774 UNIFORM_VIEWFORWARD,
775 UNIFORM_VIEWLEFT,
776 UNIFORM_VIEWUP,
777
778 UNIFORM_INVTEXRES,
779 UNIFORM_AUTOEXPOSUREMINMAX,
780 UNIFORM_TONEMINAVGMAXLINEAR,
781
782 UNIFORM_PRIMARYLIGHTORIGIN,
783 UNIFORM_PRIMARYLIGHTCOLOR,
784 UNIFORM_PRIMARYLIGHTAMBIENT,
785 UNIFORM_PRIMARYLIGHTRADIUS,
786
787 UNIFORM_CUBEMAPINFO,
788
789 UNIFORM_ALPHATEST,
790
791 UNIFORM_BONEMATRIX,
792
793 UNIFORM_FIRERISEDIR,
794 UNIFORM_ZFADELOWEST,
795 UNIFORM_ZFADEHIGHEST,
796
797 UNIFORM_COUNT
798 } uniform_t;
799
800 // shaderProgram_t represents a pair of one
801 // GLSL vertex and one GLSL fragment shader
802 typedef struct shaderProgram_s
803 {
804 char name[MAX_QPATH];
805
806 GLuint program;
807 GLuint vertexShader;
808 GLuint fragmentShader;
809 uint32_t attribs; // vertex array attributes
810
811 // uniform parameters
812 GLint uniforms[UNIFORM_COUNT];
813 short uniformBufferOffsets[UNIFORM_COUNT]; // max 32767/64=511 uniforms
814 char *uniformBuffer;
815 } shaderProgram_t;
816
817 // trRefdef_t holds everything that comes in refdef_t,
818 // as well as the locally generated scene information
819 typedef struct {
820 int x, y, width, height;
821 float fov_x, fov_y;
822 vec3_t vieworg;
823 vec3_t viewaxis[3]; // transformation matrix
824
825 stereoFrame_t stereoFrame;
826
827 int time; // time in milliseconds for shader effects and other time dependent rendering issues
828 int rdflags; // RDF_NOWORLDMODEL, etc
829
830 // 1 bits will prevent the associated area from rendering at all
831 byte areamask[MAX_MAP_AREA_BYTES];
832 qboolean areamaskModified; // qtrue if areamask changed since last scene
833
834 double floatTime; // tr.refdef.time / 1000.0
835
836 float blurFactor;
837
838 // text messages for deform text shaders
839 char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH];
840
841 int num_entities;
842 trRefEntity_t *entities;
843
844 int num_dlights;
845 struct dlight_s *dlights;
846
847 int num_coronas;
848 struct corona_s *coronas;
849
850 int numPolys;
851 struct srfPoly_s *polys;
852
853 int numDrawSurfs;
854 struct drawSurf_s *drawSurfs;
855
856 unsigned int dlightMask;
857 int num_pshadows;
858 struct pshadow_s *pshadows;
859
860 float sunShadowMvp[4][16];
861 float sunDir[4];
862 float sunCol[4];
863 float sunAmbCol[4];
864
865 float autoExposureMinMax[2];
866 float toneMinAvgMaxLinear[3];
867 } trRefdef_t;
868
869
870 //=================================================================================
871
872 // max surfaces per-skin
873 // This is an arbitry limit. Vanilla Q3 only supported 32 surfaces in skins but failed to
874 // enforce the maximum limit when reading skin files. It was possile to use more than 32
875 // surfaces which accessed out of bounds memory past end of skin->surfaces hunk block.
876 #define MAX_SKIN_SURFACES 256
877
878 // skins allow models to be retextured without modifying the model file
879 typedef struct {
880 char name[MAX_QPATH];
881 shader_t *shader;
882 } skinSurface_t;
883
884 //----(SA) modified
885 #define MAX_PART_MODELS 5
886
887 typedef struct {
888 char type[MAX_QPATH]; // md3_lower, md3_lbelt, md3_rbelt, etc.
889 char model[MAX_QPATH]; // lower.md3, belt1.md3, etc.
890 } skinModel_t;
891
892 typedef struct skin_s {
893 char name[MAX_QPATH]; // game path, including extension
894 int numSurfaces;
895 int numModels;
896 skinSurface_t *surfaces; // dynamically allocated array of surfaces
897 skinModel_t *models[MAX_PART_MODELS];
898 vec3_t scale; //----(SA) added
899 } skin_t;
900 //----(SA) end
901
902 typedef struct {
903 int originalBrushNumber;
904 vec3_t bounds[2];
905
906 unsigned colorInt; // in packed byte format
907 float tcScale; // texture coordinate vector scales
908 fogParms_t parms;
909
910 // for clipping distance in fog when outside
911 qboolean hasSurface;
912 float surface[4];
913 } fog_t;
914
915 typedef enum {
916 VPF_NONE = 0x00,
917 VPF_NOVIEWMODEL = 0x01,
918 VPF_SHADOWMAP = 0x02,
919 VPF_DEPTHSHADOW = 0x04,
920 VPF_DEPTHCLAMP = 0x08,
921 VPF_ORTHOGRAPHIC = 0x10,
922 VPF_USESUNLIGHT = 0x20,
923 VPF_FARPLANEFRUSTUM = 0x40,
924 VPF_NOCUBEMAPS = 0x80
925 } viewParmFlags_t;
926
927 typedef struct {
928 orientationr_t or;
929 orientationr_t world;
930 vec3_t pvsOrigin; // may be different than or.origin for portals
931 qboolean isPortal; // true if this view is through a portal
932 qboolean isMirror; // the portal is a mirror, invert the face culling
933 viewParmFlags_t flags;
934 int frameSceneNum; // copied from tr.frameSceneNum
935 int frameCount; // copied from tr.frameCount
936 cplane_t portalPlane; // clip anything behind this if mirroring
937 int viewportX, viewportY, viewportWidth, viewportHeight;
938 FBO_t *targetFbo;
939 int targetFboLayer;
940 int targetFboCubemapIndex;
941 float fovX, fovY;
942 float projectionMatrix[16];
943 cplane_t frustum[5];
944 vec3_t visBounds[2];
945 float zFar;
946 float zNear;
947 stereoFrame_t stereoFrame;
948
949 int dirty;
950
951 glfog_t glFog; // fog parameters //----(SA) added
952
953 } viewParms_t;
954
955
956 /*
957 ==============================================================================
958
959 SURFACES
960
961 ==============================================================================
962 */
963
964 typedef byte color4ub_t[4];
965
966 // any changes in surfaceType must be mirrored in rb_surfaceTable[]
967 // NOTE: also mirror changes to max2skl.c
968 typedef enum {
969 SF_BAD,
970 SF_SKIP, // ignore
971 SF_FACE,
972 SF_GRID,
973 SF_TRIANGLES,
974 SF_POLY,
975 SF_MDV,
976 SF_MDS,
977 SF_MDR,
978 SF_IQM,
979 SF_FLARE,
980 SF_ENTITY, // beams, rails, lightning, etc that can be determined by entity
981 SF_VAO_MDVMESH,
982 SF_VAO_IQM,
983
984 SF_NUM_SURFACE_TYPES,
985 SF_MAX = 0xffffffff // ensures that sizeof( surfaceType_t ) == sizeof( int )
986 } surfaceType_t;
987
988 typedef struct drawSurf_s {
989 unsigned int sort; // bit combination for fast compares
990 int cubemapIndex;
991 surfaceType_t *surface; // any of surface*_t
992 } drawSurf_t;
993
994 #define MAX_FACE_POINTS 64
995
996 #define MAX_PATCH_SIZE 32 // max dimensions of a patch mesh in map file
997 #define MAX_GRID_SIZE 65 // max dimensions of a grid mesh in memory
998
999 // when cgame directly specifies a polygon, it becomes a srfPoly_t
1000 // as soon as it is called
1001 typedef struct srfPoly_s {
1002 surfaceType_t surfaceType;
1003 qhandle_t hShader;
1004 int fogIndex;
1005 int numVerts;
1006 polyVert_t *verts;
1007 } srfPoly_t;
1008
1009
1010 typedef struct srfFlare_s {
1011 surfaceType_t surfaceType;
1012 vec3_t origin;
1013 vec3_t normal;
1014 vec3_t color;
1015 } srfFlare_t;
1016
1017
1018 typedef struct
1019 {
1020 vec3_t xyz;
1021 vec2_t st;
1022 vec2_t lightmap;
1023 int16_t normal[4];
1024 int16_t tangent[4];
1025 int16_t lightdir[4];
1026 uint16_t color[4];
1027
1028 #if DEBUG_OPTIMIZEVERTICES
1029 unsigned int id;
1030 #endif
1031 } srfVert_t;
1032
1033 #define srfVert_t_cleared(x) srfVert_t (x) = {{0, 0, 0}, {0, 0}, {0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}
1034
1035 // srfBspSurface_t covers SF_GRID, SF_TRIANGLES, and SF_POLY
1036 typedef struct srfBspSurface_s
1037 {
1038 surfaceType_t surfaceType;
1039
1040 // dynamic lighting information
1041 int dlightBits;
1042 int pshadowBits;
1043
1044 // culling information
1045 vec3_t cullBounds[2];
1046 vec3_t cullOrigin;
1047 float cullRadius;
1048 cplane_t cullPlane;
1049
1050 // indexes
1051 int numIndexes;
1052 glIndex_t *indexes;
1053
1054 // vertexes
1055 int numVerts;
1056 srfVert_t *verts;
1057
1058 // SF_GRID specific variables after here
1059
1060 // lod information, which may be different
1061 // than the culling information to allow for
1062 // groups of curves that LOD as a unit
1063 vec3_t lodOrigin;
1064 float lodRadius;
1065 int lodFixed;
1066 int lodStitched;
1067
1068 // vertexes
1069 int width, height;
1070 float *widthLodError;
1071 float *heightLodError;
1072 } srfBspSurface_t;
1073
1074 // inter-quake-model
1075 typedef struct {
1076 int num_vertexes;
1077 int num_triangles;
1078 int num_frames;
1079 int num_surfaces;
1080 int num_joints;
1081 int num_poses;
1082 struct srfIQModel_s *surfaces;
1083
1084 int *triangles;
1085
1086 // vertex arrays
1087 float *positions;
1088 float *texcoords;
1089 float *normals;
1090 float *tangents;
1091 byte *colors;
1092 int *influences; // [num_vertexes] indexes into influenceBlendVertexes
1093 // unique list of vertex blend indexes/weights for faster CPU vertex skinning
1094 byte *influenceBlendIndexes; // [num_influences]
1095 union {
1096 float *f;
1097 byte *b;
1098 } influenceBlendWeights; // [num_influences]
1099
1100 // depending upon the exporter, blend indices and weights might be int/float
1101 // as opposed to the recommended byte/byte, for example Noesis exports
1102 // int/float whereas the official IQM tool exports byte/byte
1103 int blendWeightsType; // IQM_UBYTE or IQM_FLOAT
1104
1105 char *jointNames;
1106 int *jointParents;
1107 float *jointMats;
1108 float *poseMats;
1109 float *bounds;
1110
1111 int numVaoSurfaces;
1112 struct srfVaoIQModel_s *vaoSurfaces;
1113 } iqmData_t;
1114
1115 // inter-quake-model surface
1116 typedef struct srfIQModel_s {
1117 surfaceType_t surfaceType;
1118 char name[MAX_QPATH];
1119 shader_t *shader;
1120 iqmData_t *data;
1121 int first_vertex, num_vertexes;
1122 int first_triangle, num_triangles;
1123 int first_influence, num_influences;
1124 } srfIQModel_t;
1125
1126 typedef struct srfVaoIQModel_s
1127 {
1128 surfaceType_t surfaceType;
1129 iqmData_t *iqmData;
1130 struct srfIQModel_s *iqmSurface;
1131 // backEnd stats
1132 int numIndexes;
1133 int numVerts;
1134 // static render data
1135 vao_t *vao;
1136 } srfVaoIQModel_t;
1137
1138 typedef struct srfVaoMdvMesh_s
1139 {
1140 surfaceType_t surfaceType;
1141
1142 struct mdvModel_s *mdvModel;
1143 struct mdvSurface_s *mdvSurface;
1144
1145 // backEnd stats
1146 int numIndexes;
1147 int numVerts;
1148
1149 // static render data
1150 vao_t *vao;
1151 } srfVaoMdvMesh_t;
1152
1153 extern void( *rb_surfaceTable[SF_NUM_SURFACE_TYPES] ) ( void * );
1154
1155 /*
1156 ==============================================================================
1157
1158 SHADOWS
1159
1160 ==============================================================================
1161 */
1162
1163 typedef struct pshadow_s
1164 {
1165 float sort;
1166
1167 int numEntities;
1168 int entityNums[8];
1169 vec3_t entityOrigins[8];
1170 float entityRadiuses[8];
1171
1172 float viewRadius;
1173 vec3_t viewOrigin;
1174
1175 vec3_t lightViewAxis[3];
1176 vec3_t lightOrigin;
1177 float lightRadius;
1178 cplane_t cullPlane;
1179 } pshadow_t;
1180
1181 /*
1182 ==============================================================================
1183
1184 BRUSH MODELS
1185
1186 ==============================================================================
1187 */
1188
1189
1190 //
1191 // in memory representation
1192 //
1193
1194 #define SIDE_FRONT 0
1195 #define SIDE_BACK 1
1196 #define SIDE_ON 2
1197
1198 #define CULLINFO_NONE 0
1199 #define CULLINFO_BOX 1
1200 #define CULLINFO_SPHERE 2
1201 #define CULLINFO_PLANE 4
1202
1203 typedef struct cullinfo_s {
1204 int type;
1205 vec3_t bounds[2];
1206 vec3_t localOrigin;
1207 float radius;
1208 cplane_t plane;
1209 } cullinfo_t;
1210
1211 typedef struct msurface_s {
1212 //int viewCount; // if == tr.viewCount, already added
1213 struct shader_s *shader;
1214 int fogIndex;
1215 int cubemapIndex;
1216 cullinfo_t cullinfo;
1217
1218 surfaceType_t *data; // any of srf*_t
1219 } msurface_t;
1220
1221
1222
1223 #define CONTENTS_NODE -1
1224 typedef struct mnode_s {
1225 // common with leaf and node
1226 int contents; // -1 for nodes, to differentiate from leafs
1227 int visCounts[MAX_VISCOUNTS]; // node needs to be traversed if current
1228 vec3_t mins, maxs; // for bounding box culling
1229 struct mnode_s *parent;
1230
1231 // node specific
1232 cplane_t *plane;
1233 struct mnode_s *children[2];
1234
1235 // leaf specific
1236 int cluster;
1237 int area;
1238
1239 int firstmarksurface;
1240 int nummarksurfaces;
1241 } mnode_t;
1242
1243 typedef struct {
1244 vec3_t bounds[2]; // for culling
1245 int firstSurface;
1246 int numSurfaces;
1247 } bmodel_t;
1248
1249 typedef struct {
1250 char name[MAX_QPATH]; // ie: maps/tim_dm2.bsp
1251 char baseName[MAX_QPATH]; // ie: tim_dm2
1252
1253 int dataSize;
1254
1255 int numShaders;
1256 dshader_t *shaders;
1257
1258 int numBModels;
1259 bmodel_t *bmodels;
1260
1261 int numplanes;
1262 cplane_t *planes;
1263
1264 int numnodes; // includes leafs
1265 int numDecisionNodes;
1266 mnode_t *nodes;
1267
1268 int numWorldSurfaces;
1269
1270 int numsurfaces;
1271 msurface_t *surfaces;
1272 int *surfacesViewCount;
1273 int *surfacesDlightBits;
1274 int *surfacesPshadowBits;
1275
1276 int nummarksurfaces;
1277 int *marksurfaces;
1278
1279 int numfogs;
1280 fog_t *fogs;
1281
1282 vec3_t lightGridOrigin;
1283 vec3_t lightGridSize;
1284 vec3_t lightGridInverseSize;
1285 int lightGridBounds[3];
1286 byte *lightGridData;
1287 uint16_t *lightGrid16;
1288
1289 int numClusters;
1290 int clusterBytes;
1291 const byte *vis; // may be passed in by CM_LoadMap to save space
1292
1293 char *entityString;
1294 char *entityParsePoint;
1295 } world_t;
1296
1297 /*
1298 ==============================================================================
1299 MDV MODELS - meta format for vertex animation models like .md2, .md3, .mdc
1300 ==============================================================================
1301 */
1302 typedef struct
1303 {
1304 float bounds[2][3];
1305 float localOrigin[3];
1306 float radius;
1307 } mdvFrame_t;
1308
1309 typedef struct
1310 {
1311 float origin[3];
1312 float axis[3][3];
1313 } mdvTag_t;
1314
1315 typedef struct
1316 {
1317 char name[MAX_QPATH]; // tag name
1318 } mdvTagName_t;
1319
1320 typedef struct
1321 {
1322 vec3_t xyz;
1323 int16_t normal[4];
1324 int16_t tangent[4];
1325 } mdvVertex_t;
1326
1327 typedef struct
1328 {
1329 float st[2];
1330 } mdvSt_t;
1331
1332 typedef struct mdvSurface_s
1333 {
1334 surfaceType_t surfaceType;
1335
1336 char name[MAX_QPATH]; // polyset name
1337
1338 int numShaderIndexes;
1339 int *shaderIndexes;
1340
1341 int numVerts;
1342 mdvVertex_t *verts;
1343 mdvSt_t *st;
1344
1345 int numIndexes;
1346 glIndex_t *indexes;
1347
1348 struct mdvModel_s *model;
1349 } mdvSurface_t;
1350
1351 typedef struct mdvModel_s
1352 {
1353 int numFrames;
1354 mdvFrame_t *frames;
1355
1356 int numTags;
1357 mdvTag_t *tags;
1358 mdvTagName_t *tagNames;
1359
1360 int numSurfaces;
1361 mdvSurface_t *surfaces;
1362
1363 int numVaoSurfaces;
1364 srfVaoMdvMesh_t *vaoSurfaces;
1365
1366 int numSkins;
1367 } mdvModel_t;
1368
1369 //======================================================================
1370
1371 typedef enum {
1372 MOD_BAD,
1373 MOD_BRUSH,
1374 MOD_MESH,
1375 MOD_MDS,
1376 MOD_MDC, // Ridah
1377 MOD_MDR,
1378 MOD_IQM
1379 } modtype_t;
1380
1381 typedef struct model_s {
1382 char name[MAX_QPATH];
1383 modtype_t type;
1384 int index; // model = tr.models[model->index]
1385
1386 int dataSize; // just for listing purposes
1387 bmodel_t *bmodel; // only if type == MOD_BRUSH
1388 mdvModel_t *mdv[MD3_MAX_LODS]; // only if type == MOD_MESH
1389 mdsHeader_t *mds; // only if type == MOD_MDS
1390 void *modelData; // only if type == (MOD_MDR | MOD_IQM)
1391
1392 int numLods;
1393
1394 // GR - model tessellation capability flag
1395 int ATI_tess;
1396 } model_t;
1397
1398
1399 #define MAX_MOD_KNOWN 2048
1400
1401 void R_ModelInit( void );
1402 model_t *R_GetModelByHandle( qhandle_t hModel );
1403 int R_LerpTag( orientation_t *tag, const refEntity_t *refent, const char *tagName, int startIndex );
1404 void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs );
1405
1406 void R_Modellist_f( void );
1407
1408 //====================================================
1409 extern refimport_t ri;
1410
1411 #define MAX_DRAWIMAGES 2048
1412 #define MAX_SKINS 1024
1413
1414
1415 #define MAX_DRAWSURFS 0x10000
1416 #define DRAWSURF_MASK ( MAX_DRAWSURFS - 1 )
1417
1418 /*
1419
1420 the drawsurf sort data is packed into a single 32 bit value so it can be
1421 compared quickly during the qsorting process
1422
1423 the bits are allocated as follows:
1424
1425 (SA) modified for Wolf (11 bits of entity num)
1426
1427 old:
1428
1429 22 - 31 : sorted shader index
1430 12 - 21 : entity index
1431 3 - 7 : fog index
1432 2 : used to be clipped flag
1433 0 - 1 : dlightmap index
1434
1435 #define QSORT_SHADERNUM_SHIFT 22
1436 #define QSORT_ENTITYNUM_SHIFT 12
1437 #define QSORT_FOGNUM_SHIFT 3
1438
1439 new:
1440
1441 22 - 31 : sorted shader index
1442 11 - 21 : entity index
1443 2 - 6 : fog index
1444 removed : used to be clipped flag
1445 0 - 1 : dlightmap index
1446
1447 SmileTheory - for pshadows
1448 17-31 : sorted shader index
1449 7-16 : entity index
1450 2-6 : fog index
1451 1 : pshadow flag
1452 0 : dlight flag
1453
1454 #define QSORT_SHADERNUM_SHIFT 22
1455 #define QSORT_ENTITYNUM_SHIFT 11
1456 #define QSORT_FOGNUM_SHIFT 2
1457
1458 */
1459
1460 #define QSORT_FOGNUM_SHIFT 2
1461 #define QSORT_REFENTITYNUM_SHIFT 11
1462 #define QSORT_SHADERNUM_SHIFT (QSORT_REFENTITYNUM_SHIFT+REFENTITYNUM_BITS)
1463 #if (QSORT_SHADERNUM_SHIFT+SHADERNUM_BITS) > 32
1464 #error "Need to update sorting, too many bits."
1465 #endif
1466
1467 #define QSORT_PSHADOW_SHIFT 1
1468
1469 // GR - tessellation flag in bit 8
1470 #define QSORT_ATI_TESS_SHIFT 8
1471 // GR - TruForm flags
1472 #define ATI_TESS_TRUFORM 1
1473 #define ATI_TESS_NONE 0
1474
1475 extern int gl_filter_min, gl_filter_max;
1476
1477 /*
1478 ** performanceCounters_t
1479 */
1480 typedef struct {
1481 int c_sphere_cull_patch_in, c_sphere_cull_patch_clip, c_sphere_cull_patch_out;
1482 int c_box_cull_patch_in, c_box_cull_patch_clip, c_box_cull_patch_out;
1483 int c_sphere_cull_md3_in, c_sphere_cull_md3_clip, c_sphere_cull_md3_out;
1484 int c_box_cull_md3_in, c_box_cull_md3_clip, c_box_cull_md3_out;
1485
1486 int c_leafs;
1487 int c_dlightSurfaces;
1488 int c_dlightSurfacesCulled;
1489 } frontEndCounters_t;
1490
1491 #define FOG_TABLE_SIZE 256
1492 #define FUNCTABLE_SIZE 1024
1493 #define FUNCTABLE_SIZE2 10
1494 #define FUNCTABLE_MASK ( FUNCTABLE_SIZE - 1 )
1495
1496
1497 // the renderer front end should never modify glstate_t
1498 typedef struct {
1499 qboolean finishCalled;
1500 int texEnv[2];
1501 int faceCulling;
1502 int faceCullFront;
1503 uint32_t glStateBits;
1504 uint32_t storedGlState;
1505 float vertexAttribsInterpolation;
1506 qboolean vertexAnimation;
1507 int boneAnimation; // number of bones
1508 mat4_t boneMatrix[IQM_MAX_JOINTS];
1509 uint32_t vertexAttribsEnabled; // global if no VAOs, tess only otherwise
1510 FBO_t *currentFBO;
1511 vao_t *currentVao;
1512 mat4_t modelview;
1513 mat4_t projection;
1514 mat4_t modelviewProjection;
1515 } glstate_t;
1516
1517 typedef enum {
1518 MI_NONE,
1519 MI_NVX,
1520 MI_ATI
1521 } memInfo_t;
1522
1523 typedef enum {
1524 TCR_NONE = 0x0000,
1525 TCR_RGTC = 0x0001,
1526 TCR_BPTC = 0x0002,
1527 } textureCompressionRef_t;
1528
1529 // We can't change glConfig_t without breaking DLL/vms compatibility, so
1530 // store extensions we have here.
1531 typedef struct {
1532 qboolean intelGraphics;
1533
1534 qboolean occlusionQuery;
1535
1536 int glslMajorVersion;
1537 int glslMinorVersion;
1538 int glslMaxAnimatedBones;
1539
1540 memInfo_t memInfo;
1541
1542 qboolean framebufferObject;
1543 int maxRenderbufferSize;
1544 int maxColorAttachments;
1545
1546 qboolean textureFloat;
1547 textureCompressionRef_t textureCompression;
1548 qboolean swizzleNormalmap;
1549
1550 qboolean framebufferMultisample;
1551 qboolean framebufferBlit;
1552
1553 qboolean depthClamp;
1554 qboolean seamlessCubeMap;
1555
1556 qboolean vertexArrayObject;
1557 qboolean directStateAccess;
1558 } glRefConfig_t;
1559
1560 typedef struct {
1561 int c_surfaces, c_shaders, c_vertexes, c_indexes, c_totalIndexes;
1562 int c_surfBatches;
1563 float c_overDraw;
1564
1565 int c_vaoBinds;
1566 int c_vaoVertexes;
1567 int c_vaoIndexes;
1568
1569 int c_staticVaoDraws;
1570 int c_dynamicVaoDraws;
1571
1572 int c_dlightVertexes;
1573 int c_dlightIndexes;
1574
1575 int c_flareAdds;
1576 int c_flareTests;
1577 int c_flareRenders;
1578
1579 int c_glslShaderBinds;
1580 int c_genericDraws;
1581 int c_lightallDraws;
1582 int c_fogDraws;
1583 int c_dlightDraws;
1584
1585 int msec; // total msec for backend run
1586 } backEndCounters_t;
1587
1588 // all state modified by the back end is seperated
1589 // from the front end state
1590 typedef struct {
1591 trRefdef_t refdef;
1592 viewParms_t viewParms;
1593 orientationr_t or;
1594 backEndCounters_t pc;
1595 qboolean isHyperspace;
1596 trRefEntity_t *currentEntity;
1597 qboolean skyRenderedThisView; // flag for drawing sun
1598
1599 qboolean projection2D; // if qtrue, drawstretchpic doesn't need to change modes
1600 byte color2D[4];
1601 qboolean vertexes2D; // shader needs to be finished
1602 trRefEntity_t entity2D; // currentEntity will point at this when doing 2D rendering
1603
1604 FBO_t *last2DFBO;
1605 qboolean colorMask[4];
1606 qboolean framePostProcessed;
1607 qboolean depthFill;
1608 } backEndState_t;
1609
1610 /*
1611 ** trGlobals_t
1612 **
1613 ** Most renderer globals are defined here.
1614 ** backend functions should never modify any of these fields,
1615 ** but may read fields that aren't dynamically modified
1616 ** by the frontend.
1617 */
1618 typedef struct {
1619 qboolean registered; // cleared at shutdown, set at beginRegistration
1620
1621 int visIndex;
1622 int visClusters[MAX_VISCOUNTS];
1623 int visCounts[MAX_VISCOUNTS]; // incremented every time a new vis cluster is entered
1624
1625 int frameCount; // incremented every frame
1626 int sceneCount; // incremented every scene
1627 int viewCount; // incremented every view (twice a scene if portaled)
1628 // and every R_MarkFragments call
1629
1630 int frameSceneNum; // zeroed at RE_BeginFrame
1631
1632 qboolean worldMapLoaded;
1633 qboolean worldDeluxeMapping;
1634 vec2_t autoExposureMinMax;
1635 vec3_t toneMinAvgMaxLevel;
1636 world_t *world;
1637
1638 const byte *externalVisData; // from RE_SetWorldVisData, shared with CM_Load
1639
1640 image_t *defaultImage;
1641 image_t *scratchImage[32];
1642 image_t *fogImage;
1643 image_t *dlightImage; // inverse-square highlight for projective adding
1644 image_t *flareImage;
1645 image_t *whiteImage; // full of 0xff
1646 image_t *identityLightImage; // full of tr.identityLightByte
1647
1648 image_t *shadowCubemaps[MAX_DLIGHTS];
1649
1650
1651 image_t *renderImage;
1652 image_t *sunRaysImage;
1653 image_t *renderDepthImage;
1654 image_t *pshadowMaps[MAX_DRAWN_PSHADOWS];
1655 image_t *screenScratchImage;
1656 image_t *textureScratchImage[2];
1657 image_t *quarterImage[2];
1658 image_t *calcLevelsImage;
1659 image_t *targetLevelsImage;
1660 image_t *fixedLevelsImage;
1661 image_t *sunShadowDepthImage[4];
1662 image_t *screenShadowImage;
1663 image_t *screenSsaoImage;
1664 image_t *hdrDepthImage;
1665 image_t *renderCubeImage;
1666
1667 image_t *textureDepthImage;
1668
1669 FBO_t *renderFbo;
1670 FBO_t *msaaResolveFbo;
1671 FBO_t *sunRaysFbo;
1672 FBO_t *depthFbo;
1673 FBO_t *pshadowFbos[MAX_DRAWN_PSHADOWS];
1674 FBO_t *screenScratchFbo;
1675 FBO_t *textureScratchFbo[2];
1676 FBO_t *quarterFbo[2];
1677 FBO_t *calcLevelsFbo;
1678 FBO_t *targetLevelsFbo;
1679 FBO_t *sunShadowFbo[4];
1680 FBO_t *screenShadowFbo;
1681 FBO_t *screenSsaoFbo;
1682 FBO_t *hdrDepthFbo;
1683 FBO_t *renderCubeFbo;
1684
1685 shader_t *defaultShader;
1686 shader_t *shadowShader;
1687 shader_t *projectionShadowShader;
1688 // shader_t *dlightShader; //----(SA) added
1689
1690 shader_t *flareShader;
1691 shader_t *spotFlareShader;
1692 char *sunShaderName;
1693 shader_t *sunShader;
1694 shader_t *sunFlareShader;
1695 shader_t *sunflareShader_old[6]; //----(SA) for the camera lens flare effect for sun
1696
1697 int numLightmaps;
1698 int lightmapSize;
1699 image_t **lightmaps;
1700 image_t **deluxemaps;
1701
1702 int fatLightmapCols;
1703 int fatLightmapRows;
1704
1705 int numCubemaps;
1706 cubemap_t *cubemaps;
1707
1708 trRefEntity_t *currentEntity;
1709 trRefEntity_t worldEntity; // point currentEntity at this when rendering world
1710 int currentEntityNum;
1711 int shiftedEntityNum; // currentEntityNum << QSORT_REFENTITYNUM_SHIFT
1712 model_t *currentModel;
1713
1714 //
1715 // GPU shader programs
1716 //
1717 shaderProgram_t genericShader[GENERICDEF_COUNT];
1718 shaderProgram_t textureColorShader;
1719 shaderProgram_t fogShader[FOGDEF_COUNT];
1720 shaderProgram_t dlightShader[DLIGHTDEF_COUNT];
1721 shaderProgram_t lightallShader[LIGHTDEF_COUNT];
1722 shaderProgram_t shadowmapShader[SHADOWMAPDEF_COUNT];
1723 shaderProgram_t pshadowShader;
1724 shaderProgram_t down4xShader;
1725 shaderProgram_t bokehShader;
1726 shaderProgram_t tonemapShader;
1727 shaderProgram_t calclevels4xShader[2];
1728 shaderProgram_t shadowmaskShader;
1729 shaderProgram_t ssaoShader;
1730 shaderProgram_t depthBlurShader[4];
1731 shaderProgram_t testcubeShader;
1732
1733
1734 // -----------------------------------------
1735
1736 viewParms_t viewParms;
1737
1738 float identityLight; // 1.0 / ( 1 << overbrightBits )
1739 int identityLightByte; // identityLight * 255
1740 int overbrightBits; // r_overbrightBits->integer, but set to 0 if no hw gamma
1741
1742 orientationr_t or; // for current entity
1743
1744 trRefdef_t refdef;
1745
1746 int viewCluster;
1747
1748 float sunShadowScale;
1749
1750 qboolean sunShadows;
1751
1752 vec3_t sunLight; // from the sky shader for this level
1753 vec3_t sunDirection;
1754 vec3_t lastCascadeSunDirection;
1755 float lastCascadeSunMvp[16];
1756
1757 //----(SA) added
1758 float lightGridMulAmbient; // lightgrid multipliers specified in sky shader
1759 float lightGridMulDirected; //
1760 //----(SA) end
1761
1762 // qboolean levelGLFog;
1763
1764 frontEndCounters_t pc;
1765 int frontEndMsec; // not in pc due to clearing issue
1766
1767 //
1768 // put large tables at the end, so most elements will be
1769 // within the +/32K indexed range on risc processors
1770 //
1771 model_t *models[MAX_MOD_KNOWN];
1772 int numModels;
1773
1774 int numImages;
1775 image_t *images[MAX_DRAWIMAGES];
1776
1777 int numFBOs;
1778 FBO_t *fbos[MAX_FBOS];
1779
1780 int numVaos;
1781 vao_t *vaos[MAX_VAOS];
1782
1783 // shader indexes from other modules will be looked up in tr.shaders[]
1784 // shader indexes from drawsurfs will be looked up in sortedShaders[]
1785 // lower indexed sortedShaders must be rendered first (opaque surfaces before translucent)
1786 int numShaders;
1787 shader_t *shaders[MAX_SHADERS];
1788 shader_t *sortedShaders[MAX_SHADERS];
1789
1790 int numSkins;
1791 skin_t *skins[MAX_SKINS];
1792
1793 GLuint sunFlareQuery[2];
1794 int sunFlareQueryIndex;
1795 qboolean sunFlareQueryActive[2];
1796
1797 float sinTable[FUNCTABLE_SIZE];
1798 float squareTable[FUNCTABLE_SIZE];
1799 float triangleTable[FUNCTABLE_SIZE];
1800 float sawToothTable[FUNCTABLE_SIZE];
1801 float inverseSawToothTable[FUNCTABLE_SIZE];
1802 float fogTable[FOG_TABLE_SIZE];
1803
1804 // RF, temp var used while parsing shader only
1805 int allowCompress;
1806
1807 } trGlobals_t;
1808
1809 extern backEndState_t backEnd;
1810 extern trGlobals_t tr;
1811 extern glconfig_t glConfig; // outside of TR since it shouldn't be cleared during ref re-init
1812 extern glstate_t glState; // outside of TR since it shouldn't be cleared during ref re-init
1813
1814 // These three variables should live inside glConfig but can't because of compatibility issues to the original ID vms.
1815 // If you release a stand-alone game and your mod uses tr_types.h from this build you can safely move them to
1816 // the glconfig_t struct.
1817 extern qboolean textureFilterAnisotropic;
1818 extern int maxAnisotropy;
1819 extern glRefConfig_t glRefConfig;
1820 extern float displayAspect;
1821
1822 //
1823 // cvars
1824 //
1825 extern cvar_t *r_flareSize;
1826 extern cvar_t *r_flareFade;
1827 // coefficient for the flare intensity falloff function.
1828 #define FLARE_STDCOEFF "150"
1829 extern cvar_t *r_flareCoeff;
1830
1831 extern cvar_t *r_railWidth;
1832 extern cvar_t *r_railCoreWidth;
1833 extern cvar_t *r_railSegmentLength;
1834
1835 extern cvar_t *r_ignore; // used for debugging anything
1836 extern cvar_t *r_verbose; // used for verbose debug spew
1837
1838 extern cvar_t *r_znear; // near Z clip plane
1839 extern cvar_t *r_zproj; // z distance of projection plane
1840 extern cvar_t *r_stereoSeparation; // separation of cameras for stereo rendering
1841 extern cvar_t *r_zfar; // far Z clip plane
1842
1843 extern cvar_t *r_stencilbits; // number of desired stencil bits
1844 extern cvar_t *r_depthbits; // number of desired depth bits
1845 extern cvar_t *r_colorbits; // number of desired color bits, only relevant for fullscreen
1846 extern cvar_t *r_texturebits; // number of desired texture bits
1847 // 0 = use framebuffer depth
1848 // 16 = use 16-bit textures
1849 // 32 = use 32-bit textures
1850 // all else = error
1851 extern cvar_t *r_ext_multisample;
1852
1853 extern cvar_t *r_measureOverdraw; // enables stencil buffer overdraw measurement
1854
1855 extern cvar_t *r_lodbias; // push/pull LOD transitions
1856 extern cvar_t *r_lodscale;
1857
1858 extern cvar_t *r_inGameVideo; // controls whether in game video should be draw
1859 extern cvar_t *r_fastsky; // controls whether sky should be cleared or drawn
1860 extern cvar_t *r_drawSun; // controls drawing of sun quad
1861 // "0" no sun
1862 // "1" draw sun
1863 // "2" also draw lens flare effect centered on sun
1864 extern cvar_t *r_dynamiclight; // dynamic lights enabled/disabled
1865 extern cvar_t *r_dlightScale; // global user attenuation of dlights
1866 extern cvar_t *r_dlightBacks; // dlight non-facing surfaces for continuity
1867
1868 extern cvar_t *r_norefresh; // bypasses the ref rendering
1869 extern cvar_t *r_drawentities; // disable/enable entity rendering
1870 extern cvar_t *r_drawworld; // disable/enable world rendering
1871 extern cvar_t *r_speeds; // various levels of information display
1872 extern cvar_t *r_detailTextures; // enables/disables detail texturing stages
1873 extern cvar_t *r_novis; // disable/enable usage of PVS
1874 extern cvar_t *r_nocull;
1875 extern cvar_t *r_facePlaneCull; // enables culling of planar surfaces with back side test
1876 extern cvar_t *r_nocurves;
1877 extern cvar_t *r_showcluster;
1878
1879 extern cvar_t *r_mode; // video mode
1880 extern cvar_t *r_fullscreen;
1881 extern cvar_t *r_noborder;
1882 extern cvar_t *r_gamma;
1883 extern cvar_t *r_ignorehwgamma; // overrides hardware gamma capabilities
1884 extern cvar_t *r_displayRefresh; // optional display refresh option
1885
1886 extern cvar_t *r_allowExtensions; // global enable/disable of OpenGL extensions
1887 extern cvar_t *r_ext_compressed_textures; // these control use of specific extensions
1888 extern cvar_t *r_ext_multitexture;
1889 extern cvar_t *r_ext_compiled_vertex_array;
1890 extern cvar_t *r_ext_texture_env_add;
1891 extern cvar_t *r_ext_texture_filter_anisotropic;
1892 extern cvar_t *r_ext_max_anisotropy;
1893
1894 //----(SA) added
1895 extern cvar_t *r_ext_ATI_pntriangles;
1896 extern cvar_t *r_ati_truform_tess;
1897 extern cvar_t *r_ati_truform_pointmode; //----(SA)
1898 extern cvar_t *r_ati_truform_normalmode; //----(SA)
1899 extern cvar_t *r_ati_fsaa_samples; //DAJ
1900 extern cvar_t *r_ext_NV_fog_dist;
1901 extern cvar_t *r_nv_fogdist_mode;
1902 //----(SA) end
1903
1904 extern cvar_t *r_ext_framebuffer_object;
1905 extern cvar_t *r_ext_texture_float;
1906 extern cvar_t *r_ext_framebuffer_multisample;
1907 extern cvar_t *r_arb_seamless_cube_map;
1908 extern cvar_t *r_arb_vertex_array_object;
1909 extern cvar_t *r_ext_direct_state_access;
1910
1911 extern cvar_t *r_waterFogColor; //----(SA) added
1912 extern cvar_t *r_mapFogColor; //----(SA) added
1913 extern cvar_t *r_savegameFogColor; //----(SA) added
1914
1915 extern cvar_t *r_nobind; // turns off binding to appropriate textures
1916 extern cvar_t *r_singleShader; // make most world faces use default shader
1917 extern cvar_t *r_roundImagesDown;
1918 extern cvar_t *r_lowMemTextureSize;
1919 extern cvar_t *r_lowMemTextureThreshold;
1920 extern cvar_t *r_rmse; // reduces textures to this root mean square error
1921 extern cvar_t *r_colorMipLevels; // development aid to see texture mip usage
1922 extern cvar_t *r_picmip; // controls picmip values
1923 extern cvar_t *r_picmip2; // controls picmip values for designated (character skin) textures
1924 extern cvar_t *r_finish;
1925 extern cvar_t *r_drawBuffer;
1926 extern cvar_t *r_glIgnoreWicked3D;
1927 extern cvar_t *r_swapInterval;
1928 extern cvar_t *r_textureMode;
1929 extern cvar_t *r_offsetFactor;
1930 extern cvar_t *r_offsetUnits;
1931
1932 extern cvar_t *r_fullbright; // avoid lightmap pass
1933 extern cvar_t *r_lightmap; // render lightmaps only
1934 extern cvar_t *r_vertexLight; // vertex lighting mode for better performance
1935 extern cvar_t *r_uiFullScreen; // ui is running fullscreen
1936
1937 extern cvar_t *r_logFile; // number of frames to emit GL logs
1938 extern cvar_t *r_showtris; // enables wireframe rendering of the world
1939 extern cvar_t *r_showsky; // forces sky in front of all surfaces
1940 extern cvar_t *r_shownormals; // draws wireframe normals
1941 extern cvar_t *r_clear; // force screen clear every frame
1942
1943 extern cvar_t *r_shadows; // controls shadows: 0 = none, 1 = blur, 2 = stencil, 3 = black planar projection
1944 extern cvar_t *r_flares; // light flares
1945
1946 extern cvar_t *r_portalsky; // (SA) added
1947 extern cvar_t *r_intensity;
1948
1949 extern cvar_t *r_lockpvs;
1950 extern cvar_t *r_noportals;
1951 extern cvar_t *r_portalOnly;
1952
1953 extern cvar_t *r_subdivisions;
1954 extern cvar_t *r_lodCurveError;
1955 extern cvar_t *r_skipBackEnd;
1956
1957 extern cvar_t *r_stereoEnabled;
1958 extern cvar_t *r_anaglyphMode;
1959
1960 extern cvar_t *r_externalGLSL;
1961
1962 extern cvar_t *r_hdr;
1963 extern cvar_t *r_floatLightmap;
1964 extern cvar_t *r_postProcess;
1965
1966 extern cvar_t *r_toneMap;
1967 extern cvar_t *r_forceToneMap;
1968 extern cvar_t *r_forceToneMapMin;
1969 extern cvar_t *r_forceToneMapAvg;
1970 extern cvar_t *r_forceToneMapMax;
1971
1972 extern cvar_t *r_autoExposure;
1973 extern cvar_t *r_forceAutoExposure;
1974 extern cvar_t *r_forceAutoExposureMin;
1975 extern cvar_t *r_forceAutoExposureMax;
1976
1977 extern cvar_t *r_cameraExposure;
1978
1979 extern cvar_t *r_depthPrepass;
1980 extern cvar_t *r_ssao;
1981
1982 extern cvar_t *r_normalMapping;
1983 extern cvar_t *r_specularMapping;
1984 extern cvar_t *r_deluxeMapping;
1985 extern cvar_t *r_parallaxMapping;
1986 extern cvar_t *r_parallaxMapShadows;
1987 extern cvar_t *r_cubeMapping;
1988 extern cvar_t *r_cubemapSize;
1989 extern cvar_t *r_deluxeSpecular;
1990 extern cvar_t *r_pbr;
1991 extern cvar_t *r_baseNormalX;
1992 extern cvar_t *r_baseNormalY;
1993 extern cvar_t *r_baseParallax;
1994 extern cvar_t *r_baseSpecular;
1995 extern cvar_t *r_baseGloss;
1996 extern cvar_t *r_glossType;
1997 extern cvar_t *r_dlightMode;
1998 extern cvar_t *r_pshadowDist;
1999 extern cvar_t *r_mergeLightmaps;
2000 extern cvar_t *r_imageUpsample;
2001 extern cvar_t *r_imageUpsampleMaxSize;
2002 extern cvar_t *r_imageUpsampleType;
2003 extern cvar_t *r_genNormalMaps;
2004 extern cvar_t *r_forceSun;
2005 extern cvar_t *r_forceSunLightScale;
2006 extern cvar_t *r_forceSunAmbientScale;
2007 extern cvar_t *r_sunlightMode;
2008 extern cvar_t *r_drawSunRays;
2009 extern cvar_t *r_sunShadows;
2010 extern cvar_t *r_shadowFilter;
2011 extern cvar_t *r_shadowBlur;
2012 extern cvar_t *r_shadowMapSize;
2013 extern cvar_t *r_shadowCascadeZNear;
2014 extern cvar_t *r_shadowCascadeZFar;
2015 extern cvar_t *r_shadowCascadeZBias;
2016 extern cvar_t *r_ignoreDstAlpha;
2017
2018 extern cvar_t *r_greyscale;
2019
2020 extern cvar_t *r_ignoreGLErrors;
2021
2022 extern cvar_t *r_overBrightBits;
2023 extern cvar_t *r_mapOverBrightBits;
2024
2025 extern cvar_t *r_debugSurface;
2026 extern cvar_t *r_simpleMipMaps;
2027
2028 extern cvar_t *r_showImages;
2029 extern cvar_t *r_debugSort;
2030
2031 extern cvar_t *r_printShaders;
2032 extern cvar_t *r_saveFontData;
2033
2034 extern cvar_t *r_marksOnTriangleMeshes;
2035
2036 // Ridah
2037 extern cvar_t *r_bonesDebug;
2038 // done.
2039
2040 // Rafael - wolf fog
2041 extern cvar_t *r_wolffog;
2042 // done
2043
2044 extern cvar_t *r_highQualityVideo;
2045 //====================================================================
2046
2047 float R_NoiseGet4f( float x, float y, float z, double t );
2048 void R_NoiseInit( void );
2049
ShaderRequiresCPUDeforms(const shader_t * shader)2050 static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
2051 {
2052 if(shader->numDeforms)
2053 {
2054 const deformStage_t *ds = &shader->deforms[0];
2055
2056 if (shader->numDeforms > 1)
2057 return qtrue;
2058
2059 switch (ds->deformation)
2060 {
2061 case DEFORM_WAVE:
2062 case DEFORM_BULGE:
2063 // need CPU deforms at high level-times to avoid floating point percision loss
2064 return ( backEnd.refdef.floatTime != (float)backEnd.refdef.floatTime );
2065
2066 default:
2067 return qtrue;
2068 }
2069 }
2070
2071 return qfalse;
2072 }
2073
2074 //====================================================================
2075
2076 void R_SwapBuffers( int );
2077
2078 void R_RenderView( viewParms_t *parms );
2079 void R_RenderDlightCubemaps(const refdef_t *fd);
2080 void R_RenderPshadowMaps(const refdef_t *fd);
2081 void R_RenderSunShadowMaps(const refdef_t *fd, int level);
2082 void R_RenderCubemapSide( int cubemapIndex, int cubemapSide, qboolean subscene );
2083
2084 void R_AddMD3Surfaces( trRefEntity_t *e );
2085 void R_AddNullModelSurfaces( trRefEntity_t *e );
2086 void R_AddBeamSurfaces( trRefEntity_t *e );
2087 void R_AddRailSurfaces( trRefEntity_t *e, qboolean isUnderwater );
2088 void R_AddLightningBoltSurfaces( trRefEntity_t *e );
2089
2090 void R_TagInfo_f( void );
2091
2092 void R_AddPolygonSurfaces( void );
2093
2094 // GR - add tessellation flag
2095 void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader,
2096 int *fogNum, int *dlightMap, int *pshadowMap, int *atiTess );
2097
2098 // GR - add tessellation flag
2099 void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader,
2100 int fogIndex, int dlightMap, int pshadowMap, int cubemap, int atiTess );
2101
2102 void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2,
2103 const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3);
2104 vec_t R_CalcTangentSpace(vec3_t tangent, vec3_t bitangent, const vec3_t normal, const vec3_t sdir, const vec3_t tdir);
2105 qboolean R_CalcTangentVectors(srfVert_t * dv[3]);
2106
2107 #define CULL_IN 0 // completely unclipped
2108 #define CULL_CLIP 1 // clipped by one or more planes
2109 #define CULL_OUT 2 // completely outside the clipping planes
2110 void R_LocalNormalToWorld (const vec3_t local, vec3_t world);
2111 void R_LocalPointToWorld (const vec3_t local, vec3_t world);
2112 int R_CullBox (vec3_t bounds[2]);
2113 int R_CullLocalBox( vec3_t bounds[2] );
2114 int R_CullPointAndRadiusEx( const vec3_t origin, float radius, const cplane_t* frustum, int numPlanes );
2115 int R_CullPointAndRadius( const vec3_t origin, float radius );
2116 int R_CullLocalPointAndRadius( const vec3_t origin, float radius );
2117
2118 void R_SetupProjection(viewParms_t *dest, float zProj, float zFar, qboolean computeFrustum);
2119 void R_RotateForEntity( const trRefEntity_t * ent, const viewParms_t * viewParms, orientationr_t * or );
2120
2121 /*
2122 ** GL wrapper/helper functions
2123 */
2124 void GL_BindToTMU( image_t *image, int tmu );
2125 void GL_SetDefaultState( void );
2126 void GL_TextureMode( const char *string );
2127 void GL_CheckErrs( char *file, int line );
2128 #define GL_CheckErrors(...) GL_CheckErrs(__FILE__, __LINE__)
2129 void GL_State( unsigned long stateVector );
2130 void GL_SetProjectionMatrix(mat4_t matrix);
2131 void GL_SetModelviewMatrix(mat4_t matrix);
2132 void GL_Cull( int cullType );
2133
2134 #define GLS_SRCBLEND_ZERO 0x00000001
2135 #define GLS_SRCBLEND_ONE 0x00000002
2136 #define GLS_SRCBLEND_DST_COLOR 0x00000003
2137 #define GLS_SRCBLEND_ONE_MINUS_DST_COLOR 0x00000004
2138 #define GLS_SRCBLEND_SRC_ALPHA 0x00000005
2139 #define GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA 0x00000006
2140 #define GLS_SRCBLEND_DST_ALPHA 0x00000007
2141 #define GLS_SRCBLEND_ONE_MINUS_DST_ALPHA 0x00000008
2142 #define GLS_SRCBLEND_ALPHA_SATURATE 0x00000009
2143 #define GLS_SRCBLEND_BITS 0x0000000f
2144
2145 #define GLS_DSTBLEND_ZERO 0x00000010
2146 #define GLS_DSTBLEND_ONE 0x00000020
2147 #define GLS_DSTBLEND_SRC_COLOR 0x00000030
2148 #define GLS_DSTBLEND_ONE_MINUS_SRC_COLOR 0x00000040
2149 #define GLS_DSTBLEND_SRC_ALPHA 0x00000050
2150 #define GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA 0x00000060
2151 #define GLS_DSTBLEND_DST_ALPHA 0x00000070
2152 #define GLS_DSTBLEND_ONE_MINUS_DST_ALPHA 0x00000080
2153 #define GLS_DSTBLEND_BITS 0x000000f0
2154
2155 #define GLS_DEPTHMASK_TRUE 0x00000100
2156
2157 #define GLS_POLYMODE_LINE 0x00001000
2158
2159 #define GLS_DEPTHTEST_DISABLE 0x00010000
2160 #define GLS_DEPTHFUNC_EQUAL 0x00020000
2161 #define GLS_DEPTHFUNC_GREATER 0x00040000
2162 #define GLS_DEPTHFUNC_BITS 0x00060000
2163
2164 #define GLS_ATEST_GT_0 0x10000000
2165 #define GLS_ATEST_LT_80 0x20000000
2166 #define GLS_ATEST_GE_80 0x40000000
2167 #define GLS_ATEST_BITS 0x70000000
2168
2169 #define GLS_DEFAULT GLS_DEPTHMASK_TRUE
2170
2171 void RE_StretchRaw( int x, int y, int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty );
2172 void RE_UploadCinematic( int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty );
2173
2174 void RE_BeginFrame( stereoFrame_t stereoFrame );
2175 void RE_BeginRegistration( glconfig_t *glconfig );
2176 void RE_LoadWorldMap( const char *mapname );
2177 void RE_SetWorldVisData( const byte *vis );
2178 qhandle_t RE_RegisterModel( const char *name );
2179 qhandle_t RE_RegisterSkin( const char *name );
2180 void RE_Shutdown( qboolean destroyWindow );
2181
2182 qboolean R_GetEntityToken( char *buffer, int size );
2183
2184 //----(SA)
2185 qboolean RE_GetSkinModel( qhandle_t skinid, const char *type, char *name );
2186 qhandle_t RE_GetShaderFromModel( qhandle_t modelid, int surfnum, int withlightmap ); //----(SA)
2187 //----(SA) end
2188
2189 model_t *R_AllocModel( void );
2190
2191 void R_Init( void );
2192 image_t *R_FindImageFile( const char *name, imgType_t type, imgFlags_t flags );
2193 image_t *R_FindImageFileExt( const char *name, imgType_t type, imgFlags_t flags, qboolean characterMip ); //----(SA) added
2194
2195 image_t *R_CreateImage( const char *name, byte *pic, int width, int height, imgType_t type, imgFlags_t flags, int internalFormat );
2196 //----(SA) added (didn't want to modify all instances of R_CreateImage()
2197 image_t *R_CreateImageExt( const char *name, byte *pic, int width, int height, imgType_t type, imgFlags_t flags, int internalFormat, qboolean characterMip );
2198 //----(SA) end
2199 void R_UpdateSubImage( image_t *image, byte *pic, int x, int y, int width, int height, GLenum picFormat );
2200 qboolean R_GetModeInfo( int *width, int *height, float *windowAspect, int mode );
2201
2202 void R_SetColorMappings( void );
2203 void R_GammaCorrect( byte *buffer, int bufSize );
2204
2205 void R_ImageList_f( void );
2206 void R_SkinList_f( void );
2207 // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=516
2208 const void *RB_TakeScreenshotCmd( const void *data );
2209 void R_ScreenShot_f( void );
2210 void R_ScreenShotJPEG_f( void );
2211
2212 void R_InitFogTable( void );
2213 float R_FogFactor( float s, float t );
2214 void R_InitImages( void );
2215 void R_DeleteTextures( void );
2216 int R_SumOfUsedImages( void );
2217 void R_InitSkins( void );
2218 skin_t *R_GetSkinByHandle( qhandle_t hSkin );
2219
2220 int R_ComputeLOD( trRefEntity_t *ent );
2221
2222 const void *RB_TakeVideoFrameCmd( const void *data );
2223
2224
2225 //
2226 // tr_shader.c
2227 //
2228 qhandle_t RE_RegisterShaderLightMap( const char *name, int lightmapIndex );
2229 qhandle_t RE_RegisterShader( const char *name );
2230 qhandle_t RE_RegisterShaderNoMip( const char *name );
2231 qhandle_t RE_RegisterShaderFromImage( const char *name, int lightmapIndex, image_t *image, qboolean mipRawImage );
2232
2233 shader_t *R_FindShader( const char *name, int lightmapIndex, qboolean mipRawImage );
2234 shader_t *R_GetShaderByHandle( qhandle_t hShader );
2235 shader_t *R_GetShaderByState( int index, long *cycleTime );
2236 shader_t *R_FindShaderByName( const char *name );
2237 void R_InitShaders( void );
2238 void R_ShaderList_f( void );
2239 void R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset );
2240
2241 /*
2242 ====================================================================
2243
2244 IMPLEMENTATION SPECIFIC FUNCTIONS
2245
2246 ====================================================================
2247 */
2248
2249 void GLimp_Init( qboolean fixedFunction );
2250 void GLimp_Shutdown( void );
2251 void GLimp_EndFrame( void );
2252
2253 void GLimp_LogComment( char *comment );
2254 void GLimp_Minimize(void);
2255
2256 void GLimp_SetGamma( unsigned char red[256],
2257 unsigned char green[256],
2258 unsigned char blue[256] );
2259
2260 void GLimp_InitExtraExtensions( void );
2261
2262 /*
2263 ====================================================================
2264
2265 TESSELATOR/SHADER DECLARATIONS
2266
2267 ====================================================================
2268 */
2269
2270 typedef struct stageVars
2271 {
2272 color4ub_t colors[SHADER_MAX_VERTEXES];
2273 vec2_t texcoords[NUM_TEXTURE_BUNDLES][SHADER_MAX_VERTEXES];
2274 } stageVars_t;
2275
2276 typedef struct shaderCommands_s
2277 {
2278 glIndex_t indexes[SHADER_MAX_INDEXES] QALIGN(16);
2279 vec4_t xyz[SHADER_MAX_VERTEXES] QALIGN(16);
2280 int16_t normal[SHADER_MAX_VERTEXES][4] QALIGN(16);
2281 int16_t tangent[SHADER_MAX_VERTEXES][4] QALIGN(16);
2282 vec2_t texCoords[SHADER_MAX_VERTEXES] QALIGN(16);
2283 vec2_t lightCoords[SHADER_MAX_VERTEXES] QALIGN(16);
2284 uint16_t color[SHADER_MAX_VERTEXES][4] QALIGN(16);
2285 int16_t lightdir[SHADER_MAX_VERTEXES][4] QALIGN(16);
2286 //int vertexDlightBits[SHADER_MAX_VERTEXES] QALIGN(16);
2287
2288 void *attribPointers[ATTR_INDEX_COUNT];
2289 vao_t *vao;
2290 qboolean useInternalVao;
2291 qboolean useCacheVao;
2292
2293 stageVars_t svars QALIGN(16);
2294
2295 //color4ub_t constantColor255[SHADER_MAX_VERTEXES] QALIGN(16);
2296
2297 shader_t *shader;
2298 double shaderTime;
2299 int fogNum;
2300 int cubemapIndex;
2301
2302 int dlightBits; // or together of all vertexDlightBits
2303 int pshadowBits;
2304
2305 int firstIndex;
2306
2307 int numIndexes;
2308 int numVertexes;
2309
2310 qboolean ATI_tess;
2311
2312 // info extracted from current shader
2313 int numPasses;
2314 void ( *currentStageIteratorFunc )( void );
2315 shaderStage_t **xstages;
2316 } shaderCommands_t;
2317
2318 extern shaderCommands_t tess;
2319
2320 void RB_BeginSurface( shader_t *shader, int fogNum, int cubemapIndex );
2321 void RB_EndSurface( void );
2322 void RB_CheckOverflow( int verts, int indexes );
2323 #define RB_CHECKOVERFLOW( v,i ) if ( tess.numVertexes + ( v ) >= SHADER_MAX_VERTEXES || tess.numIndexes + ( i ) >= SHADER_MAX_INDEXES ) {RB_CheckOverflow( v,i );}
2324
2325 void R_DrawElements( int numIndexes, int firstIndex );
2326 void RB_StageIteratorGeneric( void );
2327 void RB_StageIteratorSky( void );
2328 void RB_StageIteratorVertexLitTexture( void );
2329 void RB_StageIteratorLightmappedMultitexture( void );
2330
2331 void RB_AddQuadStamp( vec3_t origin, vec3_t left, vec3_t up, float color[4] );
2332 void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, float color[4], float s1, float t1, float s2, float t2 );
2333 void RB_InstantQuad( vec4_t quadVerts[4] );
2334 //void RB_InstantQuad2(vec4_t quadVerts[4], vec2_t texCoords[4], vec4_t color, shaderProgram_t *sp, vec2_t invTexRes);
2335 void RB_InstantQuad2(vec4_t quadVerts[4], vec2_t texCoords[4]);
2336
2337 void RB_ShowImages( void );
2338
2339
2340 /*
2341 ============================================================
2342
2343 WORLD MAP
2344
2345 ============================================================
2346 */
2347
2348 void R_AddBrushModelSurfaces( trRefEntity_t *e );
2349 void R_AddWorldSurfaces( void );
2350
2351
2352 /*
2353 ============================================================
2354
2355 FLARES
2356
2357 ============================================================
2358 */
2359
2360 void R_ClearFlares( void );
2361
2362 void RB_AddFlare( void *surface, int fogNum, vec3_t point, vec3_t color, float scale, vec3_t normal, int id, int flags ); // TTimo updated prototype
2363 void RB_AddDlightFlares( void );
2364 void RB_RenderFlares( void );
2365
2366 /*
2367 ============================================================
2368
2369 LIGHTS
2370
2371 ============================================================
2372 */
2373
2374 void R_DlightBmodel( bmodel_t *bmodel );
2375 void R_SetupEntityLighting( const trRefdef_t *refdef, trRefEntity_t *ent );
2376 void R_TransformDlights( int count, dlight_t * dl, orientationr_t * or );
2377 int R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir );
2378 int R_LightDirForPoint( vec3_t point, vec3_t lightDir, vec3_t normal, world_t *world );
2379 int R_CubemapForPoint( vec3_t point );
2380
2381
2382 /*
2383 ============================================================
2384
2385 SHADOWS
2386
2387 ============================================================
2388 */
2389
2390 void RB_ShadowTessEnd( void );
2391 void RB_ShadowFinish( void );
2392 void RB_ProjectionShadowDeform( void );
2393
2394 /*
2395 ============================================================
2396
2397 SKIES
2398
2399 ============================================================
2400 */
2401
2402 void R_BuildCloudData( shaderCommands_t *shader );
2403 void R_InitSkyTexCoords( float cloudLayerHeight );
2404 void R_DrawSkyBox( shaderCommands_t *shader );
2405 void RB_DrawSun( float scale, shader_t *shader );
2406 void RB_ClipSkyPolygons( shaderCommands_t *shader );
2407
2408 /*
2409 ============================================================
2410
2411 CURVE TESSELATION
2412
2413 ============================================================
2414 */
2415
2416 #define PATCH_STITCHING
2417
2418 void R_SubdividePatchToGrid( srfBspSurface_t *grid, int width, int height,
2419 srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE] );
2420 void R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror );
2421 void R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror );
2422
2423 /*
2424 ============================================================
2425
2426 MARKERS, POLYGON PROJECTION ON WORLD POLYGONS
2427
2428 ============================================================
2429 */
2430
2431 int R_MarkFragments( int orientation, const vec3_t *points, const vec3_t projection,
2432 int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer );
2433
2434 /*
2435 ============================================================
2436
2437 VERTEX BUFFER OBJECTS
2438
2439 ============================================================
2440 */
2441
2442 void R_VaoPackTangent(int16_t *out, vec4_t v);
2443 void R_VaoPackNormal(int16_t *out, vec3_t v);
2444 void R_VaoPackColor(uint16_t *out, vec4_t c);
2445 void R_VaoUnpackTangent(vec4_t v, int16_t *pack);
2446 void R_VaoUnpackNormal(vec3_t v, int16_t *pack);
2447
2448 vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *indexes, int indexesSize, vaoUsage_t usage);
2449 vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int numIndexes, glIndex_t *inIndexes);
2450
2451 void R_BindVao(vao_t *vao);
2452 void R_BindNullVao(void);
2453
2454 void Vao_SetVertexPointers(vao_t *vao);
2455
2456 void R_InitVaos(void);
2457 void R_ShutdownVaos(void);
2458 void R_VaoList_f(void);
2459
2460 void RB_UpdateTessVao(unsigned int attribBits);
2461
2462 void VaoCache_Commit(void);
2463 void VaoCache_Init(void);
2464 void VaoCache_BindVao(void);
2465 void VaoCache_CheckAdd(qboolean *endSurface, qboolean *recycleVertexBuffer, qboolean *recycleIndexBuffer, int numVerts, int numIndexes);
2466 void VaoCache_RecycleVertexBuffer(void);
2467 void VaoCache_RecycleIndexBuffer(void);
2468 void VaoCache_InitQueue(void);
2469 void VaoCache_AddSurface(srfVert_t *verts, int numVerts, glIndex_t *indexes, int numIndexes);
2470
2471 /*
2472 ============================================================
2473
2474 GLSL
2475
2476 ============================================================
2477 */
2478
2479 void GLSL_InitGPUShaders(void);
2480 void GLSL_ShutdownGPUShaders(void);
2481 void GLSL_VertexAttribPointers(uint32_t attribBits);
2482 void GLSL_BindProgram(shaderProgram_t * program);
2483
2484 void GLSL_SetUniformInt(shaderProgram_t *program, int uniformNum, GLint value);
2485 void GLSL_SetUniformFloat(shaderProgram_t *program, int uniformNum, GLfloat value);
2486 void GLSL_SetUniformFloat5(shaderProgram_t *program, int uniformNum, const vec5_t v);
2487 void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t v);
2488 void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t v);
2489 void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v);
2490 void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix);
2491 void GLSL_SetUniformMat4BoneMatrix(shaderProgram_t *program, int uniformNum, /*const*/ mat4_t *matrix, int numMatricies);
2492
2493 shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog);
2494
2495 /*
2496 ============================================================
2497
2498 SCENE GENERATION
2499
2500 ============================================================
2501 */
2502
2503 void R_InitNextFrame( void );
2504
2505 void RE_ClearScene( void );
2506 void RE_AddRefEntityToScene( const refEntity_t *ent );
2507 void RE_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts );
2508 // Ridah
2509 void RE_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int numPolys );
2510 // done.
2511 // Ridah
2512 void RE_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b, int overdraw );
2513 // done.
2514 //----(SA)
2515 void RE_AddCoronaToScene( const vec3_t org, float r, float g, float b, float scale, int id, int flags );
2516 //----(SA)
2517 void RE_BeginScene( const refdef_t *fd );
2518 void RE_RenderScene( const refdef_t *fd );
2519 void RE_EndScene( void );
2520
2521 /*
2522 =============================================================
2523
2524 UNCOMPRESSING BONES
2525
2526 =============================================================
2527 */
2528
2529 #define MC_BITS_X (16)
2530 #define MC_BITS_Y (16)
2531 #define MC_BITS_Z (16)
2532 #define MC_BITS_VECT (16)
2533
2534 #define MC_SCALE_X (1.0f/64)
2535 #define MC_SCALE_Y (1.0f/64)
2536 #define MC_SCALE_Z (1.0f/64)
2537
2538 void MC_UnCompress(float mat[3][4],const unsigned char * comp);
2539
2540 /*
2541 =============================================================
2542
2543 ANIMATED MODELS
2544
2545 =============================================================
2546 */
2547
2548 void R_AddAnimSurfaces( trRefEntity_t *ent );
2549 void RB_SurfaceAnim( mdsSurface_t *surfType );
2550 int R_GetBoneTag( orientation_t *outTag, mdsHeader_t *mds, int startTagIndex, const refEntity_t *refent, const char *tagName );
2551 void R_MDRAddAnimSurfaces( trRefEntity_t *ent );
2552 void RB_MDRSurfaceAnim( mdrSurface_t *surface );
2553 qboolean R_LoadIQM (model_t *mod, void *buffer, int filesize, const char *name );
2554 void R_AddIQMSurfaces( trRefEntity_t *ent );
2555 void RB_IQMSurfaceAnim( surfaceType_t *surface );
2556 void RB_IQMSurfaceAnimVao( srfVaoIQModel_t *surface );
2557 int R_IQMLerpTag( orientation_t *tag, iqmData_t *data,
2558 int startFrame, int endFrame,
2559 float frac, const char *tagName, int startIndex );
2560
2561 /*
2562 =============================================================
2563
2564 IMAGE LOADERS
2565
2566 =============================================================
2567 */
2568
2569 void R_LoadBMP( const char *name, byte **pic, int *width, int *height );
2570 void R_LoadJPG( const char *name, byte **pic, int *width, int *height );
2571 void R_LoadPCX( const char *name, byte **pic, int *width, int *height );
2572 void R_LoadPNG( const char *name, byte **pic, int *width, int *height );
2573 void R_LoadTGA( const char *name, byte **pic, int *width, int *height );
2574
2575 /*
2576 =============================================================
2577 =============================================================
2578 */
2579 void R_TransformModelToClip( const vec3_t src, const float *modelMatrix, const float *projectionMatrix,
2580 vec4_t eye, vec4_t dst );
2581 void R_TransformClipToWindow( const vec4_t clip, const viewParms_t *view, vec4_t normalized, vec4_t window );
2582
2583 void RB_DeformTessGeometry( void );
2584
2585 void RB_CalcFireRiseEnvTexCoords( float *st );
2586 void RB_CalcFogTexCoords( float *dstTexCoords );
2587 void RB_CalcSwapTexCoords( float *dstTexCoords );
2588
2589 void RB_CalcScaleTexMatrix( const float scale[2], float *matrix );
2590 void RB_CalcScrollTexMatrix( const float scrollSpeed[2], float *matrix );
2591 void RB_CalcRotateTexMatrix( float degsPerSecond, float *matrix );
2592 void RB_CalcTurbulentFactors( const waveForm_t *wf, float *amplitude, float *now );
2593 void RB_CalcTransformTexMatrix( const texModInfo_t *tmi, float *matrix );
2594 void RB_CalcStretchTexMatrix( const waveForm_t *wf, float *matrix );
2595
2596 void RB_CalcModulateColorsByFog( unsigned char *dstColors );
2597 float RB_CalcWaveAlphaSingle( const waveForm_t *wf );
2598 float RB_CalcWaveColorSingle( const waveForm_t *wf );
2599
2600 void RB_ZombieFXInit( void );
2601 void RB_ZombieFXAddNewHit( int entityNum, const vec3_t hitPos, const vec3_t hitDir );
2602
2603
2604 /*
2605 =============================================================
2606
2607 RENDERER BACK END FUNCTIONS
2608
2609 =============================================================
2610 */
2611
2612 void RB_ExecuteRenderCommands( const void *data );
2613
2614 /*
2615 =============================================================
2616
2617 RENDERER BACK END COMMAND QUEUE
2618
2619 =============================================================
2620 */
2621
2622 #define MAX_RENDER_COMMANDS 0x40000
2623
2624 typedef struct {
2625 byte cmds[MAX_RENDER_COMMANDS];
2626 int used;
2627 } renderCommandList_t;
2628
2629 typedef struct {
2630 int commandId;
2631 float color[4];
2632 } setColorCommand_t;
2633
2634 typedef struct {
2635 int commandId;
2636 int buffer;
2637 } drawBufferCommand_t;
2638
2639 typedef struct {
2640 int commandId;
2641 image_t *image;
2642 int width;
2643 int height;
2644 void *data;
2645 } subImageCommand_t;
2646
2647 typedef struct {
2648 int commandId;
2649 } swapBuffersCommand_t;
2650
2651 typedef struct {
2652 int commandId;
2653 int buffer;
2654 } endFrameCommand_t;
2655
2656 typedef struct {
2657 int commandId;
2658 shader_t *shader;
2659 float x, y;
2660 float w, h;
2661 float s1, t1;
2662 float s2, t2;
2663
2664 byte gradientColor[4]; // color values 0-255
2665 int gradientType; //----(SA) added
2666 float angle; // NERVE - SMF
2667 } stretchPicCommand_t;
2668
2669 typedef struct {
2670 int commandId;
2671 trRefdef_t refdef;
2672 viewParms_t viewParms;
2673 drawSurf_t *drawSurfs;
2674 int numDrawSurfs;
2675 } drawSurfsCommand_t;
2676
2677 typedef struct {
2678 int commandId;
2679 int x;
2680 int y;
2681 int width;
2682 int height;
2683 char *fileName;
2684 qboolean jpeg;
2685 } screenshotCommand_t;
2686
2687 typedef struct {
2688 int commandId;
2689 int width;
2690 int height;
2691 byte *captureBuffer;
2692 byte *encodeBuffer;
2693 qboolean motionJpeg;
2694 } videoFrameCommand_t;
2695
2696 typedef struct
2697 {
2698 int commandId;
2699
2700 GLboolean rgba[4];
2701 } colorMaskCommand_t;
2702
2703 typedef struct
2704 {
2705 int commandId;
2706 } clearDepthCommand_t;
2707
2708 typedef struct {
2709 int commandId;
2710 int map;
2711 int cubeSide;
2712 } capShadowmapCommand_t;
2713
2714 typedef struct {
2715 int commandId;
2716 trRefdef_t refdef;
2717 viewParms_t viewParms;
2718 } postProcessCommand_t;
2719
2720 typedef struct {
2721 int commandId;
2722 } exportCubemapsCommand_t;
2723
2724 typedef enum {
2725 RC_END_OF_LIST,
2726 RC_SET_COLOR,
2727 RC_STRETCH_PIC,
2728 RC_STRETCH_PIC_GRADIENT, // (SA) added
2729 RC_DRAW_SURFS,
2730 RC_DRAW_BUFFER,
2731 RC_SWAP_BUFFERS,
2732 RC_SCREENSHOT,
2733 RC_VIDEOFRAME,
2734 RC_COLORMASK,
2735 RC_CLEARDEPTH,
2736 RC_CAPSHADOWMAP,
2737 RC_POSTPROCESS,
2738 RC_EXPORT_CUBEMAPS
2739 } renderCommand_t;
2740
2741
2742 // these are sort of arbitrary limits.
2743 // the limits apply to the sum of all scenes in a frame --
2744 // the main view, all the 3D icons, etc
2745
2746 // Ridah, these aren't enough for cool effects
2747 //#define MAX_POLYS 256
2748 //#define MAX_POLYVERTS 1024
2749 #define MAX_POLYS 4096
2750 #define MAX_POLYVERTS 8192
2751 // done.
2752
2753 // all of the information needed by the back end must be
2754 // contained in a backEndData_t
2755 typedef struct {
2756 drawSurf_t drawSurfs[MAX_DRAWSURFS];
2757 dlight_t dlights[MAX_DLIGHTS];
2758 corona_t coronas[MAX_CORONAS]; //----(SA)
2759 trRefEntity_t entities[MAX_REFENTITIES];
2760 srfPoly_t *polys;//[MAX_POLYS];
2761 polyVert_t *polyVerts;//[MAX_POLYVERTS];
2762 pshadow_t pshadows[MAX_CALC_PSHADOWS];
2763 renderCommandList_t commands;
2764 } backEndData_t;
2765
2766 extern int max_polys;
2767 extern int max_polyverts;
2768
2769 extern backEndData_t *backEndData; // the second one may not be allocated
2770
2771 void *R_GetCommandBuffer( int bytes );
2772 void RB_ExecuteRenderCommands( const void *data );
2773
2774 void R_IssuePendingRenderCommands( void );
2775
2776 void R_AddDrawSurfCmd( drawSurf_t *drawSurfs, int numDrawSurfs );
2777 void R_AddCapShadowmapCmd( int dlight, int cubeSide );
2778 void R_AddPostProcessCmd (void);
2779
2780 void RE_SetColor( const float *rgba );
2781 void RE_StretchPic( float x, float y, float w, float h,
2782 float s1, float t1, float s2, float t2, qhandle_t hShader );
2783 void RE_StretchPicGradient( float x, float y, float w, float h,
2784 float s1, float t1, float s2, float t2, qhandle_t hShader, const float *gradientColor, int gradientType );
2785 void RE_BeginFrame( stereoFrame_t stereoFrame );
2786 void RE_EndFrame( int *frontEndMsec, int *backEndMsec );
2787 void RE_SaveJPG(char * filename, int quality, int image_width, int image_height,
2788 unsigned char *image_buffer, int padding);
2789 size_t RE_SaveJPGToBuffer(byte *buffer, size_t bufSize, int quality,
2790 int image_width, int image_height, byte *image_buffer, int padding);
2791 void RE_TakeVideoFrame( int width, int height,
2792 byte *captureBuffer, byte *encodeBuffer, qboolean motionJpeg );
2793
2794 // font stuff
2795 void R_InitFreeType( void );
2796 void R_DoneFreeType( void );
2797 void RE_RegisterFont( const char *fontName, int pointSize, fontInfo_t *font );
2798
2799
2800 //------------------------------------------------------------------------------
2801 // Ridah, mesh compression
2802 #define NUMMDCVERTEXNORMALS 256
2803
2804 extern float r_anormals[NUMMDCVERTEXNORMALS][3];
2805
2806 // NOTE: MDC_MAX_ERROR is effectively the compression level. the lower this value, the higher
2807 // the accuracy, but with lower compression ratios.
2808 #define MDC_MAX_ERROR 0.1 // if any compressed vert is off by more than this from the
2809 // actual vert, make this a baseframe
2810
2811 #define MDC_DIST_SCALE 0.05 // lower for more accuracy, but less range
2812
2813 // note: we are locked in at 8 or less bits since changing to byte-encoded normals
2814 #define MDC_BITS_PER_AXIS 8
2815 #define MDC_MAX_OFS 127.0 // to be safe
2816
2817 #define MDC_MAX_DIST ( MDC_MAX_OFS * MDC_DIST_SCALE )
2818
2819 #if 0
2820 void R_MDC_DecodeXyzCompressed( mdcXyzCompressed_t *xyzComp, vec3_t out, vec3_t normal );
2821 #else // optimized version
2822 #define R_MDC_DecodeXyzCompressed( ofsVec, out, normal ) \
2823 ( out )[0] = ( (float)( ( ofsVec ) & 255 ) - MDC_MAX_OFS ) * MDC_DIST_SCALE; \
2824 ( out )[1] = ( (float)( ( ofsVec >> 8 ) & 255 ) - MDC_MAX_OFS ) * MDC_DIST_SCALE; \
2825 ( out )[2] = ( (float)( ( ofsVec >> 16 ) & 255 ) - MDC_MAX_OFS ) * MDC_DIST_SCALE; \
2826 VectorCopy( ( r_anormals )[( ofsVec >> 24 )], normal );
2827 #endif
2828
2829 void R_AddMDCSurfaces( trRefEntity_t *ent );
2830 // done.
2831 //------------------------------------------------------------------------------
2832
2833
2834 /*
2835 ============================================================
2836
2837 GL FOG
2838
2839 ============================================================
2840 */
2841
2842 //extern glfog_t glfogCurrent;
2843 extern glfog_t glfogsettings[NUM_FOGS]; // [0] never used (FOG_NONE)
2844 extern glfogType_t glfogNum; // fog type to use (from the fog_t enum list)
2845
2846 extern void R_SetFog( int fogvar, int var1, int var2, float r, float g, float b, float density );
2847
2848 extern int skyboxportal;
2849 extern int drawskyboxportal;
2850
2851 // Ridah, virtual memory
2852 void *R_Hunk_Begin( void );
2853 void R_Hunk_End( void );
2854
2855 #endif //TR_LOCAL_H (THIS MUST BE LAST!!)
2856