Files
Client/GameTools/Zallad3D SceneClass/Z3DMultipartSkin11.h
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

286 lines
5.3 KiB
C++

// Z3DMultipartSkin.h: interface for the CZ3DMultipartSkin class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_Z3DMULTIPARTSKIN_H__1B9AE6C5_16F6_11D5_A643_0000E8EB4C69__INCLUDED_)
#define AFX_Z3DMULTIPARTSKIN_H__1B9AE6C5_16F6_11D5_A643_0000E8EB4C69__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#pragma warning (disable:4786)
#include "misc.h"
#include "Z3DRenderable.h"
#include "Z3DMultipartPortion.h"
#include "Z3DSkeletonObject.h"
//#define Z3D_MULTIPART_PORTION_COUNT 3 // 기본,관절,망토치마 이렇게 셋..현재로는
#define Z3D_MULTIPART_PORTION_COUNT 1 // 엎은 이후로 하나로 고정됨..
class CTexture;
class CZ3DMultipartSkin : public CZ3DRenderable
{
public:
CZ3DMultipartSkin( Z3D_MULTIPART_PORTION_TYPE mpt )
: CZ3DRenderable(true)
{
// set 0xFFFFFFFF to mean 'instance manages texture'
m_pTexture = (IDirect3DTexture8*)0xFFFFFFFF;
m_rpSkeleton = NULL;
m_rpSkeletonLocalizer = NULL;
m_lSkelCount = 0;
m_pMatrixPalette = NULL;
m_lAniLODFrame = 1; // 0으로 하면 X된다-_-;
m_lAniLODCounter = 0;
m_lPrevLODLevel = 0;
m_bIsBatchMode = false;
for( int i = 0; i < Z3D_MULTIPART_PORTION_COUNT; ++i )
{
m_apPortion[i] = new Z3DMultipartPortion(mpt);
}
m_MPT = mpt;
m_fScaleFactor = 1.0f;
m_vPivotPos.Identity();
m_pEnvMap = NULL;
}
virtual ~CZ3DMultipartSkin()
{
SAFE_DELETEA( m_pMatrixPalette );
for( int i = 0; i < Z3D_MULTIPART_PORTION_COUNT; ++i )
{
SAFE_DELETE( m_apPortion[i] );
}
if(m_pEnvMap != NULL)
{
delete m_pEnvMap;
m_pEnvMap = NULL;
}
}
void ApplySTMode();
void SetScale( float s )
{
m_fScaleFactor = s;
}
float GetScale()
{
return m_fScaleFactor;
}
void SetPivot( vector3& v )
{
m_vPivotPos = v;
}
void SetPivot( float x, float y, float z )
{
m_vPivotPos.x = x;
m_vPivotPos.y = y;
m_vPivotPos.z = z;
}
void GetPivot( vector3& v ) const
{
v = m_vPivotPos;
}
bool SetSkeleton( CZ3DSkeletonObject* pSkel, long lSkelCount )
{
m_rpSkeleton = pSkel;
m_lSkelCount = lSkelCount;
if( NULL == (m_pMatrixPalette = new matrix[m_lSkelCount]) )
{
return false;
}
return true;
}
void SetSkeletonLocalizer( const matrix* pMat )
{
m_rpSkeletonLocalizer = pMat;
}
bool SetMesh( const char* szMeshName );
bool DeleteMesh( int nPartId );
bool SetTex( const char* szTexName, const char* szTex2Name = NULL );
bool DeleteTex( int nPartId );
bool SetMeshTexture( const char* szMeshName, const char* szTextureName, const char* szTexture2Name = NULL, const char* szSpecTextureName = NULL );
bool BatchOpen();
//bool BatchSet( int nPartId, Z3DHANDLE handleMesh, Z3DHANDLE handleTexpiece );
//bool BatchSet( Z3DHANDLE handleMesh, Z3DHANDLE handleTexpiece );
//bool BatchDelete( int nPartId );
bool BatchClose();
void ApplyAnimation();
void Render();
void SecondRender()
{
// do nothing-_-;
}
// 몇 프레임당 한번씩 blending계산을 할 것인지 설정
void SetAniLODFrame( long l )
{
_ASSERT( l > 0 );
m_lAniLODFrame = l;
m_lAniLODCounter = 0; // reset counter
}
void RenderShadow( DWORD vertexShader = 0xFFFFFFFF );
void RenderSpecular( DWORD vertexShader = 0xFFFFFFFF );
bool CheckRecalcByAniLOD()
{
int nLODLevel = GetLODLevel();
if( nLODLevel != m_lPrevLODLevel )
{
SetAniLODFrame( ms_alAniLODFrameTable[nLODLevel] );
m_lPrevLODLevel = nLODLevel;
}
return (m_lAniLODCounter == 0);
}
void GetBoundingBox( vector3& r_vmin, vector3& r_vmax );
void GetProcessedVertex( Z3DBlend2Vertex& v_in, vector3& v_out ) const;
long GetPolyCount( int nLODLevel = -1 ) const;
void SetTestMode( bool b )
{
m_bTestMode = b;
}
protected:
// 환경 맵
CTexture *m_pEnvMap;
bool m_bTestMode;
vector3 m_vPivotPos;
float m_fScaleFactor;
Z3D_MULTIPART_PORTION_TYPE m_MPT;
const matrix* m_rpSkeletonLocalizer;
Z3DMultipartPortion* m_apPortion[Z3D_MULTIPART_PORTION_COUNT];
CZ3DSkeletonObject* m_rpSkeleton;
long m_lSkelCount;
matrix* m_pMatrixPalette;
long m_lAniLODCounter;
long m_lAniLODFrame; // 몇 프레임마다 한번씩 blending 계산을 해 줘야되나
long m_lPrevLODLevel;
bool m_bIsBatchMode;
static long ms_alAniLODFrameTable[Z3D_LOD_LEVEL];
void IncreaseAniLODCounter()
{
++m_lAniLODCounter;
m_lAniLODCounter %= m_lAniLODFrame;
//m_lAniLODCounter = 0;
}
static int GetPortionIndex( int nPartId )
{
if( nPartId > 300 )
{
return -1;
}
return (nPartId / 100);
}
};
//////////////////////////////////////////////////////////////////////////
struct Z3DPseudoClothDescriptor
{
Z3DPseudoClothDescriptor() {}
~Z3DPseudoClothDescriptor() {}
long lGridXCount;
long lGridYCount;
bool Load( const char* szFileName );
};
class CZ3DPseudoCloth : public CZ3DRenderable, public CZ3DObject
{
public:
CZ3DPseudoCloth()
: CZ3DRenderable(false), CZ3DObject()
{
}
~CZ3DPseudoCloth()
{
Reset();
UnLink();
}
void SecondRender() {}
void FrameMove();
void Render();
bool SetScriptTexture( const char* szScriptName, const char* szTextureName, const char* szTexture2Name = NULL );
void Reset();
bool BatchOpen();
bool BatchClose();
bool BuildActualPseudoCloth( Z3DPseudoClothDescriptor* pDesc );
protected:
std::vector<Z3DPseudoClothDescriptor*> m_vecpDescriptors;
};
#endif // !defined(AFX_Z3DMULTIPARTSKIN_H__1B9AE6C5_16F6_11D5_A643_0000E8EB4C69__INCLUDED_)