diff --git a/examples/PoolBox/application/src/main.cpp b/examples/PoolBox/application/src/main.cpp index 4f7be4fd..4f843be5 100644 --- a/examples/PoolBox/application/src/main.cpp +++ b/examples/PoolBox/application/src/main.cpp @@ -89,6 +89,12 @@ void main() { 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()}); load_assets(); @@ -100,6 +106,7 @@ void main() { JabyEngine::GPU::render(rectangle1); JabyEngine::GPU::render(rectangle2); + JabyEngine::GPU::render(rectangle3); JabyEngine::GPU::swap_buffers_vsync(2); } diff --git a/include/PSX/GPU/gpu_primitives.hpp b/include/PSX/GPU/gpu_primitives.hpp index db0e357f..dc2c3fbd 100644 --- a/include/PSX/GPU/gpu_primitives.hpp +++ b/include/PSX/GPU/gpu_primitives.hpp @@ -145,7 +145,7 @@ 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) : + 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), @@ -278,7 +278,7 @@ namespace JabyEngine { 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 VertexEx (&vertices_ex)[4], TPage tpage, PageClut clut, Color24 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), @@ -293,6 +293,42 @@ namespace JabyEngine { ) {} }; + struct POLY_G4 : public internal::IsPrimitive, public internal::CodeInterface { + typedef POLY_G3::VertexEx VertexEx; + static constexpr auto IdentityCode = Code(POLY_G3::IdentityCode).set(Code::QuadVertics); + + Color24 color0; // a + Code code = IdentityCode; // a + Vertex vertex0; // b + Color24 color1; // c + uint8_t pad1; // c + Vertex vertex1; // d + Color24 color2; // e + uint8_t pad2; // e + Vertex vertex2; // f + Color24 color3; // g + uint8_t pad3; // g + 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 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) {} + 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]}, + {area.position.move(0, area.size.height), color[2]}, + {area.position.move(area.size.width, area.size.height), color[3]}} + ) {} + }; + typedef POLY_F3 FlatTriangle; typedef POLY_FT3 FlatTexturedTriangle; typedef POLY_G3 GouraudTriangle; @@ -300,6 +336,7 @@ namespace JabyEngine { typedef POLY_F4 FlatRectangle; typedef POLY_FT4 FlatTexturedRectangle; + typedef POLY_G4 GouraudRectangle; static_assert(sizeof(POLY_F3) == 16); static_assert(sizeof(POLY_FT3) == 28); @@ -308,6 +345,7 @@ namespace JabyEngine { static_assert(sizeof(POLY_F4) == 20); static_assert(sizeof(POLY_FT4) == 36); + static_assert(sizeof(POLY_G4) == 32); } }