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>
2153 lines
45 KiB
C++
2153 lines
45 KiB
C++
// Z3DGCMDS.cpp: implementation of the CZ3DGCMDS class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "Z3DGCMDS.h"
|
||
|
||
#include <stack>
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
CZ3DGCMDS::CZ3DGCMDS()
|
||
{
|
||
m_fNameTagBias = 0.0f;
|
||
m_bIsAlphaUsed = false;
|
||
|
||
m_fEffectScale = 1.0f;
|
||
m_fDefaultScale = 1.0f;
|
||
m_lSkeletonCount = 0;
|
||
m_lAniHolderCount = 0;
|
||
m_pSkeletonHierarchy = NULL;
|
||
m_pAniHolderIndex = NULL;
|
||
m_pIndexInSubpart = NULL;
|
||
m_pszSkeletonName = NULL;
|
||
m_pLocalizerMatrix = NULL;
|
||
|
||
m_TokDefaultOutfit = NULL_TOK;
|
||
m_TokDefaultMotionSheet = NULL_TOK;
|
||
m_TokDefaultMotion = NULL_TOK;
|
||
|
||
m_szSkelFileName = NULL;
|
||
m_szFileName = NULL;
|
||
|
||
for( int i = 0; i < Z3D_MAX_SHADER_COUNT; ++i )
|
||
{
|
||
m_aszShaderInfoList[i] = NULL;
|
||
}
|
||
|
||
m_bFixed = false;
|
||
}
|
||
|
||
CZ3DGCMDS::~CZ3DGCMDS()
|
||
{
|
||
std::map<Z3DTOK, Z3DMOTIONSHEET*>::iterator itMsheet;
|
||
for( itMsheet = m_mapTok2MotionSheet.begin(); itMsheet != m_mapTok2MotionSheet.end(); itMsheet++ )
|
||
{
|
||
SAFE_DELETE( itMsheet->second );
|
||
}
|
||
|
||
std::map<Z3DTOK, Z3DATTACHMENTINFO*>::iterator itWInfo;
|
||
for( itWInfo = m_mapTok2AttachmentInfo.begin(); itWInfo != m_mapTok2AttachmentInfo.end(); itWInfo++ )
|
||
{
|
||
SAFE_DELETE( itWInfo->second );
|
||
}
|
||
|
||
std::map<Z3DTOK, Z3DOUTFITINFO*>::iterator itOInfo;
|
||
for( itOInfo = m_mapTok2OutfitInfo.begin(); itOInfo != m_mapTok2OutfitInfo.end(); itOInfo++ )
|
||
{
|
||
SAFE_DELETE( itOInfo->second );
|
||
}
|
||
|
||
for( int i = 0; i < Z3D_MAX_SHADER_COUNT; ++i )
|
||
{
|
||
SAFE_DELETEA( m_aszShaderInfoList[i] );
|
||
}
|
||
|
||
for(int i = 0; i < (int)m_vecszEffectInfo.size(); ++i )
|
||
{
|
||
//SAFE_DELETE( m_vecEffectInfo[i] );
|
||
SAFE_DELETEA( m_vecszEffectInfo[i] );
|
||
}
|
||
|
||
if( m_pszSkeletonName )
|
||
{
|
||
for(int i = 0; i < m_lSkeletonCount; ++i )
|
||
{
|
||
SAFE_DELETEA( m_pszSkeletonName[i] );
|
||
}
|
||
SAFE_DELETEA( m_pszSkeletonName );
|
||
}
|
||
|
||
SAFE_DELETEA( m_pSkeletonHierarchy );
|
||
SAFE_DELETEA( m_pAniHolderIndex );
|
||
SAFE_DELETEA( m_pIndexInSubpart );
|
||
SAFE_DELETEA( m_pLocalizerMatrix );
|
||
SAFE_DELETEA( m_szFileName );
|
||
SAFE_DELETEA( m_szSkelFileName );
|
||
}
|
||
|
||
|
||
// Loading <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>
|
||
|
||
bool CZ3DGCMDS::ReadSkelFile( const char* szFilename )
|
||
{
|
||
FILE* fp;
|
||
if( (fp = fopen( szFilename, "rb" )) == NULL )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
long i, j;
|
||
|
||
// read skeleton count & aniholder count;
|
||
fread( &i, sizeof(long), 1, fp );
|
||
fread( &j, sizeof(int), 1, fp );
|
||
|
||
m_lSkeletonCount = i;
|
||
m_lAniHolderCount = j;
|
||
m_pSkeletonHierarchy = new long[i];
|
||
m_pAniHolderIndex = new long[i];
|
||
m_pIndexInSubpart = new long[i];
|
||
m_pLocalizerMatrix = new matrix[i];
|
||
|
||
// read hierarchy info
|
||
for( i = 0; i < m_lSkeletonCount; ++i )
|
||
{
|
||
fread( &(m_pSkeletonHierarchy[i]), sizeof(int), 1, fp );
|
||
}
|
||
|
||
// read localizer matrix data
|
||
for( i = 0; i < m_lSkeletonCount; ++i )
|
||
{
|
||
fread( &(m_pLocalizerMatrix[i]), sizeof(matrix), 1, fp );
|
||
}
|
||
|
||
// read ani holder index & index in subpart
|
||
if( m_lAniHolderCount > 1 )
|
||
{
|
||
for( i = 0; i < m_lSkeletonCount; i++ )
|
||
{
|
||
fread( &(m_pAniHolderIndex[i]), sizeof(int), 1, fp );
|
||
fread( &(m_pIndexInSubpart[i]), sizeof(int), 1, fp );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for( i = 0; i < m_lSkeletonCount; i++ )
|
||
{
|
||
m_pAniHolderIndex[i] = 0;
|
||
m_pIndexInSubpart[i] = i;
|
||
}
|
||
}
|
||
|
||
fclose(fp);
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadSkeyFile( const char* szFilename )
|
||
{
|
||
CSimpleParser parser;
|
||
long i, j;
|
||
|
||
if( false == parser.OpenFile( szFilename ) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( 0 != stricmp( "SKELETON_KEY_DATA", parser.GetNextToken() ) )
|
||
{
|
||
return false; // invalid header
|
||
}
|
||
|
||
// <20>̹<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
if( m_pszSkeletonName )
|
||
{
|
||
for( i = 0; i < m_lSkeletonCount; ++i )
|
||
{
|
||
SAFE_DELETEA( m_pszSkeletonName[i] );
|
||
}
|
||
}
|
||
SAFE_DELETEA( m_pSkeletonHierarchy );
|
||
SAFE_DELETEA( m_pAniHolderIndex );
|
||
SAFE_DELETEA( m_pIndexInSubpart );
|
||
SAFE_DELETEA( m_pszSkeletonName );
|
||
SAFE_DELETEA( m_pLocalizerMatrix );
|
||
|
||
|
||
char* szToken;
|
||
|
||
while( (szToken = parser.GetNextToken()) != NULL )
|
||
{
|
||
if( 0 == stricmp( "skeletoncount", szToken ) )
|
||
{
|
||
szToken = parser.GetNextToken();
|
||
m_lSkeletonCount = aton( szToken );
|
||
}
|
||
else if( 0 == stricmp( "skeleton", szToken ) )
|
||
{
|
||
m_pSkeletonHierarchy = new long[m_lSkeletonCount];
|
||
m_pAniHolderIndex = new long[m_lSkeletonCount];
|
||
m_pIndexInSubpart = new long[m_lSkeletonCount];
|
||
m_pszSkeletonName = new char*[m_lSkeletonCount];
|
||
|
||
szToken = parser.GetNextToken();
|
||
while( 0 != stricmp( szToken, ";" ) )
|
||
{
|
||
i = aton(szToken);
|
||
if( i >= m_lSkeletonCount )
|
||
{
|
||
// skip remainder of 4 tokens
|
||
for( j = 0; j < 4; ++j )
|
||
{
|
||
parser.GetNextToken();
|
||
}
|
||
|
||
szToken = parser.GetNextToken();
|
||
continue;
|
||
}
|
||
|
||
m_pSkeletonHierarchy[i] = aton( parser.GetNextToken() );
|
||
m_pAniHolderIndex[i] = aton( parser.GetNextToken() );
|
||
m_pIndexInSubpart[i] = aton( parser.GetNextToken() );
|
||
szToken = parser.GetNextToken();
|
||
m_pszSkeletonName[i] = new char[strlen(szToken)+1];
|
||
strcpy( m_pszSkeletonName[i], szToken );
|
||
|
||
szToken = parser.GetNextToken();
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "aniholdercount", szToken ) )
|
||
{
|
||
szToken = parser.GetNextToken();
|
||
m_lAniHolderCount = aton( szToken );
|
||
}
|
||
else if( 0 == stricmp( "TMInverse", szToken ) )
|
||
{
|
||
m_pLocalizerMatrix = new matrix[m_lSkeletonCount];
|
||
|
||
szToken = parser.GetNextToken();
|
||
while( 0 != stricmp( szToken, ";" ) )
|
||
{
|
||
i = aton(parser.GetNextToken()); // skip "matrix" token
|
||
if( i >= m_lSkeletonCount )
|
||
{
|
||
// skip remainder of 12 tokens
|
||
for( j = 0; j < 12; ++j )
|
||
{
|
||
parser.GetNextToken();
|
||
}
|
||
szToken = parser.GetNextToken();
|
||
continue;
|
||
}
|
||
|
||
m_pLocalizerMatrix[i]._11 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._12 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._13 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._14 = 0.0f;
|
||
|
||
m_pLocalizerMatrix[i]._21 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._22 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._23 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._24 = 0.0f;
|
||
|
||
m_pLocalizerMatrix[i]._31 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._32 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._33 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._34 = 0.0f;
|
||
|
||
m_pLocalizerMatrix[i]._41 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._42 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._43 = atof( parser.GetNextToken() );
|
||
m_pLocalizerMatrix[i]._44 = 1.0f;
|
||
|
||
szToken = parser.GetNextToken();
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "BoundingVolume", szToken ) )
|
||
{
|
||
Z3D_BOUNDINGVOLUME_INFO bvi;
|
||
vector3 vPos;
|
||
quaternion qRot;
|
||
vector3 vSize;
|
||
vector3 vTmp;
|
||
|
||
szToken = parser.GetNextToken();
|
||
while( 0 != stricmp( szToken, ";" ) )
|
||
{
|
||
if( 0 == stricmp( "OBB", szToken ) ||
|
||
0 == stricmp( "CYLINDER", szToken ) ||
|
||
0 == stricmp( "SPHERE", szToken ) )
|
||
{
|
||
if( 0 == stricmp( "OBB", szToken ) )
|
||
{
|
||
bvi.eBVType = Z3D_BOUNDINGVOLUME_INFO::Z3DBV_OBB;
|
||
}
|
||
else if ( 0 == stricmp( "CYLINDER", szToken ) )
|
||
{
|
||
bvi.eBVType = Z3D_BOUNDINGVOLUME_INFO::Z3DBV_CYLINDER;
|
||
}
|
||
else if ( 0 == stricmp( "SPHERE", szToken ) )
|
||
{
|
||
bvi.eBVType = Z3D_BOUNDINGVOLUME_INFO::Z3DBV_SPHERE;
|
||
}
|
||
|
||
bvi.lSkelIndex = aton( parser.GetNextToken() );
|
||
|
||
szToken = parser.GetNextToken();
|
||
while( 0 != stricmp( szToken, ";" ) )
|
||
{
|
||
if( 0 == stricmp( "pos", szToken ) )
|
||
{
|
||
vPos.x = atof( parser.GetNextToken() );
|
||
vPos.y = atof( parser.GetNextToken() );
|
||
vPos.z = atof( parser.GetNextToken() );
|
||
}
|
||
else if( 0 == stricmp( "rot", szToken ) )
|
||
{
|
||
qRot.x = atof( parser.GetNextToken() );
|
||
qRot.y = atof( parser.GetNextToken() );
|
||
qRot.z = atof( parser.GetNextToken() );
|
||
qRot.w = atof( parser.GetNextToken() );
|
||
}
|
||
else if( 0 == stricmp( "size", szToken ) )
|
||
{
|
||
vSize.x = atof( parser.GetNextToken() );
|
||
vSize.y = atof( parser.GetNextToken() );
|
||
vSize.z = atof( parser.GetNextToken() );
|
||
}
|
||
|
||
szToken = parser.GetNextToken();
|
||
}
|
||
|
||
|
||
// calc
|
||
if( Z3D_BOUNDINGVOLUME_INFO::Z3DBV_OBB == bvi.eBVType )
|
||
{
|
||
z3d::VectorRotate( vTmp, vector3(0,0.5f*vSize.y,0), qRot );
|
||
|
||
bvi.vOrigin = vPos + vTmp;
|
||
bvi.vExtent = 0.5f*vSize;
|
||
bvi.qRot = qRot;
|
||
}
|
||
else if( Z3D_BOUNDINGVOLUME_INFO::Z3DBV_CYLINDER == bvi.eBVType )
|
||
{
|
||
}
|
||
else if( Z3D_BOUNDINGVOLUME_INFO::Z3DBV_SPHERE == bvi.eBVType )
|
||
{
|
||
}
|
||
|
||
m_vecBoundingVolumeInfo.push_back( bvi );
|
||
|
||
szToken = parser.GetNextToken();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
parser.Close();
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadSkeletonPartInfo( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
tok = g_TokSkeletonPartName.Add( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
m_mapTok2SkelpartIdx[tok] = aton( szToken );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadBoundingCylinderInfo( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
|
||
Z3D_BOUNDING_CYLINDER_INFO bci;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
bci.lBottomIdx = aton(szToken);
|
||
|
||
|
||
szToken = rParser.GetNextToken();
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
bci.lTopIdx = aton(szToken);
|
||
|
||
szToken = rParser.GetNextToken();
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
bci.fBottomRadius = atof(szToken);
|
||
|
||
szToken = rParser.GetNextToken();
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
bci.fTopRadius = atof(szToken);
|
||
|
||
m_vecBoundingCylinderInfo.push_back( bci );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadMotionSheet( CSimpleParser &rParser )
|
||
{
|
||
int i;
|
||
char* szToken;
|
||
Z3DMOTIONSHEET* pCurrentSheet;
|
||
std::stack<Z3DMOTIONSHEET*> stackParentSheet;
|
||
|
||
Z3DTOK tok;
|
||
|
||
pCurrentSheet = NULL;
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( "sheet", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
stackParentSheet.push( pCurrentSheet );
|
||
pCurrentSheet = new Z3DMOTIONSHEET;
|
||
pCurrentSheet->rpParentSheet = stackParentSheet.top();
|
||
|
||
tok = g_TokSheetName.Add( szToken );
|
||
if( m_mapTok2MotionSheet.end() != m_mapTok2MotionSheet.find( tok ) )
|
||
{
|
||
return false; // motion sheet <20≯<EFBFBD> <20>ߺ<EFBFBD>
|
||
}
|
||
m_mapTok2MotionSheet[tok] = pCurrentSheet;
|
||
}
|
||
else if( 0 == stricmp( ";", szToken) )
|
||
{
|
||
if( stackParentSheet.empty() )
|
||
{
|
||
break; // "motionsheet" <20><>ū<EFBFBD><C5AB> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> ";", sheet <20>б<EFBFBD> <20><>
|
||
}
|
||
|
||
pCurrentSheet = stackParentSheet.top();
|
||
stackParentSheet.pop();
|
||
}
|
||
else
|
||
{
|
||
Z3DTOK tokMotionName = g_TokMotionName.Add( szToken );
|
||
Z3DMOTLET* pMotlet = new Z3DMOTLET;
|
||
|
||
Z3DTOKARRAY ta;
|
||
Z3DTOK tokMotionFile;
|
||
ta.Alloc( m_lAniHolderCount );
|
||
for( i = 0; i < m_lAniHolderCount; ++i )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
if( 0 == stricmp("NULL", szToken) )
|
||
{
|
||
tokMotionFile = NULL_TOK;
|
||
}
|
||
else
|
||
{
|
||
tokMotionFile = g_TokFileName.Add( szToken );
|
||
}
|
||
ta.pArray[i] = tokMotionFile;
|
||
}
|
||
|
||
if( NULL == (szToken = rParser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
if( 0 == stricmp( ";", szToken ) ) // <20><><EFBFBD><EFBFBD>¥<EFBFBD><C2A5><EFBFBD><EFBFBD> <20><>
|
||
{
|
||
pMotlet->Alloc( 1 );
|
||
pMotlet->lProbalilitySum = 1;
|
||
pMotlet->pProbabilityIdx[0] = 1;
|
||
pMotlet->pTokArr[0] = ta;
|
||
}
|
||
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¥<EFBFBD><C2A5>
|
||
{
|
||
std::vector<Z3DTOKARRAY> vecTa;
|
||
std::vector<long> vecProbabilityFactor;
|
||
vecProbabilityFactor.push_back( aton(szToken) );
|
||
vecTa.push_back( ta );
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
|
||
if( 0 == stricmp( ";", szToken ) ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> <20><>
|
||
{
|
||
pMotlet->Alloc( vecTa.size() );
|
||
for( i = 0; i < pMotlet->lCount; ++i )
|
||
{
|
||
pMotlet->pTokArr[i] = vecTa[i];
|
||
pMotlet->pProbabilityIdx[i] = vecProbabilityFactor[i];
|
||
}
|
||
pMotlet->lProbalilitySum = vecProbabilityFactor.back();
|
||
break; // MOTLET <20>ۼ<EFBFBD><DBBC>Ϸ<EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
ta.Alloc( m_lAniHolderCount );
|
||
for( i = 0; i < m_lAniHolderCount; ++i )
|
||
{
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
if( 0 == stricmp("NULL", szToken) )
|
||
{
|
||
tokMotionFile = NULL_TOK;
|
||
}
|
||
else
|
||
{
|
||
tokMotionFile = g_TokFileName.Add( szToken );
|
||
}
|
||
tokMotionFile = g_TokFileName.Add( szToken );
|
||
ta.pArray[i] = tokMotionFile;
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
vecTa.push_back( ta );
|
||
// Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>б<EFBFBD>
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
vecProbabilityFactor.push_back( aton(szToken) + vecProbabilityFactor.back() );
|
||
}
|
||
}
|
||
}
|
||
if( pCurrentSheet->mapTok2Motlet.end() !=
|
||
pCurrentSheet->mapTok2Motlet.find( tokMotionName ) )
|
||
{
|
||
return false; // <20><> sheet <20>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> motion<6F><6E> <20>ߺ<EFBFBD><DFBA><EFBFBD>
|
||
}
|
||
pCurrentSheet->mapTok2Motlet[tokMotionName] = pMotlet;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadStaticSlot( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
tok = g_TokSlotName.Add( szToken );
|
||
// <20>ߺ<EFBFBD><DFBA>˻<EFBFBD>
|
||
if( m_vecTokStaticSlot.end() !=
|
||
std::find(
|
||
m_vecTokStaticSlot.begin(), m_vecTokStaticSlot.end(), tok )
|
||
)
|
||
{
|
||
return false;
|
||
}
|
||
m_vecTokStaticSlot.push_back( tok );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadOutfitSlot( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
tok = g_TokSlotName.Add( szToken );
|
||
// <20>ߺ<EFBFBD><DFBA>˻<EFBFBD>
|
||
if( m_vecTokOutfitSlot.end() !=
|
||
std::find(
|
||
m_vecTokOutfitSlot.begin(), m_vecTokOutfitSlot.end(), tok )
|
||
)
|
||
{
|
||
return false;
|
||
}
|
||
m_vecTokOutfitSlot.push_back( tok );
|
||
|
||
|
||
if( NULL == (szToken = rParser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
m_vecOutfitSlotOverlayCount.push_back( aton(szToken) );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadAttachementSlot( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
tok = g_TokSlotName.Add( szToken );
|
||
// <20>ߺ<EFBFBD><DFBA>˻<EFBFBD>
|
||
if( m_vecTokAttachmentSlot.end() !=
|
||
std::find(
|
||
m_vecTokAttachmentSlot.begin(), m_vecTokAttachmentSlot.end(), tok )
|
||
)
|
||
{
|
||
return false;
|
||
}
|
||
m_vecTokAttachmentSlot.push_back( tok );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadAttachmentSet( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
Z3DATTACHMENTINFO* pAInfo;
|
||
std::vector<Z3DATTACHMENTHOLDERINFO> vecHolder;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
if( 0 == stricmp( "set", szToken ) )
|
||
{
|
||
if( NULL == ( szToken = rParser.GetNextToken() ) )
|
||
{
|
||
return false;
|
||
}
|
||
Z3DTOK tokName = g_TokAttachmentName.Add( szToken );
|
||
pAInfo = new Z3DATTACHMENTINFO;
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>ʵ<EFBFBD> <20>ʱ<EFBFBD>ȭ
|
||
pAInfo->tokTextureFile2 = NULL_TOK;
|
||
vecHolder.clear();
|
||
|
||
szToken = rParser.GetNextToken();
|
||
while( NULL != szToken )
|
||
{
|
||
if( 0 == stricmp( "type", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
pAInfo->lType = aton( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
else if( 0 == stricmp( "mesh", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
pAInfo->tokMeshFile = g_TokFileName.Add( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
else if( 0 == stricmp( "tex", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
pAInfo->tokTextureFile = g_TokFileName.Add( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
if( 0 == stricmp( ":", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
pAInfo->tokTextureFile2 = g_TokFileName.Add( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "holder", szToken ) )
|
||
{
|
||
if( false == ReadAttachmentHolder( rParser, vecHolder ) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
else if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
if( m_mapTok2AttachmentInfo.end() != m_mapTok2AttachmentInfo.find( tokName ) )
|
||
{
|
||
return false; // <20><><EFBFBD><EFBFBD> <20>ߺ<EFBFBD>
|
||
}
|
||
if( 0 == (pAInfo->lHolderCount = vecHolder.size()) )
|
||
{
|
||
return false;
|
||
}
|
||
pAInfo->pHolderInfo = new Z3DATTACHMENTHOLDERINFO[pAInfo->lHolderCount];
|
||
for( int i = 0; i < pAInfo->lHolderCount; ++i )
|
||
{
|
||
pAInfo->pHolderInfo[i] = vecHolder[i];
|
||
}
|
||
m_mapTok2AttachmentInfo[tokName] = pAInfo;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadAttachmentHolder( CSimpleParser &rParser, std::vector<Z3DATTACHMENTHOLDERINFO> &r_vecHolder )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
Z3DATTACHMENTHOLDERINFO holder;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( NULL == szToken )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
r_vecHolder.push_back( holder );
|
||
break;
|
||
}
|
||
else if( 0 == stricmp( "skel", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
holder.tokSkelPart = g_TokSkeletonPartName.Add( szToken );
|
||
}
|
||
else if( 0 == stricmp( "pos", szToken ) )
|
||
{
|
||
holder.vPos.x = atof( rParser.GetNextToken() );
|
||
holder.vPos.y = atof( rParser.GetNextToken() );
|
||
holder.vPos.z = atof( rParser.GetNextToken() );
|
||
}
|
||
else if( 0 == stricmp( "rot", szToken ) )
|
||
{
|
||
holder.qRot.x = atof( rParser.GetNextToken() );
|
||
holder.qRot.y = atof( rParser.GetNextToken() );
|
||
holder.qRot.z = atof( rParser.GetNextToken() );
|
||
holder.qRot.w = atof( rParser.GetNextToken() );
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadOutfitSet( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
Z3DTOK tokLink;
|
||
Z3DTOK tokLinkSlot;
|
||
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
if( 0 == stricmp( "set", szToken ) )
|
||
{
|
||
std::vector<Z3DTOK> vecTokMeshName;
|
||
std::vector<Z3DTOK> vecTokTextureName;
|
||
std::vector<Z3DTOK> vecTokTexture2Name;
|
||
|
||
if( NULL == ( szToken = rParser.GetNextToken() ) )
|
||
{
|
||
return false;
|
||
}
|
||
Z3DTOK tokName = g_TokOutfitName.Add( szToken );
|
||
if( m_mapTok2OutfitInfo.end() != m_mapTok2OutfitInfo.find(tokName) )
|
||
{
|
||
return false; // <20><><EFBFBD><EFBFBD> <20><>Ī <20>ߺ<EFBFBD>
|
||
}
|
||
|
||
szToken = rParser.GetNextToken();
|
||
if( 0 == stricmp( "link", szToken ) )
|
||
{
|
||
if( NULL == (szToken = rParser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
tokLink = g_TokOutfitName.Add( szToken );
|
||
|
||
if( NULL == (szToken = rParser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
tokLinkSlot = g_TokSlotName.GetTOK( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
else
|
||
{
|
||
tokLink = NULL_TOK;
|
||
tokLinkSlot = NULL_TOK;
|
||
}
|
||
|
||
while( 0 != stricmp( ";", szToken ) )
|
||
{
|
||
if( 0 == stricmp( "NULL", szToken ) )
|
||
{
|
||
tok = NULL_TOK;
|
||
}
|
||
else
|
||
{
|
||
tok = g_TokFileName.Add( szToken );
|
||
}
|
||
vecTokMeshName.push_back( tok );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
if( 0 == stricmp( "NULL", szToken ) )
|
||
{
|
||
tok = NULL_TOK;
|
||
}
|
||
else
|
||
{
|
||
tok = g_TokFileName.Add( szToken );
|
||
}
|
||
vecTokTextureName.push_back( tok );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
if( 0 == stricmp( ":", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
if( 0 == stricmp( "NULL", szToken ) )
|
||
{
|
||
tok = NULL_TOK;
|
||
}
|
||
else
|
||
{
|
||
tok = g_TokFileName.Add( szToken );
|
||
}
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
else
|
||
{
|
||
tok = NULL_TOK;
|
||
}
|
||
vecTokTexture2Name.push_back( tok );
|
||
}
|
||
|
||
if( 0 == vecTokMeshName.size() )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
Z3DOUTFITINFO* pOInfo = new Z3DOUTFITINFO;
|
||
pOInfo->Alloc( vecTokMeshName.size() );
|
||
for( int i = 0; i < pOInfo->lCount; ++i )
|
||
{
|
||
pOInfo->pTokMeshName[i] = vecTokMeshName[i];
|
||
pOInfo->pTokTextureName[i] = vecTokTextureName[i];
|
||
pOInfo->pTokTexture2Name[i] = vecTokTexture2Name[i];
|
||
}
|
||
pOInfo->tokLinkOutfit = tokLink;
|
||
pOInfo->tokLinkSlot = tokLinkSlot;
|
||
m_mapTok2OutfitInfo[tokName] = pOInfo;
|
||
}
|
||
}
|
||
|
||
if( m_mapTok2OutfitInfo.size() > 1 )
|
||
{
|
||
m_bFixed = false;
|
||
}
|
||
else
|
||
{
|
||
m_bFixed = true;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadDefaultAttachment( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
Z3DTOK tok;
|
||
Z3DTOK_SLOT_ATTACHMENT TSA;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
tok = g_TokSlotName.GetTOK( szToken );
|
||
if( tok == NULL_TOK )
|
||
{
|
||
return false; // <09><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
}
|
||
TSA.tokSlot = tok;
|
||
|
||
if( NULL == ( szToken = rParser.GetNextToken() ) )
|
||
{
|
||
return false;
|
||
}
|
||
tok = g_TokAttachmentName.GetTOK( szToken );
|
||
if( tok == NULL_TOK )
|
||
{
|
||
return false; // <09><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD> attachment item
|
||
}
|
||
TSA.tokAttachment = tok;
|
||
|
||
m_vecDefaultAttachment.push_back( TSA );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadShaderInfo( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
long lIndex;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
if( 0 == stricmp( "shader", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
lIndex = aton(szToken);
|
||
|
||
if( lIndex < Z3D_MAX_SHADER_COUNT )
|
||
{
|
||
SAFE_DELETEA( m_aszShaderInfoList[lIndex] );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
m_aszShaderInfoList[lIndex] = new char[strlen(szToken)+1];
|
||
strcpy( m_aszShaderInfoList[lIndex], szToken );
|
||
}
|
||
else
|
||
{
|
||
// skip text content
|
||
szToken = rParser.GetNextToken();
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadEffectInfo( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
//Z3D_EFFECT_INFO* pEi;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
/*if( 0 == stricmp( "effect", szToken ) )
|
||
{
|
||
pEi = new Z3D_EFFECT_INFO;
|
||
|
||
szToken = rParser.GetNextToken();
|
||
pEi->szSkelName = new char[strlen(szToken) + 1];
|
||
strcpy( pEi->szSkelName, szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
pEi->szESFName = new char[strlen(szToken) + 1];
|
||
strcpy( pEi->szESFName, szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
pEi->vPos.x = atof( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
pEi->vPos.y = atof( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
pEi->vPos.z = atof( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
pEi->qRot.x = atof( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
pEi->qRot.y = atof( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
pEi->qRot.z = atof( szToken );
|
||
szToken = rParser.GetNextToken();
|
||
pEi->qRot.w = atof( szToken );
|
||
|
||
m_vecEffectInfo.push_back( pEi );
|
||
}*/
|
||
char* szTemp = new char[strlen(szToken)+1];
|
||
strcpy( szTemp, szToken );
|
||
m_vecszEffectInfo.push_back(szTemp);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::ReadFixedPoint( CSimpleParser &rParser )
|
||
{
|
||
char* szToken;
|
||
long lIndex;
|
||
Z3DBlend2Vertex vTmp;
|
||
|
||
while( szToken = rParser.GetNextToken() )
|
||
{
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
if( 0 == stricmp( "point", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
lIndex = aton(szToken);
|
||
|
||
while( 1 )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
|
||
if( 0 == stricmp( ";", szToken ) )
|
||
{
|
||
break;
|
||
}
|
||
else if( 0 == stricmp( "position", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
vTmp.pos.x = atof( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
vTmp.pos.y = atof( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
vTmp.pos.z = atof( szToken );
|
||
}
|
||
else if( 0 == stricmp( "bone", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
vTmp.mtrx_id[0] = aton( szToken );
|
||
|
||
szToken = rParser.GetNextToken();
|
||
vTmp.mtrx_id[1] = aton( szToken );
|
||
}
|
||
else if( 0 == stricmp( "factor", szToken ) )
|
||
{
|
||
szToken = rParser.GetNextToken();
|
||
vTmp.bfactor = atof( szToken );
|
||
}
|
||
}
|
||
|
||
if( lIndex <= 2 || lIndex >= 0 )
|
||
{
|
||
m_aFixedPoint[lIndex] = vTmp;
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::Load( const char* szFileName, const char* szPath )
|
||
{
|
||
// edith GCMDS <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20>κ<EFBFBD>
|
||
CSimpleParser parser;
|
||
Z3DTOK tok;
|
||
|
||
//if( false == parser.OpenFile( szFileName ) && szPath )
|
||
if( szPath )
|
||
{
|
||
SimpleString nname( szPath, szFileName );
|
||
|
||
if( false == parser.OpenFile( nname ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( false == parser.OpenFile( szFileName ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
char* szToken;
|
||
char szTmp[260];
|
||
|
||
while( (szToken = parser.GetNextToken()) != NULL )
|
||
{
|
||
if( 0 == stricmp( "skel", szToken ) )
|
||
{
|
||
szToken = parser.GetNextToken();
|
||
if( szPath )
|
||
{
|
||
sprintf( szTmp, "%s%s", szPath, szToken );
|
||
}
|
||
else
|
||
{
|
||
strcpy( szTmp, szToken );
|
||
}
|
||
|
||
if( false == ReadSkelFile( szTmp ) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// szToken <20><><EFBFBD><EFBFBD> path name <20><> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> skel <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
m_szSkelFileName = new char[strlen(szToken)+1];
|
||
strcpy( m_szSkelFileName, szToken );
|
||
}
|
||
else if( 0 == stricmp( "skey", szToken ) )
|
||
{
|
||
szToken = parser.GetNextToken();
|
||
if( szPath )
|
||
{
|
||
sprintf( szTmp, "%s%s", szPath, szToken );
|
||
}
|
||
else
|
||
{
|
||
strcpy( szTmp, szToken );
|
||
}
|
||
|
||
if( false == ReadSkeyFile( szTmp ) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// szToken <20><><EFBFBD><EFBFBD> path name <20><> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> skel <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
m_szSkelFileName = new char[strlen(szToken)+1];
|
||
strcpy( m_szSkelFileName, szToken );
|
||
}
|
||
else if( 0 == stricmp( "meshtype", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
long lType = aton( szToken );
|
||
if( 0 == lType )
|
||
{
|
||
m_MPT = Z3D_MPT_TEXPIECE;
|
||
}
|
||
else
|
||
{
|
||
m_MPT = Z3D_MPT_TEXTURE;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "skelpart", szToken ) )
|
||
{
|
||
if( false == ReadSkeletonPartInfo( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "boundingcylinder", szToken ) )
|
||
{
|
||
if( false == ReadBoundingCylinderInfo( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "motionsheet", szToken ) )
|
||
{
|
||
if( false == ReadMotionSheet( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "staticslot", szToken ) )
|
||
{
|
||
if( false == ReadStaticSlot( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "outfitslot", szToken ) )
|
||
{
|
||
if( false == ReadOutfitSlot( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "attachmentslot", szToken ) )
|
||
{
|
||
if( false == ReadAttachementSlot( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "attachmentset", szToken ) )
|
||
{
|
||
if( false == ReadAttachmentSet( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "outfitset", szToken ) )
|
||
{
|
||
if( false == ReadOutfitSet( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "default_outfit", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( NULL_TOK == (m_TokDefaultOutfit = g_TokOutfitName.GetTOK( szToken )) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "default_motion", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( NULL_TOK == (m_TokDefaultMotionSheet = g_TokSheetName.GetTOK( szToken )) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( NULL_TOK == (m_TokDefaultMotion = g_TokMotionName.GetTOK( szToken )) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "default_attachment", szToken ) )
|
||
{
|
||
if( false == ReadDefaultAttachment( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "default_scale", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
m_fDefaultScale = atof(szToken);
|
||
}
|
||
else if( 0 == stricmp( "shaderinfo", szToken ) )
|
||
{
|
||
if( false == ReadShaderInfo( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "effectinfo", szToken ) )
|
||
{
|
||
if( false == ReadEffectInfo( parser ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "effect_scale", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
m_fEffectScale = atof(szToken);
|
||
}
|
||
else if( 0 == stricmp( "alpha_used", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( 0 == stricmp( "true", szToken ) )
|
||
{
|
||
m_bIsAlphaUsed = true;
|
||
}
|
||
else
|
||
{
|
||
m_bIsAlphaUsed = false;
|
||
}
|
||
}
|
||
else if( 0 == stricmp( "nametag_bias", szToken ) )
|
||
{
|
||
if( NULL == (szToken = parser.GetNextToken()) )
|
||
{
|
||
return false;
|
||
}
|
||
m_fNameTagBias = atof( szToken );
|
||
}
|
||
|
||
}
|
||
|
||
m_szFileName = new char[strlen(szFileName) + 1];
|
||
strcpy( m_szFileName, szFileName );
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::Save( const char* szFileName, const char* szPath ) const
|
||
{
|
||
CZ3DMaskedStream mstrm;
|
||
Z3DTOK tok;
|
||
int i;
|
||
|
||
if( NULL == m_szFileName )
|
||
{
|
||
return false; // GCMDS not loaded yet for this instance
|
||
}
|
||
|
||
if( NULL == szFileName )
|
||
{
|
||
szFileName = m_szFileName;
|
||
}
|
||
|
||
if( szPath )
|
||
{
|
||
SimpleString nname( szPath, szFileName );
|
||
|
||
if( false == mstrm.Open( nname ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{ if( false == mstrm.Open( szFileName ) )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
// skey
|
||
mstrm.Printf( "skey \"%s\"\n\n\n", m_szSkelFileName );
|
||
|
||
// meshtype (almost obsolete)
|
||
mstrm.Printf( "meshtype %d\t// 0 = TEXPIECE, 1 = TEXTURE\n\n\n", (m_MPT == Z3D_MPT_TEXTURE) ? 1 : 0 );
|
||
|
||
// skelpart
|
||
if( m_mapTok2SkelpartIdx.size() > 0 )
|
||
{
|
||
std::map<Z3DTOK, long>::const_iterator it;
|
||
|
||
mstrm.Printf( "skelpart\n" );
|
||
|
||
for( it = m_mapTok2SkelpartIdx.begin(); it != m_mapTok2SkelpartIdx.end(); ++it )
|
||
{
|
||
mstrm.Printf( "\t%s %d\n", g_TokSkeletonPartName.GetString( it->first ), it->second );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// boundingcylinder
|
||
if( m_vecBoundingCylinderInfo.size() )
|
||
{
|
||
mstrm.Printf( "boundingcylinder\n" );
|
||
|
||
for( i = 0; i < (int)m_vecBoundingCylinderInfo.size(); ++i )
|
||
{
|
||
mstrm.Printf( "\t%d\t%d\t%4.1f\t%4.1f\n",
|
||
m_vecBoundingCylinderInfo[i].lBottomIdx,
|
||
m_vecBoundingCylinderInfo[i].lTopIdx,
|
||
m_vecBoundingCylinderInfo[i].fBottomRadius,
|
||
m_vecBoundingCylinderInfo[i].fTopRadius );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// motionsheet
|
||
if( false == WriteMotionSheet( mstrm ) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// staticslot
|
||
if( m_vecTokStaticSlot.size() )
|
||
{
|
||
mstrm.Printf( "staticslot\n" );
|
||
|
||
for( i = 0; i < (int)m_vecTokStaticSlot.size(); ++i )
|
||
{
|
||
mstrm.Printf( "\t%s", g_TokSlotName.GetString( m_vecTokStaticSlot[i] ) );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// outfitslot
|
||
if( m_vecTokOutfitSlot.size() )
|
||
{
|
||
mstrm.Printf( "outfitslot\n" );
|
||
|
||
for( i = 0; i < (int)m_vecTokOutfitSlot.size(); ++i )
|
||
{
|
||
mstrm.Printf( "\t%s\t%d\n",
|
||
g_TokSlotName.GetString( m_vecTokOutfitSlot[i] ), m_vecOutfitSlotOverlayCount[i] );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// attachmentslot
|
||
if( m_vecTokAttachmentSlot.size() )
|
||
{
|
||
mstrm.Printf( "attachmentslot\n" );
|
||
|
||
for( i = 0; i < (int)m_vecTokAttachmentSlot.size(); ++i )
|
||
{
|
||
mstrm.Printf( "\t%s", g_TokSlotName.GetString( m_vecTokAttachmentSlot[i] ) );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// attachmentset
|
||
if( m_mapTok2AttachmentInfo.size() )
|
||
{
|
||
std::map<Z3DTOK, Z3DATTACHMENTINFO*>::const_iterator it;
|
||
|
||
mstrm.Printf( "attachmentset\n" );
|
||
|
||
for( it = m_mapTok2AttachmentInfo.begin(); it != m_mapTok2AttachmentInfo.end(); ++it )
|
||
{
|
||
mstrm.Printf( "\n\tset\t\"%s\"\n", g_TokAttachmentName.GetString( it->first ) );
|
||
mstrm.Printf( "\t\ttype\t%d\n", it->second->lType );
|
||
mstrm.Printf( "\t\tmesh\t\"%s\"\n", g_TokFileName.GetString( it->second->tokMeshFile ) );
|
||
mstrm.Printf( "\t\ttex\t\t\"%s\"\n", g_TokFileName.GetString( it->second->tokTextureFile ) );
|
||
|
||
for( i = 0; i < it->second->lHolderCount; ++i )
|
||
{
|
||
mstrm.Printf( "\t\tholder\n" );
|
||
|
||
mstrm.Printf( "\t\t\tskel\t%s\n",
|
||
g_TokSkeletonPartName.GetString( it->second->pHolderInfo[i].tokSkelPart ) );
|
||
mstrm.Printf( "\t\t\tpos\t%8.4f\t%8.4f\t%8.4f\n",
|
||
it->second->pHolderInfo[i].vPos.x,
|
||
it->second->pHolderInfo[i].vPos.y,
|
||
it->second->pHolderInfo[i].vPos.z );
|
||
mstrm.Printf( "\t\t\trot\t%f\t%f\t%f\t%f\n",
|
||
it->second->pHolderInfo[i].qRot.x,
|
||
it->second->pHolderInfo[i].qRot.y,
|
||
it->second->pHolderInfo[i].qRot.z,
|
||
it->second->pHolderInfo[i].qRot.w );
|
||
|
||
mstrm.Printf( "\t\t;\n" );
|
||
}
|
||
|
||
mstrm.Printf( "\t;\n\n" );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// outfitset
|
||
if( m_mapTok2OutfitInfo.size() )
|
||
{
|
||
std::map<Z3DTOK, Z3DOUTFITINFO*>::const_iterator it;
|
||
|
||
mstrm.Printf( "outfitset\n" );
|
||
|
||
for( it = m_mapTok2OutfitInfo.begin(); it != m_mapTok2OutfitInfo.end(); ++it )
|
||
{
|
||
mstrm.Printf( "\tset\t\"%s\"", g_TokOutfitName.GetString( it->first ) );
|
||
if( NULL_TOK == it->second->tokLinkSlot )
|
||
{
|
||
mstrm.Printf( "\n" );
|
||
}
|
||
else
|
||
{
|
||
mstrm.Printf( "\tlink \"%s\" %s\n",
|
||
g_TokOutfitName.GetString( it->second->tokLinkOutfit ),
|
||
g_TokSlotName.GetString( it->second->tokLinkSlot ) );
|
||
}
|
||
|
||
for( i = 0; i < it->second->lCount; ++i )
|
||
{
|
||
if( NULL_TOK == it->second->pTokTextureName[i] )
|
||
{
|
||
mstrm.Printf( "\t\t\"%s\"\tNULL\n",
|
||
g_TokFileName.GetString( it->second->pTokMeshName[i] ) );
|
||
}
|
||
else
|
||
{
|
||
mstrm.Printf( "\t\t\"%s\"\t\"%s\"\n",
|
||
g_TokFileName.GetString( it->second->pTokMeshName[i] ),
|
||
g_TokFileName.GetString( it->second->pTokTextureName[i] ) );
|
||
}
|
||
}
|
||
|
||
mstrm.Printf( "\t;\n" );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// default_outfit
|
||
mstrm.Printf( "default_outfit\t\"%s\"\n\n\n",
|
||
g_TokOutfitName.GetString(m_TokDefaultOutfit) );
|
||
|
||
// default_motion
|
||
mstrm.Printf( "default_motion\t%s\t%s\n\n\n",
|
||
g_TokSheetName.GetString( m_TokDefaultMotionSheet ),
|
||
g_TokMotionName.GetString( m_TokDefaultMotion ) );
|
||
|
||
// default_attachment
|
||
if( m_vecDefaultAttachment.size() )
|
||
{
|
||
mstrm.Printf( "default_attachment\n" );
|
||
|
||
for( i = 0; i < (int)m_vecDefaultAttachment.size(); ++i )
|
||
{
|
||
mstrm.Printf( "\t%s\t\"%s\"\n",
|
||
g_TokSlotName.GetString( m_vecDefaultAttachment[i].tokSlot ),
|
||
g_TokAttachmentName.GetString( m_vecDefaultAttachment[i].tokAttachment ) );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// default_scale
|
||
if( 1.0f != m_fDefaultScale )
|
||
{
|
||
mstrm.Printf( "default_scale %f\n\n\n", m_fDefaultScale );
|
||
}
|
||
|
||
// shaderinfo
|
||
for( i = 0; i < Z3D_MAX_SHADER_COUNT; ++i )
|
||
{
|
||
if( NULL != m_aszShaderInfoList[i] )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
if( i < Z3D_MAX_SHADER_COUNT ) // shader <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
{
|
||
mstrm.Printf( "shaderinfo\n" );
|
||
|
||
for( i = 0; i < Z3D_MAX_SHADER_COUNT; ++i )
|
||
{
|
||
if( NULL != m_aszShaderInfoList[i] )
|
||
{
|
||
mstrm.Printf( "\tshader\t%d\t\"%s\"\n", i, m_aszShaderInfoList[i] );
|
||
}
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// effectinfo
|
||
if( m_vecszEffectInfo.size() )
|
||
{
|
||
mstrm.Printf( "effectinfo\n" );
|
||
|
||
for( i = 0; i < (int)m_vecszEffectInfo.size(); ++i )
|
||
{
|
||
mstrm.Printf( "\t\"%s\"\n", m_vecszEffectInfo[i] );
|
||
}
|
||
|
||
mstrm.Printf( ";\n\n\n" );
|
||
}
|
||
|
||
// effect_scale
|
||
if( 1.0f != m_fEffectScale )
|
||
{
|
||
mstrm.Printf( "effect_scale %f\n\n\n", m_fEffectScale );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
static const char* MakeIndent( int n )
|
||
{
|
||
static char szBuffer[100];
|
||
|
||
if( n > 99 ) n = 99;
|
||
int i = 0;
|
||
for(; i < n; ++i )
|
||
{
|
||
szBuffer[i] = '\t';
|
||
}
|
||
szBuffer[i] = '\0';
|
||
|
||
return szBuffer;
|
||
}
|
||
|
||
#include <list>
|
||
#include "GMMemory.h"
|
||
|
||
static bool DumpSheet( CZ3DMaskedStream &rMstrm,
|
||
std::list< std::pair< Z3DTOK,Z3DMOTIONSHEET* > > listMotionSheet,
|
||
std::pair< Z3DTOK, Z3DMOTIONSHEET* > currentSheet, int nIndentCount )
|
||
{
|
||
std::map< Z3DTOK, Z3DMOTLET* >::iterator itMotlet;
|
||
std::list< std::pair< Z3DTOK,Z3DMOTIONSHEET* > >::iterator itMotionSheet;
|
||
std::pair< Z3DTOK, Z3DMOTIONSHEET* > childSheet;
|
||
Z3DMOTLET* pMotlet = NULL;
|
||
int i, j;
|
||
const char* szFileName;
|
||
|
||
// motion sheet name
|
||
rMstrm.Printf( "\n%ssheet %s\n", MakeIndent( nIndentCount ),
|
||
g_TokSheetName.GetString(currentSheet.first) );
|
||
|
||
for( itMotlet = currentSheet.second->mapTok2Motlet.begin();
|
||
itMotlet != currentSheet.second->mapTok2Motlet.end(); ++itMotlet )
|
||
{
|
||
// motion name
|
||
rMstrm.Printf( "%s%s\n", MakeIndent( nIndentCount+1 ),
|
||
g_TokMotionName.GetString( itMotlet->first ) );
|
||
|
||
pMotlet = itMotlet->second;
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
if( 1 == pMotlet->lCount )
|
||
{
|
||
rMstrm.Printf( "%s", MakeIndent( nIndentCount+1 ) );
|
||
for( i = 0; i < pMotlet->pTokArr->lCount; ++i )
|
||
{
|
||
if( NULL_TOK == pMotlet->pTokArr->pArray[i] )
|
||
{
|
||
szFileName = "NULL";
|
||
}
|
||
else
|
||
{
|
||
szFileName = g_TokFileName.GetString( pMotlet->pTokArr->pArray[i] );
|
||
}
|
||
|
||
rMstrm.Printf( "\t%s", szFileName );
|
||
}
|
||
rMstrm.Printf( ";\n\n" );
|
||
}
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(random)
|
||
else
|
||
{
|
||
long lPrevProbability = 0;
|
||
|
||
for( i = 0; i < pMotlet->lCount; ++i )
|
||
{
|
||
rMstrm.Printf( "%s", MakeIndent( nIndentCount+1 ) );
|
||
for( j = 0; j < pMotlet->pTokArr[i].lCount; ++j )
|
||
{
|
||
if( NULL_TOK == pMotlet->pTokArr->pArray[j] )
|
||
{
|
||
szFileName = "NULL";
|
||
}
|
||
else
|
||
{
|
||
szFileName = g_TokFileName.GetString( pMotlet->pTokArr->pArray[j] );
|
||
}
|
||
|
||
rMstrm.Printf( "\t%s", szFileName );
|
||
}
|
||
rMstrm.Printf( "\t%d", pMotlet->pProbabilityIdx[i] - lPrevProbability );
|
||
lPrevProbability = pMotlet->pProbabilityIdx[i];
|
||
|
||
if( i == pMotlet->lCount-1 ) // last item ?
|
||
{
|
||
rMstrm.Printf( ";\n\n" );
|
||
}
|
||
else
|
||
{
|
||
rMstrm.Printf( "\n" );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
for( itMotionSheet = listMotionSheet.begin();
|
||
itMotionSheet != listMotionSheet.end(); ++itMotionSheet )
|
||
{
|
||
if( currentSheet.second == itMotionSheet->second->rpParentSheet )
|
||
{
|
||
DumpSheet( rMstrm, listMotionSheet, *itMotionSheet, nIndentCount+1 );
|
||
}
|
||
}
|
||
|
||
rMstrm.Printf( "%s;\n", MakeIndent( nIndentCount ),
|
||
g_TokSheetName.GetString(currentSheet.first) );
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::WriteMotionSheet( CZ3DMaskedStream &rMstrm ) const
|
||
{
|
||
std::map< Z3DTOK, Z3DMOTIONSHEET* >::const_iterator it;
|
||
std::list< std::pair< Z3DTOK,Z3DMOTIONSHEET* > > listMotionSheet;
|
||
std::list< std::pair< Z3DTOK,Z3DMOTIONSHEET* > >::iterator itMotionSheet;
|
||
|
||
|
||
std::pair< Z3DTOK, Z3DMOTIONSHEET* > rootSheet;
|
||
|
||
for( it = m_mapTok2MotionSheet.begin(); it != m_mapTok2MotionSheet.end(); ++it )
|
||
{
|
||
listMotionSheet.push_back( *it );
|
||
}
|
||
|
||
if( 0 == listMotionSheet.size() )
|
||
{
|
||
return false; // no motion sheet (but it's not possible)
|
||
}
|
||
|
||
|
||
rMstrm.Printf( "motionsheet\n" );
|
||
|
||
int nIndentCount = 1;
|
||
|
||
// search for the root sheet
|
||
rootSheet.second = NULL;
|
||
for( itMotionSheet = listMotionSheet.begin();
|
||
itMotionSheet != listMotionSheet.end(); ++itMotionSheet )
|
||
{
|
||
if( NULL == itMotionSheet->second->rpParentSheet )
|
||
{
|
||
rootSheet = *itMotionSheet;
|
||
break;
|
||
}
|
||
}
|
||
if( NULL == rootSheet.second )
|
||
{
|
||
return false; // no root sheet ( it's not possible, either )
|
||
}
|
||
|
||
DumpSheet( rMstrm, listMotionSheet, rootSheet, 1 );
|
||
|
||
rMstrm.Printf( ";\n\n\n" );
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
// <20>̿<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||
|
||
long CZ3DGCMDS::GetSkeletonPartObjectIdx( const char* szSkeletonPartName )
|
||
{
|
||
Z3DTOK tok = g_TokSkeletonPartName.GetTOK( szSkeletonPartName );
|
||
if( NULL_TOK == tok )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return GetSkeletonPartObjectIdx( tok );
|
||
}
|
||
|
||
|
||
long CZ3DGCMDS::GetSkeletonPartObjectIdx( Z3DTOK tokSkeletonPartName )
|
||
{
|
||
std::map<Z3DTOK, long>::iterator it;
|
||
|
||
if( m_mapTok2SkelpartIdx.end() == ( it = m_mapTok2SkelpartIdx.find(tokSkeletonPartName) ) )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return it->second;
|
||
}
|
||
|
||
|
||
bool CZ3DGCMDS::AllocSkeleton( CZ3DSkeletonObject* &pSkeleton )
|
||
{
|
||
pSkeleton = new CZ3DSkeletonObject[m_lSkeletonCount];
|
||
|
||
for( long i = 0; i < m_lSkeletonCount; ++i )
|
||
{
|
||
if( -1 == m_pSkeletonHierarchy[i] )
|
||
{
|
||
pSkeleton[i].Link( NULL );
|
||
}
|
||
else
|
||
{
|
||
pSkeleton[i].Link( &(pSkeleton[m_pSkeletonHierarchy[i]]) );
|
||
}
|
||
|
||
pSkeleton[i].GetTM()->MakeIdent();
|
||
pSkeleton[i].SetIndex( m_pAniHolderIndex[i], m_pIndexInSubpart[i] );
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
const Z3DOUTFITINFO* CZ3DGCMDS::GetOutfitInfo( Z3DTOK tokOutfitName )
|
||
{
|
||
std::map<Z3DTOK, Z3DOUTFITINFO*>::iterator it;
|
||
|
||
it = m_mapTok2OutfitInfo.find( tokOutfitName );
|
||
if( it == m_mapTok2OutfitInfo.end() )
|
||
{
|
||
return NULL;
|
||
}
|
||
//else
|
||
return it->second;
|
||
}
|
||
|
||
|
||
const Z3DATTACHMENTINFO* CZ3DGCMDS::GetAttachmentInfo( Z3DTOK tokAttachmentName )
|
||
{
|
||
std::map<Z3DTOK, Z3DATTACHMENTINFO*>::iterator it;
|
||
|
||
it = m_mapTok2AttachmentInfo.find( tokAttachmentName );
|
||
if( it == m_mapTok2AttachmentInfo.end() )
|
||
{
|
||
return NULL;
|
||
}
|
||
//else
|
||
return it->second;
|
||
}
|
||
|
||
|
||
Z3DMOTIONSHEET* CZ3DGCMDS::GetMotionsheet( Z3DTOK tokSheetName )
|
||
{
|
||
std::map<Z3DTOK, Z3DMOTIONSHEET*>::iterator it;
|
||
|
||
it = m_mapTok2MotionSheet.find( tokSheetName );
|
||
if( m_mapTok2MotionSheet.end() == it )
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
return it->second;
|
||
}
|
||
|
||
|
||
long CZ3DGCMDS::GetEffectInfoList( const char** &rpszEffectInfo )
|
||
{
|
||
if( 0 == m_vecszEffectInfo.size() )
|
||
{
|
||
rpszEffectInfo = NULL;
|
||
return 0;
|
||
}
|
||
|
||
rpszEffectInfo = const_cast<const char**>( &(m_vecszEffectInfo[0]) );
|
||
return m_vecszEffectInfo.size();
|
||
}
|
||
|
||
|
||
float CZ3DGCMDS::GetSizeFactor()
|
||
{
|
||
long lIdx = GetSkeletonPartObjectIdx( "HEAD" );
|
||
if( -1 == lIdx )
|
||
{
|
||
return 0.0f;
|
||
}
|
||
|
||
float fRet = 0.0f;
|
||
|
||
fRet += m_pLocalizerMatrix[lIdx]._41 * m_pLocalizerMatrix[lIdx]._41;
|
||
fRet += m_pLocalizerMatrix[lIdx]._42 * m_pLocalizerMatrix[lIdx]._42;
|
||
fRet += m_pLocalizerMatrix[lIdx]._43 * m_pLocalizerMatrix[lIdx]._43;
|
||
|
||
return sqrtf( fRet );
|
||
}
|
||
|
||
|
||
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> retrieval / modification <20>Լ<EFBFBD><D4BC><EFBFBD>
|
||
const char* CZ3DGCMDS::GetSkeyFileName()
|
||
{
|
||
return m_szSkelFileName;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetSkeyFilename( const char* szFileName )
|
||
{
|
||
if( false == ReadSkeyFile( szFileName ) )
|
||
{
|
||
return;
|
||
}
|
||
|
||
SAFE_DELETEA( m_szSkelFileName );
|
||
m_szSkelFileName = new char[strlen(szFileName)+1];
|
||
strcpy( m_szSkelFileName, szFileName );
|
||
}
|
||
|
||
long CZ3DGCMDS::GetMeshType()
|
||
{
|
||
if( Z3D_MPT_TEXPIECE == m_MPT )
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if( Z3D_MPT_TEXTURE == m_MPT )
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetMeshType( long lMeshType )
|
||
{
|
||
if( 0 == lMeshType )
|
||
{
|
||
m_MPT = Z3D_MPT_TEXPIECE;
|
||
}
|
||
|
||
if( 1 == lMeshType )
|
||
{
|
||
m_MPT = Z3D_MPT_TEXTURE;
|
||
}
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveSkelpartList( std::map<Z3DTOK, long>* &prSkelpartList )
|
||
{
|
||
prSkelpartList = &m_mapTok2SkelpartIdx;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveMotionSheetList( std::map<Z3DTOK, Z3DMOTIONSHEET*>* &prMotionsheetList )
|
||
{
|
||
prMotionsheetList = &m_mapTok2MotionSheet;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveOutfitList( std::map<Z3DTOK, Z3DOUTFITINFO*>* &prOutfitList )
|
||
{
|
||
prOutfitList = &m_mapTok2OutfitInfo;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveAttachmentList( std::map<Z3DTOK, Z3DATTACHMENTINFO*>* &prAttachmentList )
|
||
{
|
||
prAttachmentList = &m_mapTok2AttachmentInfo;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveStaticSlot( std::vector<Z3DTOK>* &prStaticSlot )
|
||
{
|
||
prStaticSlot = &m_vecTokStaticSlot;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveOutfitSlot( std::vector<Z3DTOK>* &prOutfitSlot, std::vector<long>* &prOSOverlapCount )
|
||
{
|
||
prOutfitSlot = &m_vecTokOutfitSlot;
|
||
prOSOverlapCount = &m_vecOutfitSlotOverlayCount;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveAttachmentSlot( std::vector<Z3DTOK>* &prAttachmentSlot )
|
||
{
|
||
prAttachmentSlot = &m_vecTokAttachmentSlot;
|
||
}
|
||
|
||
Z3DTOK CZ3DGCMDS::GetDefaultOutfit()
|
||
{
|
||
return m_TokDefaultOutfit;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetDefaultOutfit( Z3DTOK tokDefaultOutfit )
|
||
{
|
||
m_TokDefaultOutfit = tokDefaultOutfit;
|
||
}
|
||
|
||
Z3DTOK CZ3DGCMDS::GetDefaultMotion()
|
||
{
|
||
return m_TokDefaultMotion;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetDefaultMotion( Z3DTOK tok )
|
||
{
|
||
m_TokDefaultMotion = tok;
|
||
}
|
||
|
||
/*void CZ3DGCMDS::GetDefaultMotion( Z3DTOK &rtokMotionSheet, Z3DTOK &rtokMotion )
|
||
{
|
||
rtokMotionSheet = m_TokDefaultMotionSheet;
|
||
rtokMotion = m_TokDefaultMotion;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetDefaultMotion( Z3DTOK tokMotionSheet, Z3DTOK tokMotion )
|
||
{
|
||
m_TokDefaultMotionSheet = tokMotionSheet;
|
||
m_TokDefaultMotion = tokMotion;
|
||
}*/
|
||
|
||
Z3DTOK CZ3DGCMDS::GetDefaultMotionSheet()
|
||
{
|
||
return m_TokDefaultMotionSheet;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetDefaultMotionSheet( Z3DTOK tok )
|
||
{
|
||
m_TokDefaultMotionSheet = tok;
|
||
}
|
||
|
||
float CZ3DGCMDS::GetDefaultScale()
|
||
{
|
||
return m_fDefaultScale;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetDefaultScale( float f )
|
||
{
|
||
if( f > 0.0f )
|
||
{
|
||
m_fDefaultScale = f;
|
||
}
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveDefaultAttachmentList( std::vector<Z3DTOK_SLOT_ATTACHMENT>* &prDefaultAttachmentList )
|
||
{
|
||
prDefaultAttachmentList = &m_vecDefaultAttachment;
|
||
}
|
||
|
||
void CZ3DGCMDS::RetrieveEffectInfoList( std::vector<char*>* &prEffectInfoList )
|
||
{
|
||
prEffectInfoList = &m_vecszEffectInfo;
|
||
}
|
||
|
||
|
||
const char* CZ3DGCMDS::GetSkeletonName( int idx )
|
||
{
|
||
if( idx >= m_lSkeletonCount )
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
if( NULL == m_pszSkeletonName )
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
return m_pszSkeletonName[idx];
|
||
}
|
||
|
||
|
||
float CZ3DGCMDS::GetEffectScale()
|
||
{
|
||
return m_fEffectScale;
|
||
}
|
||
|
||
void CZ3DGCMDS::SetEffectScale( float f )
|
||
{
|
||
if( f > 0.0f )
|
||
{
|
||
m_fEffectScale = f;
|
||
}
|
||
}
|
||
|
||
|
||
void CZ3DGCMDS::AllocBoundingVolumeObject( CZ3DSkeletonObject* pSkels, std::vector<CZ3DBoundingVolumeObject*>& vec_pBV )
|
||
{
|
||
CZ3DBoundingVolumeObject* pBVO;
|
||
|
||
for( int i = 0; i < (int)m_vecBoundingVolumeInfo.size(); ++i )
|
||
{
|
||
pBVO = new CZ3DBoundingVolumeObject;
|
||
|
||
if( m_vecBoundingVolumeInfo[i].lSkelIndex < m_lSkeletonCount )
|
||
{
|
||
pBVO->Link( &(pSkels[m_vecBoundingVolumeInfo[i].lSkelIndex]) );
|
||
}
|
||
else
|
||
{
|
||
pBVO->Link( NULL );
|
||
}
|
||
|
||
pBVO->SetPositionLocal( m_vecBoundingVolumeInfo[i].vOrigin );
|
||
pBVO->SetDirectionLocal( m_vecBoundingVolumeInfo[i].qRot );
|
||
pBVO->SetExtent( m_vecBoundingVolumeInfo[i].vExtent );
|
||
|
||
vec_pBV.push_back( pBVO );
|
||
}
|
||
}
|
||
|
||
|
||
int CZ3DGCMDS::BoundingVolumeIndex2SkelIndex( int nBVIndex )
|
||
{
|
||
if( nBVIndex >= (int)m_vecBoundingVolumeInfo.size() )
|
||
{
|
||
return 0; // not exactly proper, but for safety
|
||
}
|
||
|
||
return m_vecBoundingVolumeInfo[nBVIndex].lSkelIndex;
|
||
}
|
||
|
||
|
||
Z3DBlend2Vertex& CZ3DGCMDS::GetFixedPoint( int nIdx )
|
||
{
|
||
if( nIdx > 2 )
|
||
{
|
||
nIdx = 2;
|
||
}
|
||
|
||
return m_aFixedPoint[nIdx];
|
||
} |