Files
WickedEngine/Editor/SpriteRectWindow.cpp
T
2024-09-10 08:07:07 +02:00

132 lines
3.8 KiB
C++

#include "stdafx.h"
#include "Editor.h"
#include "SpriteRectWindow.h"
void SpriteRectWindow::Create(EditorComponent* editor)
{
wi::gui::Window::Create("Select an area within the atlas...");
SetLocalizationEnabled(false);
SetSize(XMFLOAT2(300, 300));
spriteButton.Create("");
spriteButton.OnDragStart([=](wi::gui::EventArgs args) {
XMFLOAT2 pos = spriteButton.GetPos();
XMFLOAT2 size = spriteButton.GetSize();
dragStartUV = wi::math::InverseLerp(pos, XMFLOAT2(pos.x + size.x, pos.y + size.y), args.clickPos);
dragStartUV.x = saturate(dragStartUV.x);
dragStartUV.y = saturate(dragStartUV.y);
dragEndUV = dragStartUV;
});
spriteButton.OnDrag([=](wi::gui::EventArgs args) {
XMFLOAT2 pos = spriteButton.GetPos();
XMFLOAT2 size = spriteButton.GetSize();
dragEndUV = wi::math::InverseLerp(pos, XMFLOAT2(pos.x + size.x, pos.y + size.y), args.clickPos);
dragEndUV.x = saturate(dragEndUV.x);
dragEndUV.y = saturate(dragEndUV.y);
});
spriteButton.OnDragEnd([=](wi::gui::EventArgs args) {
XMFLOAT2 pos = spriteButton.GetPos();
XMFLOAT2 size = spriteButton.GetSize();
dragEndUV = wi::math::InverseLerp(pos, XMFLOAT2(pos.x + size.x, pos.y + size.y), args.clickPos);
dragEndUV.x = saturate(dragEndUV.x);
dragEndUV.y = saturate(dragEndUV.y);
muladd = XMFLOAT4(
saturate(std::abs(dragEndUV.x - dragStartUV.x)),
saturate(std::abs(dragEndUV.y - dragStartUV.y)),
saturate(std::min(dragStartUV.x, dragEndUV.x)),
saturate(std::min(dragStartUV.y, dragEndUV.y))
);
});
AddWidget(&spriteButton);
okButton.Create("OK");
okButton.OnClick([=](wi::gui::EventArgs args) {
if (onAccepted != nullptr)
onAccepted();
SetVisible(false);
});
AddWidget(&okButton);
SetPos(XMFLOAT2(200, 100));
}
void SpriteRectWindow::ResizeLayout()
{
wi::gui::Window::ResizeLayout();
XMFLOAT2 size = GetWidgetAreaSize();
spriteButton.SetSize(XMFLOAT2(size.x, size.y - okButton.GetSize().y * 2 - 1));
spriteButton.SetPos(XMFLOAT2(0, 0));
okButton.SetSize(XMFLOAT2(size.x, okButton.GetSize().y));
okButton.SetPos(XMFLOAT2(0, spriteButton.GetSize().y));
}
void SpriteRectWindow::Update(const wi::Canvas& canvas, float dt)
{
wi::gui::Window::Update(canvas, dt);
if (!IsVisible())
return;
if (GetPointerHitbox().intersects(spriteButton.hitBox))
{
wi::input::SetCursor(wi::input::CURSOR_CROSS);
}
}
void SpriteRectWindow::Render(const wi::Canvas& canvas, wi::graphics::CommandList cmd) const
{
wi::gui::Window::Render(canvas, cmd);
if (!IsVisible())
return;
ApplyScissor(canvas, this->scissorRect, cmd);
XMFLOAT2 pos = spriteButton.GetPos();
XMFLOAT2 size = spriteButton.GetSize();
XMFLOAT2 end = XMFLOAT2(pos.x + size.x, pos.y + size.y);
wi::image::Params params;
params.sampleFlag = wi::image::SAMPLEMODE_WRAP;
params.quality = wi::image::QUALITY_NEAREST;
params.pos = XMFLOAT3(pos.x, pos.y, 0);
params.siz = size;
params.color = XMFLOAT4(1.7f, 1.7f, 1.7f, 1);
params.enableDrawRect(XMFLOAT4(0, 0, size.x / 8, size.y / 8));
wi::image::Draw(wi::texturehelper::getCheckerBoard(), params, cmd);
params.disableDrawRect();
params.quality = wi::image::QUALITY_LINEAR;
params.color = XMFLOAT4(1, 1, 1, 1);
wi::image::Draw(sprite.getTexture(), params, cmd);
XMFLOAT2 rectstart = wi::math::Lerp(pos, end, dragStartUV);
XMFLOAT2 rectend = wi::math::Lerp(pos, end, dragEndUV);
params.pos = XMFLOAT3(rectstart.x, rectstart.y, 0);
params.siz = XMFLOAT2(rectend.x - rectstart.x, rectend.y - rectstart.y);
params.color = shadow_color;
params.color.w = 0.5f;
wi::image::Draw(nullptr, params, cmd);
}
void SpriteRectWindow::SetSprite(const wi::Sprite& sprite)
{
this->sprite = sprite;
}
void SpriteRectWindow::ResetSelection()
{
dragStartUV = XMFLOAT2(0, 0);
dragEndUV = XMFLOAT2(0, 0);
muladd = XMFLOAT4(1, 1, 0, 0);
}
void SpriteRectWindow::OnAccepted(std::function<void()> cb)
{
onAccepted = cb;
}