Bug fixes: - Release static GL objects (UBOs, logo texture) before the context is destroyed via new Renderer::shutdown() - Fix max point/spot light warnings never firing - Show frame time in ms instead of seconds - Size the viewport framebuffer in physical pixels on HiDPI displays - Stop double-flipping OBJ UVs; add flip_uvs option to load_obj for models with a top-left UV origin (backpack) Build: - Track header dependencies (-MMD -MP) so header edits trigger rebuilds - Create build/ automatically Error handling: - Add gldebug module: KHR_debug output routed to the logger in debug builds, object labels, and error/status string helpers - Validate inputs and check GL errors when creating textures, meshes, framebuffers, uniform buffers and shaders; FrameBuffer::resize() and Renderer::init() now report failure Resources: - Add ResourceCache: shares textures and shaders by path and substitutes fallbacks (magenta checkerboard texture, unlit shader, cube mesh) for assets that fail to load; specular maps are optional - load_obj never fails, a broken model becomes a fallback cube - Renderer draws submeshes with broken materials using the fallback material instead of skipping them - Add Texture::create_from_pixels, Shader::create_from_source and Mesh::create_cube - Cache uniform locations in Shader, looked up with string_view so hits don't allocate; missing uniforms warn once Performance: - Add CpuTimer and GpuTimer (GL_TIME_ELAPSED, non-blocking readback) and a Performance section in the UI with averaged overlay numbers - Sample material textures once per fragment and apply material colors after accumulating lights - Pass camera position through CameraBlock instead of inverting the view matrix per fragment - Compute the normal matrix on the CPU instead of per vertex - Skip spot light work for fragments outside the outer cone
112 lines
3.0 KiB
Markdown
112 lines
3.0 KiB
Markdown
# Fan Engine
|
|
|
|
<img src="./assets/logo/logo.png" width="64">
|
|
|
|
A minimal 3D renderer written in C++ and OpenGL 3.3 Core.
|
|
|
|
> **_NOTE_:** The engine is still in development. Expect breaking changes.
|
|
|
|
<img src="./assets/preview.png" width="600">
|
|
|
|
## Building
|
|
|
|
The only tested platform at the moment is **GNU/Linux** (x86_64).
|
|
|
|
To build the project **you'll need to have GLFW already installed
|
|
system-wide**, the rest of the dependencies are already included.
|
|
|
|
After that, building comes down to just running the included Makefile.
|
|
|
|
```console
|
|
$ make # optionally pass -j$(nproc)
|
|
```
|
|
|
|
## Features
|
|
|
|
This is the current state of the engine architecture:
|
|
|
|
```mermaid
|
|
flowchart TB
|
|
subgraph Infrastructure["Infrastructure"]
|
|
direction LR
|
|
|
|
subgraph Platform
|
|
direction TB
|
|
Window --> GLFW
|
|
Window --> glad
|
|
Window --> ImGui["Dear ImGui"]
|
|
end
|
|
|
|
subgraph Loading
|
|
direction TB
|
|
Loader --> tinyobjloader
|
|
Loader --> stb_image
|
|
end
|
|
end
|
|
|
|
subgraph Application
|
|
direction LR
|
|
Framebuffer
|
|
Renderer --> Camera
|
|
Renderer --> Scene
|
|
Renderer -->|Updates| UniformBuffer
|
|
Renderer -->|Owns| ResourceCache
|
|
end
|
|
|
|
subgraph World
|
|
direction LR
|
|
|
|
subgraph SceneGraph["Scene Graph"]
|
|
direction TB
|
|
Scene --> Entity
|
|
Entity --> Transform
|
|
Entity --> Mesh
|
|
Entity -.->|Optional override| Material
|
|
Mesh -->|Partitions| SubMesh
|
|
SubMesh -->|Owns| Material
|
|
end
|
|
|
|
subgraph Lighting
|
|
direction TB
|
|
Scene --> LightEnvironment
|
|
LightEnvironment --> DirectionalLight
|
|
LightEnvironment --> PointLight
|
|
LightEnvironment --> SpotLight
|
|
end
|
|
end
|
|
|
|
subgraph SceneData["Scene Data"]
|
|
direction LR
|
|
|
|
subgraph Geometry
|
|
direction TB
|
|
Mesh --> Vertices
|
|
Mesh --> Indices
|
|
end
|
|
|
|
subgraph Resources
|
|
direction TB
|
|
Material --> Shader
|
|
Material --> Texture
|
|
UniformBuffer -->|Global data| Shader
|
|
ResourceCache -.->|Caches, falls back| Texture
|
|
ResourceCache -.->|Caches, falls back| Shader
|
|
end
|
|
end
|
|
|
|
tinyobjloader -->|Generates| Entity
|
|
Texture -.->|Decodes via| stb_image
|
|
|
|
classDef application fill:#7c3aed,stroke:#4c1d95,color:#fff
|
|
classDef world fill:#2563eb,stroke:#1e3a8a,color:#fff
|
|
classDef data fill:#0f766e,stroke:#134e4a,color:#fff
|
|
classDef loading fill:#d97706,stroke:#92400e,color:#fff
|
|
classDef platform fill:#64748b,stroke:#334155,color:#fff
|
|
|
|
class Renderer,Scene,Camera,Framebuffer,ResourceCache application
|
|
class Entity,Transform,Mesh,SubMesh,Material,LightEnvironment world
|
|
class UniformBuffer,Shader,Texture,Vertices,Indices,DirectionalLight,PointLight,SpotLight data
|
|
class Loader,tinyobjloader,stb_image loading
|
|
class Window,GLFW,glad,ImGui platform
|
|
```
|