Support GPU Primitives as constexpr

This commit is contained in:
jaby 2023-05-24 20:55:43 +02:00
parent a16f12a5ce
commit 6d6396ad16
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)
INCLUDES += -I$(JABY_ENGINE_DIR)/include
#CCFLAGS += -save-temps=obj
include $(JABY_ENGINE_DIR)/lib/Makefile
include $(JABY_ENGINE_DIR)/lib/PSEXETarget.mk

View File

@ -11,6 +11,71 @@ enum LBA {
__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 const JabyEngine::CDFile Assets[] = {
JabyEngine::CDFileBuilder::simple_tim(LBA::FONT, JabyEngine::SimpleTIM(320, 0, 320, 511)),
@ -41,70 +106,6 @@ static void load_assets() {
}
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();
while(true) {

View File

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