Crafter.Graphics/interfaces/Crafter.Graphics-Transform2D.cppm

77 lines
2.8 KiB
Text
Raw Permalink Normal View History

2026-03-09 20:10:19 +01:00
/*
Crafter®.Graphics
Copyright (C) 2026 Catcrafts®
catcrafts.net
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License version 3.0 as published by the Free Software Foundation;
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
export module Crafter.Graphics:Transform2D;
import std;
import :Types;
2026-03-12 21:13:53 +01:00
import :ForwardDeclarations;
2026-03-09 20:10:19 +01:00
export namespace Crafter {
struct Anchor2D {
float x;
float y;
float width;
float height;
float offsetX;
float offsetY;
2026-03-22 21:08:02 +01:00
std::uint8_t z;
2026-03-09 20:10:19 +01:00
bool maintainAspectRatio;
Anchor2D() = default;
2026-03-22 21:08:02 +01:00
Anchor2D(float x, float y, float width, float height, float offsetX, float offsetY, std::uint8_t z, bool maintainAspectRatio = false);
2026-03-09 20:10:19 +01:00
};
2026-03-12 21:13:53 +01:00
2026-03-09 20:10:19 +01:00
struct Transform2D {
Anchor2D anchor;
ScaleData2D scaled;
std::vector<Transform2D*> children;
2026-03-10 22:32:50 +01:00
Transform2D() = default;
2026-03-12 21:13:53 +01:00
Transform2D(Anchor2D anchor) : anchor(anchor) {
}
2026-03-09 20:10:19 +01:00
Transform2D(Transform2D&) = delete;
Transform2D(Transform2D&&) = delete;
Transform2D& operator=(Transform2D&) = delete;
virtual ~Transform2D() = default;
2026-03-12 21:13:53 +01:00
2026-04-11 18:48:00 +02:00
virtual void UpdatePosition(RendertargetBase& window, Transform2D& parent) {
2026-03-12 21:13:53 +01:00
ScaleElement(parent);
for(Transform2D* child : children) {
child->UpdatePosition(window, *this);
}
}
void ScaleElement(Transform2D& parent) {
if(anchor.maintainAspectRatio) {
if(parent.scaled.size.x > parent.scaled.size.y) {
scaled.size.x = anchor.width * parent.scaled.size.y;
scaled.size.y = anchor.height * parent.scaled.size.y;
} else {
scaled.size.x = anchor.width * parent.scaled.size.x;
scaled.size.y = anchor.height * parent.scaled.size.x;
}
} else {
scaled.size.x = anchor.width * parent.scaled.size.x;
scaled.size.y = anchor.height * parent.scaled.size.y;
}
scaled.position.x = parent.scaled.position.x + (anchor.x * parent.scaled.size.x - anchor.offsetX * scaled.size.x);
scaled.position.y = parent.scaled.position.y + (anchor.y * parent.scaled.size.y - anchor.offsetY * scaled.size.y);
}
2026-03-09 20:10:19 +01:00
};
}