$darkmode
Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
light_probes.h
Go to the documentation of this file.
1 #ifndef LIGHT_PROBES_H
2 #define LIGHT_PROBES_H
3 
4 #include "sh_math.h"
5 #include "shader.h"
6 #include <cglm/cglm.h>
7 #include <pthread.h>
8 
9 /* Forward declaration from instanced_rendering.h */
10 typedef struct {
11  mat4 model;
12  vec3 albedo;
13  float metallic;
14  float roughness;
15  float ao;
16  float padding;
18 
21 enum { SH_TEXTURE_COUNT = 7 };
23 enum { TEXTURE_UNIT_SH_START = 8 };
24 
25 typedef struct {
26  SH9 sh_data; /* 9 coefficients, each aligned to vec4 (16 bytes) for
27  std430 */
28 } LightProbe;
29 
30 typedef struct {
31  /* Grid Data */
32  LightProbe* probes; /* CPU Buffer */
33  unsigned int ssbo; /* Legacy GPU Buffer Handle (kept for debug view) */
34  unsigned int sh_textures[SH_TEXTURE_COUNT]; /* 3D Textures for hardware
35  interpolation */
36 
37  /* Spatial Info */
38  vec3 aabb_min;
39  vec3 aabb_max;
40  ivec3 grid_dim;
41  vec3 cell_size;
43 
44  /* Scene Copy for Async Update */
47 
48  /* Threading */
49  pthread_t worker_thread;
50  pthread_mutex_t mutex;
51  pthread_cond_t cond;
52  volatile int running;
53  volatile int update_pending;
54  volatile int results_ready;
55 
56  /* Debug Resources */
59  unsigned int dummy_vao;
60  unsigned int aabb_vao;
61  unsigned int aabb_vbo;
63 
73 void light_probe_grid_compute_aabb(LightProbeGrid* grid, const void* spheres,
74  int count, size_t stride, float padding);
75 
83 void light_probe_grid_init_cpu(LightProbeGrid* grid, int dim_x, int dim_y,
84  int dim_z);
85 
90 void light_probe_grid_init(LightProbeGrid* grid, int dim_x, int dim_y,
91  int dim_z);
92 
96 void light_probe_grid_set_bounds(LightProbeGrid* grid, vec3 aabb_min,
97  vec3 aabb_max);
98 
102 void light_probe_grid_set_scene(LightProbeGrid* grid, const void* spheres,
103  int count, size_t stride);
104 
109 
115 
122 void light_probe_render_debug(LightProbeGrid* grid, mat4 view, mat4 proj);
123 
128 
133 
134 #endif /* LIGHT_PROBES_H */
void light_probe_grid_compute_aabb(LightProbeGrid *grid, const void *spheres, int count, size_t stride, float padding)
Computes the AABB for the grid based on sphere instances.
Definition: light_probes.c:80
void light_probe_grid_init(LightProbeGrid *grid, int dim_x, int dim_y, int dim_z)
Initializes the grid structure, creates SSBO, and starts worker thread.
Definition: light_probes.c:419
void light_probe_grid_init_cpu(LightProbeGrid *grid, int dim_x, int dim_y, int dim_z)
Initializes the grid structure (CPU only).
Definition: light_probes.c:133
void light_probe_grid_cleanup(LightProbeGrid *grid)
Cleans up all resources (CPU, GPU, Threads).
Definition: light_probes.c:615
void light_probe_grid_set_scene(LightProbeGrid *grid, const void *spheres, int count, size_t stride)
Updates the scene data used by the grid (copies it).
Definition: light_probes.c:491
void light_probe_grid_sync(LightProbeGrid *grid)
Checks if results are ready and uploads to GPU. Should be called on main thread.
Definition: light_probes.c:532
@ TEXTURE_UNIT_SH_START
Definition: light_probes.h:23
void light_probe_grid_update_async(LightProbeGrid *grid)
Signals the worker thread to perform an SH update.
Definition: light_probes.c:519
void light_probe_grid_set_bounds(LightProbeGrid *grid, vec3 aabb_min, vec3 aabb_max)
Sets the grid AABB and computes cell sizes from dimensions.
Definition: light_probes.c:468
@ SH_TEXTURE_COUNT
Definition: light_probes.h:21
void light_probe_render_debug(LightProbeGrid *grid, mat4 view, mat4 proj)
Renders debug spheres for the probes.
Definition: light_probes.c:665
void light_probe_grid_free_cpu(LightProbeGrid *grid)
Cleans up CPU resources.
Definition: light_probes.c:159
High-level OpenGL shader management with metadata and uniform caching.
Definition: light_probes.h:30
pthread_t worker_thread
Definition: light_probes.h:49
Shader * aabb_shader
Definition: light_probes.h:58
pthread_mutex_t mutex
Definition: light_probes.h:50
int scene_count
Definition: light_probes.h:46
Shader * debug_shader
Definition: light_probes.h:57
int total_probes
Definition: light_probes.h:42
unsigned int aabb_vao
Definition: light_probes.h:60
unsigned int aabb_vbo
Definition: light_probes.h:61
unsigned int ssbo
Definition: light_probes.h:33
ivec3 grid_dim
Definition: light_probes.h:40
unsigned int dummy_vao
Definition: light_probes.h:59
pthread_cond_t cond
Definition: light_probes.h:51
volatile int update_pending
Definition: light_probes.h:53
LightProbe * probes
Definition: light_probes.h:32
vec3 aabb_min
Definition: light_probes.h:38
volatile int results_ready
Definition: light_probes.h:54
SphereInstance_POD * scene_copy
Definition: light_probes.h:45
vec3 cell_size
Definition: light_probes.h:41
volatile int running
Definition: light_probes.h:52
vec3 aabb_max
Definition: light_probes.h:39
Definition: light_probes.h:25
SH9 sh_data
Definition: light_probes.h:26
Definition: sh_math.h:10
Wrapper for an OpenGL program with uniform caching and automatic cleanup.
Definition: shader.h:71
Definition: light_probes.h:10
vec3 albedo
Definition: light_probes.h:12
mat4 model
Definition: light_probes.h:11
float ao
Definition: light_probes.h:15
float roughness
Definition: light_probes.h:14
float metallic
Definition: light_probes.h:13
float padding
Definition: light_probes.h:16