109 lines
2.4 KiB
C++
109 lines
2.4 KiB
C++
#include "dl_ui_sprite.h"
|
|
|
|
#ifndef DL_DISABLE_RENDER
|
|
#include "system/dl_system.h"
|
|
#include "render/dl_factory.h"
|
|
#include "ui/dl_ui_panel.h"
|
|
#include "ui/dl_ui_manager.h"
|
|
|
|
namespace dl::UI
|
|
{
|
|
|
|
void Sprite::SetMode(AutoSize auto_size, FillMode mode)
|
|
{
|
|
_autoSize = auto_size;
|
|
_fillMode = mode;
|
|
|
|
Position size;
|
|
switch (auto_size)
|
|
{
|
|
case AutoSize::NONE:
|
|
size = toPosition(Every::Zero(_sizeSet) ? g_factory->GetSpriteTexSize(_spr) : _sizeSet);
|
|
break;
|
|
case AutoSize::PANEL:
|
|
size = _panel ?
|
|
toPosition(_panel->GetSize()) :
|
|
toPosition(g_system->GetWindowSize()) / g_ui->GetScale();
|
|
break;
|
|
case AutoSize::WINDOW:
|
|
size = toPosition(g_system->GetWindowSize()) / g_ui->GetScale();
|
|
break;
|
|
default:
|
|
assert(0);
|
|
break;
|
|
}
|
|
|
|
|
|
switch (_fillMode)
|
|
{
|
|
case FillMode::STATIC:
|
|
_spr->SetQuad(createQuad(toPosition(g_factory->GetSpriteTexSize(_spr)), false));
|
|
break;
|
|
case FillMode::STRETCH:
|
|
_spr->SetQuad(createQuad(size, false));
|
|
break;
|
|
case FillMode::RATIO_MOVIE:
|
|
{
|
|
Position tex_size = toPosition(g_factory->GetSpriteTexSize(_spr));
|
|
Position k = size / tex_size;
|
|
// 以较小者放大
|
|
float s = Select::Min(k);
|
|
_spr->SetQuad(createQuad(tex_size * s, false));
|
|
}
|
|
break;
|
|
case FillMode::RATIO_OUT:
|
|
{
|
|
Position tex_size = toPosition(g_factory->GetSpriteTexSize(_spr));
|
|
Position k = size / tex_size;
|
|
// 以较大者放大
|
|
float s = Select::Max(k);
|
|
_spr->SetQuad(createQuad(tex_size * s, false));
|
|
}
|
|
break;
|
|
default:
|
|
assert(0);
|
|
break;
|
|
}
|
|
|
|
_cptElemData._hv = Align::LT;
|
|
_cptElemData._size = _spr->GetSize();
|
|
}
|
|
|
|
void Sprite::SetElementData(const Align::Direction2& hv, const Position& pos)
|
|
{
|
|
_cptElemData._size = GetSize();
|
|
_cptElemData._anchor = {};
|
|
_cptElemData._hv = hv;
|
|
_cptElemData._pos = pos;
|
|
|
|
// 在组内则更新位置
|
|
if (_panel)
|
|
_panel->OnChangeElementData(&_cpt);
|
|
}
|
|
|
|
void Sprite::SetEDOrderOffset(int order_offset)
|
|
{
|
|
_cptElemData._orderOffset = order_offset;
|
|
}
|
|
|
|
void Sprite::SetSprite(gcSprite spr)
|
|
{
|
|
// 复用创建时的逻辑:为新精灵创建独立Coor并设置UI标记
|
|
if (!spr->IsOwnCoor())
|
|
{
|
|
Coor* coor = Coor::Create(spr->GetCoor());
|
|
spr->SetCoor(coor, true);
|
|
}
|
|
// 沿用原有绘制层级
|
|
spr->SetOrder(_spr->GetOrder());
|
|
_spr = spr;
|
|
_spr->SetUI(true);
|
|
SetMode(_autoSize, _fillMode);
|
|
// 已加入面板时,重新定位新精灵的Coor(原Coor随旧精灵被替换,AddCpt不会再次处理)
|
|
if (_panel)
|
|
_panel->OnChangeElementData(&_cpt);
|
|
}
|
|
|
|
}
|
|
|
|
#endif |