diff --git a/src/display/Display.cpp b/src/display/Display.cpp index b8b9dbda..7b566a74 100644 --- a/src/display/Display.cpp +++ b/src/display/Display.cpp @@ -9,9 +9,9 @@ using namespace Dawn; MeshVertex vertices[3] = { - { Color4B::RED, glm::vec2(0.0f, 0.0f), glm::vec3(-0.5f, -0.5f, 0.0f) }, - { Color4B::GREEN, glm::vec2(1.0f, 0.0f), glm::vec3(0.5f, -0.5f, 0.0f) }, - { Color4B::BLUE, glm::vec2(0.5f, 1.0f), glm::vec3(0.0f, 0.5f, 0.0f) } + { {255, 0, 0, 255}, glm::vec2(0.5f, 1.0f), glm::vec3(0.0f, 0.5f, 0.0f) }, + { {0, 255, 0, 255}, glm::vec2(0.0f, 0.0f), glm::vec3(-0.5f, -0.5f, 0.0f) }, + { {0, 0, 255, 255}, glm::vec2(1.0f, 0.0f), glm::vec3(0.5f, -0.5f, 0.0f) } }; Display::Display(Engine &engine) : @@ -20,8 +20,9 @@ Display::Display(Engine &engine) : window(nullptr), #endif engine(engine), - mesh(3, PrimitiveType::Triangles, vertices) + mesh(3, PrimitiveType::TRIANGLES, vertices) { + #if DAWN_SDL2 uint32_t flags = SDL_INIT_VIDEO; #if DAWN_SDL2_GAMEPAD @@ -104,7 +105,7 @@ void Display::update(void) { } } - SDL_GL_MakeCurrent(this->window, this->glContext); + // SDL_GL_MakeCurrent(this->window, this->glContext); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor( @@ -118,6 +119,11 @@ void Display::update(void) { // glViewport(0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT); + GLenum err = glGetError(); + if (err != GL_NO_ERROR) { + printf("OpenGL error: %d\n", err); + } + SDL_GL_SwapWindow(this->window); #endif } diff --git a/src/display/color/Color.hpp b/src/display/color/Color.hpp index 58d641f4..a6aeb80d 100644 --- a/src/display/color/Color.hpp +++ b/src/display/color/Color.hpp @@ -4,7 +4,6 @@ // https://opensource.org/licenses/MIT #pragma once -#include "IColor.hpp" #include "Color3B.hpp" #include "Color3F.hpp" #include "Color4B.hpp" diff --git a/src/display/color/Color3B.hpp b/src/display/color/Color3B.hpp index 1094e825..c2bbdf43 100644 --- a/src/display/color/Color3B.hpp +++ b/src/display/color/Color3B.hpp @@ -4,14 +4,25 @@ // https://opensource.org/licenses/MIT #pragma once -#include "IColor.hpp" +#include "dawn.hpp" namespace Dawn { - struct Color3B : public Color { + struct Color4B; + struct Color3F; + struct Color4F; + + #pragma pack(push, 1) + struct Color3B { public: - const uint8_t r; - const uint8_t g; - const uint8_t b; + union { + struct { + uint8_t r; + uint8_t g; + uint8_t b; + }; + + uint8_t rgb[3]; + }; /** * Color (RGB, byte) constructor @@ -22,25 +33,33 @@ namespace Dawn { */ Color3B(const uint8_t r, const uint8_t g, const uint8_t b); + /** + * Color (RGB, byte) constructor from array + * + * @param rgb Array of 3 bytes: {r, g, b} + */ + Color3B(const uint8_t rgb[3]); + /** * Gets this color as a 3-channel byte color. */ - Color3B toColor3B(void) const override; + Color3B toColor3B(void) const; /** * Gets this color as a 4-channel byte color. Alpha is set to 255. */ - Color4B toColor4B(void) const override; + Color4B toColor4B(void) const; /** * Gets this color as a 3-channel float color. (0-1 range) */ - Color3F toColor3F(void) const override; + Color3F toColor3F(void) const; /** * Gets this color as a 4-channel float color. (0-1 range), Alpha is set * to 1.0f */ - Color4F toColor4F(void) const override; + Color4F toColor4F(void) const; }; + #pragma pack(pop) } \ No newline at end of file diff --git a/src/display/color/Color3F.cpp b/src/display/color/Color3F.cpp index 28cf4338..2a4d20c0 100644 --- a/src/display/color/Color3F.cpp +++ b/src/display/color/Color3F.cpp @@ -14,6 +14,11 @@ Color3F::Color3F( ) : r(r), g(g), b(b) { } +Color3F::Color3F( + const float_t rgb[3] +) : r(rgb[0]), g(rgb[1]), b(rgb[2]) { +} + Color3B Color3F::toColor3B(void) const { return Color3B( static_cast(r * 255.0f), diff --git a/src/display/color/Color3F.hpp b/src/display/color/Color3F.hpp index 11d18a19..99ed50cc 100644 --- a/src/display/color/Color3F.hpp +++ b/src/display/color/Color3F.hpp @@ -4,14 +4,25 @@ // https://opensource.org/licenses/MIT #pragma once -#include "IColor.hpp" +#include "dawn.hpp" namespace Dawn { - struct Color3F : public Color { + struct Color3B; + struct Color4B; + struct Color4F; + + #pragma pack(push, 1) + struct Color3F { public: - const float_t r; - const float_t g; - const float_t b; + union { + struct { + float_t r; + float_t g; + float_t b; + }; + + float_t rgb[3]; + }; /** * Color (RGB, float) constructor @@ -22,24 +33,32 @@ namespace Dawn { */ Color3F(const float_t r, const float_t g, const float_t b); + /** + * Color (RGB, float) constructor from array + * + * @param rgb Array of 3 float_t: {r, g, b} + */ + Color3F(const float_t rgb[3]); + /** * Gets this color as a 3-channel byte color. */ - Color3B toColor3B(void) const override; + Color3B toColor3B(void) const; /** * Gets this color as a 4-channel byte color. Alpha is set to 255. */ - Color4B toColor4B(void) const override; + Color4B toColor4B(void) const; /** * Gets this color as a 3-channel float_t color. */ - Color3F toColor3F(void) const override; + Color3F toColor3F(void) const; /** * Gets this color as a 4-channel float_t color. Alpha is set to 1.0f */ - Color4F toColor4F(void) const override; + Color4F toColor4F(void) const; }; + #pragma pack(pop) } \ No newline at end of file diff --git a/src/display/color/Color4B.cpp b/src/display/color/Color4B.cpp index 8f179b48..d79d49ee 100644 --- a/src/display/color/Color4B.cpp +++ b/src/display/color/Color4B.cpp @@ -7,30 +7,28 @@ using namespace Dawn; -const Color4B Color4B::WHITE = Color4B(255, 255, 255, 255); -const Color4B Color4B::BLACK = Color4B(0, 0, 0, 255); -const Color4B Color4B::RED = Color4B(255, 0, 0, 255); -const Color4B Color4B::GREEN = Color4B(0, 255, 0, 255); -const Color4B Color4B::BLUE = Color4B(0, 0, 255, 255); -const Color4B Color4B::YELLOW = Color4B(255, 255, 0, 255); -const Color4B Color4B::CYAN = Color4B(0, 255, 255, 255); -const Color4B Color4B::MAGENTA = Color4B(255, 0, 255, 255); -const Color4B Color4B::TRANSPARENT = Color4B(0, 0, 0, 0); -const Color4B Color4B::CORNFLOWER_BLUE = Color4B(100, 149, 237, 255); +const Color4B Color4B::WHITE = Color4B(0xFF, 0xFF, 0xFF, 0xFF); +const Color4B Color4B::BLACK = Color4B(0x00, 0x00, 0x00, 0xFF); +const Color4B Color4B::RED = Color4B(0xFF, 0x00, 0x00, 0xFF); +const Color4B Color4B::GREEN = Color4B(0x00, 0xFF, 0x00, 0xFF); +const Color4B Color4B::BLUE = Color4B(0x00, 0x00, 0xFF, 0xFF); +const Color4B Color4B::YELLOW = Color4B(0xFF, 0xFF, 0x00, 0xFF); +const Color4B Color4B::CYAN = Color4B(0x00, 0xFF, 0xFF, 0xFF); +const Color4B Color4B::MAGENTA = Color4B(0xFF, 0x00, 0xFF, 0xFF); +const Color4B Color4B::TRANSPARENT = Color4B(0x00, 0x00, 0x00, 0x00); +const Color4B Color4B::CORNFLOWER_BLUE = Color4B(0x64, 0x95, 0xED, 0xFF); Color4B::Color4B( const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t a -) : Color3B(r, g, b), a(a) { +) : r(r), g(g), b(b), a(a) { // Constructor body (if needed) } -Color4B Color4B::toColor4B(void) const { - return Color4B(r, g, b, a); -} - -Color4F Color4B::toColor4F(void) const { - return Color4F(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f); +Color4B::Color4B( + const uint8_t rgba[4] +) : r(rgba[0]), g(rgba[1]), b(rgba[2]), a(rgba[3]) { + // Constructor body (if needed) } \ No newline at end of file diff --git a/src/display/color/Color4B.hpp b/src/display/color/Color4B.hpp index a69bb166..5f7f2f36 100644 --- a/src/display/color/Color4B.hpp +++ b/src/display/color/Color4B.hpp @@ -4,47 +4,58 @@ // https://opensource.org/licenses/MIT #pragma once -#include "Color3B.hpp" +#include "dawn.hpp" namespace Dawn { - struct Color4B : public Color3B { - public: - static const Color4B WHITE; - static const Color4B BLACK; - static const Color4B RED; - static const Color4B GREEN; - static const Color4B BLUE; - static const Color4B YELLOW; - static const Color4B CYAN; - static const Color4B MAGENTA; - static const Color4B TRANSPARENT; - static const Color4B CORNFLOWER_BLUE; + struct Color3B; + struct Color3F; + struct Color4F; - const uint8_t a; + #pragma pack(push, 1) + struct Color4B { + static const Color4B WHITE; + static const Color4B BLACK; + static const Color4B RED; + static const Color4B GREEN; + static const Color4B BLUE; + static const Color4B YELLOW; + static const Color4B CYAN; + static const Color4B MAGENTA; + static const Color4B TRANSPARENT; + static const Color4B CORNFLOWER_BLUE; - /** - * Color (RGBA, byte) constructor - * - * @param r Red channel (0-255) - * @param g Green channel (0-255) - * @param b Blue channel (0-255) - * @param a Alpha channel (0-255) - */ - Color4B( - const uint8_t r, - const uint8_t g, - const uint8_t b, - const uint8_t a - ); + union { + struct { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; + }; + + uint8_t rgba[4]; + }; - /** - * Gets this color as a 4-channel byte color. - */ - Color4B toColor4B(void) const override; + /** + * Color (RGBA, byte) constructor + * + * @param r Red channel (0-255) + * @param g Green channel (0-255) + * @param b Blue channel (0-255) + * @param a Alpha channel (0-255) + */ + Color4B( + const uint8_t r, + const uint8_t g, + const uint8_t b, + const uint8_t a + ); - /** - * Gets this color as a 4-channel float color. (0-1 range) - */ - Color4F toColor4F(void) const override; + /** + * Color (RGBA, byte) constructor from array + * + * @param rgba Array of 4 bytes: {r, g, b, a} + */ + Color4B(const uint8_t rgba[4]); }; + #pragma pack(pop) } \ No newline at end of file diff --git a/src/display/color/Color4F.cpp b/src/display/color/Color4F.cpp index 8b5b61bd..1dedf794 100644 --- a/src/display/color/Color4F.cpp +++ b/src/display/color/Color4F.cpp @@ -23,7 +23,24 @@ Color4F::Color4F( const float_t g, const float_t b, const float_t a -) : Color3F(r, g, b), a(a) { +) : r(r), g(g), b(b), a(a) { +} + +Color4F::Color4F( + const float_t rgba[4] +) : r(rgba[0]), g(rgba[1]), b(rgba[2]), a(rgba[3]) { +} + +Color3B Color4F::toColor3B(void) const { + return Color3B( + static_cast(r * 255.0f), + static_cast(g * 255.0f), + static_cast(b * 255.0f) + ); +} + +Color3F Color4F::toColor3F(void) const { + return Color3F(r, g, b); } Color4B Color4F::toColor4B(void) const { diff --git a/src/display/color/Color4F.hpp b/src/display/color/Color4F.hpp index bb566cf1..77ef1fc6 100644 --- a/src/display/color/Color4F.hpp +++ b/src/display/color/Color4F.hpp @@ -7,7 +7,12 @@ #include "Color3F.hpp" namespace Dawn { - struct Color4F : public Color3F { + struct Color3B; + struct Color3F; + struct Color4B; + + #pragma pack(push, 1) + struct Color4F { public: static const Color4F WHITE; static const Color4F BLACK; @@ -19,8 +24,17 @@ namespace Dawn { static const Color4F MAGENTA; static const Color4F TRANSPARENT; static const Color4F CORNFLOWER_BLUE; - - const float_t a; + + union { + struct { + float_t r; + float_t g; + float_t b; + float_t a; + }; + + float_t rgba[4]; + }; /** * Color (RGBA, float) constructor @@ -37,14 +51,34 @@ namespace Dawn { const float_t a ); + /** + * Color (RGBA, float) constructor from array + * + * @param rgba Array of 4 float_t: {r, g, b, a} + */ + Color4F(const float_t rgba[4]); + + /** + * Gets this color as a 3-channel byte color. + * + * @return Color3B representation of this color (alpha is discarded) + */ + Color3B toColor3B(void) const; + + /** + * Gets this color as a 3-channel float color. (alpha is discarded) + */ + Color3F toColor3F(void) const; + /** * Gets this color as a 4-channel byte color. */ - Color4B toColor4B(void) const override; + Color4B toColor4B(void) const; /** * Gets this color as a 4-channel float_t color. */ - Color4F toColor4F(void) const override; + Color4F toColor4F(void) const; }; + #pragma pack(pop) } \ No newline at end of file diff --git a/src/display/color/IColor.hpp b/src/display/color/IColor.hpp deleted file mode 100644 index 946f5b8b..00000000 --- a/src/display/color/IColor.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2025 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#pragma once -#include "dawn.hpp" - -namespace Dawn { - struct Color3B; - struct Color4B; - struct Color3F; - struct Color4F; - - struct Color { - public: - /** - * Gets this color as a 3-channel byte color. - */ - virtual Color3B toColor3B(void) const = 0; - - /** - * Gets this color as a 4-channel byte color. - */ - virtual Color4B toColor4B(void) const = 0; - - /** - * Gets this color as a 3-channel float color. (0-1 range) - */ - virtual Color3F toColor3F(void) const = 0; - - /** - * Gets this color as a 4-channel float color. (0-1 range) - */ - virtual Color4F toColor4F(void) const = 0; - }; -} \ No newline at end of file diff --git a/src/display/mesh/Mesh.cpp b/src/display/mesh/Mesh.cpp index cfee3d79..84eca258 100644 --- a/src/display/mesh/Mesh.cpp +++ b/src/display/mesh/Mesh.cpp @@ -35,33 +35,33 @@ void Mesh::draw( "Vertex offset + count must not exceed vertex count" ); - #if DISPLAY_SDL2 + #if DAWN_SDL2 // PSP style pointer legacy OpenGL const GLsizei stride = sizeof(MeshVertex); glColorPointer( - MESH_VERTEX_COLOR_SIZE, + 4, GL_UNSIGNED_BYTE, stride, (const GLvoid*)&this->vertices[offset].color[0] ); glTexCoordPointer( - MESH_VERTEX_UV_SIZE, + 2, GL_FLOAT, stride, (const GLvoid*)&this->vertices[offset].uv[0] ); glVertexPointer( - MESH_VERTEX_POS_SIZE, + 3, GL_FLOAT, stride, - (const GLvoid*)&this->vertices[offset].pos[0] + (const GLvoid*)&this->vertices[offset].position[0] ); glDrawArrays( - this->primitiveType, + static_cast(this->primitiveType), 0, count ); diff --git a/src/display/mesh/Mesh.hpp b/src/display/mesh/Mesh.hpp index 6af7f719..0b90736a 100644 --- a/src/display/mesh/Mesh.hpp +++ b/src/display/mesh/Mesh.hpp @@ -8,14 +8,15 @@ #include "display/color/Color.hpp" namespace Dawn { + #pragma pack(push, 1) struct MeshVertex { - public: - #if DAWN_SDL2 - Color4B color; - glm::vec2 uv; - glm::vec3 position; - #endif + #if DAWN_SDL2 + uint8_t color[4]; + glm::vec2 uv; + glm::vec3 position; + #endif }; + #pragma pack(pop) struct Mesh { private: diff --git a/src/display/mesh/PrimitiveType.hpp b/src/display/mesh/PrimitiveType.hpp index 6f701048..27743118 100644 --- a/src/display/mesh/PrimitiveType.hpp +++ b/src/display/mesh/PrimitiveType.hpp @@ -9,9 +9,9 @@ namespace Dawn { enum class PrimitiveType { #if DAWN_SDL2 - Triangles = GL_TRIANGLES, - Lines = GL_LINES, - Points = GL_POINTS, + TRIANGLES = GL_TRIANGLES, + LINES = GL_LINES, + POINTS = GL_POINTS, #endif }; } \ No newline at end of file