diff --git a/.ccls b/.ccls index 2a8ceb9..6f142bb 100644 --- a/.ccls +++ b/.ccls @@ -4,5 +4,7 @@ clang++ -Ivendor/imgui -Ivendor/notcurses/include -Ivendor/GameNetworkingSockets/include --DWINDOW=1 --DRENDERER=1 +-DWINDOW_GLFW +-DWINDOW_SDL3 +-DRENDERER_OPENGL +-DRENDERER_SDL3 diff --git a/include/utils/Renderer/Renderer.h b/include/utils/Renderer/Renderer.h index 25ed553..385c147 100644 --- a/include/utils/Renderer/Renderer.h +++ b/include/utils/Renderer/Renderer.h @@ -3,34 +3,110 @@ #include "pch.hpp" +#include "extratools.h" + namespace Archimedes { - class VertexArray {}; + class VertexArray { - class IndexArray {}; + public: + VertexArray(const void* data, size_t size) : data(data), size(size) { + } + + ~VertexArray() {} - class Shader {}; + const void* getData() const { return data; } + size_t getSize() const { return size; } + unsigned int getId() const { return id; } + + private: + const void* data; + size_t size; + unsigned int id; + }; + + class IndexArray { + + public: + IndexArray(const unsigned int* indices, size_t count) : indices(indices), count(count) { + } + + ~IndexArray() {} + + const void* getIndicies() const { return indices; } + size_t getCount() const { return count; } + + private: + const unsigned int* indices; + size_t count; + unsigned int id; + }; + + class Shader { + + public: + enum class LoadType { + FromSource, + FromFileSource, + FromFileBin + }; + + Shader(const std::string& source, LoadType loadType) { + switch(loadType) { + case LoadType::FromSource: + break; + case LoadType::FromFileSource: + break; + case LoadType::FromFileBin: + break; + default: + break; + } + } + + ~Shader() {} + + unsigned int getId() const { return id; } + + private: + unsigned int id; + }; + + class RenderTarget { + + public: + RenderTarget(const void* data, size_t size, size_t count, const std::string& shader) + : data(data), size(size), count(count), shader(shader) {} + + ~RenderTarget() {} + + private: + const void* data; + size_t size; + size_t count; + const std::string& shader; + }; class Renderer { public: int w, h; + + glm::vec4 clearColor = { 0.0f, 0.0f, 0.0f, 0.0f }; - Renderer() {} - virtual ~Renderer() = 0; + Renderer() : w(0), h(0) {} + + virtual ~Renderer() {} virtual bool init() = 0; virtual void render() = 0; + + virtual void draw(const VertexArray&, const IndexArray&, const Shader&) = 0; - std::list>& getCmdList() { - return rc; - } + virtual Renderer* getRendererImpl() = 0; - - private: - std::list> rc; }; } diff --git a/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h b/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h index 268cc4f..44cc944 100644 --- a/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h +++ b/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h @@ -1,5 +1,7 @@ -#ifndef RENDERER_OPENGL + #define RENDERER_OPENGL +#ifdef RENDERER_OPENGL +#undef RENDERER_OPENGL #include "pch.hpp" @@ -11,6 +13,12 @@ namespace Archimedes { + class VertexArrayOpenGL : public VertexArray {}; + + class IndexArrayOpenGL : public IndexArray {}; + + class ShaderOpenGL : public Shader {}; + class RendererOpenGL : public Renderer { public: @@ -19,19 +27,30 @@ namespace Archimedes { RendererOpenGL() {}; ~RendererOpenGL() {}; - bool init() { + bool init() override { return glewInit() == GLEW_OK; }; - void render(std::list> cmdList, int& w, int& h) { + void render() override { glViewport(0, 0, w, h); - glClearColor(0.2, 0.2, 0.4, 1); + glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a); glClear(GL_COLOR_BUFFER_BIT); } - void draw() {} + void draw(const VertexArray& va, const IndexArray& ia, const Shader& shader) override { + + glUseProgram(shader.id); + + glBindVertexArray(va.id); + + glDrawElements(GL_TRIANGLES, va.count, GL_UNSIGNED_INT, 0); + + glBindVertexArray(0); + } + + RendererOpenGL* getRendererImpl() override { return this; } }; } diff --git a/include/utils/Window/WindowImpl/WindowGLFW/WindowGLFW.h b/include/utils/Window/WindowImpl/WindowGLFW/WindowGLFW.h index 926c1d9..5a67dcb 100644 --- a/include/utils/Window/WindowImpl/WindowGLFW/WindowGLFW.h +++ b/include/utils/Window/WindowImpl/WindowGLFW/WindowGLFW.h @@ -1,7 +1,5 @@ -#if WINDOW == 1 - -#ifndef WINDOW_GLFW -#define WINDOW_GLFW +#ifdef WINDOW_GLFW +#undef WINDOW_GLFW #include "pch.hpp" @@ -30,11 +28,13 @@ namespace Archimedes { std::cout << "glfwInit failed!\n"; std::abort(); } -#if RENDRER == 1 - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); -#endif + + if(renderer) { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + } + window = glfwCreateWindow(640, 480, "Archimedes", NULL, NULL); if(!w) { @@ -134,5 +134,3 @@ namespace Archimedes { } #endif - -#endif diff --git a/include/utils/Window/WindowImpl/WindowSDL3/WindowSDL3.h b/include/utils/Window/WindowImpl/WindowSDL3/WindowSDL3.h index d5d0561..e7b8fd4 100644 --- a/include/utils/Window/WindowImpl/WindowSDL3/WindowSDL3.h +++ b/include/utils/Window/WindowImpl/WindowSDL3/WindowSDL3.h @@ -1,7 +1,5 @@ -#if WINDOW == 2 - -#ifndef WINDOW_SDL3 -#define WINDOW_SDL3 +#ifdef WINDOW_SDL3 +#undef WINDOW_SDL3 #include "pch.hpp" @@ -9,7 +7,7 @@ #include -#if RENDERER == 2 +#if RENDERER == 1 #include @@ -136,7 +134,7 @@ namespace Archimedes { while(SDL_PollEvent(&e)); } - WindowSDL3* getWindowImpl() { return this; }; + WindowSDL3* getWindowImpl() override { return this; }; #if RENDERER == 1 void restoreContext() { SDL_GL_MakeCurrent(window, gl_context); } @@ -167,5 +165,3 @@ namespace Archimedes { } #endif - -#endif