From b37b5398a6afa940acd1138bde922a70838f33af Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Fri, 4 Jul 2025 10:37:01 -0700 Subject: Add the new low-level renderer, shared between the imm and scene graph renderer. LLR integration with the scene graph renderer not yet done. --- include/gfx/gfx.h | 6 +- include/gfx/llr/llr.h | 107 +++++++++--------------------------- include/gfx/renderer.h | 77 +------------------------- include/gfx/renderer/imm_renderer.h | 55 ++++++++++++++++++ include/gfx/scene.h | 7 ++- include/gfx/sizes.h | 16 ++++-- 6 files changed, 103 insertions(+), 165 deletions(-) create mode 100644 include/gfx/renderer/imm_renderer.h (limited to 'include') diff --git a/include/gfx/gfx.h b/include/gfx/gfx.h index 7c670a5..d5c25b6 100644 --- a/include/gfx/gfx.h +++ b/include/gfx/gfx.h @@ -3,6 +3,7 @@ typedef struct AssetCache AssetCache; typedef struct GfxCore GfxCore; typedef struct ImmRenderer ImmRenderer; +typedef struct LLR LLR; typedef struct Renderer Renderer; typedef struct Gfx Gfx; @@ -16,12 +17,15 @@ void gfx_destroy(Gfx**); /// Get the render backend. GfxCore* gfx_get_core(Gfx*); -/// Get the renderer. +/// Get the scene renderer. Renderer* gfx_get_renderer(Gfx*); /// Get the immediate mode renderer. ImmRenderer* gfx_get_imm_renderer(Gfx*); +/// Get the low-level renderer. +LLR* gfx_get_llr(Gfx*); + /// Get the asset cache. AssetCache* gfx_get_asset_cache(Gfx*); diff --git a/include/gfx/llr/llr.h b/include/gfx/llr/llr.h index 49b7706..57abffc 100644 --- a/include/gfx/llr/llr.h +++ b/include/gfx/llr/llr.h @@ -1,117 +1,64 @@ #pragma once -#include -#include #include #include #include -#include -typedef struct Anima Anima; -typedef struct Light Light; -typedef struct Mesh Mesh; -typedef struct Skeleton Skeleton; +typedef struct Anima Anima; +typedef struct Geometry Geometry; +typedef struct Light Light; +typedef struct Mesh Mesh; +typedef struct ShaderProgram ShaderProgram; +typedef struct Skeleton Skeleton; -typedef struct ImmRenderer ImmRenderer; +typedef struct LLR LLR; -/// Prepare the graphics systems for immediate-mode rendering. -/// -/// Call this before issuing any immediate-mode rendering draws. -void gfx_imm_start(ImmRenderer*); - -/// End immediate mode rendering. -/// -/// Call this after issuing immediate-mode rendering draws and before swapping -/// buffers. -void gfx_imm_end(ImmRenderer*); - -// ----------------------------------------------------------------------------- -// Immediate-mode rendering of scene elements. -// -// This renders models and meshes under lighting. It is up to the client to -// determine visibility, sort the calls optimally, etc. +/// Set the shader to be used for subsequent draw calls. +/// The shader is not yet activated at this point. +void gfx_llr_set_shader(LLR*, ShaderProgram*); /// Push a light into the lights stack. -void gfx_imm_push_light(ImmRenderer*, Light*); +void gfx_llr_push_light(LLR*, Light*); /// Pop the last light from the lights stack. -void gfx_imm_pop_light(ImmRenderer*); +void gfx_llr_pop_light(LLR*); /// Load a skeleton. /// /// If a skeleton is loaded, subsequent meshes are rendered with joint data /// passed to the shader. This has a cost, so if subsequent meshes are not /// animated, unload the skeleton prior to rendering them. -void gfx_imm_set_skeleton(ImmRenderer*, const Anima*, const Skeleton*); +void gfx_llr_set_skeleton(LLR*, const Anima*, const Skeleton*); /// Unload the loaded skeleton. -void gfx_imm_unset_skeleton(ImmRenderer*); +void gfx_llr_unset_skeleton(LLR*); -/// Render the mesh. -void gfx_imm_render_mesh(ImmRenderer*, const Mesh*); - -// ----------------------------------------------------------------------------- -// Immediate-mode rendering of primitives. -// -// This is rather inefficient and should be reserved for debug rendering. It -// also does not support lighting; the primitives are rendered with a constant -// colour. - -/// Draw a set of triangles. -void gfx_imm_draw_triangles(ImmRenderer*, const vec3[], size_t num_triangles); - -/// Draw a triangle. -void gfx_imm_draw_triangle(ImmRenderer*, const vec3[3]); +/// Set the camera. +void gfx_llr_set_camera(LLR*, const Camera*); -/// Draw a bounding box. -void gfx_imm_draw_aabb2(ImmRenderer*, aabb2); +/// Set the view-projection matrix. +// void gfx_llr_set_view_projection_matrix(LLR*, const mat4*); -/// Draw a bounding box. -void gfx_imm_draw_aabb3(ImmRenderer*, aabb3); +/// Render the geometry. +void gfx_llr_render_geometry(LLR*, const Geometry*); -/// Draw a box. -/// -/// The vertices must be given in the following order: -/// -/// 7 ----- 6 -/// / /| -/// 3 ----- 2 | -/// | | | -/// | 4 ----- 5 -/// |/ |/ -/// 0 ----- 1 -void gfx_imm_draw_box3(ImmRenderer* renderer, const vec3 vertices[8]); - -/// Set the render colour. -void gfx_imm_set_colour(ImmRenderer*, vec4 colour); +/// Render the mesh. +void gfx_llr_render_mesh(LLR*, const Mesh*); // ----------------------------------------------------------------------------- // Matrix stack manipulation. -// -// Common to both scene and and primitive rendering. /// Load an identity model matrix. Clears the matrix stack. -void gfx_imm_load_identity(ImmRenderer* renderer); +void gfx_llr_load_identity(LLR* renderer); /// Push the given matrix to the matrix stack. -void gfx_imm_push_matrix(ImmRenderer* renderer, const mat4* matrix); +void gfx_llr_push_matrix(LLR* renderer, const mat4* matrix); /// Pop the top of the matrix stack. -void gfx_imm_pop_matrix(ImmRenderer* renderer); +void gfx_llr_pop_matrix(LLR* renderer); /// Push a translation matrix to the matrix stack. -void gfx_imm_translate(ImmRenderer* renderer, vec3 offset); +void gfx_llr_translate(LLR* renderer, vec3 offset); /// Set the model matrix. Clears the matrix stack. -void gfx_imm_set_model_matrix(ImmRenderer*, const mat4*); - -// ----------------------------------------------------------------------------- -// Camera -// -// Common to both scene and and primitive rendering. - -/// Set the camera. -void gfx_imm_set_camera(ImmRenderer*, const Camera*); - -/// Set the view-projection matrix. -// void gfx_imm_set_view_projection_matrix(ImmRenderer*, const mat4*); +void gfx_llr_set_model_matrix(LLR*, const mat4*); diff --git a/include/gfx/renderer.h b/include/gfx/renderer.h index 2a4ada1..1da74eb 100644 --- a/include/gfx/renderer.h +++ b/include/gfx/renderer.h @@ -1,23 +1,12 @@ #pragma once -#include -#include -#include #include -#include -#include -#include typedef struct GfxCore GfxCore; typedef struct Scene Scene; typedef struct SceneCamera SceneCamera; -typedef struct ImmRenderer ImmRenderer; -typedef struct Renderer Renderer; - -// ----------------------------------------------------------------------------- -// Main Renderer. -// ----------------------------------------------------------------------------- +typedef struct Renderer Renderer; typedef enum RenderSceneMode { RenderDefault, @@ -38,67 +27,3 @@ void gfx_render_scene(Renderer*, const RenderSceneParams*); /// Update the scene. void gfx_update(Scene*, const SceneCamera*, R t); - -// ----------------------------------------------------------------------------- -// Immediate Mode Renderer. -// ----------------------------------------------------------------------------- - -/// Prepare the graphics systems for immediate-mode rendering. -/// -/// Call this before issuing any immediate-mode rendering draws. -void gfx_imm_start(ImmRenderer*); - -/// End immediate mode rendering. -/// -/// Call this after issuing immediate-mode rendering draws and before swapping -/// buffers. -void gfx_imm_end(ImmRenderer*); - -/// Draw a set of triangles. -void gfx_imm_draw_triangles(ImmRenderer*, const vec3[], size_t num_triangles); - -/// Draw a triangle. -void gfx_imm_draw_triangle(ImmRenderer*, const vec3[3]); - -/// Draw a bounding box. -void gfx_imm_draw_aabb2(ImmRenderer*, aabb2); - -/// Draw a bounding box. -void gfx_imm_draw_aabb3(ImmRenderer*, aabb3); - -/// Draw a box. -/// -/// The vertices must be given in the following order: -/// -/// 7 ----- 6 -/// / /| -/// 3 ----- 2 | -/// | | | -/// | 4 ----- 5 -/// |/ |/ -/// 0 ----- 1 -void gfx_imm_draw_box3(ImmRenderer* renderer, const vec3 vertices[8]); - -/// Set the camera. -void gfx_imm_set_camera(ImmRenderer*, const Camera*); - -/// Load an identity model matrix. Clears the matrix stack. -void gfx_imm_load_identity(ImmRenderer* renderer); - -/// Push the given matrix to the matrix stack. -void gfx_imm_push_matrix(ImmRenderer* renderer, const mat4* matrix); - -/// Pop the top of the matrix stack. -void gfx_imm_pop_matrix(ImmRenderer* renderer); - -/// Push a translation matrix to the matrix stack. -void gfx_imm_translate(ImmRenderer* renderer, vec3 offset); - -/// Set the model matrix. Clears the matrix stack. -void gfx_imm_set_model_matrix(ImmRenderer*, const mat4*); - -/// Set the view-projection matrix. -void gfx_imm_set_view_projection_matrix(ImmRenderer*, const mat4*); - -/// Set the render colour. -void gfx_imm_set_colour(ImmRenderer*, vec4 colour); diff --git a/include/gfx/renderer/imm_renderer.h b/include/gfx/renderer/imm_renderer.h new file mode 100644 index 0000000..db4d290 --- /dev/null +++ b/include/gfx/renderer/imm_renderer.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +typedef struct ImmRenderer ImmRenderer; + +/// Prepare the graphics systems for immediate-mode rendering. +/// +/// Call this before issuing any immediate-mode rendering draws. +void gfx_imm_start(ImmRenderer*); + +/// End immediate mode rendering. +/// +/// Call this after issuing immediate-mode rendering draws and before swapping +/// buffers. +void gfx_imm_end(ImmRenderer*); + +/// Flush draw commands. +/// +/// This should be done when changing any state that may affect the rendering of +/// primitives; for example, LLR matrix stack changes. +void gfx_imm_flush(ImmRenderer*); + +/// Draw a set of triangles. +void gfx_imm_draw_triangles(ImmRenderer*, const vec3[], size_t num_triangles); + +/// Draw a triangle. +void gfx_imm_draw_triangle(ImmRenderer*, const vec3[3]); + +/// Draw a bounding box. +void gfx_imm_draw_aabb2(ImmRenderer*, aabb2); + +/// Draw a bounding box. +void gfx_imm_draw_aabb3(ImmRenderer*, aabb3); + +/// Draw a box. +/// +/// The vertices must be given in the following order: +/// +/// 7 ----- 6 +/// / /| +/// 3 ----- 2 | +/// | | | +/// | 4 ----- 5 +/// |/ |/ +/// 0 ----- 1 +void gfx_imm_draw_box3(ImmRenderer* renderer, const vec3 vertices[8]); + +/// Set the render colour. +void gfx_imm_set_colour(ImmRenderer*, vec4 colour); diff --git a/include/gfx/scene.h b/include/gfx/scene.h index abcaa70..37a7e0b 100644 --- a/include/gfx/scene.h +++ b/include/gfx/scene.h @@ -1,10 +1,11 @@ #pragma once +// TODO: Remove references to gfx/llr once the transition is complete. +#include +#include +#include #include #include -#include -#include -#include #include #include #include diff --git a/include/gfx/sizes.h b/include/gfx/sizes.h index 14f72bc..3eb7481 100644 --- a/include/gfx/sizes.h +++ b/include/gfx/sizes.h @@ -77,14 +77,20 @@ /// Maximum number of compiler defines in a Shader. #define GFX_MAX_SHADER_COMPILER_DEFINES 16 -// Renderer. +// Low-level renderer. + +/// Maximum number of lights that the low-level renderer can enable per rendered +/// mesh. +#define GFX_LLR_MAX_NUM_LIGHTS 8 + +/// Maximum number of matrices in the low-level renderer's matrix stack. +#define GFX_LLR_MAX_NUM_MATRICES 32 + +// Immediate-mode Renderer. /// Maximum number of triangles that the immediate-mode renderer can draw in a /// frame. -#define IMM_MAX_NUM_TRIANGLES 1024 - -/// Maximum number of matrices in the immediate-mode renderer's matrix stack. -#define IMM_MAX_NUM_MATRICES 32 +#define GFX_IMM_MAX_NUM_TRIANGLES 1024 // Asset Cache. -- cgit v1.2.3