dquakeplus/source/psp/video_hardware_hlmdl.h
2022-02-08 16:49:56 -05:00

356 lines
10 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"
#define MAXSTUDIOTRIANGLES 20000 // TODO: tune this
#define MAXSTUDIOVERTS 2048 // TODO: tune this
#define MAXSTUDIOSEQUENCES 256 // total animation sequences
#define MAXSTUDIOSKINS 100 // total textures
#define MAXSTUDIOSRCBONES 512 // bones allowed at source movement
#define MAXSTUDIOBONES 128 // total bones actually used
#define MAXSTUDIOMODELS 32 // sub-models per model
#define MAXSTUDIOBODYPARTS 32
#define MAXSTUDIOGROUPS 4
#define MAXSTUDIOANIMATIONS 512 // per sequence
#define MAXSTUDIOMESHES 256
#define MAXSTUDIOEVENTS 1024
#define MAXSTUDIOPIVOTS 256
#define MAXSTUDIOCONTROLLERS 8
/*
-----------------------------------------------------------------------------------------------------------------------
main model header
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
int filetypeid; //IDSP
int version; //10
char name[64];
int filesize;
vec3_t unknown3[5];
int flags;
int numbones;
int boneindex;
int numcontrollers;
int controllerindex;
int unknown5[2];
int numseq;
int seqindex;
int numseqgroups; // demand loaded sequences
int seqgroups;
int numtextures;
int textures;
int texturedataindex;
int numskinref; // replaceable textures
int numskinfamilies;
int skins;
int numbodyparts;
int bodypartindex;
int unknown9[8];
} hlmdl_header_t;
typedef struct
{
int id;
int version;
char name[64];
int length;
vec3_t eyeposition; // ideal eye position
vec3_t min; // ideal movement hull size
vec3_t max;
vec3_t bbmin; // clipping bounding box
vec3_t bbmax;
int flags;
int numbones; // bones
int boneindex;
int numbonecontrollers; // bone controllers
int bonecontrollerindex;
int numhitboxes; // complex bounding boxes
int hitboxindex;
int numseq; // animation sequences
int seqindex;
int numseqgroups; // demand loaded sequences
int seqgroupindex;
int numtextures; // raw textures
int textureindex;
int texturedataindex;
int numskinref; // replaceable textures
int numskinfamilies;
int skinindex;
int numbodyparts;
int bodypartindex;
int numattachments; // queryable attachable points
int attachmentindex;
int soundtable;
int soundindex;
int soundgroups;
int soundgroupindex;
int numtransitions; // animation node to animation node transition graph
int transitionindex;
} studiohdr_t;
/*
-----------------------------------------------------------------------------------------------------------------------
skin info
-----------------------------------------------------------------------------------------------------------------------
*/
// lighting options
#define STUDIO_NF_FLATSHADE 0x0001
#define STUDIO_NF_CHROME 0x0002
#define STUDIO_NF_FULLBRIGHT 0x0004
typedef struct
{
char name[64];
int flags;
int w; /* width */
int h; /* height */
int i; /* 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 numnorms; // per mesh normals
int normindex; // normal vec3_t
} 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;
/*
-----------------------------------------------------------------------------------------------------------------------
bone controllers
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
int name;
int type;
float start;
float end;
int unknown1;
int index;
} hlmdl_bonecontroller_t;
/*
-----------------------------------------------------------------------------------------------------------------------
halflife model descriptor
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
char name[64];
int type;
float boundingradius;
int nummesh;
int meshindex;
int numverts;
int vertinfoindex;
int vertindex;
int numnorms;
int norminfoindex;
int normindex;
int numgroups;
int groupindex;
} hlmdl_model_t;
/*
-----------------------------------------------------------------------------------------------------------------------
animation
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
unsigned short offset[6];
} hlmdl_anim_t;
/*
-----------------------------------------------------------------------------------------------------------------------
animation frames
-----------------------------------------------------------------------------------------------------------------------
*/
typedef union
{
struct
{
byte valid;
byte total;
} num;
short value;
} hlmdl_animvalue_t;
/*
-----------------------------------------------------------------------------------------------------------------------
sequence descriptions
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
char name[32];
float timing;
int unknown1[5];
int numframes;
int unknown2[2];
int motiontype;
int motionbone;
vec3_t unknown3;
int unknown4[2];
vec3_t unknown5[2];
int unknown6;
int index;
int unknown7[2];
float unknown[4];
int unknown8;
int seqindex;
int unknown9[4];
} hlmdl_sequencelist_t;
/*
-----------------------------------------------------------------------------------------------------------------------
sequence groups
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
char name[96]; /* should be split label[32] and name[64] */
void * cache;
int data;
} hlmdl_sequencedata_t;
/*
-----------------------------------------------------------------------------------------------------------------------
halflife model internal structure
-----------------------------------------------------------------------------------------------------------------------
*/
typedef struct
{
int sequence;
int frame; /* Current animation sequence and frame */
float frametime; /* Time of last frame drawn */
float controller[4]; /* Position of bone controllers */
float adjust[4];
/* Static pointers */
hlmdl_header_t *header;
hlmdl_tex_t *textures;
hlmdl_bone_t *bones;
hlmdl_bonecontroller_t *bonectls;
} hlmodel_t;
typedef struct //this is stored as the cache. an hlmodel_t is generated when drawing
{
int header;
int textures;
int bones;
int bonectls;
} hlmodelcache_t;
// lighting options
#define STUDIO_NF_FLATSHADE 0x0001
#define STUDIO_NF_CHROME 0x0002
#define STUDIO_NF_FULLBRIGHT 0x0004
// motion flags
#define STUDIO_X 0x0001
#define STUDIO_Y 0x0002
#define STUDIO_Z 0x0004
#define STUDIO_XR 0x0008
#define STUDIO_YR 0x0010
#define STUDIO_ZR 0x0020
#define STUDIO_LX 0x0040
#define STUDIO_LY 0x0080
#define STUDIO_LZ 0x0100
#define STUDIO_AX 0x0200
#define STUDIO_AY 0x0400
#define STUDIO_AZ 0x0800
#define STUDIO_AXR 0x1000
#define STUDIO_AYR 0x2000
#define STUDIO_AZR 0x4000
#define STUDIO_TYPES 0x7FFF
#define STUDIO_RLOOP 0x8000 // controller that wraps shortest distance
// sequence flags
#define STUDIO_LOOPING 0x0001
// bone flags
#define STUDIO_HAS_NORMALS 0x0001
#define STUDIO_HAS_VERTICES 0x0002
#define STUDIO_HAS_BBOX 0x0004
#define STUDIO_HAS_CHROME 0x0008 // if any of the textures have chrome on them
#define RAD_TO_STUDIO (32768.0/M_PI)
#define STUDIO_TO_RAD (M_PI/32768.0)
/* 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);
/* HL drawing */
qboolean Mod_LoadHLModel (model_t *mod, void *buffer);
int HL_CurSequence(hlmodel_t model);
int HL_NewSequence(hlmodel_t * model, int _inew);
void HL_SetController(hlmodel_t *model, int num, float value);
void R_DrawHLModel(entity_t *curent);