DragonNest/Common/EtInterface/EtUITextureControl.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

264 lines
No EOL
7.2 KiB
C++

#include "StdAfx.h"
#include "EtUITextureControl.h"
#include "EtUIDialog.h"
#include "EtUIXML.h"
// 이 두개는 다른 프로젝트의 파일들이라 안쓰려고 했는데,
// 보니 EtUIDialog에서도 다이얼로그 텍스처 로딩할때 쓴다.
// 그래서 그냥 쓰기로 한다.
#include "EtLoader.h"
#include "EtResourceMng.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CEtUITextureControl::CEtUITextureControl( CEtUIDialog *pParent )
: CEtUIControl( pParent )
{
m_fBlendRate = 0.8f;
m_Scale = 1.f;
m_bManualControlColor = false;
m_bCreatedFromPropertyTextureFile = false;
m_fAddX = 0.0f;
m_fAddY = 0.0f;
}
CEtUITextureControl::~CEtUITextureControl(void)
{
//DeleteTexture();
if( m_bCreatedFromPropertyTextureFile )
SAFE_RELEASE_SPTR( m_hTexture );
}
void CEtUITextureControl::Initialize( SUIControlProperty *pProperty )
{
CEtUIControl::Initialize( pProperty );
if( ( pProperty ) && ( pProperty->StaticProperty.nStringIndex > 0 ) )
{
SetText( m_pParent->GetUIString( CEtUIXML::idCategory1, pProperty->StaticProperty.nStringIndex ) );
}
m_Scale = 1.f;
if( ( pProperty ) && ( pProperty->TextureControlProperty.szTextureFileName[0] != '\0' ))
{
if( m_bCreatedFromPropertyTextureFile )
SAFE_RELEASE_SPTR( m_hTexture );
m_hTexture = LoadResource( CEtResourceMng::GetInstance().GetFullName( pProperty->TextureControlProperty.szTextureFileName ).c_str(), RT_TEXTURE );
m_TextureUV.SetCoord( 0.0f, 0.0f, 1.0f, 1.0f );
m_fAddX = m_fAddY = 0.0f;
UpdateRects();
m_bCreatedFromPropertyTextureFile = true;
}
}
void CEtUITextureControl::Process( float fElapsedTime )
{
m_CurrentState = UI_STATE_NORMAL;
if( !IsShow() )
{
m_CurrentState = UI_STATE_HIDDEN;
}
else if( !IsEnable() )
{
m_CurrentState = UI_STATE_DISABLED;
}
if (m_bManualControlColor == false)
{
SUIElement *pElement = GetElement(0);
if( !pElement ) return;
pElement->TextureColor.Blend( m_CurrentState, fElapsedTime, m_fBlendRate );
pElement->FontColor.Blend( m_CurrentState, fElapsedTime, m_fBlendRate );
pElement->ShadowFontColor.Blend( m_CurrentState, fElapsedTime, m_fBlendRate );
}
}
DWORD CEtUITextureControl::GetTextureColor()
{
SUIElement *pElement = GetElement(0);
if( !pElement ) return 0;
return pElement->TextureColor.dwColor[UI_STATE_NORMAL];
}
void CEtUITextureControl::SetTextureColor(DWORD dwColor)
{
SUIElement *pElement = GetElement(0);
if( !pElement ) return;
pElement->TextureColor.dwCurrentColor = dwColor;
}
void CEtUITextureControl::Render( float fElapsedTime )
{
if( !m_hTexture )
return;
SUIElement *pElement = GetElement(0);
if( !pElement ) return;
SUICoord renderCoord(m_ControlCoord);
renderCoord.fWidth *= m_Scale;
renderCoord.fHeight *= m_Scale;
m_pParent->DrawSprite( m_hTexture, m_TextureUV, pElement->TextureColor.dwCurrentColor, renderCoord );
if( m_bExistTemplateTexture )
m_pParent->DrawSprite( m_Template.m_hTemplateTexture, pElement->TemplateUVCoord, pElement->TextureColor.dwCurrentColor, renderCoord );
else
m_pParent->DrawSprite( pElement->UVCoord, pElement->TextureColor.dwCurrentColor, renderCoord );
m_pParent->DrawDlgText( m_szText.c_str(), pElement, pElement->FontColor.dwCurrentColor, m_NewUICoord, -1, m_Property.TextureControlProperty.dwFontFormat );
}
void CEtUITextureControl::SetTexturePosition(float fX, float fY)
{
m_ControlCoord.SetPosition(fX, fY);
}
void CEtUITextureControl::UpdateRects()
{
m_NewUICoord = m_Property.UICoord;
m_NewUICoord.fX += 0.5f * m_fAddX * m_Property.UICoord.fWidth;
m_NewUICoord.fY += 0.5f * m_fAddY * m_Property.UICoord.fHeight;
m_NewUICoord.fWidth *= (1.0f - m_fAddX);
m_NewUICoord.fHeight *= (1.0f - m_fAddY);
//m_ControlCoord.SetCoord( m_Property.UICoord.fX, m_Property.UICoord.fY, m_TextureCoord.fWidth / m_pParent->GetScreenWidth(), m_Property.UICoord.fHeight );
m_ControlCoord.SetCoord( m_NewUICoord.fX, m_NewUICoord.fY, m_NewUICoord.fWidth, m_NewUICoord.fHeight );
}
void CEtUITextureControl::SetTexture( EtTextureHandle hTextureHandle )
{
if( !hTextureHandle ) return;
int nWidth = hTextureHandle->Width();
int nHeight = hTextureHandle->Height();
return SetTexture( hTextureHandle, 0, 0, nWidth, nHeight);
}
void CEtUITextureControl::SetTexture( EtTextureHandle hTextureHandle, int nX, int nY, int nWidth, int nHeight )
{
if( !hTextureHandle )
{
//CDebugSet::ToLogFile( "CEtUITextureControl::SetTexture, hTextureHandle is NULL!" );
return;
}
// 만약 지금 Property에 온 텍스처를 사용중인데,
// 새로 텍스처 설정이 들어오면 기존에 사용하던 텍스처를 지우고, 플래그를 꺼둔다.
if( m_bCreatedFromPropertyTextureFile )
{
SAFE_RELEASE_SPTR( m_hTexture );
m_bCreatedFromPropertyTextureFile = false;
}
//DeleteTexture();
// 그냥 포인터 복사다. 레퍼런스 카운터 증가같은거 없다.
m_hTexture = hTextureHandle;
/*m_TextureCoord.SetCoord( (float)nX, (float)nY, (float)nWidth, (float)nHeight );*/
m_TextureUV.SetCoord( nX / ( float )hTextureHandle->Width(),
nY / ( float )hTextureHandle->Height(),
nWidth / ( float )hTextureHandle->Width(),
nHeight / ( float )hTextureHandle->Height());
m_fAddX = 0.f;
m_fAddY = 0.f;
if( m_TextureUV.fX < 0.f ) {
m_fAddX = -m_TextureUV.fX;
m_TextureUV.fX = 0.f;
}
if( m_TextureUV.fY < 0.f ) {
m_fAddY = -m_TextureUV.fY;
m_TextureUV.fY = 0.f;
}
if( m_TextureUV.fX+m_TextureUV.fWidth > 1.f ) {
m_fAddX += m_TextureUV.fWidth - (1 - m_TextureUV.fX);
m_TextureUV.fWidth = 1 - m_TextureUV.fX;
}
if( m_TextureUV.fY+m_TextureUV.fHeight > 1.f ) {
m_fAddY += m_TextureUV.fHeight - (1 - m_TextureUV.fY);
m_TextureUV.fHeight = 1 - m_TextureUV.fY;
}
UpdateRects();
}
void CEtUITextureControl::SetFlipHTexture( EtTextureHandle hTextureHandle, int nX, int nY, int nWidth, int nHeight, bool bFlipH /*= false*/)
{
if( !hTextureHandle )
{
//CDebugSet::ToLogFile( "CEtUITextureControl::SetTexture, hTextureHandle is NULL!" );
return;
}
// 만약 지금 Property에 온 텍스처를 사용중인데,
// 새로 텍스처 설정이 들어오면 기존에 사용하던 텍스처를 지우고, 플래그를 꺼둔다.
if( m_bCreatedFromPropertyTextureFile )
{
SAFE_RELEASE_SPTR( m_hTexture );
m_bCreatedFromPropertyTextureFile = false;
}
//DeleteTexture();
// 그냥 포인터 복사다. 레퍼런스 카운터 증가같은거 없다.
m_hTexture = hTextureHandle;
/*m_TextureCoord.SetCoord( (float)nX, (float)nY, (float)nWidth, (float)nHeight );*/
m_TextureUV.SetCoord( nX / ( float )hTextureHandle->Width(),
nY / ( float )hTextureHandle->Height(),
nWidth / ( float )hTextureHandle->Width(),
nHeight / ( float )hTextureHandle->Height() );
if(bFlipH)
m_TextureUV.fWidth = 3.0f;
m_fAddX = 0.f;
m_fAddY = 0.f;
if( m_TextureUV.fX < 0.f ) {
m_fAddX = -m_TextureUV.fX;
m_TextureUV.fX = 0.f;
}
if( m_TextureUV.fY < 0.f ) {
m_fAddY = -m_TextureUV.fY;
m_TextureUV.fY = 0.f;
}
if( m_TextureUV.fX+m_TextureUV.fWidth > 1.f ) {
m_fAddX += m_TextureUV.fWidth - (1 - m_TextureUV.fX);
m_TextureUV.fWidth = 1 - m_TextureUV.fX;
}
if( m_TextureUV.fY+m_TextureUV.fHeight > 1.f ) {
m_fAddY += m_TextureUV.fHeight - (1 - m_TextureUV.fY);
m_TextureUV.fHeight = 1 - m_TextureUV.fY;
}
UpdateRects();
}
void CEtUITextureControl::DeleteTexture()
{
SAFE_RELEASE_SPTR( m_hTexture );
}
void CEtUITextureControl::Show( bool bShow )
{
if (bShow == false && m_bManualControlColor)
m_bManualControlColor = false;
CEtUIControl::Show(bShow);
}