integer math
This commit is contained in:
parent
4428cfe12c
commit
5ff43e240c
27 changed files with 922 additions and 1011 deletions
|
|
@ -18,38 +18,100 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
*/
|
||||
|
||||
export module Crafter.Graphics:UiElement;
|
||||
import :UiElementBuffer;
|
||||
import :UiElementMouse;
|
||||
import std;
|
||||
import Crafter.Event;
|
||||
import :Types;
|
||||
|
||||
export namespace Crafter {
|
||||
class Font;
|
||||
class UiElementBase {
|
||||
class Window;
|
||||
class UiElement {
|
||||
public:
|
||||
float z;
|
||||
float anchorX;
|
||||
float anchorY;
|
||||
std::int_fast32_t z;
|
||||
std::int_fast32_t anchorX;
|
||||
std::int_fast32_t anchorY;
|
||||
std::int_fast32_t anchorOffsetX;
|
||||
std::int_fast32_t anchorOffsetY;
|
||||
std::uint_fast32_t relativeWidth;
|
||||
std::uint_fast32_t relativeHeight;
|
||||
bool ignoreScaling;
|
||||
float relativeWidth;
|
||||
float relativeHeight;
|
||||
float anchorOffsetX;
|
||||
float anchorOffsetY;
|
||||
std::vector<std::unique_ptr<UiElementBase>> children;
|
||||
std::vector<UiElement*> children;
|
||||
ScaleData scaled;
|
||||
|
||||
UiElementBase(float anchorX, float anchorY, float relativeWidth, float relativeHeight, float anchorOffsetX = 0.5, float anchorOffsetY = 0.5, float z = 0, bool ignoreScaling = false);
|
||||
UiElementBase(UiElementBase&&) noexcept = default;
|
||||
UiElementBase& operator=(UiElementBase&&) noexcept = default;
|
||||
UiElement(std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX = FractionalToMapped(0.5), std::int_fast32_t anchorOffsetY = FractionalToMapped(0.5), std::int_fast32_t z = 0, bool ignoreScaling = false);
|
||||
UiElement(UiElement&) = delete;
|
||||
UiElement& operator=(UiElement&) = delete;
|
||||
// void UpdatePosition(Window& window);
|
||||
// void UpdatePosition(UiElement& parent);
|
||||
};
|
||||
|
||||
template<bool Buffer, bool Mouse>
|
||||
class UiElement : public UiElementBase{
|
||||
class UiElementMouse {
|
||||
public:
|
||||
std::conditional_t<Buffer, UiElementBuffer, std::monostate> buffer;
|
||||
std::conditional_t<Buffer, UiElementMouse, std::monostate> mouse;
|
||||
UiElement(float anchorX, float anchorY, float relativeWidth, float relativeHeight, float anchorOffsetX = 0.5, float anchorOffsetY = 0.5, float z = 0, bool ignoreScaling = false) : UiElementBase(anchorX, anchorY, relativeWidth, relativeHeight, anchorOffsetX, anchorOffsetY, z, ignoreScaling = false) {}
|
||||
UiElement(float anchorX, float anchorY, float relativeWidth, float relativeHeight, float anchorOffsetX = 0.5, float anchorOffsetY = 0.5, float z = 0, bool ignoreScaling = false) requires (Buffer) : UiElementBase(anchorX, anchorY, relativeWidth, relativeHeight, anchorOffsetX, anchorOffsetY, z, ignoreScaling), buffer(*this) {}
|
||||
UiElement(std::uint_fast32_t width, std::uint_fast32_t height, float anchorX, float anchorY, float relativeWidth, float relativeHeight, float anchorOffsetX = 0.5, float anchorOffsetY = 0.5, float z = 0, bool ignoreScaling = false) requires (Buffer) : UiElementBase(anchorX, anchorY, relativeWidth, relativeHeight, anchorOffsetX, anchorOffsetY, z, ignoreScaling), buffer(*this, width, height) {}
|
||||
ScaleData clickArea;
|
||||
Event<MouseMoveEvent> onMouseMove;
|
||||
Event<MouseMoveEvent> onMouseEnter;
|
||||
Event<MouseMoveEvent> onMouseLeave;
|
||||
Event<MousePoint> onMouseRightClick;
|
||||
Event<MousePoint> onMouseLeftClick;
|
||||
Event<MousePoint> onMouseRightHold;
|
||||
Event<MousePoint> onMouseLeftHold;
|
||||
Event<MousePoint> onMouseRightRelease;
|
||||
Event<MousePoint> onMouseLeftRelease;
|
||||
};
|
||||
|
||||
class UiElementBuffer {
|
||||
public:
|
||||
std::uint_fast32_t width;
|
||||
std::uint_fast32_t height;
|
||||
UiElementBuffer() = default;
|
||||
UiElementBuffer(std::uint_fast32_t width, std::uint_fast32_t height);
|
||||
virtual void Create(std::uint_fast32_t width, std::uint_fast32_t height) = 0;
|
||||
virtual void Resize(std::uint_fast32_t width, std::uint_fast32_t height) = 0;
|
||||
virtual void Resize(std::uint_fast32_t width, std::uint_fast32_t height, std::uint_fast32_t offsetX, std::uint_fast32_t offsetY) = 0;
|
||||
virtual void ResizeNearestNeighbour(std::uint_fast32_t width, std::uint_fast32_t height) = 0;
|
||||
virtual void ResizeBicubic(std::uint_fast32_t width, std::uint_fast32_t height) = 0;
|
||||
virtual void Destroy() = 0;
|
||||
virtual void Copy(Pixel_BU8_GU8_RU8_AU8* dst) const = 0;
|
||||
virtual void CopyNearestNeighbour(Pixel_BU8_GU8_RU8_AU8* dst, std::uint_fast32_t dstWidth, std::uint_fast32_t dstHeight) const = 0;
|
||||
virtual void CopyBicubic(Pixel_BU8_GU8_RU8_AU8* dst, std::uint_fast32_t dstWidth, std::uint_fast32_t dstHeight) const = 0;
|
||||
virtual void Write(Pixel_BU8_GU8_RU8_AU8* pixels) = 0;
|
||||
virtual void Write(std::uint_fast32_t x, std::uint_fast32_t y, Pixel_BU8_GU8_RU8_AU8 pixel) = 0;
|
||||
virtual Pixel_BU8_GU8_RU8_AU8 Read(std::uint_fast32_t x, std::uint_fast32_t y) const = 0;
|
||||
virtual const Pixel_BU8_GU8_RU8_AU8* Read() const = 0;
|
||||
virtual Pixel_BU8_GU8_RU8_AU8* Get() = 0;
|
||||
virtual void Store() = 0;
|
||||
};
|
||||
|
||||
class UiElementBufferBufferBase : public UiElementBuffer {
|
||||
public:
|
||||
std::vector<Pixel_BU8_GU8_RU8_AU8> buffer;
|
||||
UiElementBufferBufferBase() = default;
|
||||
UiElementBufferBufferBase(std::uint_fast32_t width, std::uint_fast32_t height);
|
||||
void Create(std::uint_fast32_t width, std::uint_fast32_t height) override;
|
||||
void Resize(std::uint_fast32_t width, std::uint_fast32_t height) override;
|
||||
void Resize(std::uint_fast32_t width, std::uint_fast32_t height, std::uint_fast32_t offsetX, std::uint_fast32_t offsetY) override;
|
||||
void ResizeNearestNeighbour(std::uint_fast32_t width, std::uint_fast32_t height) override;
|
||||
void ResizeBicubic(std::uint_fast32_t width, std::uint_fast32_t height) override;
|
||||
void Destroy() override;
|
||||
void Copy(Pixel_BU8_GU8_RU8_AU8* dst) const override;
|
||||
void CopyNearestNeighbour(Pixel_BU8_GU8_RU8_AU8* dst, std::uint_fast32_t dstWidth, std::uint_fast32_t dstHeight) const override;
|
||||
void CopyBicubic(Pixel_BU8_GU8_RU8_AU8* dst, std::uint_fast32_t dstWidth, std::uint_fast32_t dstHeight) const override;
|
||||
void Write(Pixel_BU8_GU8_RU8_AU8* pixels) override;
|
||||
void Write(std::uint_fast32_t x, std::uint_fast32_t y, Pixel_BU8_GU8_RU8_AU8 pixel) override;
|
||||
Pixel_BU8_GU8_RU8_AU8 Read(std::uint_fast32_t x, std::uint_fast32_t y) const override;
|
||||
const Pixel_BU8_GU8_RU8_AU8* Read() const override;
|
||||
Pixel_BU8_GU8_RU8_AU8* Get() override;
|
||||
void Store() override;
|
||||
};
|
||||
|
||||
class UiElementBufferBuffer : public UiElement, public UiElementBufferBufferBase {
|
||||
public:
|
||||
UiElementBufferBuffer(std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX = FractionalToMapped(0.5), std::int_fast32_t anchorOffsetY = FractionalToMapped(0.5), std::int_fast32_t z = 0, bool ignoreScaling = false);
|
||||
UiElementBufferBuffer(std::uint_fast32_t width, std::uint_fast32_t height, std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX = FractionalToMapped(0.5), std::int_fast32_t anchorOffsetY = FractionalToMapped(0.5), std::int_fast32_t z = 0, bool ignoreScaling = false);
|
||||
};
|
||||
|
||||
class UiElementBufferMouseBuffer : public UiElementBufferBuffer, public UiElementMouse {
|
||||
public:
|
||||
UiElementBufferMouseBuffer(std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX = FractionalToMapped(0.5), std::int_fast32_t anchorOffsetY = FractionalToMapped(0.5), std::int_fast32_t z = 0, bool ignoreScaling = false);
|
||||
UiElementBufferMouseBuffer(std::uint_fast32_t width, std::uint_fast32_t height, std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX = FractionalToMapped(0.5), std::int_fast32_t anchorOffsetY = FractionalToMapped(0.5), std::int_fast32_t z = 0, bool ignoreScaling = false);
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue