mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-23 04:11:53 +00:00
f38a6264b8
Fix recursive errors from Sys_Error on worker threads. Fix shader parsing on worker thread with hlmdl. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5431 fc73d0e0-1445-4013-8a0c-d673dee63da5
346 lines
9.7 KiB
C
346 lines
9.7 KiB
C
/*
|
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
Half-Life Model Renderer (Experimental) Copyright (C) 2001 James 'Ender' Brown [ender@quakesrc.org] 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 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. fromquake.h -
|
|
|
|
model_hl.h - halflife model structure
|
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
*/
|
|
#define HLPOLYHEADER (('T' << 24) + ('S' << 16) + ('D' << 8) + 'I') /* little-endian "IDST" */
|
|
#define HLMDLHEADER "IDST"
|
|
|
|
/* flags - eukara */
|
|
#define HLMDLFL_FLAT 0x0001
|
|
#define HLMDLFL_CHROME 0x0002
|
|
#define HLMDLFL_FULLBRIGHT 0x0004
|
|
|
|
#define HLSHADER_FULLBRIGHT \
|
|
"{\n" \
|
|
"program defaultskin\n" \
|
|
"{\n" \
|
|
"map $diffuse\n" \
|
|
"}\n" \
|
|
"}\n"
|
|
|
|
#define HLSHADER_CHROME \
|
|
"{\n" \
|
|
"program defaultskin#CHROME\n" \
|
|
"{\n" \
|
|
"map $diffuse\n" \
|
|
"tcgen environment\n" \
|
|
"rgbgen lightingdiffuse\n" \
|
|
"}\n" \
|
|
"}\n"
|
|
|
|
#define HLSHADER_FULLBRIGHTCHROME \
|
|
"{\n" \
|
|
"program defaultskin#CHROME\n" \
|
|
"{\n" \
|
|
"map $diffuse\n" \
|
|
"tcgen environment\n" \
|
|
"}\n" \
|
|
"}\n"
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
main model header
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
int filetypeid; //IDSP
|
|
int version; //10
|
|
char name[64];
|
|
int filesize;
|
|
vec3_t unknown3[5];
|
|
int unknown4; //flags
|
|
int numbones;
|
|
int boneindex;
|
|
int numcontrollers;
|
|
int controllerindex;
|
|
int num_hitboxes;
|
|
int ofs_hitboxes;
|
|
int numseq;
|
|
int seqindex;
|
|
int unknown6; //external sequences
|
|
int seqgroups;
|
|
int numtextures;
|
|
int textures;
|
|
int unknown7; //something to do with external textures
|
|
int skinrefs;
|
|
int skingroups;
|
|
int skins;
|
|
int numbodyparts;
|
|
int bodypartindex;
|
|
int num_attachments;
|
|
int ofs_attachments;
|
|
int unknown9[6]; //sounds, transitions
|
|
} hlmdl_header_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
skin info
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
char name[64];
|
|
int flags; /*flat, chrome, fullbright*/
|
|
int w; /* width */
|
|
int h; /* height */
|
|
int offset; /* index */
|
|
} hlmdl_tex_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
body part index
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
char name[64];
|
|
int nummodels;
|
|
int base;
|
|
int modelindex;
|
|
} hlmdl_bodypart_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
meshes
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
int numtris;
|
|
int index;
|
|
int skinindex;
|
|
int unknown2;
|
|
int unknown3;
|
|
} hlmdl_mesh_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
bones
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
char name[32];
|
|
int parent;
|
|
int unknown1;
|
|
int bonecontroller[6];
|
|
float value[6];
|
|
float scale[6];
|
|
} hlmdl_bone_t;
|
|
|
|
typedef struct
|
|
{
|
|
char name[32]; //I assume
|
|
int unk;
|
|
int bone;
|
|
vec3_t org;
|
|
vec3_t unk2[3];
|
|
} hlmdl_attachment_t;
|
|
|
|
typedef struct
|
|
{
|
|
int bone;
|
|
int body; //value reported to gamecode on impact
|
|
vec3_t mins;
|
|
vec3_t maxs;
|
|
} hlmdl_hitbox_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
bone controllers
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
int name;
|
|
int type;
|
|
float start;
|
|
float end;
|
|
int unknown1;
|
|
int index;
|
|
} hlmdl_bonecontroller_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
halflife submodel descriptor
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
char name[64];
|
|
int unknown1;
|
|
float unknown2;
|
|
int nummesh;
|
|
int meshindex;
|
|
int numverts;
|
|
int vertinfoindex;
|
|
int vertindex;
|
|
int unknown3[2];
|
|
int normindex;
|
|
int unknown4[2];
|
|
} hlmdl_submodel_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
animation
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
unsigned short offset[6];
|
|
} hlmdl_anim_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
animation frames
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef union
|
|
{
|
|
struct {
|
|
qbyte valid;
|
|
qbyte total;
|
|
} num;
|
|
short value;
|
|
} hlmdl_animvalue_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
sequence descriptions
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
char name[32];
|
|
float timing;
|
|
int loop;
|
|
int unknown1[2];
|
|
int num_events;
|
|
int ofs_events;
|
|
int numframes;
|
|
int unknown2[2];
|
|
int motiontype;
|
|
int motionbone;
|
|
vec3_t unknown3;
|
|
int unknown4[2];
|
|
vec3_t bbox[2];
|
|
int hasblendseq;
|
|
int index;
|
|
int unknown7[2];
|
|
float unknown[4];
|
|
int unknown8;
|
|
unsigned int seqindex;
|
|
int unknown9[4];
|
|
} hlmdl_sequencelist_t;
|
|
|
|
typedef struct
|
|
{
|
|
int pose;
|
|
int code;
|
|
int unknown1;
|
|
char data[64];
|
|
} hlmdl_event_t;
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
sequence groups
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
typedef struct
|
|
{
|
|
char name[96]; /* should be split label[32] and name[64] */
|
|
unsigned int cache;
|
|
int data;
|
|
} hlmdl_sequencedata_t;
|
|
|
|
typedef struct
|
|
{
|
|
int magic; //IDSQ
|
|
int version; //10
|
|
char name[64];
|
|
int unk1;
|
|
} hlmdl_sequencefile_t;
|
|
/*
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
halflife model internal structure
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#define MAX_ANIM_GROUPS 16 //submodel files containing anim data.
|
|
typedef struct //this is stored as the cache. an hlmodel_t is generated when drawing
|
|
{
|
|
//updated while rendering...
|
|
float controller[5]; /* Position of bone controllers */
|
|
float adjust[5];
|
|
|
|
hlmdl_header_t *header;
|
|
hlmdl_bone_t *bones;
|
|
hlmdl_bonecontroller_t *bonectls;
|
|
hlmdl_sequencefile_t *animcache[MAX_ANIM_GROUPS];
|
|
zonegroup_t *memgroup;
|
|
struct hlmodelshaders_s
|
|
{
|
|
char name[MAX_QPATH];
|
|
char *defaultshadertext;
|
|
texnums_t defaulttex;
|
|
shader_t *shader;
|
|
int w, h;
|
|
} *shaders;
|
|
short *skinref;
|
|
int numskinrefs;
|
|
int numskingroups;
|
|
|
|
int numgeomsets;
|
|
struct
|
|
{
|
|
int numalternatives;
|
|
struct hlalternative_s
|
|
{
|
|
mesh_t mesh;
|
|
int numsubmeshes;
|
|
struct
|
|
{
|
|
int firstindex;
|
|
int numindexes;
|
|
} *submesh;
|
|
} *alternatives;
|
|
} *geomset;
|
|
} hlmodel_t;
|
|
|
|
/* HL mathlib prototypes: */
|
|
void QuaternionGLAngle(const vec3_t angles, vec4_t quaternion);
|
|
void QuaternionGLMatrix(float x, float y, float z, float w, vec4_t *GLM);
|
|
//void UploadTexture(hlmdl_tex_t *ptexture, qbyte *data, qbyte *pal);
|
|
|
|
qboolean QDECL Mod_LoadHLModel (model_t *mod, void *buffer, size_t fsize);
|
|
|
|
/* physics stuff */
|
|
void *Mod_GetHalfLifeModelData(model_t *mod);
|
|
|
|
//reflectioney things, including bone data
|
|
int HLMDL_BoneForName(model_t *mod, const char *name);
|
|
int HLMDL_FrameForName(model_t *mod, const char *name);
|
|
const char *HLMDL_FrameNameForNum(model_t *model, int surfaceidx, int num);
|
|
qboolean HLMDL_FrameInfoForNum(model_t *model, int surfaceidx, int num, char **name, int *numframes, float *duration, qboolean *loop);
|
|
qboolean HLMDL_GetModelEvent(model_t *model, int animation, int eventidx, float *timestamp, int *eventcode, char **eventdata);
|
|
int HLMDL_GetNumBones(model_t *mod, qboolean tagstoo);
|
|
int HLMDL_GetBoneParent(model_t *mod, int bonenum);
|
|
const char *HLMDL_GetBoneName(model_t *mod, int bonenum);
|
|
int HLMDL_GetBoneData(model_t *model, int firstbone, int lastbone, framestate_t *fstate, float *result);
|
|
int HLMDL_GetAttachment(model_t *model, int tagnum, float *resultmatrix);
|
|
|
|
#ifndef SERVERONLY
|
|
//stuff only useful for clients that need to draw stuff
|
|
void R_DrawHLModel(entity_t *curent);
|
|
void HLMDL_DrawHitBoxes(entity_t *ent);
|
|
#endif
|