Files
2022-10-26 12:25:11 +08:00

374 lines
8.6 KiB
Objective-C

// effectbody.h
#ifndef _EFFECT_EFFECTBODY_H_
#define _EFFECT_EFFECTBODY_H_
#include "eelementparticle.h"
#include <client/3dengine/3dfileaccess/wzunit/wzunitdraw.h>
#include <list>
#include <vector>
#include <algorithm>
class CEElementFlatChain;
//------------------------------------------------------------------------------
/**
@class CEffectBody
*/
class CEffectBody : public CEElementParticle
{
public:
#ifdef _DEBUG
int m_CreateFrom;
virtual int GetAllocatedMemorySize();
#endif
public:
// 생성자/소멸자
CEffectBody();
virtual ~CEffectBody();
// 초기화
virtual void Clear();
// 생성 정보 설정
virtual void SetElementInfo( St_ElementCreate* pElement );
// 생성
virtual bool Create( bool bFirst );
// 파괴
virtual void Destroy();
// 메모리 반납
virtual void Free();
// 자식 생성
bool CreateElement( St_ElementCreate* pec, int iRate = 100 );
// Move (시뮬레이션)
_ENUM_RESULT_EFFECT_MOVE Move( DWORD dwTick, bool& bSimulate, int iRate );
// 랜더링
virtual void Render();
// 월드 위치/회전/크기 설정
virtual void SetResultMatrix( const WzVector& wvPos, const WzVector& wvRot, const WzVector& wvScale );
virtual void SetResultMatrix( const WzMatrix* pwmPos, const WzMatrix* pwmRot = NULL, const WzMatrix* pwmScale = NULL);
// 타입 얻기
virtual ENUM_EELEMENT_TYPE GetType() const;
// 수명 정보 (외부에서 강제 설정하는 경우)
void SetLifeInfo( DWORD dwMakeTime, DWORD dwLife );
// 타겟 위치 설정
WZEFF_API void SetAllElementTargetPos( const WzVector& wvPos );
// BodyID 설정/얻기
void SetBodyID( WzID wzID );
WzID GetBodyID() const;
// 랜더링 타입 설정
void SetRenderType( ENUM_ALTERNATIVE_RENDER eRenderType );
ENUM_ALTERNATIVE_RENDER GetRenderType() const;
// 스피드 설정
void SetSpeedOfSecond( float fSS );
// 크기 비율 설정
void SetAccmulateScale( float fScale );
float GetAccmulateScale();
// 페이드 아웃 효과 적용 설정/얻기
void SetFadeOutEffect( bool bl );
bool IsUseFade() const;
// 초당 페이드 아웃 값 설정
void SetFadeOfSec( float fValue );
// 페이드 아웃 시작
void FadeOut();
// 굴절율 설정/얻기
void SetRefractionRate( float fRefractionRate );
float GetRefractionRate() const;
// 굴절 알파 설정/얻기
void SetRefractionAlpha( float fRefractionAlpha );
float GetRefractionAlpha() const;
// 컬링 적용 설정/얻기
void SetCulling( bool bCull );
bool UseCulling() const;
// 보이기/감추기
void SetShow( bool b );
bool IsShow() const;
// 외부에서 강제로 죽임
void KillSelf();
// FlatChain 얻기
CEElementFlatChain* GetFlatChainPtr();
// 기본 바운딩 박스 설정
void SetBaseBBox( const BvAABB& bbox );
// 바운딩 박스 얻기
const BvAABB& GetBBox();
virtual void GetTextureHandle( std::vector<HANDLE>& HandleArray );
virtual void ReloadTexture();
protected:
// 자식 해제
void FreeElement( CEElementBase* pElem );
// 모든 자식들 제거
void DestroyAllElements();
// Move (자식들)
void MoveElement( DWORD dwTick, int iRate );
// 바운딩 박스 갱신
void UpdateBBox();
// 사운드 정보 추가
void AddSoundInfo( const St_ElementCreate* pElement, DWORD dwMakeTime );
// 모든 사운드 정보 초기화
void InitAllSoundInfos();
// 모든 사운드 정보 해제
void FreeAllSoundInfos();
// 사운드 처리
void ProcessSound();
protected:
std::list<CEElementBase*> m_lstElement;
std::vector<St_SoundInfo*> m_lstSndInfo;
CEElementFlatChain* m_pFlatChain;
ENUM_ALTERNATIVE_RENDER m_eRenderType;
WzID m_wzBodyID; // BodyID
float m_fSpeedToSecond; // 초당 스피드
float m_fAccmulateScale; // 크기 비율
bool m_bUseFade; // 죽을때 페이드 효과
float m_fFadeOfSec; // 투명도 지속 시간
bool m_bFadeOut; // 페이드 아웃 시작
long m_lnCurFadeRemainTick; // 현재 남은 페이드 지속 Tick
float m_fRefractionRate; // 외곡 율 0~1사이 값
float m_fRefractionAlpha; // 외곡 알파도 ( 0 - Diffuse 100%, 1 - 외곡 100% )
bool m_bUseCull; // 컬링 여부
bool m_bShow; // 보이기 여부
bool m_bKillSelf; // 자살 여부
BvAABB m_baseBBox; // 기본 바운딩 박스
BvAABB m_BBox; // 현재 바운딩 박스
};
//------------------------------------------------------------------------------
/**
*/
inline ENUM_EELEMENT_TYPE CEffectBody::GetType() const
{
return EET_BODY;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetBodyID( WzID wzID )
{
m_wzBodyID = wzID;
}
//------------------------------------------------------------------------------
/**
*/
inline WzID CEffectBody::GetBodyID() const
{
return m_wzBodyID;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetRenderType( ENUM_ALTERNATIVE_RENDER eRenderType )
{
m_eRenderType = eRenderType;
}
//------------------------------------------------------------------------------
/**
*/
inline ENUM_ALTERNATIVE_RENDER CEffectBody::GetRenderType() const
{
return m_eRenderType;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetSpeedOfSecond( float fSS )
{
m_fSpeedToSecond = fSS;
}
//------------------------------------------------------------------------------
/**
*/
inline float CEffectBody::GetAccmulateScale()
{
return m_fAccmulateScale;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetAccmulateScale( float fScale )
{
m_fAccmulateScale = fScale;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetFadeOutEffect( bool bl )
{
m_bUseFade = bl;
}
//------------------------------------------------------------------------------
/**
*/
inline bool CEffectBody::IsUseFade() const
{
return m_bUseFade;
}
//------------------------------------------------------------------------------
/**.
*/
inline void CEffectBody::SetFadeOfSec( float fValue )
{
m_fFadeOfSec = fValue;
m_lnCurFadeRemainTick = (long)( 1000.0f * m_fFadeOfSec );
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::FadeOut()
{
m_bFadeOut = true;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetRefractionRate( float fRefractionRate )
{
m_fRefractionRate = fRefractionRate;
}
//------------------------------------------------------------------------------
/**
*/
inline float CEffectBody::GetRefractionRate() const
{
return m_fRefractionRate;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetRefractionAlpha( float fRefractionAlpha )
{
m_fRefractionAlpha = fRefractionAlpha;
}
//------------------------------------------------------------------------------
/**
*/
inline float CEffectBody::GetRefractionAlpha() const
{
return m_fRefractionAlpha;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetCulling( bool bCull )
{
m_bUseCull = bCull;
}
//------------------------------------------------------------------------------
/**
*/
inline bool CEffectBody::UseCulling() const
{
return m_bUseCull;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetShow( bool b )
{
m_bShow = b;
}
//------------------------------------------------------------------------------
/**
*/
inline bool CEffectBody::IsShow() const
{
return m_bShow;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::KillSelf()
{
m_bKillSelf = true;
}
//------------------------------------------------------------------------------
/**
*/
inline CEElementFlatChain* CEffectBody::GetFlatChainPtr()
{
return m_pFlatChain;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::SetBaseBBox( const BvAABB& bbox )
{
m_baseBBox = bbox;
}
//------------------------------------------------------------------------------
/**
*/
inline void CEffectBody::UpdateBBox()
{
m_BBox.m_wvMin = m_wvRealPos + m_baseBBox.m_wvMin;
m_BBox.m_wvMax = m_wvRealPos + m_baseBBox.m_wvMax;
}
//------------------------------------------------------------------------------
/**
*/
inline const BvAABB& CEffectBody::GetBBox()
{
return m_BBox;
}
#endif // _EFFECT_EFFECTBODY_H_