fakk2-sdk/source/utils/max2skl/max2skl.h
2000-09-17 00:00:00 +00:00

214 lines
6.3 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /fakk2_code/Utils/max2skl/max2skl.h $
// $Revision:: 14 $
// $Date:: 4/25/00 12:15p $
//
// Copyright (C) 1999 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /fakk2_code/Utils/max2skl/max2skl.h $
//
// 14 4/25/00 12:15p Jimdose
// merged changes
//
// 3 4/17/00 2:55p Jimdose
// added ConvertToQuake3Worldspace
// added FixMirroredBones
//
// 13 3/16/00 6:10p Jimdose
// added MAX_LOADBLENDBONES for when the model starts with more than
// MAX_BLENDBONES per vertex
//
// 12 1/19/00 5:18p Jimdose
// added AddBone
//
// 11 10/20/99 2:50p Jimdose
// added CopyBones
//
// 10 10/14/99 6:37p Jimdose
// added SaveMD4
//
// 9 10/12/99 3:35p Markd
// fixed max2skl for the new qfiles.h
//
// 8 10/11/99 5:49p Jimdose
// added ScaleModel, ReverseAnimation, ReduceBonesPerVertex, and
// RemoveUnusedBones
//
// 7 10/08/99 7:19p Jimdose
// got tags and deltas working
//
// 6 10/06/99 12:46p Jimdose
// added ComputeVertexNormals
//
// 5 10/04/99 7:05p Jimdose
// moved lod to surfaces
// added radius to frames
//
// 4 9/27/99 5:01p Jimdose
// fixed some errors in saving animations
//
// 3 9/27/99 12:35p Jimdose
// changed TIKI_ANIM_IDENT to TIKI_SKEL_ANIM_IDENT
//
// 2 9/24/99 4:39p Jimdose
// first working version
//
// DESCRIPTION:
//
#ifndef __MAX2SKL_H__
#define __MAX2SKL_H__
#include "cmdlib.h"
#include "script.h"
#include "mathlib.h"
#include "qfiles.h"
#include "str.h"
#include "container.h"
#include "uvector3.h"
#include "umatrix.h"
#define UV_FILE_VERSION 2
#define MAX_BONES 256
#define MAX_BLENDBONES 8
#define MAX_LOADBLENDBONES 16
#define MAX_SURFACE_TRIS (SHADER_MAX_INDEXES / 3)
#define MAX_SURFACE_VERTS SHADER_MAX_VERTEXES
#define UNUSED_BONE -1
// output file version number
#define SKL_VERSION 1
typedef struct
{
float offset[ 3 ];
float matrix[ 3 ][ 3 ];
} loadbone_t;
typedef struct
{
int bone;
float offset[ 3 ];
float weight;
} blendvert_t;
typedef struct
{
int numbones;
blendvert_t blend[ MAX_LOADBLENDBONES ];
float normal[ 3 ];
int index;
vec2_t texCoords;
} loadvertx_t;
typedef struct
{
int vertindex;
vec2_t texCoords;
} loadfacevertx_t;
typedef struct
{
int id;
loadfacevertx_t verts[ 3 ];
} loadtriangle_t;
typedef struct
{
loadbone_t *bones;
vec3_t bounds[ 2 ];
float radius; // dist from localOrigin to corner
vec3_t delta;
vec3_t origin;
} loadframe_t;
typedef struct
{
int id;
char name[ MAX_QPATH ];
int numtris;
int numverts;
int minLod;
int collapseMap[ TIKI_MAX_VERTS ];
int tris[ TIKI_MAX_TRIANGLES ][ 3 ];
loadvertx_t verts[ TIKI_MAX_VERTS ];
} surface_t;
typedef struct
{
char name[ MAX_QPATH ];
float framerate;
int numverts;
int numfaces;
int numbones;
int numframes;
int numsurfaces;
vec3_t totaldelta;
loadvertx_t *verts;
loadtriangle_t *faces;
loadframe_t *anim;
skelBoneName_t *bones;
surface_t *surfaces;
} loadmodel_t;
class SkelModel
{
private :
void LoadSurfaces( Script &script );
void LoadBones( Script &script );
void LoadVerts( Script &script );
void LoadFaces( Script &script );
void LoadFrames( Script &script );
Container<str> ignorelist;
loadmodel_t model;
public :
SkelModel();
~SkelModel();
void FreeModel( void );
void SaveBaseFrame( const char *name );
void SaveAnimation( const char *name );
void SaveMD4( const char *name );
void LoadIgnoreFile( const char *filename );
bool IgnoreSurface( const char *name );
void LoadSKL( const char *filename );
void LoadUVFile( const char *filename );
void CopyBaseModel( SkelModel &base );
void CopyBones( SkelModel &base );
void CreateSurfaces( void );
void ComputeVertexNormals( void );
void CalculateLOD( void );
void CalcFrameBones( int framenum, UMat3 bones[ MAX_BONES ], UVector3 offsets[ MAX_BONES ] );
void CalcVerts( vec3_t *outverts, UMat3 bones[ MAX_BONES ], UVector3 offsets[ MAX_BONES ] );
void CalcFrame( int framenum, vec3_t *outverts );
void CalcStaticFrame( vec3_t *outverts );
void CalculateTriStrips( void );
void CalculateBounds( void );
void ComputeTagFromTri( loadbone_t *bone, const float pTri[ 3 ][ 3 ] );
void CalculateTags( void );
void ScaleModel( float scale );
void ConvertToQuake3Worldspace( void );
void ReverseAnimation( void );
void ReduceBonesPerVertex( int maxbones, float minweight );
int AddBone( int parent, const char *name );
void RemoveUnusedBones( void );
void FixMirroredBones( void );
};
#endif /* !__MAX2SKL_H__ */