/* 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; import :ForwardDeclarations; export namespace Crafter { struct Anchor2D { float x; float y; float width; float height; float offsetX; float offsetY; std::int32_t z; bool maintainAspectRatio; Anchor2D() = default; Anchor2D(float x, float y, float width, float height, float offsetX, float offsetY, std::int32_t z, bool maintainAspectRatio = false); }; struct Transform2D { Anchor2D anchor; ScaleData2D scaled; std::vector children; Transform2D() = default; Transform2D(Anchor2D anchor) : anchor(anchor) { } Transform2D(Transform2D&) = delete; Transform2D(Transform2D&&) = delete; Transform2D& operator=(Transform2D&) = delete; virtual ~Transform2D() = default; virtual void UpdatePosition(RendertargetBase<1>& window, Transform2D& parent) { ScaleElement(parent); for(Transform2D* child : children) { child->UpdatePosition(window, *this); } } virtual void UpdatePosition(RendertargetBase<3>& window, Transform2D& parent) { 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); } }; }