diff --git a/src/core/renderer.cpp b/src/core/renderer.cpp index ad58374..507b8f0 100644 --- a/src/core/renderer.cpp +++ b/src/core/renderer.cpp @@ -26,7 +26,14 @@ void Renderer::Init(DisplayInterface* display) { m_interface = display; } +void Renderer::InitRender(Camera* camera, Scene* scene) { + m_camera = camera; + m_scene = scene; + RendererInitialized = true; +} + void Renderer::Render() { + if (!RendererInitialized) return; if (m_mode == MODE_PROGRESSIVE_GUI || m_mode == MODE_PROGRESSIVE_IMG) { RenderProgressive(); } else if (m_mode == MODE_SAMPLES_IMG) { @@ -37,6 +44,7 @@ void Renderer::Render() { } void Renderer::Render(uint32_t* framebuffer) { + if (!RendererInitialized) return; m_framebuffer = framebuffer; if (m_mode == MODE_PROGRESSIVE_GUI || m_mode == MODE_PROGRESSIVE_IMG) { RenderProgressive(); @@ -50,7 +58,7 @@ void Renderer::Render(uint32_t* framebuffer) { void Renderer::RenderProgressive() { m_progressive = new ProgressiveRenderer(); - m_progressive->Init(m_interface); + m_progressive->Init(m_interface, m_camera, m_scene); m_progressive->Render(); } diff --git a/src/core/renderer.hpp b/src/core/renderer.hpp index cc99de9..e17ad38 100644 --- a/src/core/renderer.hpp +++ b/src/core/renderer.hpp @@ -7,6 +7,9 @@ class DisplayInterface; class ProgressiveRenderer; +class Camera; +class Scene; + // Function initProgressive or whatever takes a pointer to the display class Renderer { public: @@ -17,6 +20,9 @@ public: void Init(); void Init(DisplayInterface* display); + void InitRender(Camera* camera, Scene* scene); + + bool RendererInitialized = false; void Render(); void Render(uint32_t* framebuffer); @@ -28,11 +34,14 @@ private: DisplayInterface* m_interface = nullptr; uint32_t* m_framebuffer = nullptr; + Camera* m_camera = nullptr; + Scene* m_scene = nullptr; + void RenderProgressive(); ProgressiveRenderer* m_progressive = nullptr; - void RenderSamples(); + int m_sampleCount = -1; }; #endif diff --git a/src/engine/progressiverenderer.cpp b/src/engine/progressiverenderer.cpp index 888b9bb..4a7ee08 100644 --- a/src/engine/progressiverenderer.cpp +++ b/src/engine/progressiverenderer.cpp @@ -1,15 +1,20 @@ -#include "./progressiverenderer.hpp" +#include "progressiverenderer.hpp" #include "../common.hpp" #include "../pixel.hpp" #include "../display/displayinterface.hpp" +#include "../definitions/camera.hpp" +#include "../definitions/scene.hpp" + ProgressiveRenderer::ProgressiveRenderer() { } -void ProgressiveRenderer::Init(DisplayInterface* interface) { +void ProgressiveRenderer::Init(DisplayInterface* interface, Camera* camera, Scene* scene) { m_interface = interface; + m_camera = camera; + m_scene = scene; } void ProgressiveRenderer::Render() { @@ -22,8 +27,8 @@ void ProgressiveRenderer::Render() { for (int i = 0; i < 360000; i++) { m_interface->SetPixelSafe(rand() % m_interface->XRes, - rand() % m_interface->YRes, - rgb888(rand() % 255, rand() % 255, rand() % 255)); + rand() % m_interface->YRes, + rgb888(rand() % 255, rand() % 255, rand() % 255)); } m_interface->Update(); diff --git a/src/engine/progressiverenderer.hpp b/src/engine/progressiverenderer.hpp index cb80d5b..0661ccf 100644 --- a/src/engine/progressiverenderer.hpp +++ b/src/engine/progressiverenderer.hpp @@ -3,16 +3,22 @@ class DisplayInterface; +class Camera; +class Scene; + class ProgressiveRenderer { public: ProgressiveRenderer(); - void Init(DisplayInterface* interface); + void Init(DisplayInterface* interface, Camera* camera, Scene* scene); void Render(); private: - DisplayInterface* m_interface = nullptr; + DisplayInterface* m_interface = nullptr; + + Camera* m_camera = nullptr; + Scene* m_scene = nullptr; }; #endif diff --git a/src/inferno.cpp b/src/inferno.cpp index 55b3f18..0a63943 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -45,7 +45,22 @@ bool InfernoEngine::InitWindow(int xRes, int yRes) { return true; } +void InfernoEngine::SetScene(Scene* scene) { + m_scene = scene; +} + +void InfernoEngine::SetCamera(Camera* camera) { + m_camera = camera; +} + +void InfernoEngine::AutoInitCamera() { + // set up a camera +} + void InfernoEngine::Ready() { + if (!m_camera || !m_scene) return; + m_renderer->InitRender(m_camera, m_scene); + if (!m_initialized) m_initialized = true; } diff --git a/src/inferno.hpp b/src/inferno.hpp index f25e2e7..c2757ad 100644 --- a/src/inferno.hpp +++ b/src/inferno.hpp @@ -7,6 +7,7 @@ #include "common.hpp" +// Give the user access to the base classes to define shit #include "definitions/camera.hpp" #include "definitions/scene.hpp" @@ -27,6 +28,11 @@ public: // Initializes the SDL framebuffer with OpenGL bool InitWindow(int xRes, int yRes); + // Functions related to raytracing + void SetScene(Scene* scene); + void SetCamera(Camera* camera); + void AutoInitCamera(); + void Ready(); void Render(); @@ -54,6 +60,9 @@ private: // mode is not selected then it is nothing Display* m_display = nullptr; Renderer* m_renderer = nullptr; + + Camera* m_camera = nullptr; + Scene* m_scene = nullptr; }; #endif diff --git a/test/main.cpp b/test/main.cpp index 7eaf5a2..5b2e723 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -11,6 +11,9 @@ int main(int argc, char** argv) { std::cout << "Error initializing window: " << inferno.LastError() << std::endl; } + inferno.SetCamera(new Camera()); + inferno.SetScene(new Scene()); + inferno.Ready(); inferno.Render(); }