214 lines
6.3 KiB
C++
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__ */
|