2016-07-12 00:40:13 +00:00
# ifdef __cplusplus
extern " C " {
# endif
# include "hash.h"
# include "shader.h"
# ifdef SKELETALMODELS
# include <stdlib.h>
# endif
2016-12-07 18:45:25 +00:00
# ifdef HALFLIFEMODELS
# include "model_hl.h"
# endif
2016-07-12 00:40:13 +00:00
2017-02-19 00:15:42 +00:00
# ifdef NONSKELETALMODELS
2016-07-12 00:40:13 +00:00
//a single pose within an animation (note: always refered to via a framegroup, even if there's only one frame in that group).
typedef struct
{
vecV_t * ofsverts ;
# ifndef SERVERONLY
vec3_t * ofsnormals ;
vec3_t * ofstvector ;
vec3_t * ofssvector ;
vboarray_t vboverts ;
vboarray_t vbonormals ;
vboarray_t vbosvector ;
vboarray_t vbotvector ;
# endif
vec3_t scale ;
vec3_t scale_origin ;
} galiaspose_t ;
2017-02-19 00:15:42 +00:00
# endif
2016-07-12 00:40:13 +00:00
2017-01-13 00:39:50 +00:00
typedef struct galiasevent_s
{
struct galiasevent_s * next ;
float timestamp ;
int code ;
char * data ;
} galiasevent_t ;
2016-07-12 00:40:13 +00:00
//a frame group (aka: animation)
typedef struct
{
# ifdef SKELETALMODELS
skeltype_t skeltype ; //for models with transforms, states that bones need to be transformed from their parent.
//this is actually bad, and can result in bones shortening as they interpolate.
float * boneofs ; //numposes*12*numbones
# endif
qboolean loop ;
int numposes ;
float rate ;
2017-02-19 00:15:42 +00:00
# ifdef NONSKELETALMODELS
2016-07-12 00:40:13 +00:00
galiaspose_t * poseofs ;
2017-02-19 00:15:42 +00:00
# endif
2017-01-13 00:39:50 +00:00
galiasevent_t * events ;
2016-07-12 00:40:13 +00:00
char name [ 64 ] ;
} galiasanimation_t ;
typedef struct galiasbone_s galiasbone_t ;
# ifdef SKELETALMODELS
struct galiasbone_s
{
char name [ 32 ] ;
int parent ;
float inverse [ 12 ] ;
} ;
2016-12-13 11:50:15 +00:00
typedef struct
2016-07-12 00:40:13 +00:00
{
2016-12-13 11:50:15 +00:00
//should be load-time only
2016-07-12 00:40:13 +00:00
//use of this prevents the use of glsl acceleration. the framerate loss is of the order of 90%
//skeletal poses refer to this.
int vertexindex ;
int boneindex ;
vec4_t org ;
# ifndef SERVERONLY
vec3_t normal ;
# endif
} galisskeletaltransforms_t ;
# endif
//we can't be bothered with animating skins.
//We'll load up to four of them but after that you're on your own
# ifndef SERVERONLY
typedef struct
{
shader_t * shader ;
qbyte * texels ; //this is 8bit for frame 0 only. only valid in q1 models without replacement textures, used for colourising player skins.
const char * defaultshader ;
char shadername [ MAX_QPATH ] ;
texnums_t texnums ;
} skinframe_t ;
typedef struct
{
int skinwidth ;
int skinheight ;
float skinspeed ;
int numframes ;
skinframe_t * frame ;
char name [ MAX_QPATH ] ;
} galiasskin_t ;
typedef struct
{
char name [ MAX_QPATH ] ;
texnums_t texnum ;
unsigned int tcolour ;
unsigned int bcolour ;
unsigned int pclass ;
int skinnum ;
unsigned int subframe ;
bucket_t bucket ;
} galiascolourmapped_t ;
2017-03-04 19:36:06 +00:00
# else
typedef void galiasskin_t ;
2016-07-12 00:40:13 +00:00
# endif
typedef struct
{
char name [ 64 ] ;
vec3_t org ;
float ang [ 3 ] [ 3 ] ;
} md3tag_t ;
typedef struct galiasinfo_s
{
char surfacename [ MAX_QPATH ] ;
unsigned short geomset ;
unsigned short geomid ;
index_t * ofs_indexes ;
int numindexes ;
2017-01-13 00:39:50 +00:00
//for hitmodel
unsigned int contents ; //default CONTENTS_BODY
q2csurface_t csurface ; //flags, and also collision name, if useful...
unsigned int surfaceid ; //the body reported to qc via trace_surface
float mindist ;
float maxdist ;
2016-07-12 00:40:13 +00:00
int * ofs_trineighbours ;
float lerpcutoff ; //hack. should probably be part of the entity structure, but I really don't want new models (and thus code) to have access to this ugly inefficient hack. make your models properly in the first place.
int numskins ;
2017-03-04 19:36:06 +00:00
//#ifndef SERVERONLY
2016-07-12 00:40:13 +00:00
galiasskin_t * ofsskins ;
2017-03-04 19:36:06 +00:00
//#endif
2016-07-12 00:40:13 +00:00
int shares_verts ; //used with models with two shaders using the same vertex. set to the surface number to inherit from (or itself).
int shares_bones ; //use last mesh's bones. set to the surface number to inherit from (or itself).
int numverts ;
2017-03-04 19:36:06 +00:00
//#ifndef SERVERONLY
2016-07-12 00:40:13 +00:00
vec2_t * ofs_st_array ;
vec4_t * ofs_rgbaf ;
byte_vec4_t * ofs_rgbaub ;
2017-03-04 19:36:06 +00:00
//#endif
2016-07-12 00:40:13 +00:00
int numanimations ;
galiasanimation_t * ofsanimations ;
struct galiasinfo_s * nextsurf ;
# ifdef SKELETALMODELS
float * baseframeofs ; /*non-heirachical*/
int numbones ;
galiasbone_t * ofsbones ;
vecV_t * ofs_skel_xyz ;
vec3_t * ofs_skel_norm ;
vec3_t * ofs_skel_svect ;
vec3_t * ofs_skel_tvect ;
byte_vec4_t * ofs_skel_idx ;
vec4_t * ofs_skel_weight ;
vboarray_t vbo_skel_verts ;
vboarray_t vbo_skel_normals ;
vboarray_t vbo_skel_svector ;
vboarray_t vbo_skel_tvector ;
vboarray_t vbo_skel_bonenum ;
vboarray_t vbo_skel_bweight ;
# endif
vboarray_t vboindicies ;
vboarray_t vbotexcoords ;
vboarray_t vborgba ; //yeah, just you try reading THAT as an actual word.
void * vbomem ;
void * ebomem ;
//these exist only in the root mesh.
2016-12-13 11:50:15 +00:00
# ifdef MD3MODELS
2016-07-12 00:40:13 +00:00
int numtagframes ;
int numtags ;
md3tag_t * ofstags ;
2016-12-13 11:50:15 +00:00
# else
FTE_DEPRECATED int numtagframes ;
FTE_DEPRECATED int numtags ;
FTE_DEPRECATED md3tag_t * ofstags ;
# endif
2016-07-12 00:40:13 +00:00
unsigned int warned ; //passed around at load time, so we don't spam warnings
} galiasinfo_t ;
struct terrainfuncs_s ;
typedef struct modplugfuncs_s
{
int version ;
int ( QDECL * RegisterModelFormatText ) ( const char * formatname , char * magictext , qboolean ( QDECL * load ) ( struct model_s * mod , void * buffer , size_t fsize ) ) ;
int ( QDECL * RegisterModelFormatMagic ) ( const char * formatname , unsigned int magic , qboolean ( QDECL * load ) ( struct model_s * mod , void * buffer , size_t fsize ) ) ;
void ( QDECL * UnRegisterModelFormat ) ( int idx ) ;
void ( QDECL * UnRegisterAllModelFormats ) ( void ) ;
void * ( QDECL * ZG_Malloc ) ( zonegroup_t * ctx , int size ) ; //ctx=&mod->memgroup and the data will be freed when the model is freed.
void ( QDECL * ConcatTransforms ) ( float in1 [ 3 ] [ 4 ] , float in2 [ 3 ] [ 4 ] , float out [ 3 ] [ 4 ] ) ;
void ( QDECL * M3x4_Invert ) ( const float * in1 , float * out ) ;
added r_meshpitch cvar that allows for fixing the unfixable mesh pitch bug from vanilla... needs a better name... do note that this will break pretty much any mod, so this is really only for TCs designed to use it. Its likely that I missed places.
nqsv: added support for spectators with nq clients. the angles are a bit rough, but hey. need to do something about frags so nq clients know who's a spectator. use 'cmd observe' to get an nq client to spectate on an fte server (then attack/jump behave the same as in qw clients).
nqsv: rewrote EF_MUZZLEFLASH handling, so svc_muzzleflash is now translated properly to EF_MUZZLEFLASH, and vice versa. No more missing muzzleflashes!
added screenshot_cubemap, so you can actually pre-generate cubemaps with fte (which can be used for reflections or whatever).
misc fixes (server crash, a couple of other less important ones).
external files based on a model's name will now obey r_replacemodels properly, instead of needing to use foo.mdl_0.skin for foo.md3.
identify <playernum> should now use the correct masked ip, instead of abrubtly failing (reported by kt)
vid_toggle console command should now obey vid_width and vid_height when switching to fullscreen, but only if vid_fullscreen is actually set, which should make it seem better behaved (reported by kt).
qcc: cleaned up sym->symboldata[sym->ofs] to be more consistent at all stages.
qcc: typedef float vec4[4]; now works to define a float array with 4 elements (however, it will be passed by-value rather than by-reference).
qcc: cleaned up optional vs __out ordering issues.
qccgui: shift+f3 searches backwards
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5064 fc73d0e0-1445-4013-8a0c-d673dee63da5
2017-02-27 09:34:35 +00:00
void ( QDECL * VectorAngles ) ( float * forward , float * up , float * result , qboolean meshpitch ) ;
2016-07-12 00:40:13 +00:00
void ( QDECL * AngleVectors ) ( const vec3_t angles , vec3_t forward , vec3_t right , vec3_t up ) ;
void ( QDECL * GenMatrixPosQuat4Scale ) ( const vec3_t pos , const vec4_t quat , const vec3_t scale , float result [ 12 ] ) ;
void ( QDECL * StripExtension ) ( const char * in , char * out , int outlen ) ;
void ( QDECL * ForceConvertBoneData ) ( skeltype_t sourcetype , const float * sourcedata , size_t bonecount , galiasbone_t * bones , skeltype_t desttype , float * destbuffer , size_t destbonecount ) ;
struct terrainfuncs_s * ( QDECL * GetTerrainFuncs ) ( void ) ;
void * reserved2 ;
void * unused3 ;
void * unused4 ;
void * unused5 ;
} modplugfuncs_t ;
# define MODPLUGFUNCS_VERSION 2
# ifdef SKELETALMODELS
void Alias_TransformVerticies ( float * bonepose , galisskeletaltransforms_t * weights , int numweights , vecV_t * xyzout , vec3_t * normout ) ;
void QDECL Alias_ForceConvertBoneData ( skeltype_t sourcetype , const float * sourcedata , size_t bonecount , galiasbone_t * bones , skeltype_t desttype , float * destbuffer , size_t destbonecount ) ;
# endif
qboolean Alias_GAliasBuildMesh ( mesh_t * mesh , vbo_t * * vbop , galiasinfo_t * inf , int surfnum , entity_t * e , qboolean allowskel ) ;
void Mod_DestroyMesh ( galiasinfo_t * galias ) ;
void Alias_FlushCache ( void ) ;
void Alias_Shutdown ( void ) ;
void Alias_Register ( void ) ;
shader_t * Mod_ShaderForSkin ( model_t * model , int surfaceidx , int num ) ;
const char * Mod_SkinNameForNum ( model_t * model , int surfaceidx , int num ) ;
const char * Mod_SurfaceNameForNum ( model_t * model , int num ) ;
const char * Mod_FrameNameForNum ( model_t * model , int surfaceidx , int num ) ;
const char * Mod_SkinNameForNum ( model_t * model , int surfaceidx , int num ) ;
qboolean Mod_FrameInfoForNum ( model_t * model , int surfaceidx , int num , char * * name , int * numframes , float * duration , qboolean * loop ) ;
void Mod_DoCRC ( model_t * mod , char * buffer , int buffersize ) ;
2016-12-13 11:50:15 +00:00
void Mod_AccumulateTextureVectors ( vecV_t * const vc , vec2_t * const tc , vec3_t * nv , vec3_t * sv , vec3_t * tv , const index_t * idx , int numidx , qboolean calcnorms ) ;
2016-07-12 00:40:13 +00:00
void Mod_AccumulateMeshTextureVectors ( mesh_t * mesh ) ;
2016-12-13 11:50:15 +00:00
void Mod_NormaliseTextureVectors ( vec3_t * n , vec3_t * s , vec3_t * t , int v , qboolean calcnorms ) ;
2016-12-07 18:45:25 +00:00
void R_Generate_Mesh_ST_Vectors ( mesh_t * mesh ) ;
2016-07-12 00:40:13 +00:00
# ifdef __cplusplus
} ;
2015-02-02 08:01:53 +00:00
# endif