mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-10 22:51:57 +00:00
6e3f69f504
fte particle scripts are disabled (classic works). I'll fix these in the new year. Redid framestate stuff again. Slightly better now, but this is the bulk of the changes here. Reworked the renderqueue to provide batches of items instead of individual items. This cleans up the particle rendering code significantly, and is a step towards multiple concurrent particle systems. fte's scripted particles are broken as I'm trying to find a way to rework them to batch types together, rather than having to restart each batch after each particle when you have two particles in a trail. I'll fix it some time. Reworked some alias model code regarding skeletal models. Added some conceptual skeletal bone control builtins available to csqc. Currently it can query the bone names and save off animation states, but can't animate - its just not complete. Added more info to glsl custom shaders. Updated surface sorting on halflife maps to properly cope with alphaed entities, rather than just texture-based blends (q2-style). git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3095 fc73d0e0-1445-4013-8a0c-d673dee63da5
283 lines
5.9 KiB
C
283 lines
5.9 KiB
C
#ifdef Q3SHADERS
|
|
#define SHADER_PASS_MAX 8
|
|
#define SHADER_MAX_TC_MODS 8
|
|
#define SHADER_DEFORM_MAX 8
|
|
#define SHADER_MAX_ANIMFRAMES 8
|
|
#define SHADER_ANIM_FRAMES_MAX 16
|
|
|
|
#define SHADER_PROGPARMS_MAX 16
|
|
|
|
typedef enum {
|
|
SHADER_BSP,
|
|
SHADER_BSP_VERTEX,
|
|
SHADER_BSP_FLARE,
|
|
SHADER_MD3,
|
|
SHADER_2D
|
|
} shadertype_t;
|
|
|
|
typedef enum {
|
|
SHADER_SORT_NONE,
|
|
SHADER_SORT_SKY,
|
|
SHADER_SORT_PORTAL,
|
|
SHADER_SORT_OPAQUE,
|
|
SHADER_SORT_BANNER,
|
|
SHADER_SORT_UNDERWATER,
|
|
SHADER_SORT_ADDITIVE,
|
|
SHADER_SORT_NEAREST
|
|
} shadersort_t;
|
|
|
|
typedef enum {
|
|
MF_NONE = 1<<0,
|
|
MF_NORMALS = 1<<1,
|
|
MF_TRNORMALS = 1<<2,
|
|
MF_COLORS = 1<<3,
|
|
MF_STCOORDS = 1<<4,
|
|
MF_LMCOORDS = 1<<5,
|
|
MF_NOCULL = 1<<6,
|
|
MF_NONBATCHED = 1<<7
|
|
} meshfeatures_t;
|
|
|
|
//colour manipulation
|
|
typedef struct
|
|
{
|
|
enum {
|
|
SHADER_FUNC_SIN,
|
|
SHADER_FUNC_TRIANGLE,
|
|
SHADER_FUNC_SQUARE,
|
|
SHADER_FUNC_SAWTOOTH,
|
|
SHADER_FUNC_INVERSESAWTOOTH,
|
|
SHADER_FUNC_NOISE,
|
|
SHADER_FUNC_CONSTANT
|
|
} type; // SHADER_FUNC enum
|
|
float args[4]; // offset, amplitude, phase_offset, rate
|
|
} shaderfunc_t;
|
|
|
|
#if _MSC_VER || __BORLANDC__
|
|
typedef unsigned __int64 msortkey_t;
|
|
#else
|
|
typedef unsigned long long msortkey_t;
|
|
#endif
|
|
|
|
typedef struct meshbuffer_s
|
|
{
|
|
msortkey_t sortkey;
|
|
int infokey; // lightmap number or mesh number
|
|
unsigned int dlightbits;
|
|
entity_t *entity;
|
|
struct shader_s *shader;
|
|
mesh_t *mesh;
|
|
struct mfog_s *fog;
|
|
} meshbuffer_t;
|
|
|
|
|
|
//tecture coordinate manipulation
|
|
typedef struct
|
|
{
|
|
enum {
|
|
SHADER_TCMOD_NONE, //bug
|
|
SHADER_TCMOD_SCALE, //some sorta tabled deformation
|
|
SHADER_TCMOD_SCROLL, //boring moving texcoords with time
|
|
SHADER_TCMOD_STRETCH, //constant factor
|
|
SHADER_TCMOD_ROTATE,
|
|
SHADER_TCMOD_MAX,
|
|
SHADER_TCMOD_TRANSFORM,
|
|
SHADER_TCMOD_TURB
|
|
} type;
|
|
float args[6];
|
|
} tcmod_t;
|
|
|
|
//vertex positioning manipulation.
|
|
typedef struct
|
|
{
|
|
enum {
|
|
DEFORMV_NONE, //bug
|
|
DEFORMV_MOVE,
|
|
DEFORMV_WAVE,
|
|
DEFORMV_NORMAL,
|
|
DEFORMV_BULGE,
|
|
DEFORMV_AUTOSPRITE,
|
|
DEFORMV_AUTOSPRITE2,
|
|
DEFORMV_PROJECTION_SHADOW
|
|
} type;
|
|
float args[4];
|
|
shaderfunc_t func;
|
|
} deformv_t;
|
|
|
|
|
|
typedef struct shaderpass_s {
|
|
int numMergedPasses;
|
|
|
|
shaderfunc_t rgbgen_func;
|
|
shaderfunc_t alphagen_func;
|
|
|
|
struct cin_s *cin;
|
|
|
|
|
|
unsigned int blendsrc, blenddst; // glBlendFunc args
|
|
unsigned int blendmode, envmode;
|
|
|
|
unsigned int combinesrc0, combinesrc1, combinemode;
|
|
|
|
unsigned int depthfunc; // glDepthFunc arg
|
|
enum {
|
|
SHADER_ALPHA_GT0,
|
|
SHADER_ALPHA_LT128,
|
|
SHADER_ALPHA_GE128
|
|
} alphafunc;
|
|
|
|
enum {
|
|
TC_GEN_BASE, //basic specified texture coords
|
|
TC_GEN_LIGHTMAP, //use loaded lightmap coords
|
|
TC_GEN_ENVIRONMENT,
|
|
TC_GEN_DOTPRODUCT,
|
|
TC_GEN_VECTOR
|
|
} tcgen;
|
|
enum {
|
|
RGB_GEN_WAVE,
|
|
RGB_GEN_ENTITY,
|
|
RGB_GEN_ONE_MINUS_ENTITY,
|
|
RGB_GEN_VERTEX,
|
|
RGB_GEN_EXACT_VERTEX,
|
|
RGB_GEN_ONE_MINUS_VERTEX,
|
|
RGB_GEN_IDENTITY_LIGHTING,
|
|
RGB_GEN_IDENTITY,
|
|
RGB_GEN_CONST,
|
|
RGB_GEN_UNKNOWN,
|
|
RGB_GEN_LIGHTING_DIFFUSE,
|
|
RGB_GEN_TOPCOLOR,
|
|
RGB_GEN_BOTTOMCOLOR
|
|
} rgbgen;
|
|
enum {
|
|
ALPHA_GEN_ENTITY,
|
|
ALPHA_GEN_WAVE,
|
|
ALPHA_GEN_PORTAL,
|
|
ALPHA_GEN_SPECULAR,
|
|
ALPHA_GEN_IDENTITY,
|
|
ALPHA_GEN_VERTEX,
|
|
ALPHA_GEN_CONST
|
|
} alphagen;
|
|
|
|
int numtcmods;
|
|
tcmod_t tcmods[SHADER_MAX_TC_MODS];
|
|
|
|
void (*flush) (meshbuffer_t *mb, struct shaderpass_s *pass);
|
|
|
|
int anim_numframes;
|
|
int anim_frames[SHADER_MAX_ANIMFRAMES];
|
|
float anim_fps;
|
|
unsigned int texturetype;
|
|
|
|
enum {
|
|
SHADER_PASS_BLEND = 1 << 0,
|
|
SHADER_PASS_ALPHAFUNC = 1 << 1,
|
|
SHADER_PASS_DEPTHWRITE = 1 << 2,
|
|
|
|
SHADER_PASS_VIDEOMAP = 1 << 3,
|
|
SHADER_PASS_DETAIL = 1 << 4,
|
|
SHADER_PASS_LIGHTMAP = 1 << 5,
|
|
SHADER_PASS_DELUXMAP = 1 << 6,
|
|
SHADER_PASS_NOCOLORARRAY = 1<< 7,
|
|
SHADER_PASS_ANIMMAP = 1 << 8
|
|
} flags;
|
|
} shaderpass_t;
|
|
|
|
typedef struct
|
|
{
|
|
mesh_t meshes[5];
|
|
|
|
int farbox_textures[6];
|
|
int nearbox_textures[6];
|
|
} skydome_t;
|
|
|
|
typedef struct {
|
|
enum shaderprogparmtype_e {
|
|
SP_BAD,
|
|
|
|
SP_ENTCOLOURS,
|
|
SP_TOPCOLOURS,
|
|
SP_BOTTOMCOLOURS,
|
|
SP_TIME,
|
|
SP_EYEPOS,
|
|
|
|
//things that are set immediatly
|
|
SP_FIRSTIMMEDIATE, //never set
|
|
SP_CVARI,
|
|
SP_CVARF,
|
|
SP_TEXTURE
|
|
} type;
|
|
unsigned int handle;
|
|
} shaderprogparm_t;
|
|
|
|
typedef struct shader_s {
|
|
int numpasses; //careful... 0 means it's not loaded... and not actually a proper shader.
|
|
struct shader_s *next;
|
|
char name[MAX_QPATH];
|
|
//end of shared fields.
|
|
|
|
byte_vec4_t fog_color;
|
|
float fog_dist;
|
|
|
|
int numdeforms;
|
|
deformv_t deforms[SHADER_DEFORM_MAX];
|
|
|
|
enum {
|
|
SHADER_SKY = 1 << 0,
|
|
SHADER_NOMIPMAPS = 1 << 1,
|
|
SHADER_NOPICMIP = 1 << 2,
|
|
SHADER_CULL_FRONT = 1 << 3,
|
|
SHADER_CULL_BACK = 1 << 4,
|
|
SHADER_DEFORMV_BULGE = 1 << 5,
|
|
SHADER_AUTOSPRITE = 1 << 6,
|
|
SHADER_FLARE = 1 << 7,
|
|
SHADER_POLYGONOFFSET = 1 << 8,
|
|
SHADER_ENTITY_MERGABLE = 1 << 9,
|
|
SHADER_VIDEOMAP = 1 << 10,
|
|
SHADER_DEPTHWRITE = 1 << 11,
|
|
SHADER_AGEN_PORTAL = 1 << 12,
|
|
SHADER_BLEND = 1 << 13, //blend or alphatest (not 100% opaque).
|
|
SHADER_NODRAW = 1 << 14 //parsed only to pee off developers when they forget it on no-pass shaders.
|
|
} flags;
|
|
|
|
unsigned int programhandle;
|
|
int numprogparams;
|
|
shaderprogparm_t progparm[SHADER_PROGPARMS_MAX];
|
|
|
|
shaderpass_t passes[SHADER_PASS_MAX];
|
|
|
|
shadersort_t sort;
|
|
|
|
skydome_t *skydome;
|
|
|
|
meshfeatures_t features;
|
|
|
|
int registration_sequence;
|
|
} shader_t;
|
|
|
|
extern shader_t r_shaders[];
|
|
|
|
|
|
|
|
|
|
void R_RenderMeshGeneric ( meshbuffer_t *mb, shaderpass_t *pass );
|
|
void R_RenderMeshCombined ( meshbuffer_t *mb, shaderpass_t *pass );
|
|
void R_RenderMeshMultitextured ( meshbuffer_t *mb, shaderpass_t *pass );
|
|
void R_RenderMeshProgram ( meshbuffer_t *mb, shaderpass_t *pass );
|
|
|
|
shader_t *R_RegisterPic (char *name);
|
|
shader_t *R_RegisterShader (char *name);
|
|
shader_t *R_RegisterShader_Vertex (char *name);
|
|
shader_t *R_RegisterShader_Flare (char *name);
|
|
shader_t *R_RegisterSkin (char *name);
|
|
shader_t *R_RegisterCustom (char *name, void(*defaultgen)(char *name, shader_t*));
|
|
|
|
cin_t *R_ShaderGetCinematic(char *name);
|
|
|
|
void Shader_DefaultSkinShell(char *shortname, shader_t *s);
|
|
|
|
|
|
void R_BackendInit (void);
|
|
void Shader_Shutdown (void);
|
|
qboolean Shader_Init (void);
|
|
|
|
mfog_t *CM_FogForOrigin(vec3_t org);
|
|
#endif
|