Support linking primitives

This commit is contained in:
Jaby 2023-06-13 21:21:02 +02:00
parent c705c3627c
commit b2886dfdac
6 changed files with 65 additions and 26 deletions

View File

@ -121,7 +121,8 @@ static constexpr const auto rect6 = GPU::SPRT_16({0, GPU::Display::Height - 16
static constexpr const auto rect7 = GPU::SPRT_8({0, GPU::Display::Height - 8}, {{0, 0}, TriangleClut}, GPU::Color24::Yellow()); static constexpr const auto rect7 = GPU::SPRT_8({0, GPU::Display::Height - 8}, {{0, 0}, TriangleClut}, GPU::Color24::Yellow());
static constexpr const auto rect8 = GPU::SPRT_1({0, GPU::Display::Height - 1}, {{0, 0}, TriangleClut}, GPU::Color24::Red()); static constexpr const auto rect8 = GPU::SPRT_1({0, GPU::Display::Height - 1}, {{0, 0}, TriangleClut}, GPU::Color24::Red());
static constexpr const auto rect9 = GPU::SPRT(GPU::AreaI16({GPU::Display::Width/2, GPU::Display::Height/2}, {32, 32}).centered(), {{0, 0}, TriangleClut}, GPU::Color24::Grey()).linked(); static auto rect9 = GPU::SPRT(GPU::AreaI16({GPU::Display::Width/2, GPU::Display::Height/2}, {32, 32}).centered(), {{0, 0}, TriangleClut}, GPU::Color24::Grey()).linked();
static auto rect10 = GPU::SPRT(GPU::AreaI16({GPU::Display::Width/2, GPU::Display::Height/2 - 32}, {32, 32}).centered(), {{0, 0}, TriangleClut}, GPU::Color24::Grey()).linked();
static void load_assets() { static void load_assets() {
static const CDFile Assets[] = { static const CDFile Assets[] = {
@ -155,6 +156,8 @@ static void load_assets() {
void main() { void main() {
load_assets(); load_assets();
rect9.concat(rect10);
while(true) { while(true) {
GPU::render(triangle1); GPU::render(triangle1);
GPU::render(triangle2); GPU::render(triangle2);

View File

@ -16,7 +16,28 @@ namespace JabyEngine {
constexpr Link(size_t size) : value(SizeRange.as_value(size >> 2) | TerminationValue) { constexpr Link(size_t size) : value(SizeRange.as_value(size >> 2) | TerminationValue) {
} }
//void add void set_adr(const void* adr) {
this->value = bit::value::set_normalized(this->value, AdrRange.with(reinterpret_cast<uint32_t>(adr)));
}
void* get_adr() const {
return reinterpret_cast<void*>(bit::value::get_normalized(this->value, AdrRange));
}
template<typename T>
T& insert_after(T& obj) {
const auto adr = Link::get_adr();
Link::set_adr(&obj);
obj.set_adr(adr);
return obj;
}
template<typename T>
const T& concat(const T& obj) {
Link::set_adr(&obj);
return obj;
}
constexpr void terminate() { constexpr void terminate() {
this->value |= TerminationValue; this->value |= TerminationValue;
@ -45,6 +66,8 @@ namespace JabyEngine {
namespace internal { namespace internal {
template<typename T> template<typename T>
struct LinkedElementCreator { struct LinkedElementCreator {
typedef LinkedElement<T> Linked;
constexpr LinkedElement<T> linked() { constexpr LinkedElement<T> linked() {
return LinkedElement<T>(*static_cast<T*>(this)); return LinkedElement<T>(*static_cast<T*>(this));
} }

View File

@ -1,11 +1,12 @@
#ifndef __JABYENGINE_PRIMITIVE_GPU_COMMANDS_HPP__ #ifndef __JABYENGINE_PRIMITIVE_GPU_COMMANDS_HPP__
#define __JABYENGINE_PRIMITIVE_GPU_COMMANDS_HPP__ #define __JABYENGINE_PRIMITIVE_GPU_COMMANDS_HPP__
#include "../../System/IOPorts/gpu_io.hpp" #include "../../System/IOPorts/gpu_io.hpp"
#include "linked_elements.hpp"
#include "primitive_support_types.hpp" #include "primitive_support_types.hpp"
namespace JabyEngine { namespace JabyEngine {
namespace GPU { namespace GPU {
struct TexPage { struct TexPage : public internal::LinkedElementCreator<TexPage> {
GPU_IO::GP0_t value; GPU_IO::GP0_t value;
constexpr TexPage(const PositionU16& tex_pos, TexturePageColor tex_color, SemiTransparency transparency = SemiTransparency::B_Half_add_F_Half, bool dither = false) : value{ constexpr TexPage(const PositionU16& tex_pos, TexturePageColor tex_color, SemiTransparency transparency = SemiTransparency::B_Half_add_F_Half, bool dither = false) : value{

View File

@ -1,5 +1,6 @@
#ifndef __JABYENGINE_PRIMITIVE_LINE_TYPES_HPP__ #ifndef __JABYENGINE_PRIMITIVE_LINE_TYPES_HPP__
#define __JABYENGINE_PRIMITIVE_LINE_TYPES_HPP__ #define __JABYENGINE_PRIMITIVE_LINE_TYPES_HPP__
#include "linked_elements.hpp"
#include "primitive_support_types.hpp" #include "primitive_support_types.hpp"
namespace JabyEngine { namespace JabyEngine {
@ -53,14 +54,14 @@ namespace JabyEngine {
}; };
template<typename Body> template<typename Body>
struct SingleLine : public LineCodeInterface<SingleLine<Body>> { struct SingleLine : public LineCodeInterface<SingleLine<Body>>, public internal::LinkedElementCreator<SingleLine<Body>> {
LineHead head; LineHead head;
Vertex start_point; Vertex start_point;
Body end_point; Body end_point;
}; };
template<typename Body, size_t N> template<typename Body, size_t N>
struct MultiLine : public LineCodeInterface<MultiLine<Body, N>> { struct MultiLine : public LineCodeInterface<MultiLine<Body, N>>, public internal::LinkedElementCreator<MultiLine<Body, N>> {
LineHead head; LineHead head;
Vertex start_point; Vertex start_point;
Body points[N]; Body points[N];

View File

@ -1,5 +1,6 @@
#ifndef __JABYENGINE_PRIMITIVE_POLY_TYPES_HPP__ #ifndef __JABYENGINE_PRIMITIVE_POLY_TYPES_HPP__
#define __JABYENGINE_PRIMITIVE_POLY_TYPES_HPP__ #define __JABYENGINE_PRIMITIVE_POLY_TYPES_HPP__
#include "linked_elements.hpp"
#include "primitive_support_types.hpp" #include "primitive_support_types.hpp"
namespace JabyEngine { namespace JabyEngine {
@ -35,7 +36,7 @@ namespace JabyEngine {
/ \ / \
3 - 2 3 - 2
*/ */
struct POLY_F3 : public internal::PolyCodeInterface<POLY_F3> { struct POLY_F3 : public internal::PolyCodeInterface<POLY_F3>, public internal::LinkedElementCreator<POLY_F3> {
static constexpr auto IdentityCode = Code().set(Code::FlatShading).set(Code::TriVertics).set(Code::Untextured).set(Code::NonTransparent); static constexpr auto IdentityCode = Code().set(Code::FlatShading).set(Code::TriVertics).set(Code::Untextured).set(Code::NonTransparent);
Color24 color; // a Color24 color; // a
@ -53,7 +54,7 @@ namespace JabyEngine {
} }
}; };
struct POLY_FT3 : public internal::PolyCodeInterface<POLY_FT3> { struct POLY_FT3 : public internal::PolyCodeInterface<POLY_FT3>, public internal::LinkedElementCreator<POLY_FT3> {
struct VertexEx { struct VertexEx {
Vertex position; Vertex position;
PagePosition page; PagePosition page;
@ -84,7 +85,7 @@ namespace JabyEngine {
vertex2(vertices_ex[2].position), page2(vertices_ex[2].page), padded2(0) {} vertex2(vertices_ex[2].position), page2(vertices_ex[2].page), padded2(0) {}
}; };
struct POLY_G3 : public internal::PolyCodeInterface<POLY_G3> { struct POLY_G3 : public internal::PolyCodeInterface<POLY_G3>, public internal::LinkedElementCreator<POLY_G3> {
static constexpr auto IdentityCode = Code(POLY_F3::IdentityCode).set(Code::GouraudShading); static constexpr auto IdentityCode = Code(POLY_F3::IdentityCode).set(Code::GouraudShading);
Color24 color0; // a Color24 color0; // a
@ -108,7 +109,7 @@ namespace JabyEngine {
color2(verticies_ex[2].color), pad2(0), vertex2(verticies_ex[2].position) {} color2(verticies_ex[2].color), pad2(0), vertex2(verticies_ex[2].position) {}
}; };
struct POLY_GT3 : public internal::PolyCodeInterface<POLY_GT3> { struct POLY_GT3 : public internal::PolyCodeInterface<POLY_GT3>, public internal::LinkedElementCreator<POLY_GT3> {
struct VertexEx { struct VertexEx {
Vertex position; Vertex position;
PagePosition page; PagePosition page;
@ -148,7 +149,7 @@ namespace JabyEngine {
| | | |
3 - 4 3 - 4
*/ */
struct POLY_F4 : public internal::PolyCodeInterface<POLY_F4> { struct POLY_F4 : public internal::PolyCodeInterface<POLY_F4>, public internal::LinkedElementCreator<POLY_F4> {
static constexpr auto IdentityCode = Code(POLY_F3::IdentityCode).set(Code::QuadVertics); static constexpr auto IdentityCode = Code(POLY_F3::IdentityCode).set(Code::QuadVertics);
Color24 color; // a Color24 color; // a
@ -173,7 +174,7 @@ namespace JabyEngine {
color) {} color) {}
}; };
struct POLY_FT4 : public internal::PolyCodeInterface<POLY_FT4> { struct POLY_FT4 : public internal::PolyCodeInterface<POLY_FT4>, public internal::LinkedElementCreator<POLY_FT4> {
typedef POLY_FT3::VertexEx VertexEx; typedef POLY_FT3::VertexEx VertexEx;
static constexpr auto IdentityCode = Code(POLY_FT3::IdentityCode).set(Code::QuadVertics); static constexpr auto IdentityCode = Code(POLY_FT3::IdentityCode).set(Code::QuadVertics);
@ -213,7 +214,7 @@ namespace JabyEngine {
) {} ) {}
}; };
struct POLY_G4 : public internal::PolyCodeInterface<POLY_G4> { struct POLY_G4 : public internal::PolyCodeInterface<POLY_G4>, public internal::LinkedElementCreator<POLY_G4> {
static constexpr auto IdentityCode = Code(POLY_G3::IdentityCode).set(Code::QuadVertics); static constexpr auto IdentityCode = Code(POLY_G3::IdentityCode).set(Code::QuadVertics);
Color24 color0; // a Color24 color0; // a
@ -249,7 +250,7 @@ namespace JabyEngine {
) {} ) {}
}; };
struct POLY_GT4 : public internal::PolyCodeInterface<POLY_GT4> { struct POLY_GT4 : public internal::PolyCodeInterface<POLY_GT4>, public internal::LinkedElementCreator<POLY_GT4> {
typedef POLY_GT3::VertexEx VertexEx; typedef POLY_GT3::VertexEx VertexEx;
static constexpr auto IdentityCode = Code(POLY_GT3::IdentityCode).set(Code::QuadVertics); static constexpr auto IdentityCode = Code(POLY_GT3::IdentityCode).set(Code::QuadVertics);

View File

@ -34,23 +34,23 @@ namespace JabyEngine {
}; };
template<typename RectCode::Size Size> template<typename RectCode::Size Size>
struct RECT_F : public RectCodeInterface<RECT_F<Size>> { struct RECT_BASE_F : public RectCodeInterface<RECT_BASE_F<Size>> {
typedef RECT_F<Size>::Code Code; typedef RECT_BASE_F<Size>::Code Code;
static constexpr auto IdentityCode = Code().set(Code::Size.with(static_cast<uint8_t>(Size))).set(Code::Untextured).set(Code::NonTransparent); static constexpr auto IdentityCode = Code().set(Code::Size.with(static_cast<uint8_t>(Size))).set(Code::Untextured).set(Code::NonTransparent);
Color24 color; Color24 color;
Code code; Code code;
Vertex position; Vertex position;
constexpr RECT_F() = default; constexpr RECT_BASE_F() = default;
constexpr RECT_F(const Vertex& position, const Color24& color) : color(color), code(IdentityCode), position(position) { constexpr RECT_BASE_F(const Vertex& position, const Color24& color) : color(color), code(IdentityCode), position(position) {
} }
}; };
template<typename RectCode::Size Size> template<typename RectCode::Size Size>
struct RECT_T : public RectCodeInterface<RECT_T<Size>> { struct RECT_BASE_T : public RectCodeInterface<RECT_BASE_T<Size>> {
typedef RECT_T<Size>::Code Code; typedef RECT_BASE_T<Size>::Code Code;
static constexpr auto IdentityCode = Code(RECT_F<Size>::IdentityCode).set(Code::Textured); static constexpr auto IdentityCode = Code(RECT_BASE_F<Size>::IdentityCode).set(Code::Textured);
Color24 color; Color24 color;
Code code; Code code;
@ -58,31 +58,41 @@ namespace JabyEngine {
PagePosition page; PagePosition page;
PageClut clut; PageClut clut;
constexpr RECT_T() = default; constexpr RECT_BASE_T() = default;
constexpr RECT_T(const Vertex& position, const PagePositionClut& page, const Color24& color = Color24::Grey()) : color(color), code(IdentityCode), position(position), page(page.page), clut(page.clut) { constexpr RECT_BASE_T(const Vertex& position, const PagePositionClut& page, const Color24& color = Color24::Grey()) : color(color), code(IdentityCode), position(position), page(page.page), clut(page.clut) {
} }
}; };
template<typename RectCode::Size Size>
struct RECT_F : public RECT_BASE_F<Size>, public internal::LinkedElementCreator<RECT_F<Size>> {
using RECT_BASE_F<Size>::RECT_BASE_F;
};
template<typename RectCode::Size Size>
struct RECT_T : public RECT_BASE_T<Size>, public internal::LinkedElementCreator<RECT_T<Size>> {
using RECT_BASE_T<Size>::RECT_BASE_T;
};
} }
typedef internal::RECT_F<internal::RectCode::Size::Pixel1x1> TILE_1; typedef internal::RECT_F<internal::RectCode::Size::Pixel1x1> TILE_1;
typedef internal::RECT_F<internal::RectCode::Size::Sprite8x8> TILE_8; typedef internal::RECT_F<internal::RectCode::Size::Sprite8x8> TILE_8;
typedef internal::RECT_F<internal::RectCode::Size::Sprite16x16> TILE_16; typedef internal::RECT_F<internal::RectCode::Size::Sprite16x16> TILE_16;
struct TILE : public internal::RECT_F<internal::RectCode::Size::Variable> { struct TILE : public internal::RECT_BASE_F<internal::RectCode::Size::Variable>, public internal::LinkedElementCreator<TILE> {
SizeI16 size; SizeI16 size;
constexpr TILE() = default; constexpr TILE() = default;
constexpr TILE(const AreaI16& area, const Color24& color) : RECT_F(area.position, color), size(area.size) { constexpr TILE(const AreaI16& area, const Color24& color) : RECT_BASE_F(area.position, color), size(area.size) {
} }
}; };
typedef internal::RECT_T<internal::RectCode::Size::Pixel1x1> SPRT_1; typedef internal::RECT_T<internal::RectCode::Size::Pixel1x1> SPRT_1;
typedef internal::RECT_T<internal::RectCode::Size::Sprite8x8> SPRT_8; typedef internal::RECT_T<internal::RectCode::Size::Sprite8x8> SPRT_8;
typedef internal::RECT_T<internal::RectCode::Size::Sprite16x16> SPRT_16; typedef internal::RECT_T<internal::RectCode::Size::Sprite16x16> SPRT_16;
struct SPRT : public internal::RECT_T<internal::RectCode::Size::Variable>, public internal::LinkedElementCreator<SPRT> { struct SPRT : public internal::RECT_BASE_T<internal::RectCode::Size::Variable>, public internal::LinkedElementCreator<SPRT> {
SizeI16 size; SizeI16 size;
constexpr SPRT() = default; constexpr SPRT() = default;
constexpr SPRT(const AreaI16& area, const PagePositionClut& page, const Color24& color = Color24::Grey()) : RECT_T(area.position, page, color), size(area.size) { constexpr SPRT(const AreaI16& area, const PagePositionClut& page, const Color24& color = Color24::Grey()) : RECT_BASE_T(area.position, page, color), size(area.size) {
} }
}; };