123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /*
- ===========================================================================
- Copyright (C) 1999-2005 Id Software, Inc.
- This file is part of Quake III Arena source code.
- Quake III Arena source code 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.
- Quake III Arena source code 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 Foobar; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- ===========================================================================
- */
- #include "cmdlib.h"
- #include "mathlib.h"
- #include "bspfile.h"
- #include "polylib.h"
- #include "imagelib.h"
- #include "threads.h"
- #include "scriplib.h"
- #include "shaders.h"
- #include "mesh.h"
- typedef enum
- {
- emit_point,
- emit_area,
- emit_spotlight,
- emit_sun
- } emittype_t;
- #define MAX_LIGHT_EDGES 8
- typedef struct light_s
- {
- struct light_s *next;
- emittype_t type;
- struct shaderInfo_s *si;
- vec3_t origin;
- vec3_t normal; // for surfaces, spotlights, and suns
- float dist; // plane location along normal
- qboolean linearLight;
- int photons;
- int style;
- vec3_t color;
- float radiusByDist; // for spotlights
- qboolean twosided; // fog lights both sides
- winding_t *w;
- vec3_t emitColor; // full out-of-gamut value
- } light_t;
- extern float lightscale;
- extern float ambient;
- extern float maxlight;
- extern float direct_scale;
- extern float entity_scale;
- extern qboolean noSurfaces;
- //===============================================================
- // light_trace.c
- // a facet is a subdivided element of a patch aproximation or model
- typedef struct cFacet_s {
- float surface[4];
- int numBoundaries; // either 3 or 4, anything less is degenerate
- float boundaries[4][4]; // positive is outside the bounds
- vec3_t points[4]; // needed for area light subdivision
- float textureMatrix[2][4]; // compute texture coordinates at point of impact for translucency
- } cFacet_t;
- typedef struct {
- vec3_t mins, maxs;
- vec3_t origin;
- float radius;
- qboolean patch;
- int numFacets;
- cFacet_t *facets;
- shaderInfo_t *shader; // for translucency
- } surfaceTest_t;
- typedef struct {
- vec3_t filter; // starts out 1.0, 1.0, 1.0, may be reduced if
- // transparent surfaces are crossed
- vec3_t hit; // the impact point of a completely opaque surface
- float hitFraction; // 0 = at start, 1.0 = at end
- qboolean passSolid;
- } trace_t;
- extern surfaceTest_t *surfaceTest[MAX_MAP_DRAW_SURFS];
- void InitTrace( void );
- // traceWork_t is only a parameter to crutch up poor large local allocations on
- // winNT and macOS. It should be allocated in the worker function, but never
- // looked at.
- typedef struct {
- vec3_t start, end;
- int numOpenLeafs;
- int openLeafNumbers[MAX_MAP_LEAFS];
- trace_t *trace;
- int patchshadows;
- } traceWork_t;
- void TraceLine( const vec3_t start, const vec3_t stop, trace_t *trace,
- qboolean testAll, traceWork_t *tw );
- qboolean PointInSolid( vec3_t start );
- //===============================================================
- //===============================================================
- typedef struct {
- int textureNum;
- int x, y, width, height;
- // for patches
- qboolean patch;
- mesh_t mesh;
- // for faces
- vec3_t origin;
- vec3_t vecs[3];
- } lightmap_t;
|