#pragma once #include "EtSkin.h" #include "EtSkinInstance.h" #include "EtMesh.h" #include "EtSubMesh.h" #include "EtCollisionEntity.h" #include "EtOctree.h" class CEtCustomParam; class CEtConvexVolume; class CEtObject; typedef CSmartPtr< CEtObject > EtObjectHandle; class CEtObject : public CSmartPtrBase< CEtObject >, public CEtCollisionEntity, public CBackgroundLoaderCallback { public: CEtObject(); virtual ~CEtObject(); void Clear(); // Parent Link °ü·Ã ¸â¹öµé enum LinkType { LT_BONE, LT_MESH_DUMMY, LT_OBJECT, // #29199 ¾Ö´Ï ¿ÀºêÁ§Æ®ÀÇ À§Ä¡±âÁØ ¿ÀÇÁ¼ÂÀ§Ä¡·Î Á÷Á¢ ¸µÅ©. }; protected: bool m_bChild; bool m_bShow; bool m_bEnable; bool m_bEnableCull; bool m_bShadowCast; bool m_bShadowReceive; bool m_bLightMapCast; bool m_bWaterCast; bool m_bLightMapInfluence; bool m_bShowBoundingBox; RenderType m_RenderType; EtMatrix m_WorldMat; EtMatrix m_PrevWorldMat; EtSkinHandle m_hSkin; CEtSkinInstance *m_pSkinInstance; int m_nFrustumMask; int m_nSaveMatIndex; bool m_bValidSaveMatIndex; EtObjectHandle m_hParent; EtMatrix m_LinkOffsetMat; int m_nLinkBoneIndex; LinkType m_LinkType; std::vector m_vecChild; float m_fObjectAlpha; // Ãæµ¹ ó¸® °ü·Ã Tree ±¸¼º.. CEtOctreeNode< CEtObject * > *m_pCurOctreeNode; static CEtOctree< CEtObject * > *s_pDynamicOctree; SAABox m_OriginalBoundingBox; SAABox m_BoundingBox; SSphere m_OriginalBoundingSphere; SSphere m_BoundingSphere; bool m_bAniObject; DNVector(CEtLight *) m_vecInfluenceLight; static bool m_bSkipDrawCollision; public: static void InitializeClass(); static void FinalizeClass(); int Initialize( EtSkinHandle hSkin ); void CommonInitialize(); void CreateSkinInstance(); RenderType SetRenderType( RenderType Type ); RenderType GetRenderType() { return m_RenderType; } virtual void SetParent( EtObjectHandle hObject, const char *pLinkBoneName, EtMatrix *pOffsetMat = NULL ); void SetParent( EtObjectHandle hObject, int nBoneIndex, EtMatrix *pOffsetMat = NULL, LinkType Type = LT_BONE ); void AddChild( EtObjectHandle hObject ); void RemoveChild( EtObjectHandle hObject ); EtObjectHandle GetParent() { return m_hParent;} int GetLinkBoneIndex() { return m_nLinkBoneIndex; } void SetChild( bool bChild ) { m_bChild = bChild; } bool IsChild() { return m_bChild; } std::vector< EtObjectHandle >& GetChild() {return m_vecChild;} void ShowObject( bool bShow ) { m_bShow = bShow; } bool IsShow(); void ShowSubmesh( int nSubmeshIndex, bool bShow ); bool IsShowSubmesh( int nSubmeshIndex ); void EnableObject( bool bEnable ) { m_bEnable = bEnable; } bool IsEnable() { return m_bEnable; } void EnableCull( bool bEnable ) { m_bEnableCull = bEnable; } bool IsEnableCull() { return m_bEnableCull; } void EnableShadowCast( bool bEnable ); bool IsShadowCast() { return m_bShadowCast; } void EnableShadowReceive( bool bEnable ); bool IsShadowReceive() { return m_bShadowReceive; } void EnableLightMapCast( bool bEnable ) { m_bLightMapCast = bEnable; } bool IsLightMapCast() { return m_bLightMapCast; } void EnableWaterCast( bool bEnable ) { m_bWaterCast = bEnable; } bool IsWaterCast() { return m_bWaterCast; } void EnableLightMapInfluence( bool bEnable ); bool IsLightMapInfluence() { return m_bLightMapInfluence; } void ShowBoundingBox( bool bShow ) { m_bShowBoundingBox = bShow; } bool IsShowBoundingBox() { return m_bShowBoundingBox; } void SetObjectAlpha( float fAlpha ); float GetObjectAlpha() { return m_fObjectAlpha; } EtMatrix *GetWorldMat() { return &m_WorldMat; } void SetWorldMat( EtMatrix &WorldMat ) { m_WorldMat = WorldMat; } virtual void Update( EtMatrix *pWorldMat ); virtual EtMatrix *GetBoneMat( int nBoneIndex ) { return NULL; } virtual EtMatrix *GetBoneTransMat( int nBoneIndex ) { return NULL; } virtual EtMatrix *GetDummyTransMat( int nDummyIndex ) { return NULL; } virtual int GetAniFileIndex() { return -1; } EtSkinHandle GetSkin() { return m_hSkin; } const char *GetSkinFileName() { return m_hSkin->GetFileName(); } bool IsAniObject() { return m_bAniObject; } void SetFrustumMask( int nMask ); void AddFrustumMask( int nMask ); int GetFrustumMask() { return m_nFrustumMask; } EtMeshHandle GetMesh() { return ( !m_hSkin ) ? CEtMesh::Identity() : m_hSkin->GetMeshHandle(); } int GetSubMeshCount() { return ( !GetMesh() ) ? 0 : GetMesh()->GetSubMeshCount(); } CEtSubMesh *GetSubMesh( int nSubMeshIndex ) { return ( !GetMesh() ) ? NULL : GetMesh()->GetSubMesh( nSubMeshIndex ); } const char *GetSubMeshName(int nSubMeshIndex ) { return GetSubMesh( nSubMeshIndex )->GetSubMeshName(); } int GetSubMeshIndex( const char *pSubMeshName ) { return ( !GetMesh() ) ? -1 : GetMesh()->GetSubMeshIndex( pSubMeshName ); } int GetVertexCount( int nSubMeshIndex ) { return GetSubMesh( nSubMeshIndex )->GetVertexCount(); } int GetVertexStream( int nSubMeshIndex, MeshStreamType Type, void **ppStream ) { return GetSubMesh( nSubMeshIndex )->GetVertexStream( Type, ppStream ); } void SetVertexStream( int nSubMeshIndex, MeshStreamType Type, void *pStream ) { GetSubMesh( nSubMeshIndex )->SetVertexStream( Type, pStream ); } EtMaterialHandle GetMaterial( int nSubMeshIndex ) { return m_hSkin->GetMaterialHandle( nSubMeshIndex ); } int GetMaterialCount() { return m_hSkin->GetMaterialCount(); } int GetEffectCount( int nSubMeshIndex ) { return m_hSkin->GetEffectCount( nSubMeshIndex ); } SCustomParam *GetCustomParam( int nSubMeshIndex, int nEffectIndex ) { return m_hSkin->GetCustomParam( nSubMeshIndex, nEffectIndex ); } void SetEffect( int nSubMeshIndex, int nEffectIndex, SCustomParam *pParam ) { m_hSkin->SetEffect( nSubMeshIndex, nEffectIndex, pParam ); } void SetTexture( int nSubMeshIndex, int nEffectIndex, const char *pTexName ) { return m_hSkin->SetTexture( nSubMeshIndex, nEffectIndex, pTexName ); } void CalcParentBoneMat(); virtual void InitRender( int nSaveMatIndex = -1 ); virtual void Render(); void RenderImmediate( bool bRenderChild ); void RenderAlphaImmediate( bool bRenderChild ); virtual void RenderShadow(); virtual void RenderWater( int index); int GetSaveMatIndex() {return m_nSaveMatIndex;} void SetSaveMatIndex( int nIndex ); void GetMeshBoundingBox( SAABox &AABox ); void RecalcBoundingBox(); void RecalcBoundingSphere(); void GetBoundingBox( SOBB &OBBox ) { OBBox.Init( m_OriginalBoundingBox, m_WorldMat ); } void GetBoundingBox( SAABox &AABox ) { AABox = m_BoundingBox; } void GetMeshBoundingSphere( SSphere &Sphere ); void GetBoundingSphere( SSphere &Sphere, bool bActorSize = false ) { Sphere = m_BoundingSphere; } virtual void GetExtent( EtVector3 &Origin, EtVector3 &Extent ); void DrawBoundingBox( DWORD dwColor = 0xffffffff ); void UpdateBoundingPrimitive(); virtual void UpdateCollisionPrimitive( EtMatrix &WorldMat, bool bUpdate = true ); bool FindDynamicCollision( EtMatrix &WorldMat, DNVector(SCollisionResponse) &vecResponse, bool bCalcContactTime = true, bool bUpdaetPrimitive = true); bool _FindDynamicCollision( SAABox &BoundingBox, EtVector3 &vMove, DNVector(SCollisionResponse) &vecResponse, bool bCalcContactTime); bool FindCollision( EtMatrix &WorldMat, DNVector(SCollisionResponse) &vecResponse, bool bCalcContactTime = true, bool bUpdaetPrimitive = true); bool FindCollision( EtObjectHandle hObject, std::vector< SCollisionResponse > &vecResponse, bool bCalcContactTime = true ); int AddCustomParam( const char *pParamName ); bool SetCustomParam( int nParamIndex, void *pValue, int nSubMeshIndex = -1 ); void RestoreCustomParam( int nParamIndex, int nSubMeshIndex = -1 ); static void ClearFrustumMask(); static void MaskFrustumObjectList( CEtConvexVolume *pFrustum, int nFrustumMask ); static void InitRenderObjectList(); static void RenderObjectList( int nMask ); static void RenderShadowObjectList( int nMask, float fShadowRange ); static void DrawCollisionList( int nMask ); static void SkipDrawCollisionList( bool bSkip ) { m_bSkipDrawCollision = bSkip; } void CalcLightInfluence(); static void CalcLightInfluenceList( bool bForce = false ); void CalcLightMapInfluence(); static void RecalcLightMapInfluence(); static void SetWorldSize( EtVector3 &WorldCenter, float fRadius ); static EtObjectHandle Pick( int nX, int nY, int nCameraIndex = 0 ); virtual void OnLoadComplete( CBackgroundLoader *pLoader ); CEtSkinInstance *GetSkinInstance() { return m_pSkinInstance; } //void SetBlendParam( int blendOp, int srcBlend, int destBlend ) { m_nBlendOP = blendOp; m_nSrcBlend = srcBlend; m_nDestBlend = destBlend;} void AddCollisionMeshToKdTree(); static void BuildKdTree(); // void AddToListByLock(); // void DeleteFromListByLock(); // ÀÌÆåÆ®Åø ½ºÅ² ¸®·Îµå ±â´É À§ÇÑ ÇÔ¼ö void ForceSetSkin( EtSkinHandle hSkin ) { m_hSkin = hSkin; m_pSkinInstance->CopySkinInfo( m_hSkin ); } };