diff --git a/examples/PoolBox/application/Makefile b/examples/PoolBox/application/Makefile index efce152f..71f4711e 100644 --- a/examples/PoolBox/application/Makefile +++ b/examples/PoolBox/application/Makefile @@ -7,7 +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 +CCFLAGS += -save-temps=obj include $(JABY_ENGINE_DIR)/lib/Makefile include $(JABY_ENGINE_DIR)/lib/PSEXETarget.mk diff --git a/examples/PoolBox/application/src/main.cpp b/examples/PoolBox/application/src/main.cpp index 883d7bf6..3cb85b96 100644 --- a/examples/PoolBox/application/src/main.cpp +++ b/examples/PoolBox/application/src/main.cpp @@ -87,17 +87,26 @@ static constexpr const auto rectangle5 = JabyEngine::GPU::POLY_GT4( JabyEngine::GPU::Color24::White()} ).set_semi_transparent(true); -static constexpr const auto line1 = JabyEngine::GPU::LINE_F::create(LineColor, { +static constexpr const auto line1 = JabyEngine::GPU::LINE_F::create(LineColor, {0, 0}, {JabyEngine::GPU::Display::Width, JabyEngine::GPU::Display::Height} -}); - +); static constexpr const auto line2 = JabyEngine::GPU::LINE_F::create(LineColor.invert(), JabyEngine::GPU::Vertex(0, 0), JabyEngine::GPU::Vertex(16, 0), JabyEngine::GPU::Vertex(16, 16), JabyEngine::GPU::Vertex(0, 0) ); +static constexpr const auto line3 = JabyEngine::GPU::LINE_G::create( + {LineColor, {JabyEngine::GPU::Display::Width, 0}}, + {LineColor.invert(), {0, JabyEngine::GPU::Display::Height}} +); +static constexpr const auto line4 = JabyEngine::GPU::LINE_G::create( + JabyEngine::GPU::ColorVertex{JabyEngine::GPU::Color24::Red(), {0, 0}}, + JabyEngine::GPU::ColorVertex{JabyEngine::GPU::Color24::Green(), {0, 16}}, + JabyEngine::GPU::ColorVertex{JabyEngine::GPU::Color24::Blue(), {16, 16}}, + JabyEngine::GPU::ColorVertex{JabyEngine::GPU::Color24::White(), {0, 0}} +); static void load_assets() { static const JabyEngine::CDFile Assets[] = { @@ -145,6 +154,8 @@ void main() { JabyEngine::GPU::render(line1); JabyEngine::GPU::render(line2); + JabyEngine::GPU::render(line3); + JabyEngine::GPU::render(line4); JabyEngine::GPU::swap_buffers_vsync(2); } diff --git a/include/PSX/GPU/Primitives/primitive_line_types.hpp b/include/PSX/GPU/Primitives/primitive_line_types.hpp index ce58ad8b..d80c8b85 100644 --- a/include/PSX/GPU/Primitives/primitive_line_types.hpp +++ b/include/PSX/GPU/Primitives/primitive_line_types.hpp @@ -20,75 +20,103 @@ namespace JabyEngine { struct LineCodeInterface { typedef ::JabyEngine::GPU::internal::LineCode Code; - constexpr T& set_poly_line(bool set = true) { - if(set) { - static_cast(this)->code.set(Code::PolyLine); - } - else { - static_cast(this)->code.set(Code::SingleLine); - } - return *static_cast(this); - } - constexpr T& set_semi_transparent(bool set = true) { if(set) { - static_cast(this)->code.set(Code::SemiTransparent); + static_cast(this)->head.code.set(Code::SemiTransparent); } else { - static_cast(this)->code.set(Code::NonTransparent); + static_cast(this)->head.code.set(Code::NonTransparent); } return *static_cast(this); } }; - struct LineHead : public LineCodeInterface { - Color24 color; - Code code; - }; - - union LineUnion { - LineHead head; - Vertex vertex; + struct LineHead { Color24 color; + LineCode code; - static constexpr LineUnion create_head(const Color24& color, const LineCode& code, bool is_poly) { - return LineUnion{.head = LineHead{.color = color, .code = code}.set_poly_line(is_poly)}; + static constexpr LineHead create(const Color24& color, const LineCode& code, bool is_poly) { + return LineHead{.color = color, .code = code}.set_poly_line(is_poly); } - static constexpr LineUnion create_vertex(const Vertex& vertex) { - return LineUnion{.vertex = {vertex.x, vertex.y}}; - } + constexpr LineHead& set_poly_line(bool set = true) { + if(set) { + this->code.set(LineCode::PolyLine); + } - static constexpr LineUnion create_terminate() { - return LineUnion{.vertex = {static_cast(0x5000), static_cast(0x5000)}}; + else { + this->code.set(LineCode::SingleLine); + } + return *this; } }; - template - struct Line { - LineUnion data[N]; + struct Termination { + Vertex value; + + static constexpr Termination create() { + return {.value = {static_cast(0x5000), static_cast(0x5000)}}; + } + }; + + template + struct SingleLine : public LineCodeInterface> { + LineHead head; + Vertex start_point; + Body end_point; + }; + + template + struct MultiLine : public LineCodeInterface> { + LineHead head; + Vertex start_point; + Body points[N]; + Termination end; }; } struct LINE_F { - typedef ::JabyEngine::GPU::internal::LineCode Code; - typedef ::JabyEngine::GPU::internal::LineUnion LineUnion; + typedef internal::LineCode Code; static constexpr auto IdentityCode = Code().set(Code::FlatShading).set(Code::SingleLine).set(Code::NonTransparent); - static constexpr internal::Line<3> create(const Color24& color, const Vertex (&vertices)[2]) { - return internal::Line<3>{LineUnion::create_head(color, IdentityCode, false), LineUnion::create_vertex(vertices[0]), LineUnion::create_vertex(vertices[1])}; + static constexpr internal::SingleLine create(const Color24& color, const Vertex& start_point, const Vertex& end_point) { + using namespace internal; + return {.head = LineHead::create(color, IdentityCode, false), .start_point = start_point, .end_point = end_point}; } template - static constexpr internal::Line create(const Color24& color, const ARGS&...args) { - return internal::Line{LineUnion::create_head(color, IdentityCode, true), LineUnion::create_vertex(args)..., LineUnion::create_terminate()}; + static constexpr internal::MultiLine create(const Color24& color, const Vertex& start_point, const ARGS&...rest) { + using namespace internal; + return {.head = LineHead::create(color, IdentityCode, true), .start_point = start_point, .points = {rest...}, .end = Termination::create()}; + } + }; + + struct LINE_G { + typedef LINE_F::Code Code; + + static constexpr auto IdentityCode = Code(LINE_F::IdentityCode).set(Code::GouraudShading); + + static constexpr internal::SingleLine create(const ColorVertex& start_point, const ColorVertex& end_point) { + using namespace internal; + return {.head = LineHead::create(start_point.color, IdentityCode, false), .start_point = start_point.position, .end_point = end_point}; + } + + template + static constexpr internal::MultiLine create(const ColorVertex& start_point, const ARGS&...rest) { + using namespace internal; + return {.head = LineHead::create(start_point.color, IdentityCode, true), .start_point = start_point.position, .points = {rest...}, .end = Termination::create()}; } }; namespace internal { - template - struct is_render_primitive> { + template + struct is_render_primitive> { + static constexpr bool value = true; + }; + + template + struct is_render_primitive> { static constexpr bool value = true; }; } diff --git a/include/PSX/GPU/Primitives/primitive_poly_types.hpp b/include/PSX/GPU/Primitives/primitive_poly_types.hpp index 5a51786e..3081842d 100644 --- a/include/PSX/GPU/Primitives/primitive_poly_types.hpp +++ b/include/PSX/GPU/Primitives/primitive_poly_types.hpp @@ -101,10 +101,6 @@ namespace JabyEngine { }; struct POLY_G3 : public internal::PolyCodeInterface { - struct VertexEx { - Vertex position; - Color24 color; - }; static constexpr auto IdentityCode = Code(POLY_F3::IdentityCode).set(Code::GouraudShading); Color24 color0; // a @@ -122,7 +118,7 @@ namespace JabyEngine { {verticies[0], color[0]}, {verticies[1], color[1]}, {verticies[2], color[2]}}) {} - constexpr POLY_G3(const VertexEx (&verticies_ex)[3]) : + constexpr POLY_G3(const VertexColor (&verticies_ex)[3]) : color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].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) {} @@ -234,7 +230,6 @@ namespace JabyEngine { }; struct POLY_G4 : public internal::PolyCodeInterface { - typedef POLY_G3::VertexEx VertexEx; static constexpr auto IdentityCode = Code(POLY_G3::IdentityCode).set(Code::QuadVertics); Color24 color0; // a @@ -257,7 +252,7 @@ namespace JabyEngine { {verticies[2], color[2]}, {verticies[3], color[3]} }) {} - constexpr POLY_G4(const VertexEx (&verticies_ex)[4]) : + constexpr POLY_G4(const VertexColor (&verticies_ex)[4]) : color0(verticies_ex[0].color), code(IdentityCode), vertex0(verticies_ex[0].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), diff --git a/include/PSX/GPU/gpu_types.hpp b/include/PSX/GPU/gpu_types.hpp index 407dbf47..bb9c5684 100644 --- a/include/PSX/GPU/gpu_types.hpp +++ b/include/PSX/GPU/gpu_types.hpp @@ -168,6 +168,16 @@ namespace JabyEngine { // Type used for primitives typedef PositionI16 Vertex; + + struct VertexColor { + Vertex position; + Color24 color; + }; + + struct ColorVertex { + Color24 color; + alignas(2) Vertex position; + }; } } #endif //!__JABYENGINE_GPU_TYPES_HPP__ \ No newline at end of file