Support GPU Primitives as constexpr

This commit is contained in:
Jaby 2023-05-24 20:55:43 +02:00
parent 3c22e70e94
commit f77750c054
4 changed files with 124 additions and 121 deletions

View File

@ -7,6 +7,7 @@ include $(JABY_ENGINE_DIR)/lib/Wildcard.mk
SRCS = $(call rwildcard, src, c cpp) SRCS = $(call rwildcard, src, c cpp)
INCLUDES += -I$(JABY_ENGINE_DIR)/include INCLUDES += -I$(JABY_ENGINE_DIR)/include
#CCFLAGS += -save-temps=obj
include $(JABY_ENGINE_DIR)/lib/Makefile include $(JABY_ENGINE_DIR)/lib/Makefile
include $(JABY_ENGINE_DIR)/lib/PSEXETarget.mk include $(JABY_ENGINE_DIR)/lib/PSEXETarget.mk

View File

@ -11,6 +11,71 @@ enum LBA {
__jabyengine_end_lba_request __jabyengine_end_lba_request
}; };
// Some default values for the objects
static constexpr auto TriangleColor = JabyEngine::GPU::Color24(0x0, 0xFF, 0xFF);
static constexpr auto TriangleArea = JabyEngine::GPU::AreaI16({0, 0}, {64, 64});
static constexpr auto TriangleTPage = JabyEngine::GPU::TPage(320, 0, JabyEngine::GPU::SemiTransparency::B_Half_add_F_Half, JabyEngine::GPU::TexturePageColor::$4bit);
static constexpr auto TriangleClut = JabyEngine::GPU::PageClut(320, 511);
static constexpr auto RectangleColor = JabyEngine::GPU::Color24(0x80, 0x80, 0xFF);
static constexpr auto RectangleArea = JabyEngine::GPU::AreaI16({0, TriangleArea.size.height}, {80, 80});
static constexpr auto RectangleTPage = JabyEngine::GPU::TPage(320, 256, JabyEngine::GPU::SemiTransparency::B_Half_add_F_Half, JabyEngine::GPU::TexturePageColor::$4bit);
static constexpr auto RectangleClut = JabyEngine::GPU::PageClut(320, 510);
static constexpr const JabyEngine::GPU::POLY_F3 triangle1({
{TriangleArea.position.x, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.size.height},
{TriangleArea.position.x, TriangleArea.size.height}},
TriangleColor
);
static constexpr const JabyEngine::GPU::POLY_FT3 triangle2({
{TriangleArea.position.x, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.size.height}},{
// Texture
{TriangleArea.position.x, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.size.height}},
TriangleTPage,
TriangleClut,
JabyEngine::GPU::Color24::Grey()
);
static constexpr const JabyEngine::GPU::POLY_G3 triangle3({
{triangle1.vertex0.move(TriangleArea.size.width, 0), JabyEngine::GPU::Color24::Red()},
{triangle1.vertex1.move(TriangleArea.size.width, 0), JabyEngine::GPU::Color24::Green()},
{triangle1.vertex2.move(TriangleArea.size.width, 0), JabyEngine::GPU::Color24::Blue()}}
);
static constexpr const JabyEngine::GPU::POLY_GT3 triangle4({
{triangle2.vertex0.move(TriangleArea.size.width, 0), triangle2.page0, JabyEngine::GPU::Color24::Red()},
{triangle2.vertex1.move(TriangleArea.size.width, 0), triangle2.page1, JabyEngine::GPU::Color24::Blue()},
{triangle2.vertex2.move(TriangleArea.size.width, 0), triangle2.page2, JabyEngine::GPU::Color24::Green()}},
TriangleTPage,
TriangleClut
);
static constexpr const JabyEngine::GPU::POLY_F4 rectangle1(RectangleArea, RectangleColor);
static constexpr const JabyEngine::GPU::POLY_FT4 rectangle2({
RectangleArea.position.move(RectangleArea.size.width, 0), RectangleArea.size}, {0, 0},
RectangleTPage,
RectangleClut,
JabyEngine::GPU::Color24::Grey()
);
static constexpr const JabyEngine::GPU::POLY_G4 rectangle3(
{RectangleArea.position.move(RectangleArea.size.width*2, 0), RectangleArea.size}, {
JabyEngine::GPU::Color24::Red(),
JabyEngine::GPU::Color24::Blue(),
JabyEngine::GPU::Color24::Green(),
JabyEngine::GPU::Color24::White()});
static constexpr const JabyEngine::GPU::POLY_GT4 rectangle4(
{RectangleArea.position.move(RectangleArea.size.width*3, 0), RectangleArea.size}, {0, 0},
RectangleTPage,
RectangleClut, {
JabyEngine::GPU::Color24::Red(),
JabyEngine::GPU::Color24::Blue(),
JabyEngine::GPU::Color24::Green(),
JabyEngine::GPU::Color24::White()}
);
static void load_assets() { static void load_assets() {
static const JabyEngine::CDFile Assets[] = { static const JabyEngine::CDFile Assets[] = {
JabyEngine::CDFileBuilder::simple_tim(LBA::FONT, JabyEngine::SimpleTIM(320, 0, 320, 511)), JabyEngine::CDFileBuilder::simple_tim(LBA::FONT, JabyEngine::SimpleTIM(320, 0, 320, 511)),
@ -41,70 +106,6 @@ static void load_assets() {
} }
void main() { void main() {
static constexpr auto TriangleColor = JabyEngine::GPU::Color24(0x0, 0xFF, 0xFF);
static constexpr auto TriangleArea = JabyEngine::GPU::AreaI16({0, 0}, {64, 64});
static constexpr auto TriangleTPage = JabyEngine::GPU::TPage(320, 0, JabyEngine::GPU::SemiTransparency::B_Half_add_F_Half, JabyEngine::GPU::TexturePageColor::$4bit);
static constexpr auto TriangleClut = JabyEngine::GPU::PageClut(320, 511);
static constexpr auto RectangleColor = JabyEngine::GPU::Color24(0x80, 0x80, 0xFF);
static constexpr auto RectangleArea = JabyEngine::GPU::AreaI16({0, TriangleArea.size.height}, {80, 80});
static constexpr auto RectangleTPage = JabyEngine::GPU::TPage(320, 256, JabyEngine::GPU::SemiTransparency::B_Half_add_F_Half, JabyEngine::GPU::TexturePageColor::$4bit);
static constexpr auto RectangleClut = JabyEngine::GPU::PageClut(320, 510);
const JabyEngine::GPU::POLY_F3 triangle1({
{TriangleArea.position.x, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.size.height},
{TriangleArea.position.x, TriangleArea.size.height}},
TriangleColor
);
const JabyEngine::GPU::POLY_FT3 triangle2({
{TriangleArea.position.x, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.size.height}},{
// Texture
{TriangleArea.position.x, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.position.y},
{TriangleArea.size.width, TriangleArea.size.height}},
TriangleTPage,
TriangleClut,
JabyEngine::GPU::Color24::Grey()
);
const JabyEngine::GPU::POLY_G3 triangle3({
{triangle1.vertex0.move(TriangleArea.size.width, 0), JabyEngine::GPU::Color24::Red()},
{triangle1.vertex1.move(TriangleArea.size.width, 0), JabyEngine::GPU::Color24::Green()},
{triangle1.vertex2.move(TriangleArea.size.width, 0), JabyEngine::GPU::Color24::Blue()}}
);
const JabyEngine::GPU::POLY_GT3 triangle4({
{triangle2.vertex0.move(TriangleArea.size.width, 0), triangle2.page0, JabyEngine::GPU::Color24::Red()},
{triangle2.vertex1.move(TriangleArea.size.width, 0), triangle2.page1, JabyEngine::GPU::Color24::Blue()},
{triangle2.vertex2.move(TriangleArea.size.width, 0), triangle2.page2, JabyEngine::GPU::Color24::Green()}},
TriangleTPage,
TriangleClut
);
const JabyEngine::GPU::POLY_F4 rectangle1(RectangleArea, RectangleColor);
const JabyEngine::GPU::POLY_FT4 rectangle2({
RectangleArea.position.move(RectangleArea.size.width, 0), RectangleArea.size}, {0, 0},
RectangleTPage,
RectangleClut,
JabyEngine::GPU::Color24::Grey()
);
const JabyEngine::GPU::POLY_G4 rectangle3(
{RectangleArea.position.move(RectangleArea.size.width*2, 0), RectangleArea.size}, {
JabyEngine::GPU::Color24::Red(),
JabyEngine::GPU::Color24::Blue(),
JabyEngine::GPU::Color24::Green(),
JabyEngine::GPU::Color24::White()});
const JabyEngine::GPU::POLY_GT4 rectangle4(
{RectangleArea.position.move(RectangleArea.size.width*3, 0), RectangleArea.size}, {0, 0},
RectangleTPage,
RectangleClut, {
JabyEngine::GPU::Color24::Red(),
JabyEngine::GPU::Color24::Blue(),
JabyEngine::GPU::Color24::Green(),
JabyEngine::GPU::Color24::White()}
);
load_assets(); load_assets();
while(true) { while(true) {

View File

@ -145,16 +145,15 @@ namespace JabyEngine {
uint16_t padded2; // g uint16_t padded2; // g
constexpr POLY_FT3() = default; constexpr POLY_FT3() = default;
constexpr POLY_FT3(const Vertex (&verticies)[3], const PagePosition (&page_pos)[3], TPage tpage, PageClut clut, Color24 color = Color24::Grey()) : constexpr POLY_FT3(const Vertex (&verticies)[3], const PagePosition (&page_pos)[3], TPage tpage, PageClut clut, Color24 color = Color24::Grey()) : POLY_FT3({
color(color), code(IdentityCode), {verticies[0], page_pos[0]},
vertex0(verticies[0]), page0(page_pos[0]), page_clut(clut), {verticies[1], page_pos[1]},
vertex1(verticies[1]), page1(page_pos[1]), tpage(tpage), {verticies[2], page_pos[2]}}, tpage, clut, color) {}
vertex2(verticies[2]), page2(page_pos[2]) {}
constexpr POLY_FT3(const VertexEx (&vertices_ex)[3], TPage tpage, PageClut clut, Color24 color) : constexpr POLY_FT3(const VertexEx (&vertices_ex)[3], TPage tpage, PageClut clut, Color24 color) :
color(color), code(IdentityCode), color(color), code(IdentityCode),
vertex0(vertices_ex[0].position), page0(vertices_ex[0].page), page_clut(clut), vertex0(vertices_ex[0].position), page0(vertices_ex[0].page), page_clut(clut),
vertex1(vertices_ex[1].position), page1(vertices_ex[1].page), tpage(tpage), vertex1(vertices_ex[1].position), page1(vertices_ex[1].page), tpage(tpage),
vertex2(vertices_ex[2].position), page2(vertices_ex[2].page) {} vertex2(vertices_ex[2].position), page2(vertices_ex[2].page), padded2(0) {}
}; };
struct POLY_G3 : public internal::IsPrimitive, public internal::CodeInterface<POLY_G3> { struct POLY_G3 : public internal::IsPrimitive, public internal::CodeInterface<POLY_G3> {
@ -175,14 +174,14 @@ namespace JabyEngine {
Vertex vertex2; // f Vertex vertex2; // f
constexpr POLY_G3() = default; constexpr POLY_G3() = default;
constexpr POLY_G3(const Vertex (&verticies)[3], const Color24 (&color)[3]) : constexpr POLY_G3(const Vertex (&verticies)[3], const Color24 (&color)[3]) : POLY_G3({
color0(color[0]), code(IdentityCode), vertex0(verticies[0]), {verticies[0], color[0]},
color1(color[1]), vertex1(verticies[1]), {verticies[1], color[1]},
color2(color[2]), vertex2(verticies[2]) {} {verticies[2], color[2]}}) {}
constexpr POLY_G3(const VertexEx (&verticies_ex)[3]) : constexpr POLY_G3(const VertexEx (&verticies_ex)[3]) :
color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position), color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position),
color1(verticies_ex[1].color), vertex1(verticies_ex[1].position), color1(verticies_ex[1].color), pad1(0), vertex1(verticies_ex[1].position),
color2(verticies_ex[2].color), vertex2(verticies_ex[2].position) {} color2(verticies_ex[2].color), pad2(0), vertex2(verticies_ex[2].position) {}
}; };
struct POLY_GT3 : public internal::IsPrimitive, public internal::CodeInterface<POLY_GT3> { struct POLY_GT3 : public internal::IsPrimitive, public internal::CodeInterface<POLY_GT3> {
@ -199,25 +198,25 @@ namespace JabyEngine {
PagePosition page0; // c PagePosition page0; // c
PageClut page_clut; // c PageClut page_clut; // c
Color24 color1; // d Color24 color1; // d
uint8_t padded1; // d uint8_t pad1; // d
Vertex vertex1; // e Vertex vertex1; // e
PagePosition page1; // f PagePosition page1; // f
TPage tpage; // f TPage tpage; // f
Color24 color2; // g Color24 color2; // g
uint8_t padded2; // g uint8_t pad2; // g
Vertex vertex2; // h Vertex vertex2; // h
PagePosition page2; // i PagePosition page2; // i
uint16_t padded3; // i uint16_t pad3; // i
constexpr POLY_GT3() = default; constexpr POLY_GT3() = default;
constexpr POLY_GT3(const Vertex (&verticies)[3], const PagePosition (&page_pos)[3], const Color24 (&color)[3], TPage tpage, PageClut clut) : constexpr POLY_GT3(const Vertex (&verticies)[3], const PagePosition (&page_pos)[3], const Color24 (&color)[3], TPage tpage, PageClut clut) : POLY_GT3({
color0(color[0]), code(IdentityCode), vertex0(verticies[0]), page0(page_pos[0]), page_clut(clut), {verticies[0], page_pos[0], color[0]},
color1(color[1]), vertex1(verticies[1]), page1(page_pos[1]), tpage(tpage), {verticies[1], page_pos[1], color[1]},
color2(color[2]), vertex2(verticies[2]), page2(page_pos[2]) {} {verticies[2], page_pos[2], color[2]}}, tpage, clut) {}
constexpr POLY_GT3(const VertexEx (&verticies_ex)[3], TPage tpage, PageClut clut) : constexpr POLY_GT3(const VertexEx (&verticies_ex)[3], TPage tpage, PageClut clut) :
color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position), page0(verticies_ex[0].page), page_clut(clut), color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position), page0(verticies_ex[0].page), page_clut(clut),
color1(verticies_ex[1].color), vertex1(verticies_ex[1].position), page1(verticies_ex[1].page), tpage(tpage), color1(verticies_ex[1].color), pad1(0), vertex1(verticies_ex[1].position), page1(verticies_ex[1].page), tpage(tpage),
color2(verticies_ex[2].color), vertex2(verticies_ex[2].position), page2(verticies_ex[2].page) {} color2(verticies_ex[2].color), pad2(0), vertex2(verticies_ex[2].position), page2(verticies_ex[2].page), pad3(0) {}
}; };
@ -266,24 +265,23 @@ namespace JabyEngine {
TPage tpage; // e TPage tpage; // e
Vertex vertex2; // f Vertex vertex2; // f
PagePosition page2; // g PagePosition page2; // g
uint16_t padded2; // g uint16_t pad2; // g
Vertex vertex3; // h Vertex vertex3; // h
PagePosition page3; // i PagePosition page3; // i
uint16_t padded3; // i uint16_t pad3; // i
constexpr POLY_FT4() = default; constexpr POLY_FT4() = default;
constexpr POLY_FT4(const Vertex (&verticies)[4], const PagePosition (&page_pos)[4], TPage tpage, PageClut clut, Color24 color) : constexpr POLY_FT4(const Vertex (&verticies)[4], const PagePosition (&page_pos)[4], TPage tpage, PageClut clut, Color24 color) : POLY_FT4({
color(color), code(IdentityCode), {verticies[0], page_pos[0]},
vertex0(verticies[0]), page0(page_pos[0]), page_clut(clut), {verticies[1], page_pos[1]},
vertex1(verticies[1]), page1(page_pos[1]), tpage(tpage), {verticies[2], page_pos[2]},
vertex2(verticies[2]), page2(page_pos[2]), {verticies[3], page_pos[3]}}, tpage, clut, color) {}
vertex3(verticies[3]), page3(page_pos[3]) {}
constexpr POLY_FT4(const VertexEx (&vertices_ex)[4], TPage tpage, PageClut clut, Color24 color = Color24::Grey()) : constexpr POLY_FT4(const VertexEx (&vertices_ex)[4], TPage tpage, PageClut clut, Color24 color = Color24::Grey()) :
color(color), code(IdentityCode), color(color), code(IdentityCode),
vertex0(vertices_ex[0].position), page0(vertices_ex[0].page), page_clut(clut), vertex0(vertices_ex[0].position), page0(vertices_ex[0].page), page_clut(clut),
vertex1(vertices_ex[1].position), page1(vertices_ex[1].page), tpage(tpage), vertex1(vertices_ex[1].position), page1(vertices_ex[1].page), tpage(tpage),
vertex2(vertices_ex[2].position), page2(vertices_ex[2].page), vertex2(vertices_ex[2].position), page2(vertices_ex[2].page), pad2(0),
vertex3(vertices_ex[3].position), page3(vertices_ex[3].page) {} vertex3(vertices_ex[3].position), page3(vertices_ex[3].page), pad3(0) {}
constexpr POLY_FT4(const AreaI16& area, const PagePosition& texture_pos, TPage tpage, PageClut clut, Color24 color) : POLY_FT4({ constexpr POLY_FT4(const AreaI16& area, const PagePosition& texture_pos, TPage tpage, PageClut clut, Color24 color) : POLY_FT4({
{area.position, texture_pos}, {area.position, texture_pos},
{area.position.move(area.size.width, 0), texture_pos.move(area.size.width, 0)}, {area.position.move(area.size.width, 0), texture_pos.move(area.size.width, 0)},
@ -311,16 +309,17 @@ namespace JabyEngine {
Vertex vertex3; // h Vertex vertex3; // h
constexpr POLY_G4() = default; constexpr POLY_G4() = default;
constexpr POLY_G4(const Vertex (&verticies)[4], const Color24 (&color)[4]) : constexpr POLY_G4(const Vertex (&verticies)[4], const Color24 (&color)[4]) : POLY_G4({
color0(color[0]), code(IdentityCode), vertex0(verticies[0]), {verticies[0], color[0]},
color1(color[1]), vertex1(verticies[1]), {verticies[1], color[1]},
color2(color[2]), vertex2(verticies[2]), {verticies[2], color[2]},
color3(color[3]), vertex3(verticies[3]) {} {verticies[3], color[3]}
}) {}
constexpr POLY_G4(const VertexEx (&verticies_ex)[4]) : constexpr POLY_G4(const VertexEx (&verticies_ex)[4]) :
color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position), color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position),
color1(verticies_ex[1].color), vertex1(verticies_ex[1].position), color1(verticies_ex[1].color), pad1(0), vertex1(verticies_ex[1].position),
color2(verticies_ex[2].color), vertex2(verticies_ex[2].position), color2(verticies_ex[2].color), pad2(0), vertex2(verticies_ex[2].position),
color3(verticies_ex[3].color), vertex3(verticies_ex[3].position) {} color3(verticies_ex[3].color), pad3(0), vertex3(verticies_ex[3].position) {}
constexpr POLY_G4(const AreaI16& area, const Color24 (&color)[4]) : POLY_G4({ constexpr POLY_G4(const AreaI16& area, const Color24 (&color)[4]) : POLY_G4({
{area.position, color[0]}, {area.position, color[0]},
{area.position.move(area.size.width, 0), color[1]}, {area.position.move(area.size.width, 0), color[1]},
@ -339,32 +338,33 @@ namespace JabyEngine {
PagePosition page0; // c PagePosition page0; // c
PageClut page_clut; // c PageClut page_clut; // c
Color24 color1; // d Color24 color1; // d
uint8_t padded1; // d uint8_t pad1; // d
Vertex vertex1; // e Vertex vertex1; // e
PagePosition page1; // f PagePosition page1; // f
TPage tpage; // f TPage tpage; // f
Color24 color2; // g Color24 color2; // g
uint8_t padded2; // g uint8_t pad2; // g
Vertex vertex2; // h Vertex vertex2; // h
PagePosition page2; // i PagePosition page2; // i
uint16_t padded3; // i uint16_t pad3; // i
Color24 color3; // j Color24 color3; // j
uint8_t padded4; // j uint8_t pad4; // j
Vertex vertex3; // k Vertex vertex3; // k
PagePosition page3; // l PagePosition page3; // l
uint16_t padded5; // l uint16_t pad5; // l
constexpr POLY_GT4() = default; constexpr POLY_GT4() = default;
constexpr POLY_GT4(const Vertex (&verticies)[4], const PagePosition (&page_pos)[4], const Color24 (&color)[4], TPage tpage, PageClut clut) : constexpr POLY_GT4(const Vertex (&verticies)[4], const PagePosition (&page_pos)[4], const Color24 (&color)[4], TPage tpage, PageClut clut) : POLY_GT4({
color0(color[0]), code(IdentityCode), vertex0(verticies[0]), page0(page_pos[0]), page_clut(clut), {verticies[0], page_pos[0], color[0]},
color1(color[1]), vertex1(verticies[1]), page1(page_pos[1]), tpage(tpage), {verticies[1], page_pos[1], color[1]},
color2(color[2]), vertex2(verticies[2]), page2(page_pos[2]), {verticies[2], page_pos[2], color[2]},
color3(color[3]), vertex3(verticies[3]), page3(page_pos[3]) {} {verticies[3], page_pos[3], color[3]},
}, tpage, clut) {}
constexpr POLY_GT4(const VertexEx (&verticies_ex)[4], TPage tpage, PageClut clut) : constexpr POLY_GT4(const VertexEx (&verticies_ex)[4], TPage tpage, PageClut clut) :
color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position), page0(verticies_ex[0].page), page_clut(clut), color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].position), page0(verticies_ex[0].page), page_clut(clut),
color1(verticies_ex[1].color), vertex1(verticies_ex[1].position), page1(verticies_ex[1].page), tpage(tpage), color1(verticies_ex[1].color), pad1(0), vertex1(verticies_ex[1].position), page1(verticies_ex[1].page), tpage(tpage),
color2(verticies_ex[2].color), vertex2(verticies_ex[2].position), page2(verticies_ex[2].page), color2(verticies_ex[2].color), pad2(0), vertex2(verticies_ex[2].position), page2(verticies_ex[2].page), pad3(0),
color3(verticies_ex[3].color), vertex3(verticies_ex[3].position), page3(verticies_ex[3].page) {} color3(verticies_ex[3].color), pad4(0), vertex3(verticies_ex[3].position), page3(verticies_ex[3].page), pad5(0) {}
constexpr POLY_GT4(const AreaI16& area, const PagePosition& texture_pos, TPage tpage, PageClut clut, const Color24 (&color)[4]) : POLY_GT4({ constexpr POLY_GT4(const AreaI16& area, const PagePosition& texture_pos, TPage tpage, PageClut clut, const Color24 (&color)[4]) : POLY_GT4({
{area.position, texture_pos, color[0]}, {area.position, texture_pos, color[0]},
{area.position.move(area.size.width, 0), texture_pos.move(area.size.width, 0), color[1]}, {area.position.move(area.size.width, 0), texture_pos.move(area.size.width, 0), color[1]},

View File

@ -139,16 +139,17 @@ namespace JabyEngine {
// Type used for primitives // Type used for primitives
struct PagePosition : public internal::XYMovement<PagePosition, uint8_t> { struct PagePosition : public internal::XYMovement<PagePosition, uint8_t> {
union { union {
uint8_t u = 0; uint8_t x = 0;
uint8_t x; uint8_t u;
}; };
union { union {
uint8_t v = 0; uint8_t y = 0;
uint8_t y; uint8_t v;
}; };
constexpr PagePosition() = default; constexpr PagePosition() = default;
constexpr PagePosition(uint8_t u, uint8_t v) : u(u), v(v) { constexpr PagePosition(uint8_t u, uint8_t v) : x(u), y(v) { //< Activate x and y to use XYMovement during constexpr
} }
}; };