Files
Client/Engine/Zalla3D Scene Class/ContainerASE.h
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

679 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ContainerASE.h: interface for the CContainerASE class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_CONTAINERASE_H__9EBF9328_1E27_11D4_891B_0000E8EB4C69__INCLUDED_)
#define AFX_CONTAINERASE_H__9EBF9328_1E27_11D4_891B_0000E8EB4C69__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <crtdbg.h>
#include "misc.h"
#include <vector>
// internal constants of ASE reader class
#define ASE_MAX_LINELENGTH 255 // maximum line length in ASE file
#define ASE_MAX_TOKENLENGTH 60 // maximum token length of the line in the ASE file
// should modify token reading part of ReadOneLine() func. when modify the value in the next line
#define ASE_MAX_TOKEN_IN_LINE 20 // maximum token number in a line of ASE file
#define ASE_MAX_DEPTH 20 // maximum indentation depth
// Obesolete due to using STL
//#define ASE_MAX_OBJECTS 1000 // maxumum object number in ASE file
//#define ASE_MAX_MATERIALS 100 // maxumum material number in ASE file
#define ASE_MAX_ANI_LENGTH 10000 // maximum key number in the ASE file
// ASE reader error type
typedef enum
{
ASE_ERR_NO_ERROR = 0,
ASE_ERR_FILE_NOT_FOUND,
ASE_ERR_EOF,
ASE_ERR_NOT_ENOUGH_MEMORY
} ASE_ERR_TYPE;
// ASE token type IDs
// Imported & modified from MAX R3 ascii exporter plug-in source
typedef enum
{
//
ASE_UNKNOWN = -1,
// Top level category ID's
ASE_SCENE = 0,
ASE_GEOMETRY,
ASE_SHAPE,
ASE_CAMERA,
ASE_LIGHT,
ASE_HELPER,
ASE_MATERIAL_LIST,
// Hierarchy
ASE_GROUP,
ASE_NODE_TM,
ASE_NODE_NAME,
ASE_NODE_PARENT,
// Object (node) properties
ASE_PROP_MOTIONBLUR,
ASE_PROP_CASTSHADOW,
ASE_PROP_RECVSHADOW,
// Mesh related ID's
ASE_MESH,
ASE_MESH_NORMALS,
ASE_MESH_NUMVERTEX,
ASE_MESH_NUMFACES,
ASE_MESH_VERTEX_LIST,
ASE_MESH_VERTEX,
ASE_MESH_FACE_LIST,
ASE_MESH_FACE,
ASE_MESH_SMOOTHING,
ASE_MESH_MTLID,
ASE_MESH_NUMTVERTEX,
ASE_MESH_NUMTVFACES,
ASE_MESH_TVERTLIST,
ASE_MESH_TVERT,
ASE_MESH_TFACELIST,
ASE_MESH_TFACE,
ASE_MESH_NUMCVERTEX,
ASE_MESH_NUMCVFACES,
ASE_MESH_CVERTLIST,
ASE_MESH_VERTCOL,
ASE_MESH_CFACELIST,
ASE_MESH_CFACE,
ASE_MESH_MAPPINGCHANNEL,
ASE_MESH_FACEMAPLIST,
ASE_MESH_FACEMAP,
ASE_MESH_FACEVERT,
ASE_MESH_FACENORMAL,
ASE_MESH_VERTEXNORMAL,
ASE_MESH_ANIMATION,
// Helper objects
ASE_HELPER_CLASS,
// Controller ID's
ASE_CONTROL_POINT3_TCB,
ASE_CONTROL_POINT3_BEZIER,
ASE_CONTROL_COLOR_BEZIER,
ASE_CONTROL_POINT3_SAMPLE,
ASE_CONTROL_FLOAT_TCB,
ASE_CONTROL_FLOAT_BEZIER,
ASE_CONTROL_FLOAT_LINEAR,
ASE_CONTROL_FLOAT_SAMPLE,
// "Track" is the identification of a sampled controller
ASE_POS_TRACK,
ASE_ROT_TRACK,
ASE_SCALE_TRACK,
// Sampled keys
ASE_POS_SAMPLE,
ASE_ROT_SAMPLE,
ASE_SCALE_SAMPLE,
// Specific controller keys
ASE_POS_KEY,
ASE_ROT_KEY,
ASE_SCALE_KEY,
ASE_POINT3_KEY,
ASE_FLOAT_KEY,
// TCB Keys have Tens, cont, bias, easeIn, easeOut
ASE_TCB_POINT3_KEY,
ASE_TCB_FLOAT_KEY,
ASE_TCB_POS_KEY,
ASE_TCB_ROT_KEY,
ASE_TCB_SCALE_KEY,
// Bezier keys have inTan, outTan
ASE_BEZIER_FLOAT_KEY,
ASE_BEZIER_POINT3_KEY,
ASE_BEZIER_POS_KEY,
ASE_BEZIER_SCALE_KEY,
ASE_CONTROL_POS_LINEAR,
ASE_CONTROL_POS_TCB,
ASE_CONTROL_POS_BEZIER,
ASE_CONTROL_ROT_LINEAR,
ASE_CONTROL_ROT_TCB,
ASE_CONTROL_ROT_BEZIER,
ASE_CONTROL_SCALE_LINEAR,
ASE_CONTROL_SCALE_TCB,
ASE_CONTROL_SCALE_BEZIER,
// Material / Texture related ID's
ASE_WIRECOLOR,
ASE_MATERIAL,
ASE_MATERIAL_COUNT,
ASE_MATERIAL_REF,
ASE_NUMSUBMTLS,
ASE_SUBMATERIAL,
ASE_MATNAME,
ASE_MATCLASS,
ASE_AMBIENT,
ASE_DIFFUSE,
ASE_SPECULAR,
ASE_SHINE,
ASE_SHINE_STRENGTH,
ASE_TRANSPARENCY,
ASE_WIRESIZE,
ASE_SHADING,
ASE_SELFILLUM,
ASE_TWOSIDED,
ASE_WIRE,
ASE_FACEMAP,
ASE_TEXNAME,
ASE_TEXCLASS,
ASE_TEXSUBNO,
ASE_TEXAMOUNT,
ASE_BITMAP,
ASE_MAPTYPE,
ASE_U_OFFSET,
ASE_V_OFFSET,
ASE_U_TILING,
ASE_V_TILING,
ASE_ANGLE,
// Sub texture types
ASE_MAP_DIFFUSE,
ASE_MAP_OPACITY,
ASE_MAP_BUMP,
ASE_MAP_REFLECT,
// TM related ID's
ASE_TM_ROW0,
ASE_TM_ROW1,
ASE_TM_ROW2,
ASE_TM_ROW3,
ASE_TM_POS,
ASE_TM_ROTAXIS,
ASE_TM_ROTANGLE,
ASE_TM_SCALE,
ASE_TM_SCALEAXIS,
ASE_TM_SCALEAXISANG,
ASE_TM_ANIMATION,
// TM Inheritance flags
ASE_INHERIT_POS,
ASE_INHERIT_ROT,
ASE_INHERIT_SCL,
// Scene related ID's
ASE_FILENAME,
ASE_FIRSTFRAME,
ASE_LASTFRAME,
ASE_FRAMESPEED,
ASE_TICKSPERFRAME,
ASE_ENVMAP,
ASE_STATICBGCOLOR,
ASE_ANIMBGCOLOR,
ASE_STATICAMBIENT,
ASE_ANIMAMBIENT,
// Generic ID's that can show up here and there
ASE_TIMEVALUE,
ASE_COMMENT,
ASE_FILEID,
ASE_BOUNDINGBOX_MIN,
ASE_BOUNDINGBOX_MAX,
// Physique related ID's
ASE_PHYSIQUE,
ASE_PHYSIQUE_NUMVERTEX,
ASE_PHYSIQUE_LIST,
ASE_PHYSIQUE_TYPE_BLENDRIGID,
ASE_PHYSIQUE_NUMNODE,
ASE_PHYSIQUE_NODELIST,
ASE_PHYSIQUE_NODE,
ASE_PHYSIQUE_TYPE_NONBLENDRIGID,
// User property
ASE_SKEL_KEY_ID,
ASE_BODY_PART_ID,
ASE_PART_KEY_ID,
// Braces
ASE_LEFTBRACE,
ASE_RIGHTBRACE
} ASE_TOKEN_TYPE;
// animation key type
typedef enum
{
ASE_KEY_UNKNOWN,
ASE_KEY_LINEAR,
ASE_KEY_BEZIER,
ASE_KEY_TCB,
ASE_KEY_SAMPLE
} ASE_KEY_TYPE;
struct ASE_MATRIX4
{
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
ASE_MATRIX4() { ZeroMemory( this, sizeof( ASE_MATRIX4 ) ); }
};
struct ASE_VECTOR3F
{
float x, y, z;
void Multiply( ASE_MATRIX4 m )
{
float fx = x, fy = y, fz = z;
x = m._11 * fx + m._21 * fy +
m._31 * fz + m._41;
y = m._12 * fx + m._22 * fy +
m._32 * fz + m._42;
z = m._13 * fx + m._23 * fy +
m._33 * fz + m._43;
}
void Normalize()
{
float n = sqrtf(x*x + y*y + z*z);
if( n > FLOAT_EPSILON )
{
x /= n;
y /= n;
z /= n;
}
}
};
struct ASE_COLOR3F
{
float r, g, b;
// inline con/destructor
ASE_COLOR3F() { r = g = b = 1.0f; }
~ASE_COLOR3F() {}
};
struct ASE_UVCOORD
{
float u, v;
};
struct ASE_QUAT
{
float x, y, z, w;
// inline con/destructor
ASE_QUAT() { x = y = z = 0.0f; w = 1.0f; }
~ASE_QUAT() {}
};
struct ASE_VECTORKEY
{
long tick;
float x, y, z;
};
struct ASE_QUATKEY
{
long tick;
float x, y, z, w;
};
// deleted at 00.7.26
//struct ASE_VERTEX
//{
// ASE_VECTOR3F pos;
// ASE_VECTOR3F normal; ASE<53><45> <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20>Űܰ<C5B0>
// ASE_COLOR3F color;
//};
struct ASE_FACE
{
WORD awIndex[3];
WORD awTIndex[3];
WORD awCIndex[3];
ASE_VECTOR3F avecIndexnormals[3];
ASE_VECTOR3F vecFacenormal;
WORD wSgroup_id; // smoothing group id
WORD wMaterial_id; // actually, this is material id for 'multi-sub' materialed object
ASE_FACE() { wSgroup_id = -1; wMaterial_id = -1; }
~ASE_FACE() {}
};
struct ASE_PHYS_NODE
{
float weight;
char name[ASE_MAX_TOKENLENGTH+1];
};
struct ASE_PHYS_DATA
{
WORD nodecount;
ASE_PHYS_NODE *pNode;
ASE_PHYS_DATA() { nodecount = 0; pNode = NULL; }
// copy constructor
ASE_PHYS_DATA( const ASE_PHYS_DATA &s )
{
nodecount = s.nodecount;
pNode = new ASE_PHYS_NODE[nodecount];
for( int i = 0; i < nodecount; i++ )
pNode[i] = s.pNode[i];
}
~ASE_PHYS_DATA() { SAFE_DELETEA( pNode ); }
ASE_PHYS_DATA& operator=( const ASE_PHYS_DATA &s )
{
nodecount = s.nodecount;
pNode = new ASE_PHYS_NODE[nodecount];
for( int i = 0; i < nodecount; i++ )
pNode[i] = s.pNode[i];
return *this;
}
};
struct ASE_MTRL
{
long lId;
long lParent_id;
ASE_COLOR3F ambient;
ASE_COLOR3F diffuse;
ASE_COLOR3F specular;
float fOpacity;
float fSelfillum;
char *szTexture;
ASE_MTRL() { lId = -1; lParent_id = -1; fOpacity = 1.0f; fSelfillum = 0.0f; szTexture = NULL; }
~ASE_MTRL() { SAFE_DELETE( szTexture ); }
};
struct ASE_OBJECT
{
// identification & hierarchy
char szName[ASE_MAX_TOKENLENGTH+1];
char szParentName[ASE_MAX_TOKENLENGTH+1];
bool bIsGeomObject;
// mesh things (vertex, index, texture coord, .... )
long lVertexCount;
ASE_VECTOR3F *pVertices;
long lTVertexCount;
ASE_UVCOORD *pTVertices;
long lCVertexCount;
ASE_COLOR3F *pCVertices;
long lFaceCount;
ASE_FACE *pFaces;
// Material
ASE_COLOR3F color;
long lMat_id; // material reference id
// TM
ASE_MATRIX4 TM;
ASE_VECTORKEY TM_PosKey;
ASE_QUATKEY TM_RotKey;
ASE_VECTORKEY TM_SclKey;
// Animation key
long lPosKeyCount;
ASE_KEY_TYPE ePosKeyType;
ASE_VECTORKEY **ppPosKey;
long lRotKeyCount;
ASE_KEY_TYPE eRotKeyType;
ASE_QUATKEY **ppRotKey;
long lSclKeyCount;
ASE_KEY_TYPE eSclKeyType;
ASE_VECTORKEY **ppSclKey;
// Physique
long lPhysDataCount; // same as vertex number when it's properly physique'd
ASE_PHYS_DATA **ppPhysiqueData;
long lSkelKeyId;
long lBodyPartId;
long lPartKeyId;
ASE_OBJECT::ASE_OBJECT()
{
szName[0] = '\0';
szParentName[0] = '\0';
bIsGeomObject = false;
lVertexCount = 0;
pVertices = NULL;
lTVertexCount = 0;
pTVertices = NULL;
lCVertexCount = 0;
pCVertices = NULL;
lFaceCount = 0;
pFaces = NULL;
lMat_id = -1;
lPosKeyCount = 0;
ePosKeyType = ASE_KEY_UNKNOWN;
ppPosKey = NULL;
lRotKeyCount = 0;
eRotKeyType = ASE_KEY_UNKNOWN;
ppRotKey = NULL;
lSclKeyCount = 0;
eSclKeyType = ASE_KEY_UNKNOWN;
ppSclKey = NULL;
lPhysDataCount = 0;
ppPhysiqueData = NULL;
lSkelKeyId = -1;
lBodyPartId = -1;
lPartKeyId = -1;
}
ASE_OBJECT::~ASE_OBJECT()
{
long i;
SAFE_DELETEA( pVertices );
SAFE_DELETEA( pFaces );
SAFE_DELETEA( pTVertices );
for( i = 0; i < lPosKeyCount; i++ )
SAFE_DELETE( ppPosKey[i] );
SAFE_DELETEA( ppPosKey );
for( i = 0; i < lRotKeyCount; i++ )
SAFE_DELETE( ppRotKey[i] );
SAFE_DELETEA( ppRotKey );
for( i = 0; i < lSclKeyCount; i++ )
SAFE_DELETE( ppSclKey[i] );
SAFE_DELETEA( ppSclKey );
for( i = 0; i < lPhysDataCount; i++ )
SAFE_DELETE( ppPhysiqueData[i] );
SAFE_DELETEA( ppPhysiqueData );
}
};
class CContainerASE
{
public:
long GetFirstFrame() { return m_lFirstFrame; }
long GetLastFrame() { return m_lLastFrame; }
long GetTicksPerFrame() { return m_lTicksPerFrame; }
long GetObjectCount() { return m_vecpObjects.size(); }
long GetMaterialCount() { return m_vecpMaterials.size(); }
ASE_OBJECT* GetObject( int idx )
{
if( idx < (int)m_vecpObjects.size() )
{
return m_vecpObjects[idx];
}
else
{
return NULL;
}
}
ASE_MTRL* GetMaterial( int idx )
{
if( idx < (int)m_vecpMaterials.size() )
{
return m_vecpMaterials[idx];
}
else
{
return NULL;
}
}
ASE_ERR_TYPE ReadASE( const char *szFileName );
CContainerASE();
virtual ~CContainerASE();
bool Reset();
protected:
char m_szFileName[ASE_MAX_LINELENGTH+1];
long m_lFirstFrame;
long m_lLastFrame;
long m_lTicksPerFrame;
//long m_lObjectCount;
std::vector<ASE_OBJECT*> m_vecpObjects;
//long m_lMaterialCount;
std::vector<ASE_MTRL*> m_vecpMaterials;
long m_lSkelKeyId; // user-prop value, yundi custom
void ReadScene();
void ReadTM();
void ReadObject( bool geomflag ); // for reading Geom & helper object
void ReadMesh();
void ReadVertices();
void ReadTextureVertices();
void ReadColorVertices();
void ReadFaces();
void ReadTextureFaces();
void ReadColorFaces();
void ReadNormals();
void ReadAni();
void ReadPosKey();
void ReadRotKey();
void ReadSclKey();
void ReadPhysique();
void ReadPhysList();
void ReadPhysVertex( ASE_PHYS_DATA *pData );
void ReadPhysNode( ASE_PHYS_NODE *pNode );
void ReadMaterial();
void ReadMaterialItem();
void ReadDiffuseMap();
void ReadUserProp();
static char *RipOutString();
static ASE_TOKEN_TYPE Token2Id( const char *szToken );
static ASE_ERR_TYPE ReadOneLine();
static char * GetLastToken();
static void Skip();
static void PushDepth( long lDepth );
static long PeekDepth();
static long PopDepth();
static FILE *ms_pFile;
static char ms_szLineBuff[ASE_MAX_LINELENGTH+1];
static char ms_szTmpBuff[ASE_MAX_LINELENGTH+1];
static char ms_szTokenBuff[ASE_MAX_TOKEN_IN_LINE][ASE_MAX_TOKENLENGTH+1];
static long ms_lTokenCount; // <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD> <20><>ū <20><><EFBFBD><EFBFBD>
static ASE_ERR_TYPE ms_parseState;
static long ms_lCurDepth;
static long ms_alDepthStack[ASE_MAX_DEPTH];
static long ms_lDepthStackLength;
static long ms_lLineCount;
//static ASE_OBJECT *ms_apObjects[ASE_MAX_OBJECTS];
//static ASE_MTRL *ms_apMaterials[ASE_MAX_MATERIALS];
static void *ms_apTmpKey[ASE_MAX_ANI_LENGTH];
};
inline void CContainerASE::PushDepth(long lDepth)
{
if( ms_lDepthStackLength < ASE_MAX_DEPTH )
{
ms_alDepthStack[ms_lDepthStackLength] = lDepth;
ms_lDepthStackLength++;
}
}
inline long CContainerASE::PeekDepth()
{
if( ms_lDepthStackLength > 0 )
return ms_alDepthStack[ms_lDepthStackLength - 1];
else
return -1;
}
inline long CContainerASE::PopDepth()
{
if( ms_lDepthStackLength > 0 )
{
ms_lDepthStackLength--;
return ( ms_alDepthStack[ms_lDepthStackLength] );
}
else
return -1;
}
inline char * CContainerASE::GetLastToken()
{
return ms_szTokenBuff[ms_lTokenCount - 1];
}
#endif // !defined(AFX_CONTAINERASE_H__9EBF9328_1E27_11D4_891B_0000E8EB4C69__INCLUDED_)