Files
Client/Engine/Zalla3D Scene Class/ContainerASE.cpp
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

1255 lines
31 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.cpp: implementation of the CContainerASE class.
//
//////////////////////////////////////////////////////////////////////
//#include "stdafx.h"
#include "ContainerASE.h"
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct ASE_TOKENnID { char *szToken; ASE_TOKEN_TYPE nId; } TokenTable[] =
{
// Braces
"{", ASE_LEFTBRACE,
"}", ASE_RIGHTBRACE,
// Top level category ID's
"*SCENE", ASE_SCENE,
"*GEOMOBJECT", ASE_GEOMETRY,
"*SHAPEOBJECT", ASE_SHAPE,
"*CAMERAOBJECT", ASE_CAMERA,
"*LIGHTOBJECT", ASE_LIGHT,
"*HELPEROBJECT", ASE_HELPER,
"*MATERIAL_LIST", ASE_MATERIAL_LIST,
// Hierarchy
"*GROUP", ASE_GROUP,
"*NODE_TM", ASE_NODE_TM,
"*NODE_NAME", ASE_NODE_NAME,
"*NODE_PARENT", ASE_NODE_PARENT,
// Object (node) properties
"*PROP_MOTIONBLUR", ASE_PROP_MOTIONBLUR,
"*PROP_CASTSHADOW", ASE_PROP_CASTSHADOW,
"*PROP_RECVSHADOW", ASE_PROP_RECVSHADOW,
// Mesh related ID's
"*MESH", ASE_MESH,
"*MESH_NORMALS", ASE_MESH_NORMALS,
"*MESH_NUMVERTEX", ASE_MESH_NUMVERTEX,
"*MESH_NUMFACES", ASE_MESH_NUMFACES,
"*MESH_VERTEX_LIST", ASE_MESH_VERTEX_LIST,
"*MESH_VERTEX", ASE_MESH_VERTEX,
"*MESH_FACE_LIST", ASE_MESH_FACE_LIST,
"*MESH_FACE", ASE_MESH_FACE,
"*MESH_SMOOTHING", ASE_MESH_SMOOTHING,
"*MESH_MTLID", ASE_MESH_MTLID,
"*MESH_NUMTVERTEX", ASE_MESH_NUMTVERTEX,
"*MESH_NUMTVFACES", ASE_MESH_NUMTVFACES,
"*MESH_TVERTLIST", ASE_MESH_TVERTLIST,
"*MESH_TVERT", ASE_MESH_TVERT,
"*MESH_TFACELIST", ASE_MESH_TFACELIST,
"*MESH_TFACE", ASE_MESH_TFACE,
"*MESH_NUMCVERTEX", ASE_MESH_NUMCVERTEX,
"*MESH_NUMCVFACES", ASE_MESH_NUMCVFACES,
"*MESH_CVERTLIST", ASE_MESH_CVERTLIST,
"*MESH_VERTCOL", ASE_MESH_VERTCOL,
"*MESH_CFACELIST", ASE_MESH_CFACELIST,
"*MESH_CFACE", ASE_MESH_CFACE,
"*MESH_MAPPINGCHANNEL", ASE_MESH_MAPPINGCHANNEL,
"*MESH_FACEMAPLIST", ASE_MESH_FACEMAPLIST,
"*MESH_FACEMAP", ASE_MESH_FACEMAP,
"*MESH_FACEMAPVERT", ASE_MESH_FACEVERT,
"*MESH_FACENORMAL", ASE_MESH_FACENORMAL,
"*MESH_VERTEXNORMAL", ASE_MESH_VERTEXNORMAL,
"*MESH_ANIMATION", ASE_MESH_ANIMATION,
// Helper objects
"*HELPER_CLASS", ASE_HELPER_CLASS,
// Controller ID's
"*CONTROL_POINT3_TCB", ASE_CONTROL_POINT3_TCB,
"*CONTROL_POINT3_BEZIER", ASE_CONTROL_POINT3_BEZIER,
"*CONTROL_COLOR_BEZIER", ASE_CONTROL_COLOR_BEZIER,
"*CONTROL_POINT3_SAMPLE", ASE_CONTROL_POINT3_SAMPLE,
"*CONTROL_FLOAT_TCB", ASE_CONTROL_FLOAT_TCB,
"*CONTROL_FLOAT_BEZIER", ASE_CONTROL_FLOAT_BEZIER,
"*CONTROL_FLOAT_LINEAR", ASE_CONTROL_FLOAT_BEZIER,
"*CONTROL_FLOAT_SAMPLE", ASE_CONTROL_FLOAT_SAMPLE,
// "Track" is the identification of a sampled controller
"*CONTROL_POS_TRACK", ASE_POS_TRACK,
"*CONTROL_ROT_TRACK", ASE_ROT_TRACK,
"*CONTROL_SCALE_TRACK", ASE_SCALE_TRACK,
// Sampled keys
"*CONTROL_POS_SAMPLE", ASE_POS_SAMPLE,
"*CONTROL_ROT_SAMPLE", ASE_ROT_SAMPLE,
"*CONTROL_SCALE_SAMPLE", ASE_SCALE_SAMPLE,
// Specific controller keys
"*CONTROL_POS_KEY", ASE_POS_KEY,
"*CONTROL_ROT_KEY", ASE_ROT_KEY,
"*CONTROL_SCALE_KEY", ASE_SCALE_KEY,
"*CONTROL_POINT3_KEY", ASE_POINT3_KEY,
"*CONTROL_FLOAT_KEY", ASE_FLOAT_KEY,
// TCB Keys have Tens, cont, bias, easeIn, easeOut
"*CONTROL_TCB_POINT3_KEY", ASE_TCB_POINT3_KEY,
"*CONTROL_TCB_FLOAT_KEY", ASE_TCB_FLOAT_KEY,
"*CONTROL_TCB_POS_KEY", ASE_TCB_POS_KEY,
"*CONTROL_TCB_ROT_KEY", ASE_TCB_ROT_KEY,
"*CONTROL_TCB_SCALE_KEY", ASE_TCB_SCALE_KEY,
// Bezier keys have inTan, outTan
"*CONTROL_BEZIER_FLOAT_KEY", ASE_BEZIER_FLOAT_KEY,
"*CONTROL_BEZIER_POINT3_KEY", ASE_BEZIER_POINT3_KEY,
"*CONTROL_BEZIER_POS_KEY", ASE_BEZIER_POS_KEY,
"*CONTROL_BEZIER_SCALE_KEY", ASE_BEZIER_SCALE_KEY,
"*CONTROL_POS_LINEAR", ASE_CONTROL_POS_LINEAR,
"*CONTROL_POS_TCB", ASE_CONTROL_POS_TCB,
"*CONTROL_POS_BEZIER", ASE_CONTROL_POS_BEZIER,
"*CONTROL_ROT_LINEAR", ASE_CONTROL_ROT_LINEAR,
"*CONTROL_ROT_TCB", ASE_CONTROL_ROT_TCB,
"*CONTROL_ROT_BEZIER", ASE_CONTROL_ROT_BEZIER,
"*CONTROL_SCALE_LINEAR", ASE_CONTROL_SCALE_LINEAR,
"*CONTROL_SCALE_TCB", ASE_CONTROL_SCALE_TCB,
"*CONTROL_SCALE_BEZIER", ASE_CONTROL_SCALE_BEZIER,
// Material / Texture related ID's
"*WIREFRAME_COLOR", ASE_WIRECOLOR,
"*MATERIAL", ASE_MATERIAL,
"*MATERIAL_COUNT", ASE_MATERIAL_COUNT,
"*MATERIAL_REF", ASE_MATERIAL_REF,
"*NUMSUBMTLS", ASE_NUMSUBMTLS,
"*SUBMATERIAL", ASE_SUBMATERIAL,
"*MATERIAL_NAME", ASE_MATNAME,
"*MATERIAL_CLASS", ASE_MATCLASS,
"*MATERIAL_AMBIENT", ASE_AMBIENT,
"*MATERIAL_DIFFUSE", ASE_DIFFUSE,
"*MATERIAL_SPECULAR", ASE_SPECULAR,
"*MATERIAL_SHINE", ASE_SHINE,
"*MATERIAL_SHINESTRENGTH", ASE_SHINE_STRENGTH,
"*MATERIAL_TRANSPARENCY", ASE_TRANSPARENCY,
"*MATERIAL_WIRESIZE", ASE_WIRESIZE,
"*MATERIAL_SHADING", ASE_SHADING,
"*MATERIAL_SELFILLUM", ASE_SELFILLUM,
"*MATERIAL_TWOSIDED", ASE_TWOSIDED,
"*MATERIAL_WIRE", ASE_WIRE,
"*MATERIAL_FACEMAP", ASE_FACEMAP,
"*MAP_NAME", ASE_TEXNAME,
"*MAP_CLASS", ASE_TEXCLASS,
"*MAP_SUBNO", ASE_TEXSUBNO,
"*MAP_AMOUNT", ASE_TEXAMOUNT,
"*BITMAP", ASE_BITMAP,
"*MAP_TYPE", ASE_MAPTYPE,
"*UVW_U_OFFSET", ASE_U_OFFSET,
"*UVW_V_OFFSET", ASE_V_OFFSET,
"*UVW_U_TILING", ASE_U_TILING,
"*UVW_V_TILING", ASE_V_TILING,
"*UVW_ANGLE", ASE_ANGLE,
// Sub texture types
"*MAP_DIFFUSE", ASE_MAP_DIFFUSE,
"*MAP_OPACITY", ASE_MAP_OPACITY,
"*MAP_BUMP", ASE_MAP_BUMP,
"*MAP_REFLECT", ASE_MAP_REFLECT,
// TM related ID's
"*TM_ROW0", ASE_TM_ROW0,
"*TM_ROW1", ASE_TM_ROW1,
"*TM_ROW2", ASE_TM_ROW2,
"*TM_ROW3", ASE_TM_ROW3,
"*TM_POS", ASE_TM_POS,
"*TM_ROTAXIS", ASE_TM_ROTAXIS,
"*TM_ROTANGLE", ASE_TM_ROTANGLE,
"*TM_SCALE", ASE_TM_SCALE,
"*TM_SCALEAXIS", ASE_TM_SCALEAXIS,
"*TM_SCALEAXISANG", ASE_TM_SCALEAXISANG,
"*TM_ANIMATION", ASE_TM_ANIMATION,
// TM Inheritance flags
"*INHERIT_POS", ASE_INHERIT_POS,
"*INHERIT_ROT", ASE_INHERIT_ROT,
"*INHERIT_SCL", ASE_INHERIT_SCL,
// Scene related ID's
"*SCENE_FILENAME", ASE_FILENAME,
"*SCENE_FIRSTFRAME", ASE_FIRSTFRAME,
"*SCENE_LASTFRAME", ASE_LASTFRAME,
"*SCENE_FRAMESPEED", ASE_FRAMESPEED,
"*SCENE_TICKSPERFRAME", ASE_TICKSPERFRAME,
"*SCENE_ENVMAP", ASE_ENVMAP,
"*SCENE_BACKGROUND_STATIC", ASE_STATICBGCOLOR,
"*SCENE_BACKGROUND_ANIM", ASE_ANIMBGCOLOR,
"*SCENE_AMBIENT_STATIC", ASE_STATICAMBIENT,
"*SCENE_AMBIENT_ANIM", ASE_ANIMAMBIENT,
// Generic ID's that can show up here and there
"*TIMEVALUE", ASE_TIMEVALUE,
"*COMMENT", ASE_COMMENT,
"*3DSMAX_ASCIIEXPORT", ASE_FILEID,
"*BOUNDINGBOX_MIN", ASE_BOUNDINGBOX_MIN,
"*BOUNDINGBOX_MAX", ASE_BOUNDINGBOX_MAX,
// Physique ID's
"*PHYSIQUE", ASE_PHYSIQUE,
"*PHYSIQUE_NUMVERTEXASSIGNMENT",
ASE_PHYSIQUE_NUMVERTEX,
"*PHYSIQUE_VERTEXASSIGNMENT_LIST",
ASE_PHYSIQUE_LIST,
"*PHYSIQUE_VERTEXASSIGNMENT_BLENDED_RIGIDTYPE",
ASE_PHYSIQUE_TYPE_BLENDRIGID,
"*PHYSIQUE_VERTEXASSIGNMENT_NUMNODE",
ASE_PHYSIQUE_NUMNODE,
"*PHYSIQUE_VERTEXASSIGNMENT_NODELIST",
ASE_PHYSIQUE_NODELIST,
"*PHYSIQUE_VERTEXASSIGNMENT_NODE",
ASE_PHYSIQUE_NODE,
"*PHYSIQUE_VERTEXASSIGNMENT_NONBLENDED_RIGIDTYPE",
ASE_PHYSIQUE_TYPE_NONBLENDRIGID,
// User properties
"*SKEL_KEY_ID", ASE_SKEL_KEY_ID,
"*BODY_PART_ID", ASE_BODY_PART_ID,
"*PART_KEY_ID", ASE_PART_KEY_ID,
// Identifies end of item.
NULL, ASE_UNKNOWN
};
// static <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
FILE *CContainerASE::ms_pFile = NULL;
char CContainerASE::ms_szLineBuff[ASE_MAX_LINELENGTH+1] = { 0, };
char CContainerASE::ms_szTmpBuff[ASE_MAX_LINELENGTH+1] = { 0, };
char CContainerASE::ms_szTokenBuff[ASE_MAX_TOKEN_IN_LINE][ASE_MAX_TOKENLENGTH+1] = { 0, };
long CContainerASE::ms_lTokenCount = 0;
ASE_ERR_TYPE CContainerASE::ms_parseState = ASE_ERR_NO_ERROR;
long CContainerASE::ms_lCurDepth = 0;
long CContainerASE::ms_alDepthStack[ASE_MAX_DEPTH] = { 0, };
long CContainerASE::ms_lDepthStackLength = 0;
long CContainerASE::ms_lLineCount = 0;
//ASE_OBJECT *CContainerASE::ms_apObjects[ASE_MAX_OBJECTS] = { 0, };
//ASE_MTRL *CContainerASE::ms_apMaterials[ASE_MAX_MATERIALS] = { 0, };
void *CContainerASE::ms_apTmpKey[ASE_MAX_ANI_LENGTH] = { 0, };
/////////////////////////////////////////////////////////////
// Utility& utility func.
/////////////////////////////////////////////////////////////
// ASE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>̱<EFBFBD> <20><>ƾ<EFBFBD><C6BE> header/trailer <20><><EFBFBD><EFBFBD>
// Header ->
#define ASE_PARSER_HEADER \
ASE_TOKEN_TYPE token; \
PushDepth( ms_lCurDepth ); \
while( !feof( ms_pFile ) ) \
{ \
if( ASE_ERR_NO_ERROR != ReadOneLine() ) break; \
token = Token2Id( ms_szTokenBuff[0] ); \
if( ASE_RIGHTBRACE == token ) \
if( PopDepth() == (ms_lCurDepth+1) ) \
break; \
switch( token ) \
{
// <-
// Trailer ->
#define ASE_PARSER_TRAILER \
case ASE_UNKNOWN: \
default: \
Skip(); \
break; \
} \
}
// <-
// <20>ִ<EFBFBD> <20><>ū <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>
/*#define SAFE_COPY( dest, src ) { \
strncpy( dest, src, ASE_MAX_TOKENLENGTH - 1 ); \
dest[min(ASE_MAX_TOKENLENGTH,strlen(src))-1] = '\0';}*/
inline static void SAFE_COPY( char* dest, const char* src )
{
strncpy( dest, src, ASE_MAX_TOKENLENGTH-1 );
dest[max(1, min(ASE_MAX_TOKENLENGTH, strlen(src)))-1];
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> skip~ -_-;;
void CContainerASE::Skip()
{
if( ASE_LEFTBRACE == Token2Id( GetLastToken() ) )
{
ASE_TOKEN_TYPE token;
PushDepth( ms_lCurDepth );
while( !feof( ms_pFile ) )
{
if( ASE_ERR_NO_ERROR != ReadOneLine() ) break;
token = Token2Id( ms_szTokenBuff[0] );
if( ASE_RIGHTBRACE == token && PeekDepth() == (ms_lCurDepth+1) )
{
PopDepth();
break;
}
}
}
//else
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>....
}
//
// Token2Id()
//
// <09>־<EFBFBD><D6BE><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> Id<49><64>ȣ<EFBFBD><C8A3> <20><>ȯ
//
ASE_TOKEN_TYPE CContainerASE::Token2Id(const char *szToken)
{
int i, j;
for( i = 0; TokenTable[i].szToken; i++ )
{
for( j = 0; TokenTable[i].szToken[j]; j++ )
{
if( TokenTable[i].szToken[j] != szToken[j] )
break;
}
if( TokenTable[i].szToken[j] == '\0' && szToken[j] == '\0' )
// <20>ش<EFBFBD><D8B4>Ǵ<EFBFBD> <20><>ū <20>߰<EFBFBD>
return TokenTable[i].nId;
}
// <20>ش<EFBFBD> <20><>ū <20><><EFBFBD><EFBFBD>.
return ASE_UNKNOWN;
}
//
// RipOutString()
//
// <09><> <20><> <20>о<20><><EFBFBD><EFBFBD><EBBFA1> <20><><EFBFBD><EFBFBD>ǥ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>߷<EFBFBD><DFB7><EFBFBD> <20>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD>
//
char *CContainerASE::RipOutString()
{
int len, i;
// '"'(double quat.) <20>պκ<D5BA><CEBA><EFBFBD> <20>dzʶ<C7B3>
for( i = 0; (ms_szLineBuff[i] != 0) && (ms_szLineBuff[i] != '\"'); i++ );
if( ms_szLineBuff[i] == 0 ) return 0;
// <20><>ĭ <20><> <20>dzʶپ<CAB6><D9BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20>κ<EFBFBD>
i++;
// <20><><EFBFBD>ڿ<EFBFBD> <20>κ<EFBFBD> <20><><EFBFBD><EFBFBD>
for( len = 0; (ms_szLineBuff[i] != 0) && (ms_szLineBuff[i] != '\"') &&
(i < ASE_MAX_LINELENGTH); i++, len++)
ms_szTmpBuff[len] = ms_szLineBuff[i];
// terminating
ms_szTmpBuff[len] = '\0';
//return len;
return ms_szTmpBuff;
}
ASE_ERR_TYPE CContainerASE::ReadOneLine()
{
_ASSERTE( ms_pFile );
fgets( ms_szLineBuff, ASE_MAX_LINELENGTH, ms_pFile );
ms_lLineCount++;
ms_lTokenCount = sscanf( ms_szLineBuff,
"%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s",
ms_szTokenBuff[0], ms_szTokenBuff[1], ms_szTokenBuff[2], ms_szTokenBuff[3],
ms_szTokenBuff[4], ms_szTokenBuff[5], ms_szTokenBuff[6], ms_szTokenBuff[7],
ms_szTokenBuff[8], ms_szTokenBuff[9], ms_szTokenBuff[10], ms_szTokenBuff[11],
ms_szTokenBuff[12], ms_szTokenBuff[13], ms_szTokenBuff[14], ms_szTokenBuff[15],
ms_szTokenBuff[16], ms_szTokenBuff[17], ms_szTokenBuff[18], ms_szTokenBuff[19]);
if( ASE_RIGHTBRACE == Token2Id( ms_szTokenBuff[0] ) )
ms_lCurDepth--;
if( ASE_LEFTBRACE == Token2Id( GetLastToken() ) )
ms_lCurDepth++;
return ASE_ERR_NO_ERROR;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction/Reseting
//////////////////////////////////////////////////////////////////////
CContainerASE::CContainerASE()
{
m_lFirstFrame = 0;
m_lLastFrame = 0;
m_lTicksPerFrame = 1;
}
CContainerASE::~CContainerASE()
{
int i;
if( m_vecpObjects.size() )
{
for( i = 0; i < (int)m_vecpObjects.size(); i++ )
{
SAFE_DELETE( m_vecpObjects[i] );
}
}
if( m_vecpMaterials.size() )
{
for( i = 0; i < (int)m_vecpMaterials.size(); i++ )
{
SAFE_DELETE( m_vecpMaterials[i] );
}
}
}
bool CContainerASE::Reset()
{
// release every allocated space
int i;
if( m_vecpObjects.size() )
{
for( i = 0; i < (int)m_vecpObjects.size(); i++ )
{
SAFE_DELETE( m_vecpObjects[i] );
}
}
m_vecpObjects.clear();
if( m_vecpMaterials.size() )
{
for( i = 0; i < (int)m_vecpMaterials.size(); i++ )
{
SAFE_DELETE( m_vecpMaterials[i] );
}
}
m_vecpMaterials.clear();
// reset values
m_lFirstFrame = 0;
m_lLastFrame = 0;
m_lTicksPerFrame = 1;
return true;
}
///////////////////////////////////////////////
//
///////////////////////////////////////////////
ASE_ERR_TYPE CContainerASE::ReadASE( const char *szFileName )
{
// Reset static members
ms_lCurDepth = 0;
ms_lDepthStackLength = 0;
ms_lTokenCount = 0;
ms_lLineCount = 0;
ms_pFile = fopen( szFileName, "rt" );
if( ms_pFile == NULL )
return ASE_ERR_FILE_NOT_FOUND;
SAFE_COPY( m_szFileName, szFileName );
ASE_PARSER_HEADER
// {
case ASE_SCENE:
ReadScene();
break;
case ASE_GEOMETRY:
ReadObject( true );
break;
case ASE_HELPER:
ReadObject( false );
break;
case ASE_MATERIAL_LIST:
ReadMaterial();
break;
// }
ASE_PARSER_TRAILER
fclose( ms_pFile );
return ASE_ERR_NO_ERROR;
}
void CContainerASE::ReadScene()
{
ASE_PARSER_HEADER
// {
case ASE_FIRSTFRAME:
m_lFirstFrame = atoi( ms_szTokenBuff[1] );
break;
case ASE_LASTFRAME:
m_lLastFrame = atoi( ms_szTokenBuff[1] );
break;
case ASE_TICKSPERFRAME:
m_lTicksPerFrame = atoi( ms_szTokenBuff[1] );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadObject( bool geomflag )
{
ASE_OBJECT* pObj = new ASE_OBJECT;
pObj->bIsGeomObject = geomflag;
m_vecpObjects.push_back( pObj );
ASE_PARSER_HEADER
// {
case ASE_NODE_NAME:
SAFE_COPY( m_vecpObjects.back()->szName, RipOutString() );
break;
case ASE_NODE_PARENT:
SAFE_COPY( m_vecpObjects.back()->szParentName, RipOutString() );
break;
case ASE_NODE_TM:
ReadTM();
break;
case ASE_MESH:
ReadMesh();
break;
case ASE_TM_ANIMATION:
ReadAni();
break;
case ASE_WIRECOLOR:
m_vecpObjects.back()->color.r = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->color.g = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->color.b = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_MATERIAL_REF:
m_vecpObjects.back()->lMat_id = atoi( ms_szTokenBuff[1] );
break;
case ASE_PHYSIQUE:
ReadPhysique();
break;
case ASE_SKEL_KEY_ID:
m_vecpObjects.back()->lSkelKeyId = atoi( ms_szTokenBuff[1] );
break;
case ASE_BODY_PART_ID:
m_vecpObjects.back()->lBodyPartId = atoi( ms_szTokenBuff[1] );
break;
case ASE_PART_KEY_ID:
m_vecpObjects.back()->lPartKeyId = atoi( ms_szTokenBuff[1] );
break;
// }
ASE_PARSER_TRAILER
}
static void ConvAngAxis2Quat( float& x, float& y, float& z, float& w )
{
float n = sqrtf( x*x + y*y + z*z );
if( n < FLOAT_EPSILON ) n = 1.0f;
w = w / 2;
x *= sinf(w)/n;
y *= sinf(w)/n;
z *= sinf(w)/n;
w = cosf(w);
}
void CContainerASE::ReadTM()
{
ZeroMemory( &(m_vecpObjects.back()->TM), sizeof( ASE_MATRIX4 ) );
m_vecpObjects.back()->TM._14 =
m_vecpObjects.back()->TM._24 =
m_vecpObjects.back()->TM._34 = 0.0f;
m_vecpObjects.back()->TM._44 = 1.0f;
ASE_PARSER_HEADER
// {
case ASE_TM_ROW0:
m_vecpObjects.back()->TM._11 = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM._12 = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM._13 = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_TM_ROW1:
m_vecpObjects.back()->TM._21 = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM._22 = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM._23 = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_TM_ROW2:
m_vecpObjects.back()->TM._31 = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM._32 = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM._33 = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_TM_ROW3:
m_vecpObjects.back()->TM._41 = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM._42 = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM._43 = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_TM_POS:
m_vecpObjects.back()->TM_PosKey.tick = 0;
m_vecpObjects.back()->TM_PosKey.x = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM_PosKey.y = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM_PosKey.z = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_TM_ROTAXIS:
m_vecpObjects.back()->TM_RotKey.tick = 0;
m_vecpObjects.back()->TM_RotKey.x = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM_RotKey.y = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM_RotKey.z = (float)atof( ms_szTokenBuff[3] );
break;
case ASE_TM_ROTANGLE:
m_vecpObjects.back()->TM_RotKey.w = (float)atof( ms_szTokenBuff[1] );
// axis&angle to quaternion
ConvAngAxis2Quat( m_vecpObjects.back()->TM_RotKey.x,
m_vecpObjects.back()->TM_RotKey.y,
m_vecpObjects.back()->TM_RotKey.z,
m_vecpObjects.back()->TM_RotKey.w );
break;
case ASE_TM_SCALE:
m_vecpObjects.back()->TM_SclKey.tick = 0;
m_vecpObjects.back()->TM_SclKey.x = (float)atof( ms_szTokenBuff[1] );
m_vecpObjects.back()->TM_SclKey.y = (float)atof( ms_szTokenBuff[2] );
m_vecpObjects.back()->TM_SclKey.z = (float)atof( ms_szTokenBuff[3] );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadMesh()
{
ASE_PARSER_HEADER
// {
case ASE_MESH_NUMVERTEX:
m_vecpObjects.back()->lVertexCount = atoi( ms_szTokenBuff[1] );
m_vecpObjects.back()->pVertices = new ASE_VECTOR3F[m_vecpObjects.back()->lVertexCount];
break;
case ASE_MESH_NUMTVERTEX:
m_vecpObjects.back()->lTVertexCount = atoi( ms_szTokenBuff[1] );
if( m_vecpObjects.back()->lTVertexCount )
m_vecpObjects.back()->pTVertices = new ASE_UVCOORD[m_vecpObjects.back()->lTVertexCount];
break;
case ASE_MESH_NUMCVERTEX:
m_vecpObjects.back()->lCVertexCount = atoi( ms_szTokenBuff[1] );
if( m_vecpObjects.back()->lTVertexCount )
m_vecpObjects.back()->pCVertices = new ASE_COLOR3F[m_vecpObjects.back()->lCVertexCount];
break;
case ASE_MESH_NUMFACES:
m_vecpObjects.back()->lFaceCount = atoi( ms_szTokenBuff[1] );
m_vecpObjects.back()->pFaces = new ASE_FACE[m_vecpObjects.back()->lFaceCount];
break;
case ASE_MESH_VERTEX_LIST:
ReadVertices();
break;
case ASE_MESH_TVERTLIST:
ReadTextureVertices();
break;
case ASE_MESH_CVERTLIST:
ReadColorVertices();
break;
case ASE_MESH_FACE_LIST:
ReadFaces();
break;
case ASE_MESH_TFACELIST:
ReadTextureFaces();
break;
case ASE_MESH_CFACELIST:
ReadColorFaces();
break;
case ASE_MESH_NORMALS:
ReadNormals();
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadVertices()
{
ASE_VECTOR3F *p;
ASE_PARSER_HEADER
// {
case ASE_MESH_VERTEX:
p = &(m_vecpObjects.back()->pVertices[atoi(ms_szTokenBuff[1])]);
p->x = (float)atof( ms_szTokenBuff[2] );
p->y = (float)atof( ms_szTokenBuff[3] );
p->z = (float)atof( ms_szTokenBuff[4] );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadTextureVertices()
{
ASE_UVCOORD *p;
ASE_PARSER_HEADER
// {
case ASE_MESH_TVERT:
p = &(m_vecpObjects.back()->pTVertices[atoi(ms_szTokenBuff[1])]);
p->u = (float)atof( ms_szTokenBuff[2] );
p->v = (float)atof( ms_szTokenBuff[3] );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadColorVertices()
{
ASE_COLOR3F *p;
ASE_PARSER_HEADER
// {
case ASE_MESH_VERTCOL:
p = &(m_vecpObjects.back()->pCVertices[atoi(ms_szTokenBuff[1])]);
p->r = (float)atof( ms_szTokenBuff[2] );
p->g = (float)atof( ms_szTokenBuff[3] );
p->b = (float)atof( ms_szTokenBuff[4] );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadFaces()
{
ASE_FACE *p;
long i;
ASE_PARSER_HEADER
// {
case ASE_MESH_FACE:
p = &(m_vecpObjects.back()->pFaces[atoi(ms_szTokenBuff[1])]);
p->awIndex[0] = atoi(ms_szTokenBuff[3]);
p->awIndex[1] = atoi(ms_szTokenBuff[5]);
p->awIndex[2] = atoi(ms_szTokenBuff[7]);
for( i = 8; i < ms_lTokenCount; i++ )
{
if( ASE_MESH_SMOOTHING == Token2Id( ms_szTokenBuff[i] ) )
if( atoi( ms_szTokenBuff[i+1] ) ) p->wSgroup_id = atoi( ms_szTokenBuff[i+1] );
if( ASE_MESH_MTLID == Token2Id( ms_szTokenBuff[i] ) )
p->wMaterial_id = atoi( ms_szTokenBuff[i+1] );
// if( atoi( ms_szTokenBuff[i+1] ) ) p->material_id = atoi( ms_szTokenBuff[i+1] );
// delete this line because material id could be zero
}
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadTextureFaces()
{
ASE_FACE *p;
ASE_PARSER_HEADER
// {
case ASE_MESH_TFACE:
p = &(m_vecpObjects.back()->pFaces[atoi(ms_szTokenBuff[1])]);
p->awTIndex[0] = atoi(ms_szTokenBuff[2]);
p->awTIndex[1] = atoi(ms_szTokenBuff[3]);
p->awTIndex[2] = atoi(ms_szTokenBuff[4]);
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadColorFaces()
{
ASE_FACE *p;
ASE_PARSER_HEADER
// {
case ASE_MESH_CFACE:
p = &(m_vecpObjects.back()->pFaces[atoi(ms_szTokenBuff[1])]);
p->awCIndex[0] = atoi(ms_szTokenBuff[2]);
p->awCIndex[1] = atoi(ms_szTokenBuff[3]);
p->awCIndex[2] = atoi(ms_szTokenBuff[4]);
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadNormals()
{
ASE_FACE *p;
static long i;
ASE_PARSER_HEADER
// {
case ASE_MESH_FACENORMAL:
p = &(m_vecpObjects.back()->pFaces[atoi(ms_szTokenBuff[1])]);
p->vecFacenormal.x = (float)atof( ms_szTokenBuff[2] );
p->vecFacenormal.y = (float)atof( ms_szTokenBuff[3] );
p->vecFacenormal.z = (float)atof( ms_szTokenBuff[4] );
i = 0;
break;
case ASE_MESH_VERTEXNORMAL:
// p is set when read facenormal info
// because facenormal is followed by 3 vertex normal of face
p->avecIndexnormals[i].x = (float)atof( ms_szTokenBuff[2] );
p->avecIndexnormals[i].y = (float)atof( ms_szTokenBuff[3] );
p->avecIndexnormals[i].z = (float)atof( ms_szTokenBuff[4] );
i++;
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadAni()
{
ASE_PARSER_HEADER
// {
// sampled key data
case ASE_POS_TRACK:
m_vecpObjects.back()->ePosKeyType = ASE_KEY_SAMPLE;
ReadPosKey();
m_vecpObjects.back()->ppPosKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lPosKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppPosKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lPosKeyCount );
break;
case ASE_ROT_TRACK:
m_vecpObjects.back()->eRotKeyType = ASE_KEY_SAMPLE;
ReadRotKey();
m_vecpObjects.back()->ppRotKey =
new ASE_QUATKEY *[m_vecpObjects.back()->lRotKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppRotKey, ms_apTmpKey,
sizeof( ASE_QUATKEY * ) * m_vecpObjects.back()->lRotKeyCount );
break;
case ASE_SCALE_TRACK:
m_vecpObjects.back()->eSclKeyType = ASE_KEY_SAMPLE;
ReadSclKey();
m_vecpObjects.back()->ppSclKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lSclKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppSclKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lSclKeyCount );
break;
// linear key
case ASE_CONTROL_POS_LINEAR:
m_vecpObjects.back()->ePosKeyType = ASE_KEY_LINEAR;
ReadPosKey();
m_vecpObjects.back()->ppPosKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lPosKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppPosKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lPosKeyCount );
break;
case ASE_CONTROL_ROT_LINEAR:
m_vecpObjects.back()->eRotKeyType = ASE_KEY_LINEAR;
ReadRotKey();
m_vecpObjects.back()->ppRotKey =
new ASE_QUATKEY *[m_vecpObjects.back()->lRotKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppRotKey, ms_apTmpKey,
sizeof( ASE_QUATKEY * ) * m_vecpObjects.back()->lRotKeyCount );
break;
case ASE_CONTROL_SCALE_LINEAR:
m_vecpObjects.back()->eSclKeyType = ASE_KEY_LINEAR;
ReadSclKey();
m_vecpObjects.back()->ppSclKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lSclKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppSclKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lSclKeyCount );
break;
// TCB key
case ASE_CONTROL_POS_TCB:
m_vecpObjects.back()->ePosKeyType = ASE_KEY_TCB;
ReadPosKey();
m_vecpObjects.back()->ppPosKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lPosKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppPosKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lPosKeyCount );
//Skip();
break;
case ASE_CONTROL_ROT_TCB:
m_vecpObjects.back()->eRotKeyType = ASE_KEY_TCB;
ReadRotKey();
m_vecpObjects.back()->ppRotKey =
new ASE_QUATKEY *[m_vecpObjects.back()->lRotKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppRotKey, ms_apTmpKey,
sizeof( ASE_QUATKEY * ) * m_vecpObjects.back()->lRotKeyCount );
//Skip();
break;
case ASE_CONTROL_SCALE_TCB:
m_vecpObjects.back()->eSclKeyType = ASE_KEY_TCB;
ReadSclKey();
m_vecpObjects.back()->ppSclKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lSclKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppSclKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lSclKeyCount );
//Skip();
break;
// Bezier key
case ASE_CONTROL_POS_BEZIER:
m_vecpObjects.back()->ePosKeyType = ASE_KEY_BEZIER;
ReadPosKey();
m_vecpObjects.back()->ppPosKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lPosKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppPosKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lPosKeyCount );
//Skip();
break;
case ASE_CONTROL_ROT_BEZIER:
m_vecpObjects.back()->eRotKeyType = ASE_KEY_BEZIER;
ReadRotKey();
m_vecpObjects.back()->ppRotKey =
new ASE_QUATKEY *[m_vecpObjects.back()->lRotKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppRotKey, ms_apTmpKey,
sizeof( ASE_QUATKEY * ) * m_vecpObjects.back()->lRotKeyCount );
//Skip();
break;
case ASE_CONTROL_SCALE_BEZIER:
m_vecpObjects.back()->eSclKeyType = ASE_KEY_BEZIER;
ReadSclKey();
m_vecpObjects.back()->ppSclKey =
new ASE_VECTORKEY *[m_vecpObjects.back()->lSclKeyCount];
// copy from static buffer
memcpy( m_vecpObjects.back()->ppSclKey, ms_apTmpKey,
sizeof( ASE_VECTORKEY * ) * m_vecpObjects.back()->lSclKeyCount );
//Skip();
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadPosKey()
{
ASE_VECTORKEY *p;
ASE_PARSER_HEADER
// {
case ASE_POS_SAMPLE:
// falls through
case ASE_BEZIER_POS_KEY:
// falls through
case ASE_TCB_POS_KEY:
// falls through
case ASE_POS_KEY:
p = new ASE_VECTORKEY;
ms_apTmpKey[m_vecpObjects.back()->lPosKeyCount] = p;
p->tick = atoi( ms_szTokenBuff[1] );
p->x = (float)atof( ms_szTokenBuff[2] );
p->y = (float)atof( ms_szTokenBuff[3] );
p->z = (float)atof( ms_szTokenBuff[4] );
m_vecpObjects.back()->lPosKeyCount++;
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadRotKey()
{
ASE_QUATKEY *p;
ASE_PARSER_HEADER
// {
case ASE_ROT_SAMPLE:
// falls through
case ASE_TCB_ROT_KEY:
// falls through
case ASE_ROT_KEY:
p = new ASE_QUATKEY;
ms_apTmpKey[m_vecpObjects.back()->lRotKeyCount] = p;
p->tick = atoi( ms_szTokenBuff[1] );
p->x = (float)atof( ms_szTokenBuff[2] );
p->y = (float)atof( ms_szTokenBuff[3] );
p->z = (float)atof( ms_szTokenBuff[4] );
p->w = (float)atof( ms_szTokenBuff[5] );
// axis&angle to quaternion
ConvAngAxis2Quat( p->x, p->y, p->z, p->w );
m_vecpObjects.back()->lRotKeyCount++;
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadSclKey()
{
ASE_VECTORKEY *p;
ASE_PARSER_HEADER
// {
case ASE_SCALE_SAMPLE:
// falls through
case ASE_TCB_SCALE_KEY:
// falls through
case ASE_BEZIER_SCALE_KEY:
// falls through
case ASE_SCALE_KEY:
p = new ASE_VECTORKEY;
ms_apTmpKey[m_vecpObjects.back()->lSclKeyCount] = p;
p->tick = atoi( ms_szTokenBuff[1] );
p->x = (float)atof( ms_szTokenBuff[2] );
p->y = (float)atof( ms_szTokenBuff[3] );
p->z = (float)atof( ms_szTokenBuff[4] );
m_vecpObjects.back()->lSclKeyCount++;
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadPhysique()
{
ASE_PARSER_HEADER
// {
case ASE_PHYSIQUE_NUMVERTEX:
m_vecpObjects.back()->lPhysDataCount = atoi( ms_szTokenBuff[1] );
m_vecpObjects.back()->ppPhysiqueData =
new ASE_PHYS_DATA *[m_vecpObjects.back()->lPhysDataCount];
break;
case ASE_PHYSIQUE_LIST:
ReadPhysList();
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadPhysList()
{
ASE_PHYS_DATA *p;
ASE_PARSER_HEADER
// {
case ASE_PHYSIQUE_TYPE_BLENDRIGID:
p = new ASE_PHYS_DATA;
m_vecpObjects.back()->ppPhysiqueData[atoi(ms_szTokenBuff[1])] = p;
ReadPhysVertex( p );
break;
case ASE_PHYSIQUE_TYPE_NONBLENDRIGID:
p = new ASE_PHYS_DATA;
m_vecpObjects.back()->ppPhysiqueData[atoi(ms_szTokenBuff[1])] = p;
p->nodecount = 1;
p->pNode = new ASE_PHYS_NODE;
p->pNode->weight = 1.0f;
strcpy( p->pNode->name, RipOutString() );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadPhysVertex( ASE_PHYS_DATA *pData )
{
ASE_PARSER_HEADER
// {
case ASE_PHYSIQUE_NUMNODE:
pData->nodecount = atoi( ms_szTokenBuff[1] );
pData->pNode = new ASE_PHYS_NODE[pData->nodecount];
break;
case ASE_PHYSIQUE_NODELIST:
ReadPhysNode( pData->pNode );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadPhysNode( ASE_PHYS_NODE *pNode )
{
ASE_PARSER_HEADER
// {
case ASE_PHYSIQUE_NODE:
pNode[atoi( ms_szTokenBuff[1] )].weight = (float)atof( ms_szTokenBuff[2] );
strcpy( pNode[atoi( ms_szTokenBuff[1] )].name, RipOutString() );
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadMaterial()
{
ASE_PARSER_HEADER
// {
case ASE_MATERIAL:
m_vecpMaterials.push_back(new ASE_MTRL);
m_vecpMaterials.back()->lId = atoi( ms_szTokenBuff[1] );
ReadMaterialItem();
break;
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadMaterialItem()
{
ASE_PARSER_HEADER
// {
case ASE_AMBIENT:
m_vecpMaterials.back()->ambient.r = (float)atof(ms_szTokenBuff[1]);
m_vecpMaterials.back()->ambient.g = (float)atof(ms_szTokenBuff[2]);
m_vecpMaterials.back()->ambient.b = (float)atof(ms_szTokenBuff[3]);
break;
case ASE_DIFFUSE:
m_vecpMaterials.back()->diffuse.r = (float)atof(ms_szTokenBuff[1]);
m_vecpMaterials.back()->diffuse.g = (float)atof(ms_szTokenBuff[2]);
m_vecpMaterials.back()->diffuse.b = (float)atof(ms_szTokenBuff[3]);
break;
case ASE_SPECULAR:
m_vecpMaterials.back()->specular.r = (float)atof(ms_szTokenBuff[1]);
m_vecpMaterials.back()->specular.g = (float)atof(ms_szTokenBuff[2]);
m_vecpMaterials.back()->specular.b = (float)atof(ms_szTokenBuff[3]);
break;
case ASE_TRANSPARENCY:
m_vecpMaterials.back()->fOpacity = 1.0f - (float)atof(ms_szTokenBuff[1]);
break;
case ASE_SELFILLUM:
m_vecpMaterials.back()->fSelfillum = (float)atof(ms_szTokenBuff[1]);
break;
case ASE_MAP_DIFFUSE:
ReadDiffuseMap();
break;
/* for future support -_-;;;
case ASE_MAP_OPACITY:
case ASE_MAP_BUMP:
case ASE_MAP_REFLECT:*/
// }
ASE_PARSER_TRAILER
}
void CContainerASE::ReadDiffuseMap()
{
ASE_PARSER_HEADER
// {
case ASE_BITMAP:
m_vecpMaterials.back()->szTexture =
new char[strlen(RipOutString())+1];
strcpy( m_vecpMaterials.back()->szTexture, ms_szTmpBuff );
break;
// }
ASE_PARSER_TRAILER
}
/*
void Read()
{
ASE_PARSER_HEADER
// {
// }
ASE_PARSER_TRAILER
}
*/