// 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 m_vecpDescriptors; }; #endif // !defined(AFX_Z3DMULTIPARTSKIN_H__1B9AE6C5_16F6_11D5_A643_0000E8EB4C69__INCLUDED_)