// wzunitdraw.h #ifndef _3DFILEACCESS_WZUNITDRAW_H_ #define _3DFILEACCESS_WZUNITDRAW_H_ #include #include #include #include "wzunit.h" #include "wzunitskeleton.h" class CWzSilhouette; class CWzShadowVolume; //------------------------------------------------------------------------------ /** @class CWzUnitDraw * Ŭ¶óÀÌ¾ðÆ® À¯´Ö ±¸¼º O - Àüü(º£À̽º)µµ CWzUnitDraw°í, °¢ ÆÄÆ®(¸Ó¸®, ÆÈ µî)µµ CWzUnitDrawÀÓ --+-- - º£À̽º´Â È­¸é¿¡ ±×·ÁÁöÁø ¾ÊÁö¸¸, ¾Ö´Ï¸ÞÀÌ¼Çµî ¿©·¯°¡Áö ó¸® | - ÆÄÆ®´Â º£À̽º¿¡¼­ ´ëºÎºÐ °ªÀ» ¾ò°í, ÁÖ·Î ·»´õ¸µ¸¸ ÇÔ / | - ¿£Áø Ãʱ⠱¸Çö½Ã ij¸¯ÅͰ¡ ÆÄÆ®·Î ÀÌ·ïÁú °Å¶õ »ý°¢À» ¸øÇß´ø °Í °°À½ / | - ÀÌ·± ÀÌÀ¯·Î CWzUnitSkeleton(»À´Ù±¸)À» ¸¸µé¾ú°í º£À̽º°¡ »À´Ù±¸¸¦ Æ÷ÇÔÇÏ°Ô ÇÔ, ÆÄÆ®´Â »À´Ù±¸ Æ÷ÀÎÅͰ¡ NULLÀÓ - CWzUnitSkeleton¿¡¼­ º£À̽º°¡ ÇÒ ÀÏ ´ëºÎºÐ ó¸® */ class CWzUnitDraw { public: // »ý¼ºÀÚ/¼Ò¸êÀÚ CWzUnitDraw( DWORD dwParam = 0 ); virtual ~CWzUnitDraw(); // ÆÄ±« virtual void Destroy(); // WzUnit ¼³Á¤/¾ò±â WZ3DA_API void SetWzUnit( CWzUnit* pUnit, BOOL bDynamic = TRUE ); CWzUnit* GetWzUnit() const; // ¼­ºê ŸÀÔ ¼³Á¤/¾ò±â WZ3DA_API void SetSubType( int iSubType ); int GetSubType() const; // xxx: ±âÁ¸ ȣȯ (Á¦°Å ¿¹Á¤) int GetSubTypeNum(); // ÂüÁ¶ UnitDraw ¼³Á¤/¾ò±â // xxx: ¾Ö´Ï¸ÞÀ̼Ǹ¸ ÂüÁ¶ÇÏ´Â °ÍÀº ¾Æ´Ô WZ3DA_API void SetAniRefUnitDraw( CWzUnitDraw* pRefUnitDraw ); // -------- ¾Ö´Ï¸ÞÀÌ¼Ç °ü·Ã -------- // ÇöÀç ¾Ö´Ï¸ÞÀÌ¼Ç ¼³Á¤ WZ3DA_API void SetCurrentAnimation( WzID wiAni, BOOL bLoop = TRUE, BOOL bRestart = FALSE, int nInterpolationFrame = -1 ); // ÇöÀç ¾Ö´Ï¸ÞÀÌ¼Ç ID ¾ò±â WzID GetCurrentAnimation(); // ÇöÀç ¾Ö´Ï¸ÞÀÌ¼Ç »óÅ ¾ò±â CWzAniState* GetCurAniState(); // ÇöÀç ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¾ò±â WzAnimationInfo* GetCurrentAnimationInfo(); // ÀÌÀü ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¾ò±â WzAnimationInfo* GetPrevAnimationInfo(); // xxx: ±âÁ¸ ȣȯ (Á¦°Å ¿¹Á¤) void ClearNextAnimation(); // ºí·£µù ¾Ö´Ï¸ÞÀÌ¼Ç ¼³Á¤ // xxx: ±âÁ¸ ȣȯ (fBlendWeight´Â »ç¿ë ¾ÈÇÔ) WZ3DA_API void SetCurrentBlendAnimation( WzID wiAni, int nBoneIdx, BOOL bLoop = FALSE, float fSpeedRatio = 1.0f, BOOL bDeltaType = FALSE, float fBlendWeight = 1.0f ); // ºí·£µù ¾Ö´Ï¸ÞÀÌ¼Ç Á¦°Å WZ3DA_API void UnSetBlendAnimation(); // ºí·£µù ¾Ö´Ï¸ÞÀÌ¼Ç ¹Ýº¹ ¾È ÇÔ void UnLoopBlendAnimation(); // xxx: ±âÁ¸ ȣȯ (Á¦°Å ¿¹Á¤) int GetBlendAniCount(); // ÇÁ·¹ÀÓ ÁøÇà WZ3DA_API ENUM_ANI_FRAME_STATUS ProgressFrame( float fFrameAdd, WzEvent* pEvent = NULL, float* pfProgressRate = NULL ); // ¸Å ÇÁ·¹ÀÓ Ã³¸® (xxx: ÀýµÎü ¾È¿¡ ÀÖ´Â ³Ñµé¸¸) WZ3DA_API void Process( const WzMatrix* pwmParent ); // ÇöÀç ÇÁ·¹ÀÓ ¼³Á¤/¾ò±â void SetFrame( float fFrame ); float GetFrame(); // xxx: ±âÁ¸ ȣȯ (Á¦°Å ¿¹Á¤) float GetCurrentFrame(); // º¸°£ ÇÁ·¹ÀÓ ¼³Á¤ WZ3DA_API void SetInterpolationFrame( int nInterpolationFrame ); // ºí·£µù º¸°£ ÇÁ·¹ÀÓ ¼³Á¤ WZ3DA_API void SetBlendInterpolationFrame( int nStartFrame, int nEndFrame = -1 ); // º¸°£ ÁßÀΰ¡? BOOL IsInterpolating(); // ÇöÀç º¯È¯ ¾ò±â WzTransform* GetTransform(); // ¸¶Áö¸·À¸·Î ÀúÀåµÈ º¯È¯ ¾ò±â (´ÙÀ½ ¾Ö´Ï¸ÞÀ̼ǰú º¸°£¿ë) WzTransform* GetLastSavedTransform(); // º¯È¯ Çà·Ä ¹öÆÛ ¾ò±â WZ3DA_API WzMatrix* GetTransformBuffer( int iSize = -1 ); // ½ºÅ°´× Çà·Ä ¹öÆÛ ¾ò±â WZ3DA_API WzMatrix* GetInverseAndTransformBuffer( int iSize = -1 ); // º¯È¯ ¹öÆÛ Å©±â ¾ò±â int GetTransformBufferSize(); // -------- À§Ä¡/ȸÀü/Å©±â °ü·Ã -------- // Å©±â ¼³Á¤/¾ò±â WZ3DA_API void SetScale( const WzVector& wvScale, BOOL bUpdateBV = TRUE ); WZ3DA_API void SetScale( float x, float y, float z, BOOL bUpdateBV = TRUE ); WZ3DA_API void SetScale( float fScale, BOOL bUpdateBV = TRUE ); const WzVector& GetScale() const; BOOL GetScale( WzVector* pwvScale ) const; // ȸÀü ¼³Á¤/¾ò±â WZ3DA_API void SetRotation( const WzVector& wvRotate, BOOL bUpdateBV = TRUE ); WZ3DA_API void SetRotation( float x, float y, float z, BOOL bUpdateBV = TRUE ); const WzVector& GetRotation() const; // À§Ä¡ ¼³Á¤/¾ò±â WZ3DA_API void SetPosition( const WzVector& wvPos, BOOL bUpdateBV = TRUE ); WZ3DA_API void SetPosition( float x, float y, float z, BOOL bUpdateBV = TRUE ); const WzVector& GetPosition() const; // º» À§Ä¡ ¾ò±â const WzVector& GetBonePos( int nIndex ); // ȸÀü Çà·Ä ¼³Á¤/¾ò±â void SetRotationByMatrix( const WzMatrix* pwmRotate ); void GetRotationMatrix( WzMatrix* pwmOutRotate ); // ¿ÜºÎ¿¡¼­ º¯È¯ flag °­Á¦·Î ¾÷µ¥ÀÌÆ®(Åø¿¡¼­ »ç¿ë) void UpdateTransform(); // -------- ¹Ù¿îµù º¼·ý °ü·Ã -------- // ±âº»(·ÎÄÃ) ¹Ù¿îµù º¼·ý ¼³Á¤ WZ3DA_API void SetBoundingVolume( const WzBoundingVolume& wbv ); // ¿ùµå ¹Ù¿îµù º¼·ý °»½Å (º¯È¯ Çà·Ä Àû¿ë) WZ3DA_API void UpdateBoundingVolumeWithMatrix( WzMatrix* pwmTransform ); // ¿ùµå ¹Ù¿îµù º¼·ý ¾ò±â const WzBoundingVolume& GetBoundingVolume() const; WzBoundingVolume* GetBoundingVolumePtr(); const WzBoundingVolume& GetBaseBoundingVolume() const; WzBoundingVolume* GetBaseBoundingVolumePtr(); // ¿ùµå ¹Ù¿îµù ±¸ Æ÷ÀÎÅÍ ¾ò±â BvSphere* GetBoundingSpherePtr(); // Ãß°¡ ¹Ù¿îµù º¼·ý ÃʱâÈ­ WZ3DA_API void ResetBVExtra(); // Ãß°¡ ¹Ù¿îµù º¼·ý ¼ö ¾ò±â int GetCountBoundingVolumeExtra(); // À妽º·Î Ãß°¡ ¹Ù¿îµù º¼·ý ¾ò±â WzBVExtraInfo* GetBoundingVolumeExtraPtrByIndex( int iIndex ); // -------- LOD °ü·Ã -------- // LOD ¾ò±â int GetLODLevel() const; // µ¥ÀÌŸ LOD ¾ò±â int GetWzdLOD() const; // °­Á¦ LOD ¼³Á¤ void SetForcedLOD( int iLevel = -1 ); // LODº° ¸ðµç ¸Þ½Ã ·Îµù ¿©ºÎ BOOL IsUnitFullLoaded() const; // -------- ±×¸²ÀÚ °ü·Ã -------- // ½Ç·ç¿§ °»½Å WZ3DA_API void UpdateSilhouette( CWzdBase* pWzd, const WzVector& wvRay, const WzVector* pwvTransformedVertex = NULL ); // ½Ç·ç¿§ ¾ò±â CWzSilhouette* GetSilhouette(); // ±×¸²ÀÚ º¼·ý °»½Å WZ3DA_API void UpdateShadowVolume( CWzdBase* pWzd, const WzVector& wvRay, const WzVector* pwvTransformedVertex = NULL, DWORD dwOption = 0 ); // ±×¸²ÀÚ º¼·ý ¾ò±â CWzShadowVolume* GetShadowVolume(); // ±×¸²ÀÚ ÁÖ°í/¹Þ±â Á¤º¸ ÃʱâÈ­ WZ3DA_API void InitShadowCastRecvInfo(); // ±×¸²ÀÚ Áֱ⠼³Á¤/¾ò±â (-1ÀÌ¸é ¸ðµÎ Cast) WZ3DA_API void EnableShadowCast( BOOL bEnable, int nRenderInfoIndex = -1 ); WZ3DA_API BOOL IsEnableShadowCast( int nRenderInfoIndex ); // ±×¸²ÀÚ ¹Þ±â ¼³Á¤/¾ò±â (-1ÀÌ¸é ¸ðµÎ Receive) WZ3DA_API void EnableShadowReceive( BOOL bEnable, int nRenderInfoIndex = -1 ); WZ3DA_API BOOL IsEnableShadowReceive( int nRenderInfoIndex ); // ¶óÀÌÆ®¸Ê ¼³Á¤/¾ò±â void SetLightMap( HANDLE hLightMap ); HANDLE GetLightMap() const; // ¶óÀÌÆ®¸ÊÀÌ Àִ°¡? BOOL IsLightMap() const; // -------- ÀÌÆåÆ® °ü·Ã -------- // ÀÌÆåÆ® Á¤º¸ Ãß°¡ WZ3DA_API void AddUnitEffectInfo( const WzUnitEffectInfo* pInfo ); // À妽º·Î ÀÌÆåÆ® Á¤º¸ ¾ò±â WzUnitEffectInfo* GetUnitEffectInfo( int iIndex ); // ÀÌÆåÆ® Á¤º¸ ¼ö ¾ò±â int GetNumUnitEffectInfo(); // ÀÌÆåÆ® Á¤º¸ Á¦°Å WZ3DA_API void RemoveUnitEffectInfo( int iIndex ); WZ3DA_API void ClearAllUnitEffectInfo(); // ÀÌÆåÆ® Å©±â ¼³Á¤ WZ3DA_API void SetEffectScale( HANDLE hEffect, const WzVector& wvScale ); // ÀÌÆåÆ® ȸÀü ¼³Á¤ WZ3DA_API void SetEffectRotation( HANDLE hEffect, const WzQuaternion& wqRot ); // ÀÌÆåÆ® À§Ä¡ ¼³Á¤ WZ3DA_API void SetEffectPosition( HANDLE hEffect, const WzVector& wvPos ); // ÀÌÆåÆ® ȸÀü Àû¿ë ¿©ºÎ ¼³Á¤ WZ3DA_API void SetEffectApplyRotation( HANDLE hEffect, BOOL bRotation ); // ÀÌÆåÆ® »ý¼ºÇضó void CreateUnitEffect( BOOL bForce = FALSE ); // ÀÌÆåÆ® »ý¼º/Á¦°Å µÆÀ½ void OnUnitEffectCreate(); void OnUnitEffectDestroy(); // -------- ·»´õ¸µ ¿ä¼Ò °ü·Ã -------- // ±¼ÀýÀ² ¼³Á¤/¾ò±â void SetRefractionRate( float fRefractionRate ); float GetRefractionRate() const; // ±¼Àý ¾ËÆÄ ¼³Á¤/¾ò±â void SetRefractionAlpha( float fRefractionAlpha ); float GetRefractionAlpha() const; // ÆØÃ¢À² ¼³Á¤/¾ò±â void SetInflateFactor( float fInflateFactor ); float GetInflateFactor() const; // Fade ¿ä¼Ò ¼³Á¤/¾ò±â void SetFadeFactor( float fFadeFactor ); float GetFadeFactor() const; // ½ºÇÇŧ·¯ °­µµ ¼³Á¤/¾ò±â void SetSpecularIntensity( float fIntensity = 1.0f ); float GetSpecularIntensity() const; // ¿ÜºÎ ÅØ½ºÃ³ ¼³Á¤/¾ò±â // ÅØ½ºÃ³ Çڵ鰪ÀÌ INVALID_HANDLE_VALUEÀÏ °æ¿ì Disable // iMeshGroupÀÌ -1ÀÏ °æ¿ì Àüü Àû¿ë void SetExternalTexture( int iMeshGroup, HANDLE hTexture, int index = 0 ); const St_ExternalTextureInfo* GetExternalTexture( int index = 0 ) const; // xxx: »ç¿ë ¾È ÇÔ(±âÁ¸ ȣȯ) void EnableUpdateLight( BOOL bEnable ); // Áö¿ª ¶óÀÌÆ® ¾ò±â const int* GetAreaLightPtr() const; // -------- ·»´õ¸µ ¿É¼Ç °ü·Ã -------- // ·»´õ¸µ ŸÀÔ ¼³Á¤/¾ò±â void SetRenderType( ENUM_ALTERNATIVE_RENDER eRenderType = AR_NORMAL ); ENUM_ALTERNATIVE_RENDER GetRenderType() const; // ½ºÅ°´× Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â (º£À̽º¸¸ ¼³Á¤ °¡´É) void EnableSkinning( BOOL bEnable ); BOOL IsSkinning() const; // ³ë¸»¸Ê Àû¿ë ¿©ºÎ ¼³Á¤/¾ò±â (º£À̽º¸¸ ¼³Á¤ °¡´É) void EnableNormalMap( BOOL bEnable ); BOOL IsNormalMap() const; // ³ë¸»¸Ê ±¼Àý Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableNormalMapRefraction( BOOL bEnable ); BOOL IsNormalMapRefraction() const; // ¼­ºê ŸÀÔ ¾ËÆÄ ºí·£µù Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableAlphaBlendOfSubType( BOOL bEnable ); BOOL IsAlphaBlendOfSubType() const; // xxx: ¸ð³Ä? void EnableCullFaceModeIn( BOOL bEnable ); BOOL IsCullFaceModeIn() const; // ÅÂ¾ç ±×¸²ÀÚ È°¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableShadowOnSunLight( BOOL bEnable ); BOOL IsShadowOnSunLight() const; // ¼­ºê ŸÀÔÀÇ Ä®¶ó Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableColorOfSubType( BOOL bEnable ); BOOL IsColorOfSubType() const; // ¿ÜºÎ ÅØ½ºÃ³ Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableExternalTexture( BOOL bEnable ); BOOL IsExternalTexture() const; // ¸¶Áö¸· ¾ËÆÄ ·»´õ¸µ Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableLastAlphaRender( BOOL bEnable ); BOOL IsLastAlphaRender() const; // Ä¿½ºÅÒ ¶óÀÌÆ® Ȱ¼º ¿©ºÎ ¼³Á¤/¾ò±â void EnableCustomLight( BOOL bEnable ); BOOL IsCustomLight() const; // ±âŸ BOOL CheckCreateParam( DWORD dwFlag ); BOOL CheckStateFlag( DWORD dwFlag ); private: // º¯¼ö ÃʱâÈ­ void InitVariables(); // ÇØÁ¦ void Release(); // µ¥ÀÌŸ LOD °»½Å void UpdateWzdLOD(); // ÀÌÆåÆ® ó¸® void ProcessEffect(); protected: CWzUnit* m_pUnit; int m_iSubType; CWzUnitDraw* m_pRefUnitDraw; CWzRef m_refUnitSkeleton; CWzSilhouette* m_pwsSilhouette; CWzShadowVolume* m_pwsvShadowVolume; BOOL* m_pbShadowCast; BOOL* m_pbShadowReceive; HANDLE m_hLightMap; CWzArray m_arEffectInfo; float m_fRefractionRate; // ¿Ü°î À² 0 ~ 1»çÀÌ °ª float m_fRefractionAlpha; // ¿Ü°î ¾ËÆÄµµ ( 0 - Diffuse 100%, 1 - ¿Ü°î 100% ) float m_fInflateFactor; // ÆØÃ¢ °ª float m_fSpecularIntensity; St_ExternalTextureInfo m_ExtTextureInfo[WZU_NUM_EXTERNAL_TEXTURE]; ENUM_ALTERNATIVE_RENDER m_eRenderType; CWzFlag m_renderOption; CWzFlag m_createFlag; CWzFlag m_stateFlag; float m_fFadeFactor; int m_iWzdLOD; }; // ÀζóÀÎ ÇÔ¼öµé Ãß°¡ #include "wzunitdraw.inl" #include "wzunitdraw_ani.inl" #include "wzunitdraw_renderopt.inl" #endif // _3DFILEACCESS_WZUNITDRAW_H_