mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-11 07:42:18 +00:00
7240d2dc80
The main goal was to get visframe out of mnode_t to make it thread-safe (each thread can have its own visframe array), but moving the plane info into mnode_t made for better data access patters when traversing the bsp tree as the plane is right there with the child indices. Nicely, the size of mnode_t is the same as before (64 bytes due to alignment), with 4 bytes wasted. Performance-wise, there seems to be very little difference. Maybe slightly slower. The unfortunate thing about the change is the plane distance is negated, possibly leading to some confusion, particularly since the box and sphere culling functions were affected. However, this is so point-plane distance calculations can be done with a single 4d dot product.
359 lines
10 KiB
C
359 lines
10 KiB
C
/*
|
|
r_local.h
|
|
|
|
private refresh defs
|
|
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to:
|
|
|
|
Free Software Foundation, Inc.
|
|
59 Temple Place - Suite 330
|
|
Boston, MA 02111-1307, USA
|
|
|
|
*/
|
|
|
|
#ifndef _R_LOCAL_H
|
|
#define _R_LOCAL_H
|
|
|
|
#include "QF/iqm.h"
|
|
#include "QF/mathlib.h"
|
|
#include "QF/model.h"
|
|
#include "QF/render.h"
|
|
#include "QF/vid.h"
|
|
#include "QF/simd/mat4f.h"
|
|
#include "QF/simd/vec4f.h"
|
|
#include "r_shared.h"
|
|
|
|
#define ALIAS_BASE_SIZE_RATIO (1.0 / 11.0)
|
|
// normalizing factor so player model works out to about
|
|
// 1 pixel per triangle
|
|
|
|
#define BMODEL_FULLY_CLIPPED 0x10 // value returned by R_BmodelCheckBBox ()
|
|
// if bbox is trivially rejected
|
|
|
|
// viewmodel lighting =======================================================
|
|
|
|
typedef struct {
|
|
int ambientlight;
|
|
int shadelight;
|
|
vec3_t lightvec;
|
|
} alight_t;
|
|
|
|
// clipped bmodel edges =====================================================
|
|
|
|
typedef struct bedge_s
|
|
{
|
|
mvertex_t *v[2];
|
|
struct bedge_s *pnext;
|
|
} bedge_t;
|
|
|
|
typedef struct {
|
|
float fv[3]; // viewspace x, y
|
|
} auxvert_t;
|
|
|
|
//===========================================================================
|
|
|
|
extern int r_speeds;
|
|
extern int r_timegraph;
|
|
extern int r_graphheight;
|
|
extern int r_clearcolor;
|
|
extern int r_waterwarp;
|
|
extern int r_drawentities;
|
|
extern int r_aliasstats;
|
|
extern int r_dspeeds;
|
|
extern int r_drawflat;
|
|
extern int r_ambient;
|
|
extern int r_reportsurfout;
|
|
extern int r_maxsurfs;
|
|
extern int r_numsurfs;
|
|
extern int r_reportedgeout;
|
|
extern int r_maxedges;
|
|
extern int r_numedges;
|
|
|
|
extern float cl_wateralpha;
|
|
|
|
#define XCENTERING (1.0 / 2.0)
|
|
#define YCENTERING (1.0 / 2.0)
|
|
|
|
#define CLIP_EPSILON 0.001
|
|
|
|
#define BACKFACE_EPSILON 0.01
|
|
|
|
//===========================================================================
|
|
|
|
#define DIST_NOT_SET 98765
|
|
|
|
// !!! if this is changed, it must be changed in asm_draw.h too !!!
|
|
typedef struct clipplane_s {
|
|
vec3_t normal;
|
|
float dist;
|
|
struct clipplane_s *next;
|
|
byte leftedge;
|
|
byte rightedge;
|
|
byte reserved[2];
|
|
} clipplane_t;
|
|
|
|
extern clipplane_t view_clipplanes[4];
|
|
|
|
//=============================================================================
|
|
|
|
void R_RenderWorld (void);
|
|
struct entqueue_s;
|
|
void R_DrawEntitiesOnList (struct entqueue_s *queue);
|
|
|
|
//=============================================================================
|
|
|
|
extern plane_t screenedge[4];
|
|
|
|
extern vec4f_t r_entorigin;
|
|
|
|
extern int r_visframecount;
|
|
|
|
//=============================================================================
|
|
|
|
extern int vstartscan;
|
|
|
|
|
|
void R_ClearPolyList (void);
|
|
void R_DrawPolyList (void);
|
|
|
|
// Surface cache related ==========
|
|
extern qboolean r_cache_thrash; // set if thrashing the surface cache
|
|
|
|
// current entity info
|
|
extern qboolean insubmodel;
|
|
extern vec3_t r_worldmodelorg;
|
|
|
|
extern mat4f_t glsl_projection;
|
|
extern mat4f_t glsl_view;
|
|
|
|
union refframe_s;
|
|
void R_SetFrustum (plane_t *frustum, const union refframe_s *frame,
|
|
float fov_x, float fov_y);
|
|
|
|
struct entity_s;
|
|
|
|
void R_SpriteBegin (void);
|
|
void R_SpriteEnd (void);
|
|
void R_DrawSprite (struct entity_s *ent);
|
|
void R_RenderFace (struct entity_s *ent, msurface_t *fa, int clipflags);
|
|
void R_RenderPoly (struct entity_s *ent, msurface_t *fa, int clipflags);
|
|
void R_RenderBmodelFace (struct entity_s *ent, bedge_t *pedges, msurface_t *psurf);
|
|
void R_TransformFrustum (void);
|
|
void R_SetSkyFrame (void);
|
|
void R_DrawSurfaceBlock (void);
|
|
texture_t *R_TextureAnimation (const struct entity_s *entity, msurface_t *surf) __attribute__((pure));
|
|
|
|
void R_GenSkyTile (void *pdest);
|
|
void R_SurfPatch (void);
|
|
void R_DrawSubmodelPolygons (struct entity_s *ent, model_t *pmodel, int clipflags, struct mleaf_s *topleaf);
|
|
void R_DrawSolidClippedSubmodelPolygons (struct entity_s *ent, model_t *pmodel, struct mnode_s *topnode);
|
|
|
|
void R_AddPolygonEdges (emitpoint_t *pverts, int numverts, int miplevel);
|
|
surf_t *R_GetSurf (void);
|
|
void R_AliasClipAndProjectFinalVert (finalvert_t *fv, auxvert_t *av);
|
|
void R_AliasDrawModel (struct entity_s *ent, alight_t *plighting);
|
|
void R_IQMDrawModel (struct entity_s *ent, alight_t *plighting);
|
|
struct animation_s;
|
|
maliasskindesc_t *R_AliasGetSkindesc (struct animation_s *animation, int skinnum, aliashdr_t *hdr);
|
|
maliasframedesc_t *R_AliasGetFramedesc (struct animation_s *animation, aliashdr_t *hdr);
|
|
float R_AliasGetLerpedFrames (struct animation_s *animation, aliashdr_t *hdr);
|
|
float R_IQMGetLerpedFrames (struct entity_s *ent, iqm_t *hdr);
|
|
iqmframe_t *R_IQMBlendFrames (const iqm_t *iqm, int frame1, int frame2,
|
|
float blend, int extra);
|
|
iqmframe_t *R_IQMBlendPalette (const iqm_t *iqm, int frame1, int frame2,
|
|
float blend, int extra,
|
|
iqmblend_t *blend_palette, int palette_size);
|
|
float R_EntityBlend (struct animation_s *animation, int pose, float interval);
|
|
void R_BeginEdgeFrame (void);
|
|
void R_ScanEdges (void);
|
|
void D_DrawSurfaces (void);
|
|
void R_InsertNewEdges (edge_t *edgestoadd, edge_t *edgelist);
|
|
void R_StepActiveU (edge_t *pedge);
|
|
void R_RemoveEdges (edge_t *pedge);
|
|
void R_AddTexture (texture_t *tex);
|
|
struct vulkan_ctx_s;
|
|
void R_ClearTextures (void);
|
|
void R_InitSurfaceChains (mod_brush_t *brush);
|
|
|
|
extern const byte *r_colormap;
|
|
void R_SetColormap (const byte *cmap);
|
|
extern void R_Surf8Start (void);
|
|
extern void R_Surf8End (void);
|
|
extern void R_EdgeCodeStart (void);
|
|
extern void R_EdgeCodeEnd (void);
|
|
|
|
struct transform_s;
|
|
extern void R_RotateBmodel (struct transform_s *transform);
|
|
|
|
extern int c_faceclip;
|
|
extern int r_polycount;
|
|
|
|
extern int *pfrustum_indexes[4];
|
|
|
|
// !!! if this is changed, it must be changed in asm_draw.h too !!!
|
|
#define NEAR_CLIP 0.01
|
|
|
|
extern fixed16_t sadjust, tadjust;
|
|
extern fixed16_t bbextents, bbextentt;
|
|
|
|
#define MAXBVERTINDEXES 1000 // new clipped vertices when clipping bmodels
|
|
// to the world BSP
|
|
extern mvertex_t *r_ptverts, *r_ptvertsmax;
|
|
|
|
extern vec3_t sbaseaxis[3], tbaseaxis[3];
|
|
|
|
extern int r_currentkey;
|
|
extern int r_currentbkey;
|
|
|
|
typedef struct btofpoly_s {
|
|
int clipflags;
|
|
msurface_t *psurf;
|
|
} btofpoly_t;
|
|
|
|
#define MAX_BTOFPOLYS 5000 // FIXME: tune this
|
|
|
|
extern int numbtofpolys;
|
|
|
|
void R_InitTurb (void);
|
|
void R_ZDrawSubmodelPolys (struct entity_s *ent, model_t *clmodel);
|
|
|
|
// Alias models ===========================================
|
|
|
|
#define ALIAS_Z_CLIP_PLANE 5
|
|
|
|
extern int numverts;
|
|
extern int numtriangles;
|
|
extern float leftclip, topclip, rightclip, bottomclip;
|
|
extern int r_acliptype;
|
|
extern finalvert_t *pfinalverts;
|
|
extern auxvert_t *pauxverts;
|
|
extern float ziscale;
|
|
extern float aliastransform[3][4];
|
|
|
|
qboolean R_AliasCheckBBox (struct entity_s *ent);
|
|
|
|
// turbulence stuff =======================================
|
|
|
|
#define AMP 8*0x10000
|
|
#define AMP2 3
|
|
#define SPEED 20
|
|
|
|
// particle stuff =========================================
|
|
|
|
struct psystem_s;
|
|
void R_DrawParticles (struct psystem_s *psystem);
|
|
void R_InitParticles (void);
|
|
void R_ClearParticles (void);
|
|
void R_ReadPointFile_f (void);
|
|
void R_InitSprites (void);
|
|
void R_SurfacePatch (void);
|
|
|
|
// renderer stuff again ===================================
|
|
|
|
extern int r_amodels_drawn;
|
|
extern edge_t *auxedges;
|
|
extern int r_numallocatededges;
|
|
extern edge_t *r_edges, *edge_p, *edge_max;
|
|
|
|
extern edge_t *newedges[MAXHEIGHT];
|
|
extern edge_t *removeedges[MAXHEIGHT];
|
|
|
|
extern int r_bmodelactive;
|
|
extern vrect_t *pconupdate;
|
|
|
|
extern float aliasxscale, aliasyscale, aliasxcenter, aliasycenter;
|
|
extern float r_aliastransition, r_resfudge;
|
|
|
|
extern int r_outofsurfaces;
|
|
extern int r_outofedges;
|
|
|
|
extern mvertex_t *r_pcurrentvertbase;
|
|
extern int r_maxvalidedgeoffset;
|
|
|
|
void R_AliasClipTriangle (mtriangle_t *ptri);
|
|
|
|
extern double r_time1;
|
|
extern int r_frustum_indexes[4*6];
|
|
extern int r_maxsurfsseen, r_maxedgesseen;
|
|
extern qboolean r_dowarpold, r_viewchanged;
|
|
|
|
extern int r_clipflags;
|
|
|
|
extern struct entqueue_s *r_ent_queue;
|
|
struct dlight_s;
|
|
|
|
extern vec3_t lightspot;
|
|
|
|
void R_StoreEfrags (const efrag_t *ppefrag);
|
|
void R_TimeRefresh_f (void);
|
|
void R_PrintAliasStats (void);
|
|
void R_PrintTimes (void);
|
|
void R_AnimateLight (void);
|
|
int R_LightPoint (mod_brush_t *brush, vec4f_t p);
|
|
void R_SetupFrame (void);
|
|
void R_cshift_f (void);
|
|
void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1);
|
|
void R_ClipEdge (mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip);
|
|
void R_RecursiveMarkLights (mod_brush_t *brush, vec4f_t lightorigin,
|
|
struct dlight_s *light, int bit, int node_id);
|
|
|
|
void R_LoadSkys (const char *);
|
|
//void Vulkan_R_LoadSkys (const char *, struct vulkan_ctx_s *ctx);
|
|
|
|
void R_LowFPPrecision (void);
|
|
void R_HighFPPrecision (void);
|
|
void R_SetFPCW (void);
|
|
|
|
void R_AliasProjectFinalVert (finalvert_t *fv, auxvert_t *av);
|
|
void R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1,
|
|
finalvert_t *out);
|
|
void R_Alias_clip_right (finalvert_t *pfv0, finalvert_t *pfv1,
|
|
finalvert_t *out);
|
|
void R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
|
|
finalvert_t *out);
|
|
void R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1, finalvert_t *out);
|
|
|
|
void R_AliasTransformVector (vec3_t in, vec3_t out);
|
|
void R_AliasTransformFinalVert (finalvert_t *fv, trivertx_t *pverts,
|
|
stvert_t *pstverts);
|
|
void R_AliasTransformAndProjectFinalVerts (finalvert_t *fv, stvert_t *pstverts);
|
|
|
|
void R_GenerateSpans (void);
|
|
|
|
void R_InitVars (void);
|
|
|
|
void R_LoadSky_f (void);
|
|
|
|
extern byte crosshair_data[];
|
|
#define CROSSHAIR_WIDTH 8
|
|
#define CROSSHAIR_HEIGHT 8
|
|
#define CROSSHAIR_TILEX 2
|
|
#define CROSSHAIR_TILEY 2
|
|
#define CROSSHAIR_COUNT (CROSSHAIR_TILEX * CROSSHAIR_TILEY)
|
|
|
|
//NOTE: This is packed 8x8 bitmap data, one byte per scanline, 8 scanlines
|
|
////per character. Also, it is NOT the quake font, but the IBM charset.
|
|
extern byte font8x8_data[];
|
|
|
|
struct qpic_s *Draw_CrosshairPic (void);
|
|
struct qpic_s *Draw_Font8x8Pic (void);
|
|
|
|
struct tex_s *R_DotParticleTexture (void);
|
|
struct tex_s *R_SparkParticleTexture (void);
|
|
struct tex_s *R_SmokeParticleTexture (void);
|
|
|
|
#endif // _R_LOCAL_H
|