# thenecromance/monkeyrenderer architecture

> Architecture diagram of the GitHub repository thenecromance/monkeyrenderer, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/thenecromance/monkeyrenderer
- Repository: https://github.com/thenecromance/monkeyrenderer

## Overview

MonkeyRender is a C++ OpenGL/ECS rendering engine, demonstrated by a sandbox that initializes the core, registers runtime modules, creates camera/mesh/light/shader entities, and runs the update loop. Its capabilities include input-driven camera control, asset and shader loading with hot reload, forward and deferred rendering, shadows, post-processing, grid display, anti-aliasing, and ImGui controls. The graph preserves these branches; some module implementations were not excerpted, so only documented registration or visible source relationships are linked. The empty README provides no additional evidence.

Main entry points: [`SandBox/src/main.cpp`](https://github.com/thenecromance/monkeyrenderer/blob/main/SandBox/src/main.cpp) (Sandbox app), [`Core/src/Modules/CameraModule.cpp`](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/CameraModule.cpp) (Camera & frame data), [`Core/src/Graphics/OpenGLApp.cpp`](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Graphics/OpenGLApp.cpp) (OpenGL window), [`Core/src/Modules/Renderer/ShadowMapModule.cpp`](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/ShadowMapModule.cpp) (Shadow mapping)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Runtime &amp; Window"]
  node_sandbox["Sandbox app<br/>[main.cpp]"]
  node_core["Engine core<br/>[Core.cpp]"]
  node_window["OpenGL window<br/>[OpenGLApp.cpp]"]
end

subgraph group_scene["Scene &amp; Input"]
  node_input_handler["Input handler<br/>[InputHandler.cpp]"]
  node_input_module["Input module<br/>[InputModule.cpp]"]
  node_camera["Camera &amp; frame data<br/>[CameraModule.cpp]"]
  node_transforms["Transform updates"]
end

subgraph group_assets["Assets &amp; Shaders"]
  node_mesh_assets["Mesh importer<br/>[MeshModule.cpp]"]
  node_texture_assets["Texture importer"]
  node_shader_assets["Program importer"]
  node_file_watcher["Shader file watcher"]
  node_shader_ops["Shader operations<br/>[ShaderOperator.cpp]"]
end

subgraph group_render["Rendering"]
  node_light["Light module<br/>[LightModule.cpp]"]
  node_shadow["Shadow mapping"]
  node_base_render["Base renderer"]
  node_forward["Forward renderer"]
  node_deferred["Deferred renderer<br/>[DefferedRender.cpp]"]
  node_postprocess["Post-processing"]
  node_grid["Grid display<br/>[GridModule.cpp]"]
  node_imgui["ImGui renderer"]
  node_aa["Anti-aliasing"]
end

node_user(("Application user"))

node_user -->|"runs"| node_sandbox
node_sandbox -->|"initializes"| node_core
node_sandbox -->|"registers"| node_input_module
node_sandbox -->|"registers"| node_camera
node_sandbox -->|"registers"| node_transforms
node_sandbox -->|"registers"| node_mesh_assets
node_sandbox -->|"registers"| node_texture_assets
node_sandbox -->|"registers"| node_shader_assets
node_sandbox -->|"registers"| node_light
node_sandbox -->|"registers"| node_shadow
node_sandbox -->|"registers"| node_base_render
node_sandbox -->|"registers"| node_forward
node_sandbox -->|"registers"| node_deferred
node_sandbox -->|"registers"| node_postprocess
node_sandbox -->|"registers"| node_grid
node_sandbox -->|"registers"| node_imgui
node_sandbox -->|"registers"| node_aa
node_sandbox -.->|"runs loop"| node_window
node_core -->|"uses"| node_window
node_core -->|"updates input"| node_input_handler
node_input_handler -->|"reads events"| node_window
node_camera -->|"reads dimensions"| node_window
node_camera -.->|"reads controls"| node_input_module
node_camera -.->|"updates frame data"| node_shader_ops
node_shader_assets -->|"uses watcher"| node_file_watcher
node_shader_assets -->|"uses shader components"| node_shader_ops
node_shader_ops -->|"reads files"| node_file_watcher
node_shadow -->|"uses OpenGL"| node_window
node_shadow -.->|"reads camera data"| node_camera
node_shadow -.->|"reads lights"| node_light
node_base_render -.->|"coordinates passes"| node_forward
node_base_render -.->|"coordinates passes"| node_deferred

click node_sandbox "https://github.com/thenecromance/monkeyrenderer/blob/main/SandBox/src/main.cpp"
click node_core "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Core.cpp"
click node_window "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Graphics/OpenGLApp.cpp"
click node_input_handler "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Input/InputHandler.cpp"
click node_input_module "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Input/InputModule.cpp"
click node_camera "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/CameraModule.cpp"
click node_transforms "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/TransformModule.cpp"
click node_mesh_assets "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Importer/MeshModule.cpp"
click node_texture_assets "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Importer/TextureImporter.cpp"
click node_shader_assets "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Importer/ProgramImporter.cpp"
click node_file_watcher "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/FileWatcherModule.cpp"
click node_shader_ops "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Components/ShaderOperator.cpp"
click node_light "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/LightModule.cpp"
click node_shadow "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/ShadowMapModule.cpp"
click node_base_render "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/BaseRenderModule.cpp"
click node_forward "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/ForwardRenderModule.cpp"
click node_deferred "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/DefferedRender.cpp"
click node_postprocess "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/PostProcessModule.cpp"
click node_grid "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/GridModule.cpp"
click node_imgui "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/ImGuiModule/ImGuiRenderModule.cpp"
click node_aa "https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/AntiAliasingConfigModule.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_sandbox,node_core,node_window,node_user toneBlue
class node_input_handler,node_input_module,node_camera,node_transforms toneAmber
class node_mesh_assets,node_texture_assets,node_shader_assets,node_file_watcher,node_shader_ops toneMint
class node_light,node_shadow,node_base_render,node_forward,node_deferred,node_postprocess,node_grid,node_imgui,node_aa toneRose
```

## Components

### Runtime & Window

- [Sandbox app](https://github.com/thenecromance/monkeyrenderer/blob/main/SandBox/src/main.cpp): `SandBox/src/main.cpp`
- [Engine core](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Core.cpp): `Core/src/Core.cpp`
- [OpenGL window](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Graphics/OpenGLApp.cpp): `Core/src/Graphics/OpenGLApp.cpp`

### Scene & Input

- [Input handler](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Input/InputHandler.cpp): `Core/src/Modules/Input/InputHandler.cpp`
- [Input module](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Input/InputModule.cpp): `Core/src/Modules/Input/InputModule.cpp`
- [Camera & frame data](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/CameraModule.cpp): `Core/src/Modules/CameraModule.cpp`
- [Transform updates](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/TransformModule.cpp): `Core/src/Modules/TransformModule.cpp`

### Assets & Shaders

- [Mesh importer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Importer/MeshModule.cpp): `Core/src/Modules/Importer/MeshModule.cpp`
- [Texture importer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Importer/TextureImporter.cpp): `Core/src/Modules/Importer/TextureImporter.cpp`
- [Program importer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Importer/ProgramImporter.cpp): `Core/src/Modules/Importer/ProgramImporter.cpp`
- [Shader file watcher](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/FileWatcherModule.cpp): `Core/src/Modules/FileWatcherModule.cpp`
- [Shader operations](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Components/ShaderOperator.cpp): `Core/src/Components/ShaderOperator.cpp`

### Rendering

- [Light module](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/LightModule.cpp): `Core/src/Modules/Renderer/LightModule.cpp`
- [Shadow mapping](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/ShadowMapModule.cpp): `Core/src/Modules/Renderer/ShadowMapModule.cpp`
- [Base renderer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/BaseRenderModule.cpp): `Core/src/Modules/Renderer/BaseRenderModule.cpp`
- [Forward renderer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/ForwardRenderModule.cpp): `Core/src/Modules/Renderer/ForwardRenderModule.cpp`
- [Deferred renderer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/DefferedRender.cpp): `Core/src/Modules/Renderer/DefferedRender.cpp`
- [Post-processing](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/PostProcessModule.cpp): `Core/src/Modules/Renderer/PostProcessModule.cpp`
- [Grid display](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/GridModule.cpp): `Core/src/Modules/GridModule.cpp`
- [ImGui renderer](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/ImGuiModule/ImGuiRenderModule.cpp): `Core/src/Modules/ImGuiModule/ImGuiRenderModule.cpp`
- [Anti-aliasing](https://github.com/thenecromance/monkeyrenderer/blob/main/Core/src/Modules/Renderer/AntiAliasingConfigModule.cpp): `Core/src/Modules/Renderer/AntiAliasingConfigModule.cpp`

### Other components

- **Application user**

## Connections

- Application user → Sandbox app: runs (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Engine core: initializes (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Input module: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Camera & frame data: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Transform updates: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Mesh importer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Texture importer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Program importer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Light module: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Shadow mapping: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Base renderer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Forward renderer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Deferred renderer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Post-processing: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Grid display: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → ImGui renderer: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → Anti-aliasing: registers (evidence: `SandBox/src/main.cpp`)
- Sandbox app → OpenGL window: runs loop
- Engine core → OpenGL window: uses (evidence: `Core/src/Core.cpp`)
- Engine core → Input handler: updates input (evidence: `Core/src/Core.cpp`)
- Input handler → OpenGL window: reads events (evidence: `Core/src/Modules/Input/InputHandler.cpp`)
- Camera & frame data → OpenGL window: reads dimensions (evidence: `Core/src/Modules/CameraModule.cpp`)
- Camera & frame data → Input module: reads controls
- Camera & frame data → Shader operations: updates frame data
- Program importer → Shader file watcher: uses watcher (evidence: `Core/src/Modules/Importer/ProgramImporter.cpp`)
- Program importer → Shader operations: uses shader components (evidence: `Core/src/Modules/Importer/ProgramImporter.cpp`)
- Shader operations → Shader file watcher: reads files (evidence: `Core/src/Components/ShaderOperator.cpp`)
- Shadow mapping → OpenGL window: uses OpenGL (evidence: `Core/src/Modules/Renderer/ShadowMapModule.cpp`)
- Shadow mapping → Camera & frame data: reads camera data
- Shadow mapping → Light module: reads lights
- Base renderer → Forward renderer: coordinates passes
- Base renderer → Deferred renderer: coordinates passes
