Files
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

438 lines
9.2 KiB
C++

// Z3DGCMDS.h: interface for the CZ3DGCMDS class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_Z3DGCMDS_H__768AB0C3_2AF6_4B5D_BE26_8CF7E6C92F29__INCLUDED_)
#define AFX_Z3DGCMDS_H__768AB0C3_2AF6_4B5D_BE26_8CF7E6C92F29__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Z3D General Character Model Description Script
#include "Z3D_GLOBALS.h"
#include "Z3DSkeletonObject.h"
#include "Z3DMultipartPortion.h"
#include "SimpleParser.h"
#include "Z3DMaskedStream.h"
#include <map>
#include <vector>
// TOK의 array. 한 캐릭터에 세팅되는 subpart갯수만큼의 TOK을 가짐
struct Z3DTOKARRAY
{
long lCount;
Z3DTOK* pArray;
void Alloc( long count )
{
pArray = new Z3DTOK[count];
lCount = count;
}
void Discard()
{
SAFE_DELETEA( pArray );
lCount = 0;
}
};
// TOKARRAY와 확률데이터. 한 motion아래 확률로 묶여있는 데이터들의 집합(설명이 더 어렵잖아-_-!)
struct Z3DMOTLET
{
long lCount;
Z3DTOKARRAY* pTokArr;
long* pProbabilityIdx;
long lProbalilitySum;
void Alloc( long count )
{
pTokArr = new Z3DTOKARRAY[count];
pProbabilityIdx = new long[count];
lCount = count;
}
~Z3DMOTLET()
{
SAFE_DELETEA( pProbabilityIdx );
for( int i = 0; i < lCount; ++i )
{
pTokArr[i].Discard();
}
SAFE_DELETEA( pTokArr );
lCount = 0;
}
};
struct Z3DMOTIONSHEET
{
std::map<Z3DTOK, Z3DMOTLET*> mapTok2Motlet;
Z3DMOTIONSHEET* rpParentSheet;
~Z3DMOTIONSHEET()
{
std::map<Z3DTOK, Z3DMOTLET*>::iterator it;
for( it = mapTok2Motlet.begin(); it != mapTok2Motlet.end(); it++ )
{
SAFE_DELETE( it->second );
}
}
};
struct Z3DATTACHMENTHOLDERINFO
{
Z3DTOK tokSkelPart;
vector3 vPos;
quaternion qRot;
};
struct Z3DATTACHMENTINFO
{
long lType;
Z3DTOK tokMeshFile;
Z3DTOK tokTextureFile;
Z3DTOK tokTextureFile2;
Z3DATTACHMENTHOLDERINFO* pHolderInfo;
long lHolderCount;
~Z3DATTACHMENTINFO()
{
SAFE_DELETEA( pHolderInfo );
}
const Z3DATTACHMENTHOLDERINFO* GetAttachmentHolderInfo( long lIdx ) const
{
if( !(lIdx < lHolderCount) )
{
return pHolderInfo; // returning index 0
}
return &(pHolderInfo[lIdx]);
}
};
struct Z3DOUTFITINFO
{
long lCount;
Z3DTOK tokLinkOutfit; // 연결되는 outfit의 이름
Z3DTOK tokLinkSlot; // 연결되는 outfit이 세팅될 slot이름
Z3DTOK* pTokMeshName;
Z3DTOK* pTokTextureName;
Z3DTOK* pTokTexture2Name;
void Alloc( long c )
{
lCount = c;
pTokMeshName = new Z3DTOK[c];
pTokTextureName = new Z3DTOK[c];
pTokTexture2Name = new Z3DTOK[c];
}
~Z3DOUTFITINFO()
{
SAFE_DELETEA( pTokMeshName );
SAFE_DELETEA( pTokTextureName );
SAFE_DELETEA( pTokTexture2Name );
}
};
struct Z3DTOK_SLOT_ATTACHMENT
{
Z3DTOK tokSlot;
Z3DTOK tokAttachment;
};
struct Z3D_BOUNDING_CYLINDER_INFO
{
long lBottomIdx, lTopIdx;
float fBottomRadius, fTopRadius;
};
#define Z3D_MAX_SHADER_COUNT 6
//#define Z3D_MAX_SHADER_CONSTANT_COUNT 10
/*struct Z3D_SHADER_PARAMETER_INFO
{
Z3D_SHADER_PARAMETER_INFO()
{
for( int i = 0; i < Z3D_MAX_SHADER_CONSTANT_COUNT; ++i )
{
afConstants[i] = 0.0f;
}
}
float GetParam( long lIdx ) const
{
if( lIdx < Z3D_MAX_SHADER_CONSTANT_COUNT )
{
return afConstants[lIdx];
}
else
{
return 0.0f;
}
}
float afConstants[Z3D_MAX_SHADER_CONSTANT_COUNT];
};*/
struct Z3D_EFFECT_INFO
{
char* szESFName;
char* szSkelName;
//vector3 vPos;
//quaternion qRot;
Z3D_EFFECT_INFO()
{
szESFName = NULL;
szSkelName = NULL;
}
~Z3D_EFFECT_INFO()
{
SAFE_DELETEA( szSkelName );
SAFE_DELETEA( szESFName );
}
};
class CZ3DGCMDS
{
public:
CZ3DGCMDS();
virtual ~CZ3DGCMDS();
const char* GetNameString() const
{
return m_szFileName;
}
bool Load( const char* szFileName, const char* szPath = NULL );
bool Save( const char* szFileName = NULL, const char* szPath = NULL ) const;
long GetSkeletonPartObjectIdx( const char* szSkeletonPartName );
long GetSkeletonPartObjectIdx( Z3DTOK tokSkeletonPartName );
const matrix* GetLocalizerMatrix()
{
return m_pLocalizerMatrix;
}
long GetSkeletonCount() const
{
return m_lSkeletonCount;
}
const long* GetSkeletonHierarchy() const
{
return m_pSkeletonHierarchy;
}
long GetAniHolderCount() const
{
return m_lAniHolderCount;
}
bool AllocSkeleton( CZ3DSkeletonObject* &pSkeleton );
Z3D_MULTIPART_PORTION_TYPE GetMPT()
{
return m_MPT;
}
const std::vector<Z3DTOK>* GetStaticSlotVector()
{
return &m_vecTokStaticSlot;
}
const std::vector<Z3DTOK>* GetOutfitSlotVector()
{
return &m_vecTokOutfitSlot;
}
const std::vector<long>* GetOutfitSlotOverlayVector()
{
return &m_vecOutfitSlotOverlayCount;
}
const std::vector<Z3DTOK>* GetAttachmentSlotVector()
{
return &m_vecTokAttachmentSlot;
}
const std::vector<Z3DTOK_SLOT_ATTACHMENT>* GetAttachmentDefaultSettingVector()
{
return &m_vecDefaultAttachment;
}
const std::vector<Z3D_BOUNDING_CYLINDER_INFO>* GetBoundingCylinderVector()
{
return &m_vecBoundingCylinderInfo;
}
const Z3DOUTFITINFO* GetOutfitInfo( Z3DTOK tokOutfitName );
const Z3DATTACHMENTINFO* GetAttachmentInfo( Z3DTOK tokAttachmentName );
Z3DMOTIONSHEET* GetMotionsheet( Z3DTOK tokSheetName );
bool IsFixed()
{
return m_bFixed;
}
bool IsShaderParameterAvailable( long lIdx )
{
if( lIdx >= Z3D_MAX_SHADER_COUNT )
{
return false;
}
if( NULL == m_aszShaderInfoList[lIdx] )
{
return false;
}
return true;
}
const char* GetShaderParameterInfo( long lIdx )
{
if( lIdx >= Z3D_MAX_SHADER_COUNT )
{
return NULL;
}
return m_aszShaderInfoList[lIdx];
}
//long GetEffectInfoList( const Z3D_EFFECT_INFO** &rppEffectInfo );
long GetEffectInfoList( const char** &rpszEffectInfo );
float GetSizeFactor(); // 캐릭터의 대략적인 키를 구하는 함수
const char* GetSkeletonName( int idx );
const char* GetFileName()
{
return m_szFileName;
}
// 편집용 retrieval / modification 함수군
const char* GetSkeyFileName();
void SetSkeyFilename( const char* szFileName );
long GetMeshType();
void SetMeshType( long lMeshType );
void RetrieveSkelpartList( std::map<Z3DTOK, long>* &prSkelpartList );
void RetrieveMotionSheetList( std::map<Z3DTOK, Z3DMOTIONSHEET*>* &prMotionsheetList );
void RetrieveOutfitList( std::map<Z3DTOK, Z3DOUTFITINFO*>* &prOutfitList );
void RetrieveAttachmentList( std::map<Z3DTOK, Z3DATTACHMENTINFO*>* &prAttachmentList );
void RetrieveStaticSlot( std::vector<Z3DTOK>* &prStaticSlot );
void RetrieveOutfitSlot( std::vector<Z3DTOK>* &prOutfitSlot, std::vector<long>* &prOSOverlapCount );
void RetrieveAttachmentSlot( std::vector<Z3DTOK>* &prAttachmentSlot );
Z3DTOK GetDefaultOutfit();
void SetDefaultOutfit( Z3DTOK tokDefaultOutfit );
Z3DTOK GetDefaultMotionSheet();
void SetDefaultMotionSheet( Z3DTOK tok );
Z3DTOK GetDefaultMotion();
void SetDefaultMotion( Z3DTOK tok );
//void GetDefaultMotion( Z3DTOK &rtokMotionSheet, Z3DTOK &rtokMotion );
//void SetDefaultMotion( Z3DTOK tokMotionSheet, Z3DTOK tokMotion );
float GetDefaultScale();
void SetDefaultScale( float f );
void RetrieveDefaultAttachmentList( std::vector<Z3DTOK_SLOT_ATTACHMENT>* &prDefaultAttachmentList );
//void RetrieveEffectInfoList( std::vector<Z3D_EFFECT_INFO*>* &prEffectInfoList );
void RetrieveEffectInfoList( std::vector<char*>* &prEffectInfoList );
float GetEffectScale();
void SetEffectScale( float f );
protected:
long m_lSkeletonCount;
long m_lAniHolderCount;
long* m_pSkeletonHierarchy;
long* m_pAniHolderIndex;
long* m_pIndexInSubpart;
char** m_pszSkeletonName;
matrix* m_pLocalizerMatrix;
Z3D_MULTIPART_PORTION_TYPE m_MPT;
std::map<Z3DTOK, long> m_mapTok2SkelpartIdx;
std::map<Z3DTOK, Z3DMOTIONSHEET*> m_mapTok2MotionSheet;
std::vector<Z3DTOK> m_vecTokStaticSlot;
std::vector<Z3DTOK> m_vecTokOutfitSlot;
std::vector<long> m_vecOutfitSlotOverlayCount;
std::vector<Z3DTOK> m_vecTokAttachmentSlot;
std::vector<Z3D_BOUNDING_CYLINDER_INFO> m_vecBoundingCylinderInfo;
std::map<Z3DTOK, Z3DOUTFITINFO*> m_mapTok2OutfitInfo;
std::map<Z3DTOK, Z3DATTACHMENTINFO*> m_mapTok2AttachmentInfo;
bool m_bFixed; // outfit이 하나밖에 없는 model은 fixed model로 취급되어 outfit과 attachment 변경이 제한됨
Z3DTOK m_TokDefaultOutfit;
Z3DTOK m_TokDefaultMotionSheet;
Z3DTOK m_TokDefaultMotion;
std::vector<Z3DTOK_SLOT_ATTACHMENT> m_vecDefaultAttachment;
float m_fDefaultScale;
float m_fEffectScale;
char* m_szSkelFileName;
char* m_szFileName;
char* m_aszShaderInfoList[Z3D_MAX_SHADER_COUNT];
//std::vector<Z3D_EFFECT_INFO*> m_vecEffectInfo;
std::vector<char*> m_vecszEffectInfo;
bool ReadSkelFile( const char* szFilename );
bool ReadSkeyFile( const char* szFilename );
bool ReadSkeletonPartInfo( CSimpleParser &rParser );
bool ReadBoundingCylinderInfo( CSimpleParser &rParser );
bool ReadMotionSheet( CSimpleParser &rParser );
bool ReadStaticSlot( CSimpleParser &rParser );
bool ReadOutfitSlot( CSimpleParser &rParser );
bool ReadAttachementSlot( CSimpleParser &rParser );
bool ReadAttachmentSet( CSimpleParser &rParser );
bool ReadAttachmentHolder( CSimpleParser &rParser, std::vector<Z3DATTACHMENTHOLDERINFO> &r_vecHolder );
bool ReadOutfitSet( CSimpleParser &rParser );
bool ReadDefaultAttachment( CSimpleParser &rParser );
bool ReadShaderInfo( CSimpleParser &rParser );
bool ReadEffectInfo( CSimpleParser &rParser );
bool WriteMotionSheet( CZ3DMaskedStream &rMstrm ) const;
};
#endif // !defined(AFX_Z3DGCMDS_H__768AB0C3_2AF6_4B5D_BE26_8CF7E6C92F29__INCLUDED_)