openmohaa/code/tiki/tiki_shared.h

418 lines
11 KiB
C++

/*
===========================================================================
Copyright (C) 2023 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA 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.
OpenMoHAA 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 OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// tiki_shared.h : Skeletor
#pragma once
#ifdef __cplusplus
# include "../skeletor/skeletor_name_lists.h"
#endif
#include "../skeletor/skeletor_model_file_format.h"
// animation flags
#define TAF_RANDOM 0x1 // random
#define TAF_NOREPEAT 0x2 // no loop
#define TAF_DONTREPEAT (TAF_RANDOM | TAF_NOREPEAT) // don't repeat
#define TAF_DEFAULT_ANGLES 0x8 // ?
#define TAF_NOTIMECHECK 0x10 // don't check for timing
#define TAF_DELTADRIVEN 0x20 // animation is based on skeletor animation's delta
#define TAF_AUTOSTEPS 0x400 // footsteps for dogs
#define TAF_AUTOSTEPS_RUNNING 0x800 // footsteps for dogs
#define TAF_AUTOSTEPS_EQUIPMENT 0x1000
// skeletor animation flags
#define TAF_HASDELTA 0x40
#define TAF_HASMORPH 0x80
#define TAF_HASUPPER 0x100
// tiki anim command frames
#define TIKI_FRAME_LAST -5 // exec at last
#define TIKI_FRAME_END -4 // exec at end
#define TIKI_FRAME_ENTRY -3 // exec at entry
#define TIKI_FRAME_EXIT -2 // exec at exit
#define TIKI_FRAME_EVERY -1 // exec each frame
#define TIKI_FRAME_FIRST 0 // exec at first frame
#define TIKI_FRAME_MAXFRAMERATE 60
// skb skeletor
#define TIKI_SKB_HEADER_IDENT (*(int *)"SKL ")
#define TIKI_SKB_HEADER_VER_3 3
#define TIKI_SKB_HEADER_VERSION 4
// skd skeletor
#define TIKI_SKD_HEADER_IDENT (*(int *)"SKMD")
#define TIKI_SKD_HEADER_OLD_VERSION 5
#define TIKI_SKD_HEADER_VERSION 6
// skc skeletor animations
#define TIKI_SKC_HEADER_IDENT (*(int *)"SKAN")
#define TIKI_SKC_HEADER_OLD_VERSION 13
#define TIKI_SKC_HEADER_VERSION 14
// tiki limitations
#define TIKI_MAX_BONES 100
#define TIKI_MAX_VERTEXES 1000
#define TIKI_MAX_TRIANGLES 2000
#define TIKI_MAX_SKELCACHE 1024
#define TIKI_MAX_COMMANDS 128
// tiki surface flags
#define TIKI_SURF_SKIN1 (1 << 0)
#define TIKI_SURF_SKIN2 (1 << 1)
#define TIKI_SURF_SKIN3 (TIKI_SURF_SKIN1 | TIKI_SURF_SKIN2)
#define TIKI_SURF_NODRAW (1 << 2)
#define TIKI_SURF_CROSSFADE (1 << 6)
#define TIKI_SURF_NODAMAGE (1 << 7)
#define TIKI_SURF_NOMIPMAPS (1 << 8)
#define TIKI_SURF_NOPICMIP (1 << 9)
#define MAX_SKELMODELS 12
#define MAX_TIKI_SHADER 4
#define MAX_TIKI_ALIASES 4095
typedef struct AliasList_s AliasList_t;
typedef struct AliasListNode_s AliasListNode_t;
typedef struct tiki_singlecmd_s {
int num_args;
char **args;
} tiki_singlecmd_t;
typedef struct tiki_cmd_s {
int num_cmds;
tiki_singlecmd_t cmds[TIKI_MAX_COMMANDS];
} tiki_cmd_t;
#ifdef __cplusplus
typedef class skelChannelList_s
{
public:
short int m_numChannels;
private:
short int m_numLocalFromGlobal;
short int *m_chanLocalFromGlobal;
public:
short int m_chanGlobalFromLocal[200];
int NumChannels(void) const;
void ZeroChannels(void);
void PackChannels(void);
void InitChannels(void);
void CleanUpChannels();
int GlobalChannel(int localchannel) const;
int LocalChannel(int channel) const;
int GetLocalFromGlobal(int globalChannel) const;
void SetLocalFromGlobal(int channel, int localchannel);
qboolean HasChannel(ChannelNameTable *nameTable, const char *channelName) const;
qboolean HasChannel(int channel) const;
int AddChannel(int newGlobalChannelNum);
const char *ChannelName(ChannelNameTable *nameTable, int localChannelNum) const;
} skelChannelList_c;
#else
typedef struct skelChannelList_s {
short int m_numChannels;
short int m_numLocalFromGlobal;
short int *m_chanLocalFromGlobal;
short int m_chanGlobalFromLocal[200];
} skelChannelList_c;
#endif
typedef struct dtikianim_s {
char *name;
int num_anims;
void *alias_list;
int num_client_initcmds;
struct dtikicmd_s *client_initcmds;
int num_server_initcmds;
struct dtikicmd_s *server_initcmds;
byte *modelData;
size_t modelDataSize;
vec3_t mins;
vec3_t maxs;
short int *m_aliases;
char *headmodels;
char *headskins;
qboolean bIsCharacter;
struct dtikianimdef_s *animdefs[1];
} dtikianim_t;
typedef struct dtiki_s {
char *name;
dtikianim_t *a;
void *skeletor;
int num_surfaces;
struct dtikisurface_s *surfaces;
float load_scale;
float lod_scale;
float lod_bias;
vec3_t light_offset;
vec3_t load_origin;
float radius;
skelChannelList_c m_boneList;
int numMeshes;
short int mesh[1];
#ifdef __cplusplus
int GetBoneNumFromName(const char *name);
const char *GetBoneNameFromNum(int num) const;
#endif
} dtiki_t;
typedef struct {
int ident;
int version;
char name[64];
int numSurfaces;
int numBones;
int ofsBones;
int ofsSurfaces;
int ofsEnd;
int lodIndex[10];
int numBoxes;
int ofsBoxes;
int numMorphTargets;
int ofsMorphTargets;
} skelHeader_t;
typedef struct {
short int parent;
short int boxIndex;
int flags;
char name[64];
} skelBoneName_t;
typedef struct {
int ident;
char name[64];
int numTriangles;
int numVerts;
int staticSurfProcessed;
int ofsTriangles;
int ofsVerts;
int ofsCollapse;
int ofsEnd;
int ofsCollapseIndex;
} skelSurface_t;
typedef short int skelIndex_t;
typedef struct skelSurfaceGame_s {
int ident;
char name[MAX_QPATH];
int numTriangles;
int numVerts;
vec4_t *pStaticXyz;
vec4_t *pStaticNormal;
vec2_t (*pStaticTexCoords)[2];
skelIndex_t *pTriangles;
struct skeletorVertex_s *pVerts;
skelIndex_t *pCollapse;
struct skelSurfaceGame_s *pNext;
skelIndex_t *pCollapseIndex;
#ifdef __cplusplus
skelSurfaceGame_s();
#endif
} skelSurfaceGame_t;
typedef struct skelHeaderGame_s {
int version;
char name[64];
int numSurfaces;
int numBones;
struct boneData_s *pBones;
skelSurfaceGame_t *pSurfaces;
int lodIndex[10];
int numBoxes;
struct skelHitBox_s *pBoxes;
struct lodControl_s *pLOD;
int numMorphTargets;
char *pMorphTargets;
} skelHeaderGame_t;
typedef struct boneData_s {
short int channel;
boneType_t boneType;
short int parent;
short int numChannels;
short int numRefs;
short int channelIndex[2];
short int refIndex[2];
vec3_t offset;
float length;
float weight;
float bendRatio;
float bendMax;
float spinRatio;
} boneData_t;
typedef struct tikiSurface_s {
int ident;
char name[64];
int numFrames;
int numVerts;
int minLod;
int numTriangles;
int ofsTriangles;
int ofsCollapseMap;
int ofsSt;
int ofsXyzNormals;
int ofsEnd;
} tikiSurface_t;
typedef struct dtikisurface_s {
char name[MAX_QPATH];
char shader[MAX_TIKI_SHADER][MAX_QPATH];
int hShader[MAX_TIKI_SHADER];
int numskins;
int flags;
float damage_multiplier;
} dtikisurface_t;
/*typedef struct tikiFrame_s {
vec3_t bounds[ 2 ];
vec3_t scale;
vec3_t offset;
vec3_t delta;
float radius;
float frametime;
} tikiFrame_t;*/
typedef struct tiki_tess_data_s {
int ident;
tikiSurface_t *newsurface;
tikiSurface_t *oldsurface;
} tiki_tess_data_t;
typedef struct skelWeight_s {
int boneIndex;
float boneWeight;
vec3_t offset;
} skelWeight_t;
typedef struct skelVertex_s {
vec3_t normal;
vec2_t texCoords;
int numWeights;
skelWeight_t weights[1];
} skelVertex_t;
typedef struct skeletorVertex_s {
vec3_t normal;
vec2_t texCoords;
int numWeights;
int numMorphs;
} skeletorVertex_t;
typedef struct skeletorVertexGame_s {
vec3_t normal;
vec2_t texCoords;
int numWeights;
int numMorphs;
} skeletorVertexGame_t;
typedef struct staticSurface_s {
int ident;
int ofsStaticData;
skelSurfaceGame_t *surface;
int meshNum;
} staticSurface_t;
typedef struct {
int morphIndex;
vec3_t offset;
} skeletorMorph_t;
typedef struct dtikianimdef_s {
char alias[48];
float weight;
float blendtime;
int flags;
int num_client_cmds;
struct dtikicmd_s *client_cmds;
int num_server_cmds;
struct dtikicmd_s *server_cmds;
} dtikianimdef_t;
typedef struct {
short int shortQuat[4];
short int shortOffset[3];
short int pad;
} skelBone_t;
typedef struct {
vec3_t bounds[2];
float radius;
vec3_t delta;
skelBone_t bones[1];
} skelFrame_t;
typedef struct {
int ident;
int version;
char name[64];
int type;
int numFrames;
int numbones;
float totaltime;
float frametime;
vec3_t totaldelta;
int ofsFrames;
} skelAnimHeader_t;
typedef struct {
float offset[4];
float matrix[3][4];
} skelBoneCache_t;
typedef struct {
float pos;
float val;
} lodCurvePoint_t;
typedef struct {
float base;
float scale;
float cutoff;
} lodCurvePointConstants_t;
typedef struct lodControl_s {
float minMetric;
float maxMetric;
lodCurvePoint_t curve[5];
lodCurvePointConstants_t consts[4];
} lodControl_t;
typedef struct {
char path[96];
skelHeaderGame_t *skel;
size_t size;
int numuses;
} skelcache_t;