OpenMoHAA 0.83.0
Loading...
Searching...
No Matches
tr_local.h
1/*
2===========================================================================
3Copyright (C) 1999-2005 Id Software, Inc.
4
5This file is part of Quake III Arena source code.
6
7Quake III Arena source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12Quake III Arena source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with Quake III Arena source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23
24#ifndef TR_LOCAL_H
25#define TR_LOCAL_H
26
27#include "../qcommon/q_shared.h"
28#include "../qcommon/qfiles.h"
29#include "../qcommon/qcommon.h"
30#include "../renderercommon/tr_public.h"
31#include "../renderercommon/tr_common.h"
32#include "tr_extratypes.h"
33#include "tr_extramath.h"
34#include "tr_fbo.h"
35#include "tr_postprocess.h"
36#include "../renderercommon/iqm.h"
37#include "../renderercommon/qgl.h"
38
39#ifdef __cplusplus
40#define GLE(ret, name, ...) extern "C" name##proc * qgl##name;
41#else
42#define GLE(ret, name, ...) extern name##proc * qgl##name;
43#endif
44QGL_1_1_PROCS;
45QGL_DESKTOP_1_1_PROCS;
46QGL_1_3_PROCS;
47QGL_1_5_PROCS;
48QGL_2_0_PROCS;
49QGL_3_0_PROCS;
50QGL_ARB_occlusion_query_PROCS;
51QGL_ARB_framebuffer_object_PROCS;
52QGL_ARB_vertex_array_object_PROCS;
53QGL_EXT_direct_state_access_PROCS;
54#undef GLE
55
56#ifdef __cplusplus
57extern "C" {
58#endif
59
60#define GL_INDEX_TYPE GL_UNSIGNED_SHORT
61typedef unsigned short glIndex_t;
62
63typedef unsigned int vaoCacheGlIndex_t;
64
65#define BUFFER_OFFSET(i) ((char *)NULL + (i))
66
67// 14 bits
68// can't be increased without changing bit packing for drawsurfs
69// see QSORT_SHADERNUM_SHIFT
70#define SHADERNUM_BITS 14
71#define MAX_SHADERS (1<<SHADERNUM_BITS)
72
73#define MAX_FBOS 64
74#define MAX_VISCOUNTS 5
75#define MAX_VAOS 4096
76
77#define MAX_CALC_PSHADOWS 64
78#define MAX_DRAWN_PSHADOWS 16 // do not increase past 32, because bit flags are used on surfaces
79#define PSHADOW_MAP_SIZE 512
80
81//
82// OPENMOHAA-specific stuff
83//=========================
84
85#define MAX_SPHERE_LIGHTS 512
86#define MAX_SPRITESURFS 0x8000
87
88#define MAX_SPRITE_DIST 16384.0f
89#define MAX_SPRITE_DIST_SQUARED (MAX_SPRITE_DIST * MAX_SPRITE_DIST)
90
91typedef enum {
92 USE_S_COORDS,
93 USE_T_COORDS
94} texDirection_t;
95
96#define BUNDLE_ANIMATE_ONCE 1
97
98//=========================
99
100typedef struct cubemap_s {
101 char name[MAX_QPATH];
102 vec3_t origin;
103 float parallaxRadius;
104 image_t *image;
105} cubemap_t;
106
107typedef struct dlight_s {
108 vec3_t origin;
109 vec3_t color; // range from 0.0 to 1.0, should be color normalized
110 float radius;
111
112 vec3_t transformed; // origin in local coordinate system
113 int additive; // texture detail is lost tho when the lightmap is dark
114
115 //
116 // OPENMOHAA-specific stuff
117 //
118
119 dlighttype_t type;
120} dlight_t;
121
122
123// a trRefEntity_t has all the information passed in by
124// the client game, as well as some locally derived info
125typedef struct {
126 refEntity_t e;
127
128 float axisLength; // compensate for non-normalized axis
129
130 qboolean needDlights; // true for bmodels that touch a dlight
131 qboolean lightingCalculated;
132 qboolean mirrored; // mirrored matrix, needs reversed culling
133 vec3_t lightDir; // normalized direction towards light, in world space
134 vec3_t modelLightDir; // normalized direction towards light, in model space
135 vec3_t ambientLight; // color normalized to 0-255
136 int ambientLightInt; // 32 bit rgba packed
137 vec3_t directedLight;
138
139 //
140 // OPENMOHAA-specific stuff
141 //
142
143 int iGridLighting;
144 float lodpercentage[2];
146
147
148typedef struct {
149 vec3_t origin; // in world coordinates
150 vec3_t axis[3]; // orientation in world
151 vec3_t viewOrigin; // viewParms->or.origin in local coordinates
152 float modelMatrix[16];
153 float transformMatrix[16];
155
156// Ensure this is >= the ATTR_INDEX_COUNT enum below
157#define VAO_MAX_ATTRIBS 16
158
159typedef enum
160{
161 VAO_USAGE_STATIC,
162 VAO_USAGE_DYNAMIC
163} vaoUsage_t;
164
165typedef struct vaoAttrib_s
166{
167 uint32_t enabled;
168 uint32_t count;
169 uint32_t type;
170 uint32_t normalized;
171 uint32_t stride;
172 uint32_t offset;
173}
174vaoAttrib_t;
175
176typedef struct vao_s
177{
178 char name[MAX_QPATH];
179
180 uint32_t vao;
181
182 uint32_t vertexesVBO;
183 int vertexesSize; // amount of memory data allocated for all vertices in bytes
184 vaoAttrib_t attribs[VAO_MAX_ATTRIBS];
185
186 uint32_t frameSize; // bytes to skip per frame when doing vertex animation
187
188 uint32_t indexesIBO;
189 int indexesSize; // amount of memory data allocated for all triangles in bytes
190} vao_t;
191
192//===============================================================================
193
194typedef enum {
195 SS_BAD,
196 SS_PORTAL, // mirrors, portals, viewscreens
197 SS_ENVIRONMENT, // sky box
198 SS_OPAQUE, // opaque
199
200 SS_DECAL, // scorch marks, etc.
201 SS_SEE_THROUGH, // ladders, grates, grills that may have small blended edges
202 // in addition to alpha test
203 SS_BANNER,
204
205 SS_FOG,
206
207 SS_UNDERWATER, // for items that should be drawn in front of the water plane
208
209 SS_BLEND0, // regular transparency and filters
210 SS_BLEND1, // generally only used for additive type effects
211 SS_BLEND2,
212 SS_BLEND3,
213
214 SS_BLEND6,
215 SS_STENCIL_SHADOW,
216 SS_ALMOST_NEAREST, // gun smoke puffs
217
218 SS_NEAREST // blood blobs
219} shaderSort_t;
220
221
222#define MAX_SHADER_STAGES 8
223
224typedef enum {
225 GF_NONE,
226
227 GF_SIN,
228 GF_SQUARE,
229 GF_TRIANGLE,
230 GF_SAWTOOTH,
231 GF_INVERSE_SAWTOOTH,
232
233 GF_NOISE
234
235} genFunc_t;
236
237
238typedef enum {
239 DEFORM_NONE,
240 DEFORM_WAVE,
241 DEFORM_NORMALS,
242 DEFORM_BULGE,
243 DEFORM_MOVE,
244 DEFORM_PROJECTION_SHADOW,
245 DEFORM_AUTOSPRITE,
246 DEFORM_AUTOSPRITE2,
247 DEFORM_TEXT0,
248 DEFORM_TEXT1,
249 DEFORM_TEXT2,
250 DEFORM_TEXT3,
251 DEFORM_TEXT4,
252 DEFORM_TEXT5,
253 DEFORM_TEXT6,
254 DEFORM_TEXT7,
255 //
256 // OPENMOHAA-specific stuff
257 //=========================
258 DEFORM_LIGHTGLOW,
259 DEFORM_FLAP_S,
260 DEFORM_FLAP_T,
261 //=========================
262} deform_t;
263
264// deformVertexes types that can be handled by the GPU
265typedef enum
266{
267 // do not edit: same as genFunc_t
268
269 DGEN_NONE,
270 DGEN_WAVE_SIN,
271 DGEN_WAVE_SQUARE,
272 DGEN_WAVE_TRIANGLE,
273 DGEN_WAVE_SAWTOOTH,
274 DGEN_WAVE_INVERSE_SAWTOOTH,
275 DGEN_WAVE_NOISE,
276
277 // do not edit until this line
278
279 DGEN_BULGE,
280 DGEN_MOVE
281} deformGen_t;
282
283typedef enum {
284 AGEN_IDENTITY,
285 AGEN_SKIP,
286 AGEN_ENTITY,
287 AGEN_ONE_MINUS_ENTITY,
288 AGEN_VERTEX,
289 AGEN_ONE_MINUS_VERTEX,
290 AGEN_LIGHTING_SPECULAR,
291 AGEN_WAVEFORM,
292 AGEN_PORTAL,
293 AGEN_CONST,
294
295 //
296 // OPENMOHAA-specific stuff
297 //
298
299 AGEN_NOISE,
300 AGEN_DOT,
301 AGEN_ONE_MINUS_DOT,
302 AGEN_CONSTANT,
303 AGEN_GLOBAL_ALPHA,
304 AGEN_SKYALPHA,
305 AGEN_ONE_MINUS_SKYALPHA,
306 AGEN_SCOORD,
307 AGEN_TCOORD,
308 AGEN_DIST_FADE,
309 AGEN_ONE_MINUS_DIST_FADE,
310 AGEN_TIKI_DIST_FADE,
311 AGEN_ONE_MINUS_TIKI_DIST_FADE,
312 AGEN_DOT_VIEW,
313 AGEN_ONE_MINUS_DOT_VIEW,
314 AGEN_HEIGHT_FADE,
315} alphaGen_t;
316
317typedef enum {
318 CGEN_BAD,
319 CGEN_IDENTITY_LIGHTING, // tr.identityLight
320 CGEN_IDENTITY, // always (1,1,1,1)
321 CGEN_ENTITY, // grabbed from entity's modulate field
322 CGEN_ONE_MINUS_ENTITY, // grabbed from 1 - entity.modulate
323 CGEN_EXACT_VERTEX, // tess.vertexColors
324 CGEN_VERTEX, // tess.vertexColors * tr.identityLight
325 CGEN_EXACT_VERTEX_LIT, // like CGEN_EXACT_VERTEX but takes a light direction from the lightgrid
326 CGEN_VERTEX_LIT, // like CGEN_VERTEX but takes a light direction from the lightgrid
327 CGEN_ONE_MINUS_VERTEX,
328 CGEN_WAVEFORM, // programmatically generated
329 CGEN_LIGHTING_DIFFUSE,
330 CGEN_FOG, // standard fog
331 CGEN_CONST, // fixed color
332
333 //
334 // OPENMOHAA-specific stuff
335 //
336
337 CGEN_MULTIPLY_BY_WAVEFORM,
338 CGEN_LIGHTING_GRID,
339 CGEN_LIGHTING_SPHERICAL,
340 CGEN_NOISE,
341 CGEN_GLOBAL_COLOR,
342 CGEN_STATIC,
343 CGEN_SCOORD,
344 CGEN_TCOORD,
345 CGEN_DOT,
346 CGEN_ONE_MINUS_DOT,
347} colorGen_t;
348
349typedef enum {
350 TCGEN_BAD,
351 TCGEN_IDENTITY, // clear to 0,0
352 TCGEN_LIGHTMAP,
353 TCGEN_TEXTURE,
354 TCGEN_ENVIRONMENT_MAPPED,
355 TCGEN_FOG,
356 TCGEN_VECTOR // S and T from world coordinates
357} texCoordGen_t;
358
359typedef enum {
360 ACFF_NONE,
361 ACFF_MODULATE_RGB,
362 ACFF_MODULATE_RGBA,
363 ACFF_MODULATE_ALPHA
364} acff_t;
365
366typedef struct {
367 genFunc_t func;
368
369 float base;
370 float amplitude;
371 float phase;
372 float frequency;
373} waveForm_t;
374
375#define TR_MAX_TEXMODS 4
376
377typedef enum {
378 TMOD_NONE,
379 TMOD_TRANSFORM,
380 TMOD_TURBULENT,
381 TMOD_SCROLL,
382 TMOD_SCALE,
383 TMOD_STRETCH,
384 TMOD_ROTATE,
385 TMOD_ENTITY_TRANSLATE
386} texMod_t;
387
388#define MAX_SHADER_DEFORMS 3
389typedef struct {
390 deform_t deformation; // vertex coordinate modification type
391
392 vec3_t moveVector;
393 waveForm_t deformationWave;
394 float deformationSpread;
395
396 float bulgeWidth;
397 float bulgeHeight;
398 float bulgeSpeed;
400
401
402typedef struct {
403 texMod_t type;
404
405 // used for TMOD_TURBULENT and TMOD_STRETCH
406 waveForm_t wave;
407
408 // used for TMOD_TRANSFORM
409 float matrix[2][2]; // s' = s * m[0][0] + t * m[1][0] + trans[0]
410 float translate[2]; // t' = s * m[0][1] + t * m[0][1] + trans[1]
411
412 // used for TMOD_SCALE
413 float scale[2]; // s *= scale[0]
414 // t *= scale[1]
415
416 // used for TMOD_SCROLL
417 float scroll[2]; // s' = s + scroll[0] * time
418 // t' = t + scroll[1] * time
419
420 // + = clockwise
421 // - = counterclockwise
422 float rotateSpeed;
423
425
426
427//#define MAX_IMAGE_ANIMATIONS 8
428//
429// OPENMOHAA-specific stuff
430//=========================
431#define MAX_IMAGE_ANIMATIONS 64
432//=========================
433
434typedef struct {
435 image_t *image[MAX_IMAGE_ANIMATIONS];
436 int numImageAnimations;
437 float imageAnimationSpeed;
438
439 texCoordGen_t tcGen;
440 vec3_t tcGenVectors[2];
441
442 int numTexMods;
443 texModInfo_t *texMods;
444
445 int videoMapHandle;
446 qboolean isLightmap;
447 qboolean isVideoMap;
448
449 //
450 // OPENMOHAA-specific stuff
451 //=========================
452 float imageAnimationPhase;
453 int flags;
454 //=========================
456
457enum
458{
459 TB_COLORMAP = 0,
460 TB_DIFFUSEMAP = 0,
461 TB_LIGHTMAP = 1,
462 TB_LEVELSMAP = 1,
463 TB_SHADOWMAP3 = 1,
464 TB_NORMALMAP = 2,
465 TB_DELUXEMAP = 3,
466 TB_SHADOWMAP2 = 3,
467 TB_SPECULARMAP = 4,
468 TB_SHADOWMAP = 5,
469 TB_CUBEMAP = 6,
470 TB_SHADOWMAP4 = 6,
471 NUM_TEXTURE_BUNDLES = 7
472};
473
474typedef enum
475{
476 // material shader stage types
477 ST_COLORMAP = 0, // vanilla Q3A style shader treatening
478 ST_DIFFUSEMAP = 0, // treat color and diffusemap the same
479 ST_NORMALMAP,
480 ST_NORMALPARALLAXMAP,
481 ST_SPECULARMAP,
482 ST_GLSL
483} stageType_t;
484
485typedef struct {
486 qboolean active;
487
488 textureBundle_t bundle[NUM_TEXTURE_BUNDLES];
489
490 waveForm_t rgbWave;
491 colorGen_t rgbGen;
492
493 waveForm_t alphaWave;
494 alphaGen_t alphaGen;
495
496 byte constantColor[4]; // for CGEN_CONST and AGEN_CONST
497
498 unsigned stateBits; // GLS_xxxx mask
499
500 acff_t adjustColorsForFog;
501
502 qboolean isDetail;
503
504 stageType_t type;
505 struct shaderProgram_s *glslShaderGroup;
506 int glslShaderIndex;
507
508 vec4_t normalScale;
509 vec4_t specularScale;
510
511 //
512 // OPENMOHAA-SPECIFIC stuff
513 //
514
515 float alphaMin;
516 float alphaMax;
517 vec3_t specOrigin;
518
519 byte colorConst[4]; // for CGEN_CONST and AGEN_CONST
520 byte alphaConst;
521 byte alphaConstMin;
523
524struct shaderCommands_s;
525
526typedef enum {
527 CT_FRONT_SIDED,
528 CT_BACK_SIDED,
529 CT_TWO_SIDED
530} cullType_t;
531
532typedef enum {
533 FP_NONE, // surface is translucent and will just be adjusted properly
534 FP_EQUAL, // surface is opaque but possibly alpha tested
535 FP_LE // surface is trnaslucent, but still needs a fog pass (fog surface)
536} fogPass_t;
537
538typedef struct {
539 float cloudHeight;
540 image_t *outerbox[6], *innerbox[6];
541} skyParms_t;
542
543typedef struct {
544 vec3_t color;
545 float depthForOpaque;
546} fogParms_t;
547
548//
549// OPENMOHAA-specific stuff
550//
551//=============================
552
553typedef enum {
554 SPRITE_PARALLEL,
555 SPRITE_PARALLEL_ORIENTED,
556 SPRITE_ORIENTED,
557 SPRITE_PARALLEL_UPRIGHT
558} spriteType_t;
559
560typedef struct {
561 spriteType_t type;
562 float scale;
564
565//=============================
566
567typedef struct shader_s {
568 char name[MAX_QPATH]; // game path, including extension
569 int lightmapIndex; // for a shader to match, both name and lightmapIndex must match
570
571 int index; // this shader == tr.shaders[index]
572 int sortedIndex; // this shader == tr.sortedShaders[sortedIndex]
573
574 float sort; // lower numbered shaders draw before higher numbered
575
576 qboolean defaultShader; // we want to return index 0 if the shader failed to
577 // load for some reason, but R_FindShader should
578 // still keep a name allocated for it, so if
579 // something calls RE_RegisterShader again with
580 // the same name, we don't try looking for it again
581
582 qboolean explicitlyDefined; // found in a .shader file
583
584 int surfaceFlags; // if explicitlyDefined, this will have SURF_* flags
585 int contentFlags;
586
587 qboolean entityMergable; // merge across entites optimizable (smoke, blood)
588
589 qboolean isSky;
590 skyParms_t sky;
591 fogParms_t fogParms;
592
593 float portalRange; // distance to fog out at
594 qboolean isPortal;
595
596 cullType_t cullType; // CT_FRONT_SIDED, CT_BACK_SIDED, or CT_TWO_SIDED
597 qboolean polygonOffset; // set for decals and other items that must be offset
598 qboolean noMipMaps; // for console fonts, 2D elements, etc.
599 qboolean noPicMip; // for images that must always be full resolution
600
601 fogPass_t fogPass; // draw a blended pass, possibly with depth test equals
602
603 int vertexAttribs; // not all shaders will need all data to be gathered
604
605 int numDeforms;
606 deformStage_t deforms[MAX_SHADER_DEFORMS];
607
608 int numUnfoggedPasses;
609 shaderStage_t *stages[MAX_SHADER_STAGES];
610
611 void (*optimalStageIteratorFunc)( void );
612
613 double clampTime; // time this shader is clamped to
614 double timeOffset; // current time offset for this shader
615
616 struct shader_s *remappedShader; // current shader this one is remapped too
617
618 struct shader_s *next;
619
620 //
621 // OPENMOHAA-specific stuff
622 //
623 qboolean force32bit;
624 float fDistRange;
625 float fDistNear;
626 spriteParms_t sprite;
627} shader_t;
628
629enum
630{
631 ATTR_INDEX_POSITION = 0,
632 ATTR_INDEX_TEXCOORD = 1,
633 ATTR_INDEX_LIGHTCOORD = 2,
634 ATTR_INDEX_TANGENT = 3,
635 ATTR_INDEX_NORMAL = 4,
636 ATTR_INDEX_COLOR = 5,
637 ATTR_INDEX_PAINTCOLOR = 6,
638 ATTR_INDEX_LIGHTDIRECTION = 7,
639 ATTR_INDEX_BONE_INDEXES = 8,
640 ATTR_INDEX_BONE_WEIGHTS = 9,
641
642 // GPU vertex animations
643 ATTR_INDEX_POSITION2 = 10,
644 ATTR_INDEX_TANGENT2 = 11,
645 ATTR_INDEX_NORMAL2 = 12,
646
647 ATTR_INDEX_COUNT = 13
648};
649
650enum
651{
652 ATTR_POSITION = 1 << ATTR_INDEX_POSITION,
653 ATTR_TEXCOORD = 1 << ATTR_INDEX_TEXCOORD,
654 ATTR_LIGHTCOORD = 1 << ATTR_INDEX_LIGHTCOORD,
655 ATTR_TANGENT = 1 << ATTR_INDEX_TANGENT,
656 ATTR_NORMAL = 1 << ATTR_INDEX_NORMAL,
657 ATTR_COLOR = 1 << ATTR_INDEX_COLOR,
658 ATTR_PAINTCOLOR = 1 << ATTR_INDEX_PAINTCOLOR,
659 ATTR_LIGHTDIRECTION = 1 << ATTR_INDEX_LIGHTDIRECTION,
660 ATTR_BONE_INDEXES = 1 << ATTR_INDEX_BONE_INDEXES,
661 ATTR_BONE_WEIGHTS = 1 << ATTR_INDEX_BONE_WEIGHTS,
662
663 // for .md3 interpolation
664 ATTR_POSITION2 = 1 << ATTR_INDEX_POSITION2,
665 ATTR_TANGENT2 = 1 << ATTR_INDEX_TANGENT2,
666 ATTR_NORMAL2 = 1 << ATTR_INDEX_NORMAL2,
667
668 ATTR_DEFAULT = ATTR_POSITION,
669 ATTR_BITS = ATTR_POSITION |
670 ATTR_TEXCOORD |
671 ATTR_LIGHTCOORD |
672 ATTR_TANGENT |
673 ATTR_NORMAL |
674 ATTR_COLOR |
675 ATTR_PAINTCOLOR |
676 ATTR_LIGHTDIRECTION |
677 ATTR_BONE_INDEXES |
678 ATTR_BONE_WEIGHTS |
679 ATTR_POSITION2 |
680 ATTR_TANGENT2 |
681 ATTR_NORMAL2
682};
683
684enum
685{
686 GENERICDEF_USE_DEFORM_VERTEXES = 0x0001,
687 GENERICDEF_USE_TCGEN_AND_TCMOD = 0x0002,
688 GENERICDEF_USE_VERTEX_ANIMATION = 0x0004,
689 GENERICDEF_USE_FOG = 0x0008,
690 GENERICDEF_USE_RGBAGEN = 0x0010,
691 GENERICDEF_USE_BONE_ANIMATION = 0x0020,
692 GENERICDEF_ALL = 0x003F,
693 GENERICDEF_COUNT = 0x0040,
694};
695
696enum
697{
698 FOGDEF_USE_DEFORM_VERTEXES = 0x0001,
699 FOGDEF_USE_VERTEX_ANIMATION = 0x0002,
700 FOGDEF_USE_BONE_ANIMATION = 0x0004,
701 FOGDEF_ALL = 0x0007,
702 FOGDEF_COUNT = 0x0008,
703};
704
705enum
706{
707 DLIGHTDEF_USE_DEFORM_VERTEXES = 0x0001,
708 DLIGHTDEF_ALL = 0x0001,
709 DLIGHTDEF_COUNT = 0x0002,
710};
711
712enum
713{
714 LIGHTDEF_USE_LIGHTMAP = 0x0001,
715 LIGHTDEF_USE_LIGHT_VECTOR = 0x0002,
716 LIGHTDEF_USE_LIGHT_VERTEX = 0x0003,
717 LIGHTDEF_LIGHTTYPE_MASK = 0x0003,
718 LIGHTDEF_ENTITY_VERTEX_ANIMATION = 0x0004,
719 LIGHTDEF_USE_TCGEN_AND_TCMOD = 0x0008,
720 LIGHTDEF_USE_PARALLAXMAP = 0x0010,
721 LIGHTDEF_USE_SHADOWMAP = 0x0020,
722 LIGHTDEF_ENTITY_BONE_ANIMATION = 0x0040,
723 LIGHTDEF_ALL = 0x007F,
724 LIGHTDEF_COUNT = 0x0080
725};
726
727enum
728{
729 SHADOWMAPDEF_USE_VERTEX_ANIMATION = 0x0001,
730 SHADOWMAPDEF_USE_BONE_ANIMATION = 0x0002,
731 SHADOWMAPDEF_ALL = 0x0003,
732 SHADOWMAPDEF_COUNT = 0x0004
733};
734
735enum
736{
737 GLSL_INT,
738 GLSL_FLOAT,
739 GLSL_FLOAT5,
740 GLSL_VEC2,
741 GLSL_VEC3,
742 GLSL_VEC4,
743 GLSL_MAT16,
744 GLSL_MAT16_BONEMATRIX
745};
746
747typedef enum
748{
749 UNIFORM_DIFFUSEMAP = 0,
750 UNIFORM_LIGHTMAP,
751 UNIFORM_NORMALMAP,
752 UNIFORM_DELUXEMAP,
753 UNIFORM_SPECULARMAP,
754
755 UNIFORM_TEXTUREMAP,
756 UNIFORM_LEVELSMAP,
757 UNIFORM_CUBEMAP,
758
759 UNIFORM_SCREENIMAGEMAP,
760 UNIFORM_SCREENDEPTHMAP,
761
762 UNIFORM_SHADOWMAP,
763 UNIFORM_SHADOWMAP2,
764 UNIFORM_SHADOWMAP3,
765 UNIFORM_SHADOWMAP4,
766
767 UNIFORM_SHADOWMVP,
768 UNIFORM_SHADOWMVP2,
769 UNIFORM_SHADOWMVP3,
770 UNIFORM_SHADOWMVP4,
771
772 UNIFORM_ENABLETEXTURES,
773
774 UNIFORM_DIFFUSETEXMATRIX0,
775 UNIFORM_DIFFUSETEXMATRIX1,
776 UNIFORM_DIFFUSETEXMATRIX2,
777 UNIFORM_DIFFUSETEXMATRIX3,
778 UNIFORM_DIFFUSETEXMATRIX4,
779 UNIFORM_DIFFUSETEXMATRIX5,
780 UNIFORM_DIFFUSETEXMATRIX6,
781 UNIFORM_DIFFUSETEXMATRIX7,
782
783 UNIFORM_TCGEN0,
784 UNIFORM_TCGEN0VECTOR0,
785 UNIFORM_TCGEN0VECTOR1,
786
787 UNIFORM_DEFORMGEN,
788 UNIFORM_DEFORMPARAMS,
789
790 UNIFORM_COLORGEN,
791 UNIFORM_ALPHAGEN,
792 UNIFORM_COLOR,
793 UNIFORM_BASECOLOR,
794 UNIFORM_VERTCOLOR,
795
796 UNIFORM_DLIGHTINFO,
797 UNIFORM_LIGHTFORWARD,
798 UNIFORM_LIGHTUP,
799 UNIFORM_LIGHTRIGHT,
800 UNIFORM_LIGHTORIGIN,
801 UNIFORM_MODELLIGHTDIR,
802 UNIFORM_LIGHTRADIUS,
803 UNIFORM_AMBIENTLIGHT,
804 UNIFORM_DIRECTEDLIGHT,
805
806 UNIFORM_PORTALRANGE,
807
808 UNIFORM_FOGDISTANCE,
809 UNIFORM_FOGDEPTH,
810 UNIFORM_FOGEYET,
811 UNIFORM_FOGCOLORMASK,
812
813 UNIFORM_MODELMATRIX,
814 UNIFORM_MODELVIEWPROJECTIONMATRIX,
815
816 UNIFORM_TIME,
817 UNIFORM_VERTEXLERP,
818 UNIFORM_NORMALSCALE,
819 UNIFORM_SPECULARSCALE,
820
821 UNIFORM_VIEWINFO, // znear, zfar, width/2, height/2
822 UNIFORM_VIEWORIGIN,
823 UNIFORM_LOCALVIEWORIGIN,
824 UNIFORM_VIEWFORWARD,
825 UNIFORM_VIEWLEFT,
826 UNIFORM_VIEWUP,
827
828 UNIFORM_INVTEXRES,
829 UNIFORM_AUTOEXPOSUREMINMAX,
830 UNIFORM_TONEMINAVGMAXLINEAR,
831
832 UNIFORM_PRIMARYLIGHTORIGIN,
833 UNIFORM_PRIMARYLIGHTCOLOR,
834 UNIFORM_PRIMARYLIGHTAMBIENT,
835 UNIFORM_PRIMARYLIGHTRADIUS,
836
837 UNIFORM_CUBEMAPINFO,
838
839 UNIFORM_ALPHATEST,
840
841 UNIFORM_BONEMATRIX,
842
843 UNIFORM_GREYSCALE,
844
845 UNIFORM_COUNT
846} uniform_t;
847
848// shaderProgram_t represents a pair of one
849// GLSL vertex and one GLSL fragment shader
850typedef struct shaderProgram_s
851{
852 char name[MAX_QPATH];
853
854 GLuint program;
855 GLuint vertexShader;
856 GLuint fragmentShader;
857 uint32_t attribs; // vertex array attributes
858
859 // uniform parameters
860 GLint uniforms[UNIFORM_COUNT];
861 short uniformBufferOffsets[UNIFORM_COUNT]; // max 32767/64=511 uniforms
862 char *uniformBuffer;
863} shaderProgram_t;
864
865// trRefdef_t holds everything that comes in refdef_t,
866// as well as the locally generated scene information
867typedef struct {
868 int x, y, width, height;
869 float fov_x, fov_y;
870 vec3_t vieworg;
871 vec3_t viewaxis[3]; // transformation matrix
872
873 stereoFrame_t stereoFrame;
874
875 int time; // time in milliseconds for shader effects and other time dependent rendering issues
876 int rdflags; // RDF_NOWORLDMODEL, etc
877
878 // 1 bits will prevent the associated area from rendering at all
879 byte areamask[MAX_MAP_AREA_BYTES];
880 qboolean areamaskModified; // qtrue if areamask changed since last scene
881
882 double floatTime; // tr.refdef.time / 1000.0
883
884 float blurFactor;
885
886 // text messages for deform text shaders
887 char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH];
888
889 int num_entities;
890 trRefEntity_t *entities;
891
892 int num_dlights;
893 struct dlight_s *dlights;
894
895 int numPolys;
896 struct srfPoly_s *polys;
897
898 int numDrawSurfs;
899 struct drawSurf_s *drawSurfs;
900
901 unsigned int dlightMask;
902 int num_pshadows;
903 struct pshadow_s *pshadows;
904
905 float sunShadowMvp[4][16];
906 float sunDir[4];
907 float sunCol[4];
908 float sunAmbCol[4];
909
910 float autoExposureMinMax[2];
911 float toneMinAvgMaxLinear[3];
912
913
914 //
915 // OPENMOHAA-specific stuff
916 //
917
918 int num_sprites;
919 struct refSprite_s *sprites;
920
921 int numTerMarks;
922 struct srfMarkFragment_s *terMarks;
923
924 int numSpriteSurfs;
925 struct drawSurf_s *spriteSurfs;
926
927 int numStaticModels;
928 struct cStaticModelUnpacked_s *staticModels;
929
930 int numStaticModelData;
931 unsigned char *staticModelData;
932
933 qboolean sky_portal;
934 float sky_alpha;
935 vec3_t sky_origin;
936 vec3_t sky_axis[3];
937 qboolean skybox_farplane;
938 qboolean render_terrain;
939} trRefdef_t;
940
941
942//=================================================================================
943
944// max surfaces per-skin
945// This is an arbitry limit. Vanilla Q3 only supported 32 surfaces in skins but failed to
946// enforce the maximum limit when reading skin files. It was possile to use more than 32
947// surfaces which accessed out of bounds memory past end of skin->surfaces hunk block.
948#define MAX_SKIN_SURFACES 256
949
950// skins allow models to be retextured without modifying the model file
951typedef struct {
952 char name[MAX_QPATH];
953 shader_t *shader;
955
956typedef struct skin_s {
957 char name[MAX_QPATH]; // game path, including extension
958 int numSurfaces;
959 skinSurface_t *surfaces; // dynamically allocated array of surfaces
960} skin_t;
961
962
963typedef struct {
964 int originalBrushNumber;
965 vec3_t bounds[2];
966
967 unsigned colorInt; // in packed byte format
968 float tcScale; // texture coordinate vector scales
969 fogParms_t parms;
970
971 // for clipping distance in fog when outside
972 qboolean hasSurface;
973 float surface[4];
974} fog_t;
975
976//
977// OPENMOHAA-specific stuff
978//
979//=========================
980typedef struct depthfog_s {
981 float len;
982 float oolen;
983 int enabled;
984 int extrafrustums;
985} depthfog_t;
986
987// Doesn't cull anything
988#define FARPLANE_CULL_NONE 0
989// Cull outside the maximum distance
990#define FARPLANE_CULL_STANDARD 1
991// Cull outside the maximum distance ONLY if the view is a portal sky
992#define FARPLANE_CULL_PORTALSKY 2
993
994//=========================
995
996typedef enum {
997 VPF_NONE = 0x00,
998 VPF_NOVIEWMODEL = 0x01,
999 VPF_SHADOWMAP = 0x02,
1000 VPF_DEPTHSHADOW = 0x04,
1001 VPF_DEPTHCLAMP = 0x08,
1002 VPF_ORTHOGRAPHIC = 0x10,
1003 VPF_USESUNLIGHT = 0x20,
1004 VPF_FARPLANEFRUSTUM = 0x40,
1005 VPF_NOCUBEMAPS = 0x80
1006} viewParmFlags_t;
1007
1008typedef struct {
1009 orientationr_t ori;
1010 orientationr_t world;
1011 vec3_t pvsOrigin; // may be different than or.origin for portals
1012 qboolean isPortal; // true if this view is through a portal
1013 qboolean isMirror; // the portal is a mirror, invert the face culling
1014 viewParmFlags_t flags;
1015 int frameSceneNum; // copied from tr.frameSceneNum
1016 int frameCount; // copied from tr.frameCount
1017 cplane_t portalPlane; // clip anything behind this if mirroring
1018 int viewportX, viewportY, viewportWidth, viewportHeight;
1019 FBO_t *targetFbo;
1020 int targetFboLayer;
1021 int targetFboCubemapIndex;
1022 float fovX, fovY;
1023 float projectionMatrix[16];
1024 cplane_t frustum[5];
1025 vec3_t visBounds[2];
1026 float zFar;
1027 float zNear;
1028 stereoFrame_t stereoFrame;
1029
1030 //
1031 // OPENMOHAA-specific stuff
1032 //
1033
1034 qboolean isPortalSky; // since 2.0 whether or not this view is a portal sky
1035 depthfog_t fog;
1036 float farplane_distance;
1037 float farplane_bias; // added in 2.0
1038 float farplane_color[3];
1039 int farplane_cull;
1040 qboolean renderTerrain; // added in 2.0
1041} viewParms_t;
1042
1043
1044/*
1045==============================================================================
1046
1047SURFACES
1048
1049==============================================================================
1050*/
1051typedef byte color4ub_t[4];
1052
1053// any changes in surfaceType must be mirrored in rb_surfaceTable[]
1054typedef enum {
1055 SF_BAD,
1056 SF_SKIP, // ignore
1057 SF_FACE,
1058 SF_GRID,
1059 SF_TRIANGLES,
1060 SF_POLY,
1061 SF_MDV,
1062 SF_MDR,
1063 SF_IQM,
1064 SF_FLARE,
1065 SF_ENTITY, // beams, rails, lightning, etc that can be determined by entity
1066 SF_VAO_MDVMESH,
1067 SF_VAO_IQM,
1068
1069 //
1070 // OPENMOHAA-specific stuff
1071 //
1072
1073 SF_MARK_FRAG,
1074 SF_TIKI_SKEL,
1075 SF_TIKI_STATIC,
1076 SF_SWIPE,
1077 SF_SPRITE,
1078 SF_TERRAIN_PATCH,
1079 SF_NUM_SURFACE_TYPES,
1080 SF_MAX = 0x7fffffff // ensures that sizeof( surfaceType_t ) == sizeof( int )
1081} surfaceType_t;
1082
1083typedef struct drawSurf_s {
1084 unsigned int sort; // bit combination for fast compares
1085 int cubemapIndex;
1086 surfaceType_t *surface; // any of surface*_t
1087} drawSurf_t;
1088
1089#define MAX_FACE_POINTS 64
1090
1091#define MAX_PATCH_SIZE 32 // max dimensions of a patch mesh in map file
1092#define MAX_GRID_SIZE 65 // max dimensions of a grid mesh in memory
1093
1094// when cgame directly specifies a polygon, it becomes a srfPoly_t
1095// as soon as it is called
1096typedef struct srfPoly_s {
1097 surfaceType_t surfaceType;
1098 qhandle_t hShader;
1099 int fogIndex;
1100 int numVerts;
1101 polyVert_t *verts;
1102
1103 //
1104 // OPENMOHAA-specific stuff
1105 //
1106
1107 int renderfx;
1108} srfPoly_t;
1109
1110
1111typedef struct srfFlare_s {
1112 surfaceType_t surfaceType;
1113 vec3_t origin;
1114 vec3_t normal;
1115 vec3_t color;
1116} srfFlare_t;
1117
1118typedef struct
1119{
1120 vec3_t xyz;
1121 vec2_t st;
1122 vec2_t lightmap;
1123 int16_t normal[4];
1124 int16_t tangent[4];
1125 int16_t lightdir[4];
1126 uint16_t color[4];
1127
1128#if DEBUG_OPTIMIZEVERTICES
1129 unsigned int id;
1130#endif
1131} srfVert_t;
1132
1133#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}}
1134
1135// srfBspSurface_t covers SF_GRID, SF_TRIANGLES, and SF_POLY
1136typedef struct srfBspSurface_s
1137{
1138 surfaceType_t surfaceType;
1139
1140 // dynamic lighting information
1141 int dlightBits;
1142 int pshadowBits;
1143
1144 // culling information
1145 vec3_t cullBounds[2];
1146 vec3_t cullOrigin;
1147 float cullRadius;
1148 cplane_t cullPlane;
1149
1150 // indexes
1151 int numIndexes;
1152 glIndex_t *indexes;
1153
1154 // vertexes
1155 int numVerts;
1156 srfVert_t *verts;
1157
1158 // SF_GRID specific variables after here
1159
1160 // lod information, which may be different
1161 // than the culling information to allow for
1162 // groups of curves that LOD as a unit
1163 vec3_t lodOrigin;
1164 float lodRadius;
1165 int lodFixed;
1166 int lodStitched;
1167
1168 // vertexes
1169 int width, height;
1170 float *widthLodError;
1171 float *heightLodError;
1172} srfBspSurface_t;
1173
1174typedef struct {
1175 vec3_t translate;
1176 quat_t rotate;
1177 vec3_t scale;
1179
1180// inter-quake-model
1181typedef struct {
1182 int num_vertexes;
1183 int num_triangles;
1184 int num_frames;
1185 int num_surfaces;
1186 int num_joints;
1187 int num_poses;
1188 struct srfIQModel_s *surfaces;
1189
1190 int *triangles;
1191
1192 // vertex arrays
1193 float *positions;
1194 float *texcoords;
1195 float *normals;
1196 float *tangents;
1197 byte *colors;
1198 int *influences; // [num_vertexes] indexes into influenceBlendVertexes
1199
1200 // unique list of vertex blend indexes/weights for faster CPU vertex skinning
1201 byte *influenceBlendIndexes; // [num_influences]
1202 union {
1203 float *f;
1204 byte *b;
1205 } influenceBlendWeights; // [num_influences]
1206
1207 // depending upon the exporter, blend indices and weights might be int/float
1208 // as opposed to the recommended byte/byte, for example Noesis exports
1209 // int/float whereas the official IQM tool exports byte/byte
1210 int blendWeightsType; // IQM_UBYTE or IQM_FLOAT
1211
1212 char *jointNames;
1213 int *jointParents;
1214 float *bindJoints; // [num_joints * 12]
1215 float *invBindJoints; // [num_joints * 12]
1216 iqmTransform_t *poses; // [num_frames * num_poses]
1217 float *bounds;
1218
1219 int numVaoSurfaces;
1220 struct srfVaoIQModel_s *vaoSurfaces;
1221} iqmData_t;
1222
1223// inter-quake-model surface
1224typedef struct srfIQModel_s {
1225 surfaceType_t surfaceType;
1226 char name[MAX_QPATH];
1227 shader_t *shader;
1228 iqmData_t *data;
1229 int first_vertex, num_vertexes;
1230 int first_triangle, num_triangles;
1231 int first_influence, num_influences;
1232} srfIQModel_t;
1233
1234typedef struct srfVaoIQModel_s
1235{
1236 surfaceType_t surfaceType;
1237
1238 iqmData_t *iqmData;
1239 struct srfIQModel_s *iqmSurface;
1240
1241 // backEnd stats
1242 int numIndexes;
1243 int numVerts;
1244
1245 // static render data
1246 vao_t *vao;
1247} srfVaoIQModel_t;
1248
1249typedef struct srfVaoMdvMesh_s
1250{
1251 surfaceType_t surfaceType;
1252
1253 struct mdvModel_s *mdvModel;
1254 struct mdvSurface_s *mdvSurface;
1255
1256 // backEnd stats
1257 int numIndexes;
1258 int numVerts;
1259
1260 // static render data
1261 vao_t *vao;
1262} srfVaoMdvMesh_t;
1263
1264extern void (*rb_surfaceTable[SF_NUM_SURFACE_TYPES])(void *);
1265
1266//
1267// OPENMOHAA-specific stuff
1268//=========================
1269
1270typedef struct {
1271 struct mnode_s* cntNode;
1272 struct msurface_s* skySurfs[32];
1273 int numSurfs;
1274 vec3_t offset;
1275 vec3_t mins;
1276 vec3_t maxs;
1277} portalsky_t;
1278
1279typedef struct {
1280 vec3_t transformed;
1281 int index;
1283
1284typedef enum {
1285 LIGHT_POINT,
1286 LIGHT_DIRECTIONAL,
1287 LIGHT_SPOT,
1288 LIGHT_SPOT_FAST
1289} lighttype_t;
1290
1291typedef struct reallightinfo_s {
1292 vec3_t color;
1293 lighttype_t eType;
1294 float fIntensity;
1295 float fDist;
1296 float fSpotSlope;
1297 float fSpotConst;
1298 float fSpotScale;
1299 vec3_t vOrigin;
1300 vec3_t vDirection;
1301} reallightinfo_t;
1302
1303typedef float cube_entry_t[3][4];
1304
1305typedef struct {
1306 vec3_t origin;
1307 vec3_t worldOrigin;
1308 vec3_t traceOrigin;
1309 float radius;
1310 struct mnode_s* leaves[8];
1311 void(*TessFunction) (unsigned char* dstColors);
1312 union {
1313 unsigned char level[4];
1314 int value;
1315 } ambient;
1316 int numRealLights;
1317 reallightinfo_t light[MAX_REAL_LIGHTS];
1318 int bUsesCubeMap;
1319 float cubemap[24][3][4];
1320} sphereor_t;
1321
1322typedef struct spherel_s {
1323 vec3_t origin;
1324 vec3_t color;
1325 float intensity;
1326 struct mnode_s* leaf;
1327 int needs_trace;
1328 int spot_light;
1329 float spot_radiusbydistance;
1330 vec3_t spot_dir;
1331 int reference_count;
1332} spherel_t;
1333
1334typedef struct suninfo_s {
1335 vec3_t color;
1336 vec3_t direction;
1337 vec3_t flaredirection;
1338 char szFlareName[64];
1339 qboolean exists;
1340} suninfo_t;
1341
1342typedef union varnodeUnpacked_u {
1343 float fVariance;
1344 int flags;
1345} varnodeUnpacked_t;
1346
1347typedef unsigned short terraInt;
1348
1349typedef struct terrainVert_s {
1350 vec3_t xyz;
1351 vec2_t texCoords[2];
1352 float fVariance;
1353 float fHgtAvg;
1354 float fHgtAdd;
1355 unsigned int uiDistRecalc;
1356 terraInt nRef;
1357 terraInt iVertArray;
1358 byte* pHgt;
1359 terraInt iNext;
1360 terraInt iPrev;
1362
1363typedef struct terraTri_s {
1364 unsigned short iPt[3];
1365 terraInt nSplit;
1366 unsigned int uiDistRecalc;
1367 struct cTerraPatchUnpacked_s* patch;
1368 varnodeUnpacked_t* varnode;
1369 terraInt index;
1370 byte lod;
1371 byte byConstChecks;
1372 terraInt iLeft;
1373 terraInt iRight;
1374 terraInt iBase;
1375 terraInt iLeftChild;
1376 terraInt iRightChild;
1377 terraInt iParent;
1378 terraInt iPrev;
1379 terraInt iNext;
1380} terraTri_t;
1381
1382typedef struct srfTerrain_s {
1383 surfaceType_t surfaceType;
1384 terraInt iVertHead;
1385 terraInt iTriHead;
1386 terraInt iTriTail;
1387 terraInt iMergeHead;
1388 int nVerts;
1389 int nTris;
1390 int lmapSize;
1391 int dlightBits[2];
1392 float lmapStep;
1393 int dlightMap[2];
1394 byte* lmData;
1395 float lmapX;
1396 float lmapY;
1397} srfTerrain_t;
1398
1399typedef struct cTerraPatchUnpacked_s {
1400 srfTerrain_t drawinfo;
1401 int viewCount;
1402 int visCountCheck;
1403 int visCountDraw;
1404 int frameCount;
1405 unsigned int uiDistRecalc;
1406 float s;
1407 float t;
1408 vec2_t texCoord[2][2];
1409 float x0;
1410 float y0;
1411 float z0;
1412 float zmax;
1413 shader_t* shader;
1414 short int iNorth;
1415 short int iEast;
1416 short int iSouth;
1417 short int iWest;
1418 struct cTerraPatchUnpacked_s* pNextActive;
1419 varnodeUnpacked_t varTree[2][63];
1420 unsigned char heightmap[81];
1421 byte flags;
1422 byte byDirty;
1424
1425typedef struct srfStaticModel_s {
1426 surfaceType_t surfaceType;
1427 struct cStaticModelUnpacked_s* parent;
1428} srfStaticModel_t;
1429
1430typedef struct srfMarkFragment_s {
1431 surfaceType_t surfaceType;
1432 int iIndex;
1433 int numVerts;
1434 polyVert_t* verts;
1435} srfMarkFragment_t;
1436
1437typedef struct cStaticModelUnpacked_s {
1438 qboolean useSpecialLighting;
1439 qboolean bLightGridCalculated;
1440 qboolean bRendered;
1441 char model[128];
1442 vec3_t origin;
1443 vec3_t angles;
1444 vec3_t axis[3];
1445 float scale;
1446 int firstVertexData;
1447 int numVertexData;
1448 int visCount;
1449 dtiki_t* tiki;
1450 sphere_dlight_t dlights[MAX_DLIGHTS];
1451 int numdlights;
1452 float radius;
1453 float cull_radius;
1454 int iGridLighting;
1455 float lodpercentage[2];
1457
1458typedef struct refSprite_s {
1459 surfaceType_t surftype;
1460 int hModel;
1461 int shaderNum;
1462 float origin[3];
1463 float scale;
1464 float axis[3][3];
1465 byte shaderRGBA[4];
1466 int renderfx;
1467 float shaderTime;
1468} refSprite_t;
1469
1470//=========================
1471
1472/*
1473==============================================================================
1474
1475SHADOWS
1476
1477==============================================================================
1478*/
1479
1480typedef struct pshadow_s
1481{
1482 float sort;
1483
1484 int numEntities;
1485 int entityNums[8];
1486 vec3_t entityOrigins[8];
1487 float entityRadiuses[8];
1488
1489 float viewRadius;
1490 vec3_t viewOrigin;
1491
1492 vec3_t lightViewAxis[3];
1493 vec3_t lightOrigin;
1494 float lightRadius;
1495 cplane_t cullPlane;
1496} pshadow_t;
1497
1498
1499/*
1500==============================================================================
1501
1502BRUSH MODELS
1503
1504==============================================================================
1505*/
1506
1507
1508//
1509// in memory representation
1510//
1511
1512#define SIDE_FRONT 0
1513#define SIDE_BACK 1
1514#define SIDE_ON 2
1515
1516#define CULLINFO_NONE 0
1517#define CULLINFO_BOX 1
1518#define CULLINFO_SPHERE 2
1519#define CULLINFO_PLANE 4
1520
1521typedef struct cullinfo_s {
1522 int type;
1523 vec3_t bounds[2];
1524 vec3_t localOrigin;
1525 float radius;
1526 cplane_t plane;
1527} cullinfo_t;
1528
1529typedef struct msurface_s {
1530 //int viewCount; // if == tr.viewCount, already added
1531 struct shader_s *shader;
1532 int fogIndex;
1533 int cubemapIndex;
1534 cullinfo_t cullinfo;
1535
1536 surfaceType_t *data; // any of srf*_t
1537} msurface_t;
1538
1539
1540#define CONTENTS_NODE -1
1541typedef struct mnode_s {
1542 // common with leaf and node
1543 int contents; // -1 for nodes, to differentiate from leafs
1544 int visCounts[MAX_VISCOUNTS]; // node needs to be traversed if current
1545 vec3_t mins, maxs; // for bounding box culling
1546 struct mnode_s *parent;
1547
1548 // node specific
1549 cplane_t *plane;
1550 struct mnode_s *children[2];
1551
1552 // leaf specific
1553 int cluster;
1554 int area;
1555
1556 int firstmarksurface;
1557 int nummarksurfaces;
1558
1559 //
1560 // OPENMOHAA-specific stuff
1561 //
1562
1563 spherel_t** lights;
1564 int numlights;
1565
1566 int firstTerraPatch;
1567 int numTerraPatches;
1568 int firstStaticModel;
1569 int numStaticModels;
1570 void** pFirstMarkFragment;
1571 int iNumMarkFragment;
1572} mnode_t;
1573
1574typedef struct {
1575 vec3_t bounds[2]; // for culling
1576 int firstSurface;
1577 int numSurfaces;
1578
1579 //
1580 // OPENMOHAA-specific stuff
1581 //
1582
1583 void** pFirstMarkFragment;
1584 int iNumMarkFragment;
1585 int frameCount;
1586 qboolean hasLightmap;
1587} bmodel_t;
1588
1589typedef struct {
1590 char name[MAX_QPATH]; // ie: maps/tim_dm2.bsp
1591 char baseName[MAX_QPATH]; // ie: tim_dm2
1592
1593 int dataSize;
1594
1595 int numShaders;
1596 dshader_t *shaders;
1597
1598 int numBModels;
1599 bmodel_t *bmodels;
1600
1601 int numplanes;
1602 cplane_t *planes;
1603
1604 int numnodes; // includes leafs
1605 int numDecisionNodes;
1606 mnode_t *nodes;
1607
1608 int numWorldSurfaces;
1609
1610 int numsurfaces;
1611 msurface_t *surfaces;
1612 int *surfacesViewCount;
1613 int *surfacesDlightBits;
1614 int *surfacesPshadowBits;
1615
1616 int nummarksurfaces;
1617 int *marksurfaces;
1618
1619 int numfogs;
1620 fog_t *fogs;
1621
1622 vec3_t lightGridOrigin;
1623 vec3_t lightGridSize;
1624 vec3_t lightGridInverseSize;
1625 int lightGridBounds[3];
1626 byte *lightGridData;
1627 uint16_t *lightGrid16;
1628
1629
1630 int numClusters;
1631 int clusterBytes;
1632 const byte *vis; // may be passed in by CM_LoadMap to save space
1633
1634 char *entityString;
1635 char *entityParsePoint;
1636
1637 //
1638 // OPENMOHAA-specific stuff
1639 //
1640
1641 unsigned short* lightGridOffsets;
1642 byte lightGridPalette[768];
1643
1644 int numTerraPatches;
1645 cTerraPatchUnpacked_t* terraPatches;
1646 cTerraPatchUnpacked_t* activeTerraPatches;
1647
1648 int numVisTerraPatches;
1649 cTerraPatchUnpacked_t** visTerraPatches;
1650
1651 int numStaticModelData;
1652 byte* staticModelData;
1653
1654 int numStaticModels;
1655 cStaticModelUnpacked_t* staticModels;
1656
1657 int numVisStaticModels;
1658 cStaticModelUnpacked_t** visStaticModels;
1659} world_t;
1660
1661//
1662// OPENMOHAA-specific stuff
1663//=========================
1664typedef struct {
1665 float width;
1666 float height;
1667 float origin_x;
1668 float origin_y;
1669 float scale;
1670 shader_t* shader;
1671} sprite_t;
1672//=========================
1673
1674/*
1675==============================================================================
1676MDV MODELS - meta format for vertex animation models like .md2, .md3, .mdc
1677==============================================================================
1678*/
1679typedef struct
1680{
1681 float bounds[2][3];
1682 float localOrigin[3];
1683 float radius;
1684} mdvFrame_t;
1685
1686typedef struct
1687{
1688 float origin[3];
1689 float axis[3][3];
1690} mdvTag_t;
1691
1692typedef struct
1693{
1694 char name[MAX_QPATH]; // tag name
1695} mdvTagName_t;
1696
1697typedef struct
1698{
1699 vec3_t xyz;
1700 int16_t normal[4];
1701 int16_t tangent[4];
1702} mdvVertex_t;
1703
1704typedef struct
1705{
1706 float st[2];
1707} mdvSt_t;
1708
1709typedef struct mdvSurface_s
1710{
1711 surfaceType_t surfaceType;
1712
1713 char name[MAX_QPATH]; // polyset name
1714
1715 int numShaderIndexes;
1716 int *shaderIndexes;
1717
1718 int numVerts;
1719 mdvVertex_t *verts;
1720 mdvSt_t *st;
1721
1722 int numIndexes;
1723 glIndex_t *indexes;
1724
1725 struct mdvModel_s *model;
1726} mdvSurface_t;
1727
1728typedef struct mdvModel_s
1729{
1730 int numFrames;
1731 mdvFrame_t *frames;
1732
1733 int numTags;
1734 mdvTag_t *tags;
1735 mdvTagName_t *tagNames;
1736
1737 int numSurfaces;
1738 mdvSurface_t *surfaces;
1739
1740 int numVaoSurfaces;
1741 srfVaoMdvMesh_t *vaoSurfaces;
1742
1743 int numSkins;
1744} mdvModel_t;
1745
1746
1747//======================================================================
1748
1749typedef enum {
1750 MOD_BAD,
1751 MOD_BRUSH,
1752 MOD_MESH,
1753 MOD_MDR,
1754 MOD_IQM,
1755
1756 //
1757 // OPENMOHAA-specific stuff
1758 //
1759 MOD_TIKI,
1760 MOD_SPRITE
1761} modtype_t;
1762
1763typedef struct model_s {
1764 char name[MAX_QPATH];
1765 modtype_t type;
1766 int index; // model = tr.models[model->index]
1767
1768 int dataSize; // just for listing purposes
1769 bmodel_t *bmodel; // only if type == MOD_BRUSH
1770 mdvModel_t *mdv[MD3_MAX_LODS]; // only if type == MOD_MESH
1771 void *modelData; // only if type == (MOD_MDR | MOD_IQM)
1772
1773 int numLods;
1774
1775 // OPENMOHAA-specific stuff
1776 union {
1777 dtiki_t* tiki;
1778 sprite_t* sprite;
1779 } d;
1780 qboolean serveronly;
1781} model_t;
1782
1783
1784#define MAX_MOD_KNOWN 1024
1785
1786void R_ModelInit (void);
1787model_t *R_GetModelByHandle( qhandle_t hModel );
1788int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame,
1789 float frac, const char *tagName );
1790void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs );
1791
1792void R_Modellist_f (void);
1793
1794//====================================================
1795
1796#define MAX_DRAWIMAGES 2048
1797#define MAX_SKINS 1024
1798
1799
1800#define MAX_DRAWSURFS 0x10000
1801#define DRAWSURF_MASK (MAX_DRAWSURFS-1)
1802
1803/*
1804
1805the drawsurf sort data is packed into a single 32 bit value so it can be
1806compared quickly during the qsorting process
1807
1808the bits are allocated as follows:
1809
18100 - 1 : dlightmap index
1811//2 : used to be clipped flag REMOVED - 03.21.00 rad
18122 - 6 : fog index
181311 - 20 : entity index
181421 - 31 : sorted shader index
1815
1816 TTimo - 1.32
18170-1 : dlightmap index
18182-6 : fog index
18197-16 : entity index
182017-30 : sorted shader index
1821
1822 SmileTheory - for pshadows
182317-31 : sorted shader index
18247-16 : entity index
18252-6 : fog index
18261 : pshadow flag
18270 : dlight flag
1828*/
1829/*
1830#define QSORT_FOGNUM_SHIFT 2
1831#define QSORT_REFENTITYNUM_SHIFT 7
1832#define QSORT_SHADERNUM_SHIFT (QSORT_REFENTITYNUM_SHIFT+REFENTITYNUM_BITS)
1833*/
1834#define QSORT_FOGNUM_SHIFT 2
1835#define QSORT_REFENTITYNUM_SHIFT 4
1836#define QSORT_STATICMODEL_SHIFT (QSORT_REFENTITYNUM_SHIFT+REFENTITYNUM_BITS)
1837#define QSORT_SHADERNUM_SHIFT (QSORT_STATICMODEL_SHIFT+1)
1838#if (QSORT_SHADERNUM_SHIFT+SHADERNUM_BITS) > 32
1839 #error "Need to update sorting, too many bits."
1840#endif
1841#define QSORT_PSHADOW_SHIFT 1
1842
1843extern int gl_filter_min, gl_filter_max;
1844
1845/*
1846** performanceCounters_t
1847*/
1848typedef struct {
1849 int c_sphere_cull_patch_in, c_sphere_cull_patch_clip, c_sphere_cull_patch_out;
1850 int c_box_cull_patch_in, c_box_cull_patch_clip, c_box_cull_patch_out;
1851 int c_sphere_cull_md3_in, c_sphere_cull_md3_clip, c_sphere_cull_md3_out;
1852 int c_box_cull_md3_in, c_box_cull_md3_clip, c_box_cull_md3_out;
1853
1854 int c_leafs;
1855 int c_dlightSurfaces;
1856 int c_dlightSurfacesCulled;
1858
1859#define FOG_TABLE_SIZE 256
1860#define FUNCTABLE_SIZE 1024
1861#define FUNCTABLE_SIZE2 10
1862#define FUNCTABLE_MASK (FUNCTABLE_SIZE-1)
1863
1864
1865// the renderer front end should never modify glstate_t
1866typedef struct {
1867 qboolean finishCalled;
1868 int texEnv[2];
1869 int faceCulling;
1870 int faceCullFront;
1871 uint32_t glStateBits;
1872 uint32_t storedGlState;
1873 float vertexAttribsInterpolation;
1874 qboolean vertexAnimation;
1875 int boneAnimation; // number of bones
1876 mat4_t boneMatrix[IQM_MAX_JOINTS];
1877 uint32_t vertexAttribsEnabled; // global if no VAOs, tess only otherwise
1878 FBO_t *currentFBO;
1879 vao_t *currentVao;
1880 mat4_t modelview;
1881 mat4_t projection;
1882 mat4_t modelviewProjection;
1883} glstate_t;
1884
1885typedef enum {
1886 MI_NONE,
1887 MI_NVX,
1888 MI_ATI
1889} memInfo_t;
1890
1891typedef enum {
1892 TCR_NONE = 0x0000,
1893 TCR_RGTC = 0x0001,
1894 TCR_BPTC = 0x0002,
1895} textureCompressionRef_t;
1896
1897// We can't change glConfig_t without breaking DLL/vms compatibility, so
1898// store extensions we have here.
1899typedef struct {
1900 qboolean intelGraphics;
1901
1902 qboolean occlusionQuery;
1903 GLenum occlusionQueryTarget;
1904
1905 int glslMajorVersion;
1906 int glslMinorVersion;
1907 int glslMaxAnimatedBones;
1908
1909 memInfo_t memInfo;
1910
1911 qboolean framebufferObject;
1912 int maxRenderbufferSize;
1913 int maxColorAttachments;
1914
1915 qboolean textureFloat;
1916 textureCompressionRef_t textureCompression;
1917 qboolean swizzleNormalmap;
1918
1919 qboolean framebufferMultisample;
1920 qboolean framebufferBlit;
1921
1922 qboolean depthClamp;
1923 qboolean seamlessCubeMap;
1924
1925 qboolean vertexArrayObject;
1926 qboolean directStateAccess;
1927
1928 int maxVertexAttribs;
1929 qboolean gpuVertexAnimation;
1930
1931 GLenum vaoCacheGlIndexType; // GL_UNSIGNED_INT or GL_UNSIGNED_SHORT
1932 size_t vaoCacheGlIndexSize; // must be <= sizeof( vaoCacheGlIndex_t )
1933
1934 // OpenGL ES extensions
1935 qboolean readDepth;
1936 qboolean readStencil;
1937 qboolean shadowSamplers;
1938 qboolean standardDerivatives;
1940
1941
1942typedef struct {
1943 int c_surfaces, c_shaders, c_vertexes, c_indexes, c_totalIndexes;
1944 int c_surfBatches;
1945 float c_overDraw;
1946
1947 int c_vaoBinds;
1948 int c_vaoVertexes;
1949 int c_vaoIndexes;
1950
1951 int c_staticVaoDraws;
1952 int c_dynamicVaoDraws;
1953
1954 int c_dlightVertexes;
1955 int c_dlightIndexes;
1956
1957 int c_flareAdds;
1958 int c_flareTests;
1959 int c_flareRenders;
1960
1961 int c_glslShaderBinds;
1962 int c_genericDraws;
1963 int c_lightallDraws;
1964 int c_fogDraws;
1965 int c_dlightDraws;
1966
1967 int msec; // total msec for backend run
1968
1969 //
1970 // OPENMOHAA-specific stuff
1971 //
1972
1973 int c_characterlights;
1975
1976// all state modified by the back end is separated
1977// from the front end state
1978typedef struct {
1979 trRefdef_t refdef;
1980 viewParms_t viewParms;
1981 orientationr_t ori;
1983 qboolean isHyperspace;
1984 trRefEntity_t *currentEntity;
1985 qboolean skyRenderedThisView; // flag for drawing sun
1986
1987 qboolean projection2D; // if qtrue, drawstretchpic doesn't need to change modes
1988 byte color2D[4];
1989 qboolean vertexes2D; // shader needs to be finished
1990 trRefEntity_t entity2D; // currentEntity will point at this when doing 2D rendering
1991
1992 FBO_t *last2DFBO;
1993 qboolean colorMask[4];
1994 qboolean depthFill;
1995 float greyscale;
1996
1997 //
1998 // OPENMOHAA-specific stuff
1999 //
2000 sphereor_t spheres[MAX_SPHERE_LIGHTS];
2001 unsigned short numSpheresUsed;
2002 sphereor_t* currentSphere;
2003 sphereor_t spareSphere;
2004 sphereor_t hudSphere;
2005 cStaticModelUnpacked_t* currentStaticModel;
2006 float shaderStartTime;
2007 int dsStreamVert;
2009
2010/*
2011** trGlobals_t
2012**
2013** Most renderer globals are defined here.
2014** backend functions should never modify any of these fields,
2015** but may read fields that aren't dynamically modified
2016** by the frontend.
2017*/
2018typedef struct {
2019 qboolean registered; // cleared at shutdown, set at beginRegistration
2020
2021 int visIndex;
2022 int visClusters[MAX_VISCOUNTS];
2023 int visCounts[MAX_VISCOUNTS]; // incremented every time a new vis cluster is entered
2024
2025 int frameCount; // incremented every frame
2026 int sceneCount; // incremented every scene
2027 int viewCount; // incremented every view (twice a scene if portaled)
2028 // and every R_MarkFragments call
2029
2030 int frameSceneNum; // zeroed at RE_BeginFrame
2031
2032 qboolean worldMapLoaded;
2033 qboolean worldDeluxeMapping;
2034 vec2_t autoExposureMinMax;
2035 vec3_t toneMinAvgMaxLevel;
2036 world_t *world;
2037
2038 const byte *externalVisData; // from RE_SetWorldVisData, shared with CM_Load
2039
2040 image_t *defaultImage;
2041 image_t *scratchImage[32];
2042 image_t *fogImage;
2043 image_t *dlightImage; // inverse-quare highlight for projective adding
2044 image_t *flareImage;
2045 image_t *whiteImage; // full of 0xff
2046 image_t *identityLightImage; // full of tr.identityLightByte
2047
2048 image_t *shadowCubemaps[MAX_DLIGHTS];
2049
2050
2051 image_t *renderImage;
2052 image_t *sunRaysImage;
2053 image_t *renderDepthImage;
2054 image_t *pshadowMaps[MAX_DRAWN_PSHADOWS];
2055 image_t *screenScratchImage;
2056 image_t *textureScratchImage[2];
2057 image_t *quarterImage[2];
2058 image_t *calcLevelsImage;
2059 image_t *targetLevelsImage;
2060 image_t *fixedLevelsImage;
2061 image_t *sunShadowDepthImage[4];
2062 image_t *screenShadowImage;
2063 image_t *screenSsaoImage;
2064 image_t *hdrDepthImage;
2065 image_t *renderCubeImage;
2066
2067 image_t *textureDepthImage;
2068
2069 FBO_t *renderFbo;
2070 FBO_t *msaaResolveFbo;
2071 FBO_t *sunRaysFbo;
2072 FBO_t *depthFbo;
2073 FBO_t *pshadowFbos[MAX_DRAWN_PSHADOWS];
2074 FBO_t *screenScratchFbo;
2075 FBO_t *textureScratchFbo[2];
2076 FBO_t *quarterFbo[2];
2077 FBO_t *calcLevelsFbo;
2078 FBO_t *targetLevelsFbo;
2079 FBO_t *sunShadowFbo[4];
2080 FBO_t *screenShadowFbo;
2081 FBO_t *screenSsaoFbo;
2082 FBO_t *hdrDepthFbo;
2083 FBO_t *renderCubeFbo;
2084
2085 shader_t *defaultShader;
2086 shader_t *shadowShader;
2087 shader_t *projectionShadowShader;
2088
2089 shader_t *flareShader;
2090 shader_t *sunShader;
2091 shader_t *sunFlareShader;
2092
2093 int numLightmaps;
2094 int lightmapSize;
2095 image_t **lightmaps;
2096 image_t **deluxemaps;
2097
2098 int fatLightmapCols;
2099 int fatLightmapRows;
2100
2101 int numCubemaps;
2102 cubemap_t *cubemaps;
2103
2104 trRefEntity_t *currentEntity;
2105 trRefEntity_t worldEntity; // point currentEntity at this when rendering world
2106 int currentEntityNum;
2107 int shiftedEntityNum; // currentEntityNum << QSORT_REFENTITYNUM_SHIFT
2108 model_t *currentModel;
2109
2110 //
2111 // GPU shader programs
2112 //
2113 shaderProgram_t genericShader[GENERICDEF_COUNT];
2114 shaderProgram_t textureColorShader;
2115 shaderProgram_t fogShader[FOGDEF_COUNT];
2116 shaderProgram_t dlightShader[DLIGHTDEF_COUNT];
2117 shaderProgram_t lightallShader[LIGHTDEF_COUNT];
2118 shaderProgram_t shadowmapShader[SHADOWMAPDEF_COUNT];
2119 shaderProgram_t pshadowShader;
2120 shaderProgram_t down4xShader;
2121 shaderProgram_t bokehShader;
2122 shaderProgram_t tonemapShader;
2123 shaderProgram_t calclevels4xShader[2];
2124 shaderProgram_t shadowmaskShader;
2125 shaderProgram_t ssaoShader;
2126 shaderProgram_t depthBlurShader[4];
2127 shaderProgram_t testcubeShader;
2128 shaderProgram_t greyscaleShader;
2129
2130
2131 // -----------------------------------------
2132
2133 viewParms_t viewParms;
2134
2135 float identityLight; // 1.0 / ( 1 << overbrightBits )
2136 int identityLightByte; // identityLight * 255
2137 int overbrightBits; // r_overbrightBits->integer, but set to 0 if no hw gamma
2138
2139 orientationr_t ori; // for current entity
2140
2141 trRefdef_t refdef;
2142
2143 int viewCluster;
2144
2145 float sunShadowScale;
2146
2147 qboolean sunShadows;
2148 vec3_t sunLight; // from the sky shader for this level
2149 vec3_t sunDirection;
2150 vec3_t lastCascadeSunDirection;
2151 float lastCascadeSunMvp[16];
2152
2154 int frontEndMsec; // not in pc due to clearing issue
2155
2156 //
2157 // put large tables at the end, so most elements will be
2158 // within the +/32K indexed range on risc processors
2159 //
2160 model_t *models[MAX_MOD_KNOWN];
2161 int numModels;
2162
2163 int numImages;
2164 image_t *images[MAX_DRAWIMAGES];
2165
2166 int numFBOs;
2167 FBO_t *fbos[MAX_FBOS];
2168
2169 int numVaos;
2170 vao_t *vaos[MAX_VAOS];
2171
2172 // shader indexes from other modules will be looked up in tr.shaders[]
2173 // shader indexes from drawsurfs will be looked up in sortedShaders[]
2174 // lower indexed sortedShaders must be rendered first (opaque surfaces before translucent)
2175 int numShaders;
2176 shader_t *shaders[MAX_SHADERS];
2177 shader_t *sortedShaders[MAX_SHADERS];
2178
2179 int numSkins;
2180 skin_t *skins[MAX_SKINS];
2181
2182 GLuint sunFlareQuery[2];
2183 int sunFlareQueryIndex;
2184 qboolean sunFlareQueryActive[2];
2185
2186 float sinTable[FUNCTABLE_SIZE];
2187 float squareTable[FUNCTABLE_SIZE];
2188 float triangleTable[FUNCTABLE_SIZE];
2189 float sawToothTable[FUNCTABLE_SIZE];
2190 float inverseSawToothTable[FUNCTABLE_SIZE];
2191 float fogTable[FOG_TABLE_SIZE];
2192
2193 //
2194 // OPENMOHAA-specific stuff
2195 //
2196
2197 int currentSpriteNum;
2198 int shiftedIsStatic;
2199
2200 int overbrightShift;
2201 float overbrightMult;
2202
2203 portalsky_t portalsky;
2204 qboolean skyRendered;
2205 qboolean portalRendered;
2206
2207 spherel_t sSunLight;
2208 spherel_t sLights[1532];
2209 int numSLights;
2210 int rendererhandle;
2211 qboolean shadersParsed;
2212 int frame_skel_index;
2213 int skel_index[1024];
2214 fontheader_t* pFontDebugStrings;
2215 int farclip;
2216} trGlobals_t;
2217
2218extern backEndState_t backEnd;
2219extern trGlobals_t tr;
2220extern glstate_t glState; // outside of TR since it shouldn't be cleared during ref re-init
2221extern glRefConfig_t glRefConfig;
2222
2223//
2224// cvars
2225//
2226extern cvar_t *r_flareSize;
2227extern cvar_t *r_flareFade;
2228// coefficient for the flare intensity falloff function.
2229#define FLARE_STDCOEFF "150"
2230extern cvar_t *r_flareCoeff;
2231
2232extern cvar_t *r_railWidth;
2233extern cvar_t *r_railCoreWidth;
2234extern cvar_t *r_railSegmentLength;
2235
2236extern cvar_t *r_ignore; // used for debugging anything
2237extern cvar_t *r_verbose; // used for verbose debug spew
2238
2239extern cvar_t *r_znear; // near Z clip plane
2240extern cvar_t *r_zproj; // z distance of projection plane
2241extern cvar_t *r_stereoSeparation; // separation of cameras for stereo rendering
2242
2243extern cvar_t *r_measureOverdraw; // enables stencil buffer overdraw measurement
2244
2245extern cvar_t *r_lodbias; // push/pull LOD transitions
2246extern cvar_t *r_lodscale;
2247
2248extern cvar_t *r_inGameVideo; // controls whether in game video should be draw
2249extern cvar_t *r_fastsky; // controls whether sky should be cleared or drawn
2250extern cvar_t *r_drawSun; // controls drawing of sun quad
2251extern cvar_t *r_dynamiclight; // dynamic lights enabled/disabled
2252extern cvar_t *r_dlightBacks; // dlight non-facing surfaces for continuity
2253
2254extern cvar_t *r_norefresh; // bypasses the ref rendering
2255extern cvar_t *r_drawentities; // disable/enable entity rendering
2256extern cvar_t *r_drawworld; // disable/enable world rendering
2257extern cvar_t *r_speeds; // various levels of information display
2258extern cvar_t *r_detailTextures; // enables/disables detail texturing stages
2259extern cvar_t *r_novis; // disable/enable usage of PVS
2260extern cvar_t *r_nocull;
2261extern cvar_t *r_facePlaneCull; // enables culling of planar surfaces with back side test
2262extern cvar_t *r_nocurves;
2263extern cvar_t *r_showcluster;
2264
2265extern cvar_t *r_gamma;
2266extern cvar_t *r_displayRefresh; // optional display refresh option
2267
2268extern cvar_t *r_ext_framebuffer_object;
2269extern cvar_t *r_ext_texture_float;
2270extern cvar_t *r_ext_framebuffer_multisample;
2271extern cvar_t *r_arb_seamless_cube_map;
2272extern cvar_t *r_arb_vertex_array_object;
2273extern cvar_t *r_ext_direct_state_access;
2274
2275extern cvar_t *r_nobind; // turns off binding to appropriate textures
2276extern cvar_t *r_singleShader; // make most world faces use default shader
2277extern cvar_t *r_roundImagesDown;
2278extern cvar_t *r_colorMipLevels; // development aid to see texture mip usage
2279extern cvar_t *r_picmip; // controls picmip values
2280extern cvar_t *r_finish;
2281extern cvar_t *r_textureMode;
2282extern cvar_t *r_offsetFactor;
2283extern cvar_t *r_offsetUnits;
2284
2285extern cvar_t *r_fullbright; // avoid lightmap pass
2286extern cvar_t *r_lightmap; // render lightmaps only
2287extern cvar_t *r_vertexLight; // vertex lighting mode for better performance
2288extern cvar_t *r_uiFullScreen; // ui is running fullscreen
2289
2290extern cvar_t *r_logFile; // number of frames to emit GL logs
2291extern cvar_t *r_showtris; // enables wireframe rendering of the world
2292extern cvar_t *r_showsky; // forces sky in front of all surfaces
2293extern cvar_t *r_shownormals; // draws wireframe normals
2294extern cvar_t *r_clear; // force screen clear every frame
2295
2296extern cvar_t *r_shadows; // controls shadows: 0 = none, 1 = blur, 2 = stencil, 3 = black planar projection
2297extern cvar_t *r_flares; // light flares
2298
2299extern cvar_t *r_intensity;
2300
2301extern cvar_t *r_lockpvs;
2302extern cvar_t *r_noportals;
2303extern cvar_t *r_portalOnly;
2304
2305extern cvar_t *r_subdivisions;
2306extern cvar_t *r_lodCurveError;
2307extern cvar_t *r_skipBackEnd;
2308
2309extern cvar_t *r_anaglyphMode;
2310
2311extern cvar_t *r_externalGLSL;
2312
2313extern cvar_t *r_hdr;
2314extern cvar_t *r_floatLightmap;
2315extern cvar_t *r_postProcess;
2316
2317extern cvar_t *r_toneMap;
2318extern cvar_t *r_forceToneMap;
2319extern cvar_t *r_forceToneMapMin;
2320extern cvar_t *r_forceToneMapAvg;
2321extern cvar_t *r_forceToneMapMax;
2322
2323extern cvar_t *r_autoExposure;
2324extern cvar_t *r_forceAutoExposure;
2325extern cvar_t *r_forceAutoExposureMin;
2326extern cvar_t *r_forceAutoExposureMax;
2327
2328extern cvar_t *r_cameraExposure;
2329
2330extern cvar_t *r_depthPrepass;
2331extern cvar_t *r_ssao;
2332
2333extern cvar_t *r_normalMapping;
2334extern cvar_t *r_specularMapping;
2335extern cvar_t *r_deluxeMapping;
2336extern cvar_t *r_parallaxMapping;
2337extern cvar_t *r_parallaxMapOffset;
2338extern cvar_t *r_parallaxMapShadows;
2339extern cvar_t *r_cubeMapping;
2340extern cvar_t *r_cubemapSize;
2341extern cvar_t *r_deluxeSpecular;
2342extern cvar_t *r_pbr;
2343extern cvar_t *r_baseNormalX;
2344extern cvar_t *r_baseNormalY;
2345extern cvar_t *r_baseParallax;
2346extern cvar_t *r_baseSpecular;
2347extern cvar_t *r_baseGloss;
2348extern cvar_t *r_glossType;
2349extern cvar_t *r_dlightMode;
2350extern cvar_t *r_pshadowDist;
2351extern cvar_t *r_mergeLightmaps;
2352extern cvar_t *r_imageUpsample;
2353extern cvar_t *r_imageUpsampleMaxSize;
2354extern cvar_t *r_imageUpsampleType;
2355extern cvar_t *r_genNormalMaps;
2356extern cvar_t *r_forceSun;
2357extern cvar_t *r_forceSunLightScale;
2358extern cvar_t *r_forceSunAmbientScale;
2359extern cvar_t *r_sunlightMode;
2360extern cvar_t *r_drawSunRays;
2361extern cvar_t *r_sunShadows;
2362extern cvar_t *r_shadowFilter;
2363extern cvar_t *r_shadowBlur;
2364extern cvar_t *r_shadowMapSize;
2365extern cvar_t *r_shadowCascadeZNear;
2366extern cvar_t *r_shadowCascadeZFar;
2367extern cvar_t *r_shadowCascadeZBias;
2368extern cvar_t *r_ignoreDstAlpha;
2369
2370extern cvar_t *r_greyscale;
2371
2372extern cvar_t *r_ignoreGLErrors;
2373
2374extern cvar_t *r_overBrightBits;
2375extern cvar_t *r_mapOverBrightBits;
2376
2377extern cvar_t *r_debugSurface;
2378extern cvar_t *r_simpleMipMaps;
2379
2380extern cvar_t *r_showImages;
2381extern cvar_t *r_debugSort;
2382
2383extern cvar_t *r_printShaders;
2384
2385extern cvar_t *r_marksOnTriangleMeshes;
2386
2387//
2388// OPENMOHAA-specific stuff
2389//=========================
2390
2391extern int r_sequencenumber;
2392
2393// DRAWING
2394
2395extern cvar_t *r_drawentitypoly;
2396extern cvar_t *r_drawstaticmodels;
2397extern cvar_t *r_drawstaticmodelpoly;
2398extern cvar_t *r_drawstaticdecals;
2399extern cvar_t *r_drawterrain;
2400extern cvar_t *r_drawsprites;
2401extern cvar_t *r_drawspherelights;
2402
2403extern cvar_t *r_numdebuglines;
2404extern cvar_t *r_stipplelines;
2405extern cvar_t *r_debuglines_depthmask;
2406
2407extern cvar_t *r_maxpolys;
2408extern int max_polys;
2409extern cvar_t *r_maxpolyverts;
2410extern int max_polyverts;
2411extern cvar_t* r_maxtermarks;
2412extern int max_termarks;
2413
2414extern cvar_t* r_skyportal;
2415extern cvar_t* r_skyportal_origin;
2416extern cvar_t* r_farplane;
2417extern cvar_t* r_farplane_bias;
2418extern cvar_t* r_farplane_color;
2419extern cvar_t* r_farplane_nocull;
2420extern cvar_t* r_farplane_nofog;
2421extern cvar_t* r_skybox_farplane;
2422extern cvar_t* r_farclip;
2423
2424// Lighting
2425
2426extern cvar_t* r_lightcoronasize;
2427extern cvar_t *r_entlight_scale;
2428extern cvar_t *r_entlight_errbound;
2429extern cvar_t *r_entlight_cubelevel;
2430extern cvar_t *r_entlight_cubefraction;
2431extern cvar_t *r_entlight_maxcalc;
2432extern cvar_t *r_light_lines;
2433extern cvar_t *r_light_sun_line;
2434extern cvar_t *r_light_int_scale;
2435extern cvar_t *r_light_nolight;
2436extern cvar_t *r_light_showgrid;
2437
2438// LOD
2439
2440extern cvar_t* r_staticlod;
2441extern cvar_t* r_lodscale;
2442extern cvar_t* r_lodcap;
2443extern cvar_t* r_lodviewmodelcap;
2444
2445extern cvar_t* r_uselod;
2446extern cvar_t* lod_LOD;
2447extern cvar_t* lod_minLOD;
2448extern cvar_t* lod_maxLOD;
2449extern cvar_t* lod_LOD_slider;
2450extern cvar_t* lod_curve_0_val;
2451extern cvar_t* lod_curve_1_val;
2452extern cvar_t* lod_curve_2_val;
2453extern cvar_t* lod_curve_3_val;
2454extern cvar_t* lod_curve_4_val;
2455extern cvar_t* lod_edit_0;
2456extern cvar_t* lod_edit_1;
2457extern cvar_t* lod_edit_2;
2458extern cvar_t* lod_edit_3;
2459extern cvar_t* lod_edit_4;
2460extern cvar_t* lod_curve_0_slider;
2461extern cvar_t* lod_curve_1_slider;
2462extern cvar_t* lod_curve_2_slider;
2463extern cvar_t* lod_curve_3_slider;
2464extern cvar_t* lod_curve_4_slider;
2465extern cvar_t* lod_pitch_val;
2466extern cvar_t* lod_zee_val;
2467extern cvar_t* lod_mesh;
2468extern cvar_t* lod_meshname;
2469extern cvar_t* lod_tikiname;
2470extern cvar_t* lod_metric;
2471extern cvar_t* lod_tris;
2472extern cvar_t* lod_position;
2473extern cvar_t* lod_save;
2474extern cvar_t* lod_tool;
2475
2476// UTILS
2477
2478extern cvar_t* r_developer;
2479extern cvar_t* r_fps;
2480extern cvar_t* r_showstaticbboxes;
2481extern cvar_t* r_showcull;
2482extern cvar_t* r_showlod;
2483extern cvar_t* r_showstaticlod;
2484extern cvar_t* r_showportal;
2485
2486//=========================
2487
2488extern cvar_t *r_vaoCache;
2489
2490//====================================================================
2491
2492static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
2493{
2494 if(shader->numDeforms)
2495 {
2496 const deformStage_t *ds = &shader->deforms[0];
2497
2498 if (shader->numDeforms > 1)
2499 return qtrue;
2500
2501 switch (ds->deformation)
2502 {
2503 case DEFORM_WAVE:
2504 case DEFORM_BULGE:
2505 // need CPU deforms at high level-times to avoid floating point percision loss
2506 return ( backEnd.refdef.floatTime != (float)backEnd.refdef.floatTime );
2507
2508 default:
2509 return qtrue;
2510 }
2511 }
2512
2513 return qfalse;
2514}
2515
2516//====================================================================
2517
2518void R_SwapBuffers( int );
2519
2520void R_RenderView( viewParms_t *parms );
2521void R_RenderDlightCubemaps(const refdef_t *fd);
2522void R_RenderPshadowMaps(const refdef_t *fd);
2523void R_RenderSunShadowMaps(const refdef_t *fd, int level);
2524void R_RenderCubemapSide( int cubemapIndex, int cubemapSide, qboolean subscene );
2525
2526void R_AddMD3Surfaces( trRefEntity_t *e );
2527void R_AddNullModelSurfaces( trRefEntity_t *e );
2528void R_AddBeamSurfaces( trRefEntity_t *e );
2529void R_AddRailSurfaces( trRefEntity_t *e, qboolean isUnderwater );
2530void R_AddLightningBoltSurfaces( trRefEntity_t *e );
2531
2532void R_AddPolygonSurfaces( void );
2533
2534void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader,
2535 int *fogNum, int *dlightMap, int *pshadowMap, qboolean *bStaticModel );
2536
2537void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader,
2538 int fogIndex, int dlightMap, int pshadowMap, int cubemap );
2539
2540void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2,
2541 const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3);
2542vec_t R_CalcTangentSpace(vec3_t tangent, vec3_t bitangent, const vec3_t normal, const vec3_t sdir, const vec3_t tdir);
2543qboolean R_CalcTangentVectors(srfVert_t * dv[3]);
2544
2545#define CULL_IN 0 // completely unclipped
2546#define CULL_CLIP 1 // clipped by one or more planes
2547#define CULL_OUT 2 // completely outside the clipping planes
2548void R_LocalNormalToWorld (const vec3_t local, vec3_t world);
2549void R_LocalPointToWorld (const vec3_t local, vec3_t world);
2550int R_CullBox (vec3_t bounds[2]);
2551int R_CullLocalBox (vec3_t bounds[2]);
2552int R_CullPointAndRadiusEx( const vec3_t origin, float radius, const cplane_t* frustum, int numPlanes );
2553int R_CullPointAndRadius( const vec3_t origin, float radius );
2554int R_CullLocalPointAndRadius( const vec3_t origin, float radius );
2555
2556void R_SetupProjection(viewParms_t *dest, float zProj, float zFar, qboolean computeFrustum);
2557void R_RotateForEntity( const trRefEntity_t *ent, const viewParms_t *viewParms, orientationr_t *ori );
2558
2559/*
2560** GL wrapper/helper functions
2561*/
2562void GL_BindToTMU( image_t *image, int tmu );
2563void GL_SetDefaultState (void);
2564void GL_TextureMode( const char *string );
2565void GL_CheckErrs( char *file, int line );
2566#define GL_CheckErrors(...) GL_CheckErrs(__FILE__, __LINE__)
2567void GL_State( unsigned long stateVector );
2568void GL_SetProjectionMatrix(mat4_t matrix);
2569void GL_SetModelviewMatrix(mat4_t matrix);
2570void GL_Cull( int cullType );
2571
2572#define GLS_SRCBLEND_ZERO 0x00000001
2573#define GLS_SRCBLEND_ONE 0x00000002
2574#define GLS_SRCBLEND_DST_COLOR 0x00000003
2575#define GLS_SRCBLEND_ONE_MINUS_DST_COLOR 0x00000004
2576#define GLS_SRCBLEND_SRC_ALPHA 0x00000005
2577#define GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA 0x00000006
2578#define GLS_SRCBLEND_DST_ALPHA 0x00000007
2579#define GLS_SRCBLEND_ONE_MINUS_DST_ALPHA 0x00000008
2580#define GLS_SRCBLEND_ALPHA_SATURATE 0x00000009
2581#define GLS_SRCBLEND_BITS 0x0000000f
2582
2583#define GLS_DSTBLEND_ZERO 0x00000010
2584#define GLS_DSTBLEND_ONE 0x00000020
2585#define GLS_DSTBLEND_SRC_COLOR 0x00000030
2586#define GLS_DSTBLEND_ONE_MINUS_SRC_COLOR 0x00000040
2587#define GLS_DSTBLEND_SRC_ALPHA 0x00000050
2588#define GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA 0x00000060
2589#define GLS_DSTBLEND_DST_ALPHA 0x00000070
2590#define GLS_DSTBLEND_ONE_MINUS_DST_ALPHA 0x00000080
2591#define GLS_DSTBLEND_BITS 0x000000f0
2592
2593#define GLS_DEPTHMASK_TRUE 0x00000100
2594
2595#define GLS_POLYMODE_LINE 0x00001000
2596
2597#define GLS_DEPTHTEST_DISABLE 0x00010000
2598#define GLS_DEPTHFUNC_EQUAL 0x00020000
2599#define GLS_DEPTHFUNC_GREATER 0x00040000
2600#define GLS_DEPTHFUNC_BITS 0x00060000
2601
2602#define GLS_ATEST_GT_0 0x10000000
2603#define GLS_ATEST_LT_80 0x20000000
2604#define GLS_ATEST_GE_80 0x40000000
2605#define GLS_ATEST_BITS 0x70000000
2606
2607#define GLS_DEFAULT GLS_DEPTHMASK_TRUE
2608
2609void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty);
2610void RE_UploadCinematic (int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty);
2611
2612void RE_BeginFrame( stereoFrame_t stereoFrame );
2613void RE_BeginRegistration( glconfig_t *glconfig );
2614void RE_LoadWorldMap( const char *mapname );
2615void RE_SetWorldVisData( const byte *vis );
2616qhandle_t RE_RegisterModel( const char *name );
2617qhandle_t RE_RegisterSkin( const char *name );
2618void RE_Shutdown( qboolean destroyWindow );
2619
2620qboolean R_GetEntityToken( char *buffer, int size );
2621
2622model_t *R_AllocModel( void );
2623
2624void R_Init( void );
2625void R_UpdateSubImage( image_t *image, byte *pic, int x, int y, int width, int height, GLenum picFormat );
2626
2627void R_SetColorMappings( void );
2628void R_GammaCorrect( byte *buffer, int bufSize );
2629
2630void R_ImageList_f( void );
2631void R_SkinList_f( void );
2632// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=516
2633const void *RB_TakeScreenshotCmd( const void *data );
2634void R_ScreenShot_f( void );
2635
2636void R_InitFogTable( void );
2637float R_FogFactor( float s, float t );
2638void R_InitImages( void );
2639void R_DeleteTextures( void );
2640int R_SumOfUsedImages( void );
2641void R_InitSkins( void );
2642skin_t *R_GetSkinByHandle( qhandle_t hSkin );
2643
2644int R_ComputeLOD( trRefEntity_t *ent );
2645
2646const void *RB_TakeVideoFrameCmd( const void *data );
2647
2648//
2649// tr_shader.c
2650//
2651shader_t *R_FindShader( const char *name, int lightmapIndex, qboolean mipRawImage );
2652shader_t *R_FindShaderEx( const char *name, int lightmapIndex, qboolean mipRawImage, int realLightmapIndex );
2653shader_t *R_GetShaderByHandle( qhandle_t hShader );
2654shader_t *R_GetShaderByState( int index, long *cycleTime );
2655shader_t *R_FindShaderByName( const char *name );
2656void R_InitShaders( void );
2657void R_ShaderList_f( void );
2658void R_RemapShader(const char *oldShader, const char *newShader, const char *timeOffset);
2659
2660//
2661// OPENMOHAA-specific stuff
2662//=========================
2663
2664#define GLS_MULTITEXTURE 0x00004000
2665#define GLS_MULTITEXTURE_ENV 0x00008000
2666#define GLS_FOG 0x00080000
2667
2668#define GLS_FOG_ENABLED 0x00100000
2669#define GLS_FOG_BLACK 0x00200000
2670#define GLS_FOG_WHITE 0x00400000
2671#define GLS_FOG_COLOR (GLS_FOG_BLACK | GLS_FOG_WHITE)
2672#define GLS_FOG_BITS (GLS_FOG_WHITE|GLS_FOG_BLACK|GLS_FOG_ENABLED)
2673#define GLS_COLOR_NOMASK 0x00800000
2674
2675void R_RotateForStaticModel(cStaticModelUnpacked_t* SM, const viewParms_t* viewParms, orientationr_t* ori);
2676void R_RotateForViewer(void);
2677void R_SetupFrustum (viewParms_t *dest, float xmin, float xmax, float ymax, float zProj, float zFar, float stereoSep);
2678int R_DistanceCullLocalPointAndRadius(float fDist, const vec3_t pt, float radius);
2679int R_DistanceCullPointAndRadius(float fDist, const vec3_t pt, float radius);
2680qboolean R_ImageExists(const char* name);
2681int R_CountTextureMemory();
2682qboolean R_LoadRawImage(const char *name, byte **pic, int *width, int *height);
2683void R_FreeRawImage(byte *pic);
2684
2685//
2686// tr_bsp.c
2687//
2688void RE_PrintBSPFileSizes(void);
2689int RE_MapVersion(void);
2690void R_ClearWorld(void);
2691
2692//
2693// tr_cmds.c
2694//
2695void R_SavePerformanceCounters(void);
2696
2697//
2698// tr_main.c
2699//
2700
2701void R_AddSpriteSurfaces();
2702qboolean SurfIsOffscreen2(const srfBspSurface_t* surface, shader_t* shader, int entityNum);
2703
2704//
2705// tr_shader.c
2706//
2707qhandle_t RE_RefreshShaderNoMip(const char* name);
2708//=========================
2709
2710
2711/*
2712====================================================================
2713
2714IMPLEMENTATION SPECIFIC FUNCTIONS
2715
2716====================================================================
2717*/
2718
2719void GLimp_InitExtraExtensions( void );
2720
2721/*
2722====================================================================
2723
2724TESSELATOR/SHADER DECLARATIONS
2725
2726====================================================================
2727*/
2728
2729typedef struct stageVars
2730{
2731 color4ub_t colors[SHADER_MAX_VERTEXES];
2732 vec2_t texcoords[NUM_TEXTURE_BUNDLES][SHADER_MAX_VERTEXES];
2733} stageVars_t;
2734
2735typedef struct shaderCommands_s
2736{
2737 glIndex_t indexes[SHADER_MAX_INDEXES] Q_ALIGN(16);
2738 vec4_t xyz[SHADER_MAX_VERTEXES] Q_ALIGN(16);
2739 int16_t normal[SHADER_MAX_VERTEXES][4] Q_ALIGN(16);
2740 int16_t tangent[SHADER_MAX_VERTEXES][4] Q_ALIGN(16);
2741 vec2_t texCoords[SHADER_MAX_VERTEXES] Q_ALIGN(16);
2742 vec2_t lightCoords[SHADER_MAX_VERTEXES] Q_ALIGN(16);
2743 uint16_t color[SHADER_MAX_VERTEXES][4] Q_ALIGN(16);
2744 int16_t lightdir[SHADER_MAX_VERTEXES][4] Q_ALIGN(16);
2745 //int vertexDlightBits[SHADER_MAX_VERTEXES] Q_ALIGN(16);
2746
2747 void *attribPointers[ATTR_INDEX_COUNT];
2748 vao_t *vao;
2749 qboolean useInternalVao;
2750 qboolean useCacheVao;
2751
2752 stageVars_t svars Q_ALIGN(16);
2753
2754 //color4ub_t constantColor255[SHADER_MAX_VERTEXES] Q_ALIGN(16);
2755
2756 shader_t *shader;
2757 double shaderTime;
2758 int fogNum;
2759 int cubemapIndex;
2760
2761 int dlightBits; // or together of all vertexDlightBits
2762 int pshadowBits;
2763
2764 int firstIndex;
2765 int numIndexes;
2766 int numVertexes;
2767
2768 // info extracted from current shader
2769 int numPasses;
2770 void (*currentStageIteratorFunc)( void );
2771 shaderStage_t **xstages;
2772
2773 //
2774 // OPENMOHAA-specific stuff
2775 //
2776
2777 qboolean no_global_fog;
2778} shaderCommands_t;
2779
2780extern shaderCommands_t tess;
2781
2782void RB_BeginSurface(shader_t *shader, int fogNum, int cubemapIndex );
2783void RB_EndSurface(void);
2784void RB_CheckOverflow( int verts, int indexes );
2785#define RB_CHECKOVERFLOW(v,i) if (tess.numVertexes + (v) >= SHADER_MAX_VERTEXES || tess.numIndexes + (i) >= SHADER_MAX_INDEXES ) {RB_CheckOverflow(v,i);}
2786
2787void R_DrawElements( int numIndexes, int firstIndex );
2788void RB_StageIteratorGeneric( void );
2789void RB_StageIteratorSky( void );
2790void RB_StageIteratorVertexLitTexture( void );
2791void RB_StageIteratorLightmappedMultitexture( void );
2792
2793void RB_AddQuadStamp( vec3_t origin, vec3_t left, vec3_t up, float color[4] );
2794void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, float color[4], float s1, float t1, float s2, float t2 );
2795void RB_InstantQuad( vec4_t quadVerts[4] );
2796//void RB_InstantQuad2(vec4_t quadVerts[4], vec2_t texCoords[4], vec4_t color, shaderProgram_t *sp, vec2_t invTexRes);
2797void RB_InstantQuad2(vec4_t quadVerts[4], vec2_t texCoords[4]);
2798
2799void RB_ShowImages( void );
2800
2801
2802/*
2803============================================================
2804
2805WORLD MAP
2806
2807============================================================
2808*/
2809
2810void R_AddBrushModelSurfaces(trRefEntity_t* e);
2811void R_AddWorldSurfaces(void);
2812qboolean R_inPVS( const vec3_t p1, const vec3_t p2 );
2813mnode_t* R_PointInLeaf(const vec3_t p);
2814
2815
2816/*
2817============================================================
2818
2819FLARES
2820
2821============================================================
2822*/
2823
2824void R_ClearFlares( void );
2825
2826void RB_AddFlare( void *surface, int fogNum, vec3_t point, vec3_t color, vec3_t normal );
2827void RB_AddDlightFlares( void );
2828void RB_RenderFlares (void);
2829
2830/*
2831============================================================
2832
2833LIGHTS
2834
2835============================================================
2836*/
2837
2838void R_DlightBmodel( bmodel_t *bmodel );
2839void R_SetupEntityLighting( const trRefdef_t *refdef, trRefEntity_t *ent );
2840void R_TransformDlights( int count, dlight_t *dl, orientationr_t *ori );
2841int R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir );
2842int R_LightDirForPoint( vec3_t point, vec3_t lightDir, vec3_t normal, world_t *world );
2843int R_CubemapForPoint( vec3_t point );
2844
2845/*
2846============================================================
2847
2848SHADOWS
2849
2850============================================================
2851*/
2852
2853void RB_ShadowTessEnd( void );
2854void RB_ShadowFinish( void );
2855void RB_ProjectionShadowDeform( void );
2856
2857/*
2858============================================================
2859
2860SKIES
2861
2862============================================================
2863*/
2864
2865void R_BuildCloudData( shaderCommands_t *shader );
2866void R_InitSkyTexCoords( float cloudLayerHeight );
2867void R_DrawSkyBox( shaderCommands_t *shader );
2868void RB_DrawSun( float scale, shader_t *shader );
2869void RB_ClipSkyPolygons( shaderCommands_t *shader );
2870
2871/*
2872============================================================
2873
2874CURVE TESSELATION
2875
2876============================================================
2877*/
2878
2879#define PATCH_STITCHING
2880
2881void R_SubdividePatchToGrid( srfBspSurface_t *grid, int width, int height,
2882 srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE] );
2883void R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror );
2884void R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror );
2885
2886/*
2887============================================================
2888
2889MARKERS, POLYGON PROJECTION ON WORLD POLYGONS
2890
2891============================================================
2892*/
2893
2894int R_MarkFragments(int numPoints, const vec3_t *points, const vec3_t projection,
2895 int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer, float fRadiusSquared);
2896
2897int R_MarkFragmentsForInlineModel(clipHandle_t bmodel, const vec3_t vAngles, const vec3_t vOrigin, int numPoints,
2898 const vec3_t* points, const vec3_t projection, int maxPoints, vec3_t pointBuffer,
2899 int maxFragments, markFragment_t* fragmentBuffer, float fRadiusSquared);
2900
2901
2902/*
2903============================================================
2904
2905VERTEX BUFFER OBJECTS
2906
2907============================================================
2908*/
2909
2910void R_VaoPackTangent(int16_t *out, vec4_t v);
2911void R_VaoPackNormal(int16_t *out, vec3_t v);
2912void R_VaoPackColor(uint16_t *out, vec4_t c);
2913void R_VaoUnpackTangent(vec4_t v, int16_t *pack);
2914void R_VaoUnpackNormal(vec3_t v, int16_t *pack);
2915
2916vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *indexes, int indexesSize, vaoUsage_t usage);
2917vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int numIndexes, glIndex_t *inIndexes);
2918
2919void R_BindVao(vao_t *vao);
2920void R_BindNullVao(void);
2921
2922void Vao_SetVertexPointers(vao_t *vao);
2923
2924void R_InitVaos(void);
2925void R_ShutdownVaos(void);
2926void R_VaoList_f(void);
2927
2928void RB_UpdateTessVao(unsigned int attribBits);
2929
2930void VaoCache_Commit(void);
2931void VaoCache_DrawElements(int numIndexes, int firstIndex);
2932void VaoCache_Init(void);
2933void VaoCache_BindVao(void);
2934void VaoCache_CheckAdd(qboolean *endSurface, qboolean *recycleVertexBuffer, qboolean *recycleIndexBuffer, int numVerts, int numIndexes);
2935void VaoCache_RecycleVertexBuffer(void);
2936void VaoCache_RecycleIndexBuffer(void);
2937void VaoCache_InitQueue(void);
2938void VaoCache_AddSurface(srfVert_t *verts, int numVerts, glIndex_t *indexes, int numIndexes);
2939
2940/*
2941============================================================
2942
2943GLSL
2944
2945============================================================
2946*/
2947
2948void GLSL_InitGPUShaders(void);
2949void GLSL_ShutdownGPUShaders(void);
2950void GLSL_VertexAttribPointers(uint32_t attribBits);
2951void GLSL_BindProgram(shaderProgram_t * program);
2952
2953void GLSL_SetUniformInt(shaderProgram_t *program, int uniformNum, GLint value);
2954void GLSL_SetUniformFloat(shaderProgram_t *program, int uniformNum, GLfloat value);
2955void GLSL_SetUniformFloat5(shaderProgram_t *program, int uniformNum, const vec5_t v);
2956void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t v);
2957void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t v);
2958void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v);
2959void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix);
2960void GLSL_SetUniformMat4BoneMatrix(shaderProgram_t *program, int uniformNum, /*const*/ mat4_t *matrix, int numMatricies);
2961
2962shaderProgram_t *GLSL_GetGenericShaderProgram(int stage);
2963
2964/*
2965============================================================
2966
2967SCENE GENERATION
2968
2969============================================================
2970*/
2971
2972void R_InitNextFrame( void );
2973
2974void RE_ClearScene( void );
2975void RE_AddRefEntityToScene( const refEntity_t *ent );
2976void RE_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int num );
2977void RE_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b );
2978void RE_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b );
2979void RE_BeginScene( const refdef_t *fd );
2980void RE_RenderScene( const refdef_t *fd );
2981void RE_EndScene(void);
2982void RE_AddRefEntityToScene2(const refEntity_t* ent, int parentEntityNumber);
2983
2984/*
2985=============================================================
2986
2987UNCOMPRESSING BONES
2988
2989=============================================================
2990*/
2991
2992#define MC_BITS_X (16)
2993#define MC_BITS_Y (16)
2994#define MC_BITS_Z (16)
2995#define MC_BITS_VECT (16)
2996
2997#define MC_SCALE_X (1.0f/64)
2998#define MC_SCALE_Y (1.0f/64)
2999#define MC_SCALE_Z (1.0f/64)
3000
3001void MC_UnCompress(float mat[3][4],const unsigned char * comp);
3002
3003/*
3004=============================================================
3005
3006ANIMATED MODELS
3007
3008=============================================================
3009*/
3010
3011void R_MDRAddAnimSurfaces( trRefEntity_t *ent );
3012void RB_MDRSurfaceAnim( mdrSurface_t *surface );
3013qboolean R_LoadIQM (model_t *mod, void *buffer, int filesize, const char *name );
3014void R_AddIQMSurfaces( trRefEntity_t *ent );
3015void RB_IQMSurfaceAnim( surfaceType_t *surface );
3016void RB_IQMSurfaceAnimVao( srfVaoIQModel_t *surface );
3017int R_IQMLerpTag( orientation_t *tag, iqmData_t *data,
3018 int startFrame, int endFrame,
3019 float frac, const char *tagName );
3020
3021//
3022// OPENMOHAA-specific stuff
3023//=========================
3024
3025/*
3026=============================================================
3027
3028DRAWING
3029
3030=============================================================
3031*/
3032
3033void Draw_SetColor(const vec4_t rgba);
3034void Draw_StretchPic(float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader);
3035void Draw_StretchPic2(float x, float y, float w, float h, float s1, float t1, float s2, float t2, float sx, float sy, qhandle_t hShader);
3036void Draw_TilePic(float x, float y, float w, float h, qhandle_t hShader);
3037void Draw_TilePicOffset(float x, float y, float w, float h, qhandle_t hShader, int offsetX, int offsetY);
3038void Draw_TrianglePic(const vec2_t vPoints[3], const vec2_t vTexCoords[3], qhandle_t hShader);
3039void DrawBox(float x, float y, float w, float h);
3040void AddBox(float x, float y, float w, float h);
3041void Set2DWindow(int x, int y, int w, int h, float left, float right, float bottom, float top, float n, float f);
3042void RE_Scissor(int x, int y, int width, int height);
3043void DrawLineLoop(const vec2_t* points, int count, int stipple_factor, int stipple_mask);
3044void RE_StretchRaw2(int x, int y, int w, int h, int cols, int rows, int components, const byte* data);
3045
3046/*
3047=============================================================
3048
3049FONT
3050
3051=============================================================
3052*/
3053void R_ShutdownFont();
3054fontheader_t* R_LoadFont(const char* name);
3055void R_LoadFontShader(fontheader_sgl_t* font);
3056void R_DrawString(fontheader_t* font, const char* text, float x, float y, int maxlen, const float *pvVirtualScreen);
3057void R_DrawFloatingString(fontheader_t* font, const char* text, const vec3_t org, const vec4_t color, float scale, int maxlen);
3058float R_GetFontHeight(const fontheader_t* font);
3059float R_GetFontStringWidth(const fontheader_t* font, const char* s);
3060
3061/*
3062=============================================================
3063
3064GHOST
3065
3066=============================================================
3067*/
3068
3069void R_UpdateGhostTextures();
3070void R_SetGhostImage(const char* name, image_t* image);
3071void LoadGHOST(const char* name, byte** pic, int* width, int* height);
3072
3073/*
3074============================================================
3075
3076LIGHTS
3077
3078============================================================
3079*/
3080
3081void R_GetLightingForDecal(vec3_t vLight, const vec3_t vFacing, const vec3_t vOrigin);
3082void R_GetLightingForSmoke(vec3_t vLight, const vec3_t vOrigin);
3083void R_GetLightingGridValue(world_t* world, const vec3_t vPos, vec3_t vAmbientLight, vec3_t vDirectedLight);
3084void RB_SetupEntityGridLighting();
3085void RB_SetupStaticModelGridLighting(trRefdef_t* refdef, cStaticModelUnpacked_t* ent, const vec3_t lightOrigin);
3086
3087void RB_Light_Real(unsigned char* colors);
3088void RB_Sphere_BuildDLights();
3089void RB_Sphere_SetupEntity();
3090void RB_Grid_SetupEntity();
3091void RB_Grid_SetupStaticModel();
3092void RB_Light_Fullbright(unsigned char* colors);
3093void R_Sphere_InitLights();
3094int R_GatherLightSources(const vec3_t vPos, vec3_t* pvLightPos, vec3_t* pvLightIntensity, int iMaxLights);
3095
3096extern suninfo_t s_sun;
3097
3098/*
3099=============================================================
3100
3101MARKS
3102
3103=============================================================
3104*/
3105void R_LevelMarksLoad(const char* szBSPName);
3106void R_LevelMarksInit();
3107void R_LevelMarksFree();
3108void R_UpdateLevelMarksSystem();
3109void R_AddPermanentMarkFragmentSurfaces(void** pFirstMarkFragment, int iNumMarkFragment);
3110
3111/*
3112============================================================
3113
3114SCENE
3115
3116============================================================
3117*/
3118
3119void RE_AddRefSpriteToScene(const refEntity_t* ent);
3120void RE_AddTerrainMarkToScene(int iTerrainIndex, qhandle_t hShader, int numVerts, const polyVert_t* verts, int renderfx);
3121refEntity_t* RE_GetRenderEntity(int entityNumber);
3122qboolean RE_AddPolyToScene2(qhandle_t hShader, int numVerts, const polyVert_t* verts, int renderfx);
3123void RE_AddLightToScene2(const vec3_t org, float intensity, float r, float g, float b, int type);
3124
3125/*
3126============================================================
3127
3128SHADE CALC
3129
3130============================================================
3131*/
3132
3133void RB_CalcLightGridColor(unsigned char* colors);
3134
3135/*
3136=============================================================
3137
3138SKY PORTALS
3139
3140=============================================================
3141*/
3142void R_Sky_Init();
3143void R_Sky_Reset();
3144void R_Sky_AddSurf(msurface_t* surf);
3145void R_Sky_Render();
3146
3147/*
3148=============================================================
3149
3150SPRITE
3151
3152=============================================================
3153*/
3154sprite_t* SPR_RegisterSprite(const char* name);
3155void RB_DrawSprite(const refSprite_t* spr);
3156
3157
3158/*
3159=============================================================
3160
3161SUN FLARE
3162
3163=============================================================
3164*/
3165void R_InitLensFlare();
3166void R_DrawLensFlares();
3167
3168/*
3169=============================================================
3170
3171SWIPE
3172
3173=============================================================
3174*/
3175void RB_DrawSwipeSurface(surfaceType_t* pswipe);
3176void RE_SwipeBegin(float thistime, float life, qhandle_t shader);
3177void RE_SwipeEnd();
3178void R_AddSwipeSurfaces();
3179
3180/*
3181=============================================================
3182
3183TERRAIN
3184
3185=============================================================
3186*/
3187
3188extern terraTri_t* g_pTris;
3189extern terrainVert_t* g_pVert;
3190
3191void R_MarkTerrainPatch(cTerraPatchUnpacked_t* pPatch);
3192void R_AddTerrainSurfaces();
3193void R_AddTerrainMarkSurfaces();
3194void R_InitTerrain();
3195void R_ShutdownTerrain();
3196void R_TerrainFree();
3197void R_TerrainPrepareFrame();
3198qboolean R_TerrainHeightForPoly(cTerraPatchUnpacked_t* pPatch, polyVert_t* pVerts, int nVerts);
3199void R_SwapTerraPatch(cTerraPatch_t* pPatch);
3200
3201void R_TerrainCrater_f(void);
3202
3203/*
3204=============================================================
3205
3206TIKI
3207
3208=============================================================
3209*/
3210struct skelHeaderGame_s;
3211struct skelAnimFrame_s;
3212
3213void R_InitStaticModels(void);
3214void RE_FreeModels(void);
3215qhandle_t RE_SpawnEffectModel(const char* szModel, vec3_t vPos, vec3_t* axis);
3216qhandle_t RE_RegisterServerModel(const char* name);
3217void RE_UnregisterServerModel(qhandle_t hModel);
3218orientation_t RE_TIKI_Orientation(refEntity_t* model, int tagnum);
3219qboolean RE_TIKI_IsOnGround(refEntity_t* model, int tagnum, float threshold);
3220float R_ModelRadius(qhandle_t handle);
3221void R_ModelBounds(qhandle_t handle, vec3_t mins, vec3_t maxs);
3222dtiki_t* R_Model_GetHandle(qhandle_t handle);
3223
3224float R_GetRadius(refEntity_t* model);
3225void R_GetFrame(refEntity_t* model, struct skelAnimFrame_s* newFrame);
3226void RE_ForceUpdatePose(refEntity_t* model);
3227void RE_SetFrameNumber(int frameNumber);
3228void R_UpdatePoseInternal(refEntity_t* model);
3229void RB_SkelMesh(skelSurfaceGame_t* sf);
3230void RB_StaticMesh(staticSurface_t* staticSurf);
3231void RB_Static_BuildDLights();
3232void R_InfoStaticModels_f(void);
3233void R_PrintInfoStaticModels();
3234void R_AddSkelSurfaces(trRefEntity_t* ent);
3235void R_AddStaticModelSurfaces(void);
3236void R_CountTikiLodTris(dtiki_t* tiki, float lodpercentage, int* render_tris, int* total_tris);
3237float R_CalcLod(const vec3_t origin, float radius);
3238int GetLodCutoff(struct skelHeaderGame_s* skelmodel, float lod_val, int renderfx);
3239int GetToolLodCutoff(struct skelHeaderGame_s* skelmodel, float lod_val);
3240void R_InfoWorldTris_f(void);
3241void R_PrintInfoWorldtris(void);
3242void R_DebugSkeleton(void);
3243
3244extern int g_nStaticSurfaces;
3245extern qboolean g_bInfostaticmodels;
3246extern qboolean g_bInfoworldtris;
3247
3248/*
3249=============================================================
3250
3251UTIL
3252
3253=============================================================
3254*/
3255
3256void RB_StreamBegin(shader_t* shader);
3257void RB_StreamEnd(void);
3258void RB_StreamBeginDrawSurf(void);
3259void RB_StreamEndDrawSurf(void);
3260static void addTriangle(void);
3261void RB_Vertex3fv(vec3_t v);
3262void RB_Vertex3f(vec_t x, vec_t y, vec_t z);
3263void RB_Vertex2f(vec_t x, vec_t y);
3264void RB_Color4f(vec_t r, vec_t g, vec_t b, vec_t a);
3265void RB_Color3f(vec_t r, vec_t g, vec_t b);
3266void RB_Color3fv(vec3_t col);
3267void RB_Color4bv(unsigned char* colors);
3268void RB_Texcoord2f(float s, float t);
3269void RB_Texcoord2fv(vec2_t st);
3270void R_DrawDebugNumber(const vec3_t org, float number, float scale, float r, float g, float b, int precision);
3271void R_DebugRotatedBBox(const vec3_t org, const vec3_t ang, const vec3_t mins, const vec3_t maxs, float r, float g, float b, float alpha);
3272void R_DebugCircle(const vec3_t org, float radius, float r, float g, float b, float alpha, qboolean horizontal);
3273void R_DebugLine(const vec3_t start, const vec3_t end, float r, float g, float b, float alpha);
3274int RE_GetShaderWidth(qhandle_t hShader);
3275int RE_GetShaderHeight(qhandle_t hShader);
3276const char* RE_GetShaderName(qhandle_t hShader);
3277const char* RE_GetModelName(qhandle_t hModel);
3278
3279/*
3280============================================================
3281
3282WORLD MAP
3283
3284============================================================
3285*/
3286void R_GetInlineModelBounds(int iIndex, vec3_t vMins, vec3_t vMaxs);
3287int R_SphereInLeafs(const vec3_t p, float r, mnode_t** nodes, int nMaxNodes);
3288mnode_t* R_PointInLeaf(const vec3_t p);
3289int R_CheckDlightTerrain(cTerraPatchUnpacked_t* surf, int dlightBits);
3290
3291void R_AddSpriteSurfCmd(drawSurf_t* drawSurfs, int numDrawSurfs);
3292
3293//=========================
3294
3295/*
3296=============================================================
3297=============================================================
3298*/
3299void R_TransformModelToClip( const vec3_t src, const float *modelMatrix, const float *projectionMatrix,
3300 vec4_t eye, vec4_t dst );
3301void R_TransformClipToWindow( const vec4_t clip, const viewParms_t *view, vec4_t normalized, vec4_t window );
3302
3303void RB_DeformTessGeometry( void );
3304
3305void RB_CalcFogTexCoords( float *dstTexCoords );
3306
3307void RB_CalcScaleTexMatrix( const float scale[2], float *matrix );
3308void RB_CalcScrollTexMatrix( const float scrollSpeed[2], float *matrix );
3309void RB_CalcRotateTexMatrix( float degsPerSecond, float *matrix );
3310void RB_CalcTurbulentFactors( const waveForm_t *wf, float *amplitude, float *now );
3311void RB_CalcTransformTexMatrix( const texModInfo_t *tmi, float *matrix );
3312void RB_CalcStretchTexMatrix( const waveForm_t *wf, float *matrix );
3313
3314void RB_CalcModulateColorsByFog( unsigned char *dstColors );
3315float RB_CalcWaveAlphaSingle( const waveForm_t *wf );
3316float RB_CalcWaveColorSingle( const waveForm_t *wf );
3317
3318/*
3319=============================================================
3320
3321RENDERER BACK END FUNCTIONS
3322
3323=============================================================
3324*/
3325
3326void RB_ExecuteRenderCommands( const void *data );
3327
3328/*
3329=============================================================
3330
3331RENDERER BACK END COMMAND QUEUE
3332
3333=============================================================
3334*/
3335
3336#define MAX_RENDER_COMMANDS 0x40000
3337
3338typedef struct {
3339 byte cmds[MAX_RENDER_COMMANDS];
3340 int used;
3342
3343typedef struct {
3344 int commandId;
3345 float color[4];
3347
3348typedef struct {
3349 int commandId;
3350 int buffer;
3352
3353typedef struct {
3354 int commandId;
3355 image_t *image;
3356 int width;
3357 int height;
3358 void *data;
3360
3361typedef struct {
3362 int commandId;
3364
3365typedef struct {
3366 int commandId;
3367 int buffer;
3369
3370typedef struct {
3371 int commandId;
3372 shader_t *shader;
3373 float x, y;
3374 float w, h;
3375 float s1, t1;
3376 float s2, t2;
3378
3379typedef struct {
3380 int commandId;
3381 trRefdef_t refdef;
3382 viewParms_t viewParms;
3383 drawSurf_t *drawSurfs;
3384 int numDrawSurfs;
3386
3387typedef struct {
3388 int commandId;
3389 int x;
3390 int y;
3391 int width;
3392 int height;
3393 char *fileName;
3394 qboolean jpeg;
3396
3397typedef struct {
3398 int commandId;
3399 int width;
3400 int height;
3401 byte *captureBuffer;
3402 byte *encodeBuffer;
3403 qboolean motionJpeg;
3405
3406typedef struct
3407{
3408 int commandId;
3409
3410 GLboolean rgba[4];
3412
3413typedef struct
3414{
3415 int commandId;
3417
3418typedef struct {
3419 int commandId;
3420 int map;
3421 int cubeSide;
3423
3424typedef struct {
3425 int commandId;
3426 trRefdef_t refdef;
3427 viewParms_t viewParms;
3429
3430typedef struct {
3431 int commandId;
3433
3434typedef enum {
3435 RC_END_OF_LIST,
3436 RC_SET_COLOR,
3437 RC_STRETCH_PIC,
3438 RC_DRAW_SURFS,
3439 RC_DRAW_BUFFER,
3440 RC_SWAP_BUFFERS,
3441 RC_SCREENSHOT,
3442 RC_VIDEOFRAME,
3443 RC_COLORMASK,
3444 RC_CLEARDEPTH,
3445 RC_CAPSHADOWMAP,
3446 RC_POSTPROCESS,
3447 RC_EXPORT_CUBEMAPS,
3448
3449 //
3450 // OPENMOHAA-specific stuff
3451 //
3452
3453 RC_SPRITE_SURFS,
3454} renderCommand_t;
3455
3456
3457// these are sort of arbitrary limits.
3458// the limits apply to the sum of all scenes in a frame --
3459// the main view, all the 3D icons, etc
3460#define MAX_POLYS 600
3461#define MAX_POLYVERTS 3000
3462#define MAX_TERMARKS 1024
3463
3464// all of the information needed by the back end must be
3465// contained in a backEndData_t
3466typedef struct {
3467 drawSurf_t drawSurfs[MAX_DRAWSURFS];
3468 dlight_t dlights[MAX_DLIGHTS];
3469 trRefEntity_t entities[MAX_REFENTITIES];
3470 srfPoly_t *polys;//[MAX_POLYS];
3471 polyVert_t *polyVerts;//[MAX_POLYVERTS];
3472 pshadow_t pshadows[MAX_CALC_PSHADOWS];
3473 renderCommandList_t commands;
3474
3475 //
3476 // OPENMOHAA-specific stuff
3477 //
3478 drawSurf_t spriteSurfs[MAX_SPRITESURFS];
3479 srfMarkFragment_t* terMarks;
3480 refSprite_t sprites[2048];
3481 cStaticModelUnpacked_t* staticModels;
3482 byte* staticModelData;
3484
3485extern int max_polys;
3486extern int max_polyverts;
3487
3488extern backEndData_t *backEndData; // the second one may not be allocated
3489
3490
3491void *R_GetCommandBuffer( int bytes );
3492void RB_ExecuteRenderCommands( const void *data );
3493
3494void R_IssuePendingRenderCommands( void );
3495
3496void R_AddDrawSurfCmd( drawSurf_t *drawSurfs, int numDrawSurfs );
3497void R_AddCapShadowmapCmd( int dlight, int cubeSide );
3498void R_AddPostProcessCmd (void);
3499
3500void RE_SetColor( const float *rgba );
3501void RE_StretchPic ( float x, float y, float w, float h,
3502 float s1, float t1, float s2, float t2, qhandle_t hShader );
3503void RE_BeginFrame( stereoFrame_t stereoFrame );
3504void RE_EndFrame( int *frontEndMsec, int *backEndMsec );
3505void RE_SaveJPG(char * filename, int quality, int image_width, int image_height,
3506 unsigned char *image_buffer, int padding);
3507size_t RE_SaveJPGToBuffer(byte *buffer, size_t bufSize, int quality,
3508 int image_width, int image_height, byte *image_buffer, int padding);
3509void RE_TakeVideoFrame( int width, int height,
3510 byte *captureBuffer, byte *encodeBuffer, qboolean motionJpeg );
3511
3512void R_ConvertTextureFormat( const byte *in, int width, int height, GLenum format, GLenum type, byte *out );
3513
3514#ifdef __cplusplus
3515}
3516#endif
3517
3518#endif //TR_LOCAL_H
Definition tr_local.h:1257
Definition tr_local.h:2465
Definition tr_local.h:1273
Definition tr_local.h:1070
Definition tr_local.h:990
Definition navigation_bsp.h:149
Definition tr_local.h:959
Definition navigation_bsp.h:308
Definition tr_local.h:3418
Definition tr_local.h:2435
Definition tr_local.h:2428
Definition tr_local.h:100
Definition tr_local.h:1521
Definition tr_local.h:409
Definition tr_local.h:720
Definition tr_local.h:169
Definition tr_local.h:2369
Definition tr_local.h:767
Definition tr_local.h:2400
Definition qfiles.h:536
Definition tr_local.h:2386
Definition tr_local.h:3430
Definition tr_local.h:542
Definition tr_local.h:707
Definition tr_local.h:1223
Definition tr_local.h:1899
Definition tr_types.h:244
Definition tr_local.h:1243
Definition tr_local.h:1181
Definition tr_local.h:1174
Definition q_shared.h:1493
Definition qfiles.h:268
Definition tr_local.h:1680
Definition tr_local.h:1729
Definition tr_local.h:1705
Definition tr_local.h:1710
Definition tr_local.h:1693
Definition tr_local.h:1687
Definition tr_local.h:1698
Definition tr_local.h:1042
Definition tr_local.h:1155
Definition tr_local.h:1030
Definition q_shared.h:1524
Definition tr_local.h:214
Definition tr_types.h:67
Definition tr_local.h:105
Definition tr_local.h:3424
Definition tr_local.h:1481
Definition tr_local.h:126
Definition tr_types.h:95
Definition tr_local.h:202
Definition tr_types.h:162
Definition tr_local.h:2359
Definition tr_local.h:2408
Definition tr_local.h:2364
Definition tr_local.h:1892
Definition tr_local.h:851
Definition tr_local.h:476
Definition tr_local.h:548
Definition skeletor.h:42
Definition tiki_shared.h:257
Definition tr_local.h:695
Definition tr_local.h:700
Definition tr_local.h:525
Definition tr_local.h:114
Definition tr_local.h:157
Definition tr_local.h:140
Definition tr_local.h:537
Definition tr_local.h:1080
Definition tr_local.h:1137
Definition tr_local.h:800
Definition tr_local.h:1224
Definition tr_local.h:787
Definition tr_local.h:779
Definition tr_local.h:985
Definition tr_local.h:942
Definition tr_local.h:1235
Definition tr_local.h:1250
Definition tr_local.h:1119
Definition tr_local.h:1886
Definition tr_local.h:2391
Definition tr_local.h:2374
Definition tr_local.h:2349
Definition tr_local.h:2382
Definition tr_local.h:923
Definition navigation_bsp.h:281
Definition tr_local.h:909
Definition navigation_bsp.h:269
Definition tr_local.h:422
Definition tr_local.h:455
Definition tr_local.h:1305
Definition tr_local.h:181
Definition tr_local.h:633
Definition tr_local.h:166
Definition tr_local.h:177
Definition tr_local.h:2418
Definition tr_local.h:734
Definition tr_local.h:379
Definition tr_local.h:1089
Definition navigation_bsp.h:214