Files
illusion-arena-engine/code/client/fx_local.h
leilei- 43d6a97c43 - Fixed crash for fragment shader effects being loaded for unsupported hardware
- unfinished texture dumping mode, r_texdump would save jpegs of any texture that loads....upside down. The purpose of this is to make compact content builds with only the used textures (without bloat)
- the eager beginning of a water refraction/reflection buffer
- some map texture listing fixes
- very unfinished revolution environment maps
- very unfinished 'crazy' lighting changes
- some pointless whitepsaces added for no reason other than to open file, add something, remove it later, and leave it changed
2014-06-14 07:30:15 -04:00

477 lines
9.3 KiB
C

/*
===========================================================================
Copyright (C) 2006 Sjoerd van der Berg ( harekiet @ gmail.com )
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
===========================================================================
*/
// fx_local.h -- private fx definitions
#define FX_HASH_SHIFT 8
#define FX_HASH_SIZE ( 1 << FX_HASH_SHIFT )
#define FX_HASH_MASK (FX_HASH_SIZE - 1)
#define FX_ACTIVE_HASH_SHIFT 5
#define FX_ACTIVE_HASH_SIZE ( 1 << FX_ACTIVE_HASH_SHIFT )
#define FX_ACTIVE_HASH_MASK (FX_ACTIVE_HASH_SIZE - 1)
#define FX_MAX_SCRIPTS 4096
#define FX_MAX_ENTITIES (16*1024)
#define FX_EMIT_TRACE 0x001
#define FX_EMIT_SINK 0x002
#define FX_EMIT_MOVE 0x004
#define FX_EMIT_PARENT 0x010
#define FX_EMIT_IMPACT 0x020
#define FX_EMIT_MASKSIZE 16 //Probably enough space
#define FX_ENT_STATIONARY 0x001
#define FX_ENT_DEAD 0x002
#define FX_SCRIPT_PARENT 0x001
#define FX_STACK_SIZE 128
#define FX_VECTOR_PARENT 0x10000
#define FX_MASK_PARENT 0x00001
#define FX_MASK_ORIGIN 0x00002
#define FX_MASK_VELOCITY 0x00004
#define FX_MASK_SHADER 0x00008
#define FX_MASK_SIZE 0x00010
#define FX_MASK_ROTATE 0x00020
#define FX_MASK_COLOR 0x00040
#define FX_MASK_DIR 0x00080
#define FX_MASK_MODEL 0x00100
#define FX_MASK_AXIS 0x00200
#define FX_MASK_ANGLES 0x00400
#define FX_MASK_WIDTH 0x00800
#define FX_MASK_T0 0x01000
#define FX_MASK_T1 0x02000
#define FX_MASK_T2 0x04000
#define FX_MASK_T3 0x08000
#define FX_MASK_V0 0x10000
#define FX_MASK_V1 0x20000
#define FX_MASK_V2 0x40000
#define FX_MASK_V3 0x80000
struct fxHashEntry_s;
struct fxEntity_s;
struct fxInitScript_s;
typedef struct fxAtive_s {
struct fxAtive_s *next;
unsigned int key1, key2;
int beenUsed;
} fxActive_t;
//Making any changes to this order you'll also need to modify the mask/unpacking stuff
typedef struct {
vec3_t origin;
vec3_t velocity;
float size, rotate;
color4ub_t color;
qhandle_t shader;
vec3_t dir;
float width;
vec3_t angles;
qhandle_t model;
vec3_t axis[3];
float t0, t1, t2, t3;
vec3_t v0, v1, v2, v3;
const fxParent_t *parent;
float lerp;
float loop;
float life;
struct fxEntity_s *entity;
int shaderTime;
unsigned int key;
int stackUsed;
float stackData[FX_STACK_SIZE];
} fxRun_t;
const void *fxRunMath( fxRun_t *run, const void *data, float *value );
typedef const void *(*fxHandler_t)( fxRun_t *run, const void * );
static ID_INLINE const float *fxFloatSrc( const fxRun_t *run, int offset ) {
if ( offset & FX_VECTOR_PARENT)
return (float *) (((char *)run->parent) + (offset & ~FX_VECTOR_PARENT) );
else
return (float *) (((char *)run) + offset );
}
static ID_INLINE float *fxFloatDst( const fxRun_t *run, int offset ) {
return (float *) (((char *)run) + offset );
}
typedef enum {
fxCmdHalt,
fxCmdSkip,
fxCmdEmitter,
fxCmdKill,
fxCmdRepeat,
fxCmdOnce,
fxCmdIf,
fxCmdInterval,
fxCmdDistance,
fxCmdSprite,
fxCmdBeam,
fxCmdLight,
fxCmdDirModel,
fxCmdAnglesModel,
fxCmdAxisModel,
fxCmdQuad,
fxCmdRings,
fxCmdSpark,
fxCmdDecal,
fxCmdTrace,
fxCmdScript,
fxCmdColor,
fxCmdColorList,
fxCmdColorBlend,
fxCmdColorHue,
fxCmdColorScale,
fxCmdColorMath,
fxCmdColorFade,
fxCmdAlphaFade,
fxCmdShader,
fxCmdShaderList,
fxCmdModel,
fxCmdModelList,
fxCmdSound,
fxCmdSoundList,
fxCmdLoopSound,
fxCmdVibrate,
fxCmdPush,
fxCmdPop,
fxCmdPushParent,
fxCmdScale,
fxCmdCopy,
fxCmdAdd,
fxCmdAddScale,
fxCmdSub,
fxCmdSubScale,
fxCmdRotateAround,
fxCmdInverse,
fxCmdNormalize,
fxCmdPerpendicular,
fxCmdRandom,
fxCmdClear,
fxCmdWobble,
fxCmdMakeAngles,
fxCmdValue,
} fxCommand_t;
typedef struct {
int blockSize;
void *blockData;
} fxRunBlock_t;
typedef struct fxScript_s {
fxHandle_t handle;
struct fxHashEntry_s *entry;
struct fxScript_s *remap;
unsigned int readMask;
void *data[0];
} fxScript_t;
typedef struct {
int renderfx;
} fxRunRender_t;
typedef struct {
color4ub_t value;
} fxRunColor_t;
typedef struct {
unsigned int count;
} fxRunColorBlend_t;
typedef struct {
unsigned int count;
} fxRunColorList_t;
typedef struct {
float delay, scale;
} fxRunColorFade_t;
typedef struct {
unsigned int index;
} fxRunColorMath_t;
typedef struct {
color4ub_t value;
} fxRunAlpha_t;
typedef struct {
int size;
} fxRunAlphaScale_t;
typedef struct {
float delay, scale;
} fxRunAlphaFade_t;
typedef struct {
int size;
} fxRunRed_t;
typedef struct {
int size;
} fxRunGreen_t;
typedef struct {
int size;
} fxRunBlue_t;
typedef struct {
unsigned short flags;
unsigned short size;
unsigned short emitRun;
unsigned short impactRun;
unsigned short deathRun;
unsigned short allocSize;
byte mask[FX_EMIT_MASKSIZE];
float impactSpeed;
float bounceFactor;
float sinkDelay, sinkDepth;
float gravity;
} fxRunEmitter_t;
typedef struct {
int src;
int dst;
} fxRunScale_t;
typedef struct {
int src;
int dst;
} fxRunWobble_t;
typedef struct {
int src;
int dst;
} fxRunCopy_t;
typedef struct {
int src;
int dst;
} fxRunMakeAngles_t;
typedef struct {
int dst;
} fxRunClear_t;
typedef struct {
int src;
int dst;
} fxRunInverse_t;
typedef struct {
int src;
int dst;
} fxRunNormalize_t;
typedef struct {
int src1;
int src2;
int dst;
} fxRunAdd_t;
typedef struct {
int src1;
int src2;
int dst;
} fxRunSub_t;
typedef struct {
int src;
int scale;
int dst;
} fxRunAddScale_t;
typedef struct {
int src;
int scale;
int dst;
} fxRunSubScale_t;
typedef struct {
int src;
int dir;
int dst;
} fxRunRotateAround_t;
typedef struct {
int src;
int dst;
} fxRunPerpendicular_t;
typedef struct {
int dst;
} fxRunRandom_t;
typedef struct {
int dst;
} fxRunValue_t;
typedef struct {
qhandle_t shader;
} fxRunShader_t;
typedef struct {
unsigned int count;
} fxRunShaderList_t;
typedef struct {
qhandle_t model;
} fxRunModel_t;
typedef struct {
unsigned int count;
qhandle_t list[0];
} fxRunModelList_t;
typedef struct {
int flags;
int life;
} fxRunDecal_t;
typedef struct {
void *data;
} fxRunScript_t;
typedef struct {
int count;
int offset;
} fxRunPush_t;
typedef struct {
int count;
int offset;
} fxRunPushParent_t;
typedef struct {
int count;
int offset;
} fxRunPop_t;
typedef struct {
int size;
} fxRunRepeat_t;
typedef struct {
int size;
} fxRunOnce_t;
typedef struct {
int beenUsed;
} fxActiveOnce_t;
typedef struct {
int size;
} fxRunInterval_t;
typedef struct {
int beenUsed;
int nextTime;
} fxActiveInterval_t;
typedef struct {
int size;
} fxRunSkip_t;
typedef struct {
int testCount;
int elseStep;
int size;
} fxRunIf_t;
typedef struct {
int size;
} fxRunDistance_t;
typedef struct {
int beenUsed;
vec3_t lastOrigin;
float distance;
} fxActiveDistance_t;
typedef struct {
float strength;
} fxRunVibrate_t;
typedef struct {
unsigned int count;
sfxHandle_t handle[0];
} fxRunSoundList_t;
typedef struct {
sfxHandle_t handle;
} fxRunSound_t;
typedef struct {
sfxHandle_t handle;
} fxRunLoopSound_t;
typedef struct fxEntity_s {
struct fxEntity_s *next;
const fxRunEmitter_t *emitter;
int flags;
int startTime;
float traceTime;
float moveTime, lifeScale;
vec3_t origin, velocity;
} fxEntity_t;
/* Just gonna stick with using next for now */
typedef struct fxHashEntry_s {
const char *name;
const char *text;
fxScript_t *script;
struct fxHashEntry_s *next;
} fxHashEntry_t;
#define FX_VIBRATE_QUEUE 32
typedef struct {
fxScript_t *scripts[FX_MAX_SCRIPTS];
fxHashEntry_t *entryHash[FX_HASH_SIZE];
fxActive_t *activeHash[FX_ACTIVE_HASH_SIZE];
int scriptCount;
int *allocSearch;
int *allocStart;
int allocSize;
int time, oldTime;
float timeFraction;
float deltaTime;
int seed;
fxEntity_t *entityActive;
fxEntity_t *entityNew;
struct {
int entitySize, activeSize;
int entityCount, activeCount;
} last;
struct {
int used, time;
float offset, magnitude;
struct {
vec3_t origin;
float strength;
} queue[FX_VIBRATE_QUEUE];
} vibrate;
struct {
fxHashEntry_t *entries;
} alloc;
} fxMain_t;
void fxInitParser( void );
void fxFreeMemory( void );
extern cvar_t *fx_Debug;
extern cvar_t *fx_Override;