summaryrefslogtreecommitdiff
path: root/src/3d
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-05-21 08:10:47 +0200
committerskal <pascal.massimino@gmail.com>2026-05-21 08:10:47 +0200
commitd806027dcaeadcdd8d2febd88bc46b2fd2c465de (patch)
tree30bc1ef9f40ccab7c00e31ee20e62bb86755fa26 /src/3d
parent680042a18c11ad5e58757e45b260745c2f52417f (diff)
style: apply clang-formatHEADmain
Diffstat (limited to 'src/3d')
-rw-r--r--src/3d/object.h2
-rw-r--r--src/3d/physics.cc3
-rw-r--r--src/3d/renderer.h7
-rw-r--r--src/3d/renderer_draw.cc138
-rw-r--r--src/3d/renderer_pipelines.cc4
-rw-r--r--src/3d/scene_loader.cc51
6 files changed, 120 insertions, 85 deletions
diff --git a/src/3d/object.h b/src/3d/object.h
index e2cd15a..eb1125c 100644
--- a/src/3d/object.h
+++ b/src/3d/object.h
@@ -9,7 +9,7 @@
#include <memory> // For std::shared_ptr
enum class ObjectType {
- CUBE, // Legacy alias for BOX (value 0, kept for binary scene compat)
+ CUBE, // Legacy alias for BOX (value 0, kept for binary scene compat)
SPHERE,
PLANE,
TORUS,
diff --git a/src/3d/physics.cc b/src/3d/physics.cc
index 788246f..592428b 100644
--- a/src/3d/physics.cc
+++ b/src/3d/physics.cc
@@ -16,7 +16,8 @@ float PhysicsSystem::sample_sdf(const Object3D& obj, vec3 world_p) {
float d = 1000.0f;
if (obj.type == ObjectType::SPHERE) {
d = q.len() - 1.0f;
- } else if (obj.type == ObjectType::BOX || obj.type == ObjectType::CUBE) { // CUBE is legacy alias
+ } else if (obj.type == ObjectType::BOX ||
+ obj.type == ObjectType::CUBE) { // CUBE is legacy alias
d = sdf::sdBox(q, vec3(1.0f, 1.0f, 1.0f));
} else if (obj.type == ObjectType::TORUS) {
d = sdf::sdTorus(q, vec2(1.0f, 0.4f));
diff --git a/src/3d/renderer.h b/src/3d/renderer.h
index 21192f3..5a9a065 100644
--- a/src/3d/renderer.h
+++ b/src/3d/renderer.h
@@ -80,7 +80,9 @@ class Renderer3D {
// Call before init(). When true, renders directly to surface (no post-process
// Y-flip): uses standard perspective (Y not negated) and CCW winding.
- void set_direct_render(bool v) { direct_render_ = v; }
+ void set_direct_render(bool v) {
+ direct_render_ = v;
+ }
struct MeshGpuData {
WGPUBuffer vertex_buffer;
@@ -124,7 +126,8 @@ class Renderer3D {
BVH cpu_bvh_; // Keep a CPU-side copy for building/uploading
bool bvh_enabled_ = true;
- bool direct_render_ = false; // true = render to surface (no post-process flip)
+ bool direct_render_ =
+ false; // true = render to surface (no post-process flip)
bool bind_group_dirty_ = true; // Recreate bind group when textures change
std::map<AssetId, MeshGpuData> mesh_cache_;
diff --git a/src/3d/renderer_draw.cc b/src/3d/renderer_draw.cc
index 929f261..bd7e994 100644
--- a/src/3d/renderer_draw.cc
+++ b/src/3d/renderer_draw.cc
@@ -10,11 +10,11 @@
void Renderer3D::update_uniforms(const Scene& scene, const Camera& camera,
float time) {
mat4 proj = camera.get_projection_matrix();
- if (direct_render_) proj.m[5] = -proj.m[5]; // undo Y-negate for direct surface
+ if (direct_render_)
+ proj.m[5] = -proj.m[5]; // undo Y-negate for direct surface
const mat4 vp = proj * camera.get_view_matrix();
const GlobalUniforms globals = GlobalUniforms::make(
- vp,
- vec4(camera.position.x, camera.position.y, camera.position.z, time),
+ vp, vec4(camera.position.x, camera.position.y, camera.position.z, time),
vec4((float)std::min((size_t)kMaxObjects, scene.objects.size()), 0.0f,
0.0f, 0.0f),
vec2((float)width_, (float)height_));
@@ -26,13 +26,25 @@ void Renderer3D::update_uniforms(const Scene& scene, const Camera& camera,
for (const auto& obj : scene.objects) {
float type_id = 0.0f;
switch (obj.type) {
- case ObjectType::SPHERE: type_id = 1.0f; break;
- case ObjectType::CUBE: // fallthrough (legacy alias for BOX)
- case ObjectType::BOX: type_id = 2.0f; break;
- case ObjectType::TORUS: type_id = 3.0f; break;
- case ObjectType::PLANE: type_id = 4.0f; break;
- case ObjectType::MESH: type_id = 5.0f; break;
- default: type_id = 0.0f; break;
+ case ObjectType::SPHERE:
+ type_id = 1.0f;
+ break;
+ case ObjectType::CUBE: // fallthrough (legacy alias for BOX)
+ case ObjectType::BOX:
+ type_id = 2.0f;
+ break;
+ case ObjectType::TORUS:
+ type_id = 3.0f;
+ break;
+ case ObjectType::PLANE:
+ type_id = 4.0f;
+ break;
+ case ObjectType::MESH:
+ type_id = 5.0f;
+ break;
+ default:
+ type_id = 0.0f;
+ break;
}
float plane_distance = 0.0f;
@@ -69,68 +81,69 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
} else {
bind_group_dirty_ = false;
- if (bind_group_)
- wgpuBindGroupRelease(bind_group_);
+ if (bind_group_)
+ wgpuBindGroupRelease(bind_group_);
- std::vector<WGPUBindGroupEntry> bg_entries;
+ std::vector<WGPUBindGroupEntry> bg_entries;
- {
- WGPUBindGroupEntry e = {};
- e.binding = 0;
- e.buffer = global_uniform_buffer_;
- e.size = sizeof(GlobalUniforms);
- bg_entries.push_back(e);
- }
+ {
+ WGPUBindGroupEntry e = {};
+ e.binding = 0;
+ e.buffer = global_uniform_buffer_;
+ e.size = sizeof(GlobalUniforms);
+ bg_entries.push_back(e);
+ }
- {
- WGPUBindGroupEntry e = {};
- e.binding = 1;
- e.buffer = object_storage_buffer_;
- e.size = sizeof(ObjectData) * kMaxObjects;
- bg_entries.push_back(e);
- }
+ {
+ WGPUBindGroupEntry e = {};
+ e.binding = 1;
+ e.buffer = object_storage_buffer_;
+ e.size = sizeof(ObjectData) * kMaxObjects;
+ bg_entries.push_back(e);
+ }
- if (bvh_enabled_) {
- WGPUBindGroupEntry e = {};
- e.binding = 2;
- e.buffer = bvh_storage_buffer_;
- e.size = sizeof(BVHNode) * kMaxObjects * 2;
- bg_entries.push_back(e);
- }
+ if (bvh_enabled_) {
+ WGPUBindGroupEntry e = {};
+ e.binding = 2;
+ e.buffer = bvh_storage_buffer_;
+ e.size = sizeof(BVHNode) * kMaxObjects * 2;
+ bg_entries.push_back(e);
+ }
- {
- WGPUBindGroupEntry e = {};
- e.binding = 3;
- e.textureView = noise_texture_view_;
- bg_entries.push_back(e);
- }
+ {
+ WGPUBindGroupEntry e = {};
+ e.binding = 3;
+ e.textureView = noise_texture_view_;
+ bg_entries.push_back(e);
+ }
- {
- WGPUBindGroupEntry e = {};
- e.binding = 4;
- e.sampler = default_sampler_;
- bg_entries.push_back(e);
- }
+ {
+ WGPUBindGroupEntry e = {};
+ e.binding = 4;
+ e.sampler = default_sampler_;
+ bg_entries.push_back(e);
+ }
- {
- WGPUBindGroupEntry e = {};
- e.binding = 5;
- e.textureView = sky_texture_view_ ? sky_texture_view_ : noise_texture_view_;
- bg_entries.push_back(e);
- }
+ {
+ WGPUBindGroupEntry e = {};
+ e.binding = 5;
+ e.textureView =
+ sky_texture_view_ ? sky_texture_view_ : noise_texture_view_;
+ bg_entries.push_back(e);
+ }
- WGPURenderPipeline cp = bvh_enabled_ ? pipeline_ : pipeline_no_bvh_;
- WGPUBindGroupLayout current_layout =
- wgpuRenderPipelineGetBindGroupLayout(cp, 0);
+ WGPURenderPipeline cp = bvh_enabled_ ? pipeline_ : pipeline_no_bvh_;
+ WGPUBindGroupLayout current_layout =
+ wgpuRenderPipelineGetBindGroupLayout(cp, 0);
- WGPUBindGroupDescriptor bg_desc = {};
- bg_desc.layout = current_layout;
- bg_desc.entryCount = (uint32_t)bg_entries.size();
- bg_desc.entries = bg_entries.data();
+ WGPUBindGroupDescriptor bg_desc = {};
+ bg_desc.layout = current_layout;
+ bg_desc.entryCount = (uint32_t)bg_entries.size();
+ bg_desc.entries = bg_entries.data();
- bind_group_ = wgpuDeviceCreateBindGroup(device_, &bg_desc);
+ bind_group_ = wgpuDeviceCreateBindGroup(device_, &bg_desc);
- wgpuBindGroupLayoutRelease(current_layout);
+ wgpuBindGroupLayoutRelease(current_layout);
} // end dirty block
WGPURenderPipeline current_pipeline =
@@ -208,7 +221,8 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
}
mat4 dbg_proj = camera.get_projection_matrix();
- if (direct_render_) dbg_proj.m[5] = -dbg_proj.m[5];
+ if (direct_render_)
+ dbg_proj.m[5] = -dbg_proj.m[5];
mat4 view_proj = dbg_proj * camera.get_view_matrix();
visual_debug_.render(pass, view_proj);
}
diff --git a/src/3d/renderer_pipelines.cc b/src/3d/renderer_pipelines.cc
index 195baad..9e1e2fb 100644
--- a/src/3d/renderer_pipelines.cc
+++ b/src/3d/renderer_pipelines.cc
@@ -253,8 +253,8 @@ void Renderer3D::create_mesh_pipeline() {
pipeline_desc.vertex.buffers = &vert_buffer_layout;
pipeline_desc.primitive.topology = WGPUPrimitiveTopology_TriangleList;
pipeline_desc.primitive.cullMode = WGPUCullMode_Back;
- // CW winding compensates for Y-negation in perspective() (post-process chain).
- // Direct-to-surface rendering uses standard CCW winding.
+ // CW winding compensates for Y-negation in perspective() (post-process
+ // chain). Direct-to-surface rendering uses standard CCW winding.
pipeline_desc.primitive.frontFace =
direct_render_ ? WGPUFrontFace_CCW : WGPUFrontFace_CW;
pipeline_desc.multisample.count = 1;
diff --git a/src/3d/scene_loader.cc b/src/3d/scene_loader.cc
index d5c1879..d27cc16 100644
--- a/src/3d/scene_loader.cc
+++ b/src/3d/scene_loader.cc
@@ -64,26 +64,40 @@ bool LoadScene(Scene& scene, const uint8_t* data, size_t size) {
if (offset + 12 + 16 + 12 + 16 > size)
return false; // Transforms + Color
- float px = read_f32(data + offset); offset += 4;
- float py = read_f32(data + offset); offset += 4;
- float pz = read_f32(data + offset); offset += 4;
+ float px = read_f32(data + offset);
+ offset += 4;
+ float py = read_f32(data + offset);
+ offset += 4;
+ float pz = read_f32(data + offset);
+ offset += 4;
vec3 pos(px, py, pz);
- float rx = read_f32(data + offset); offset += 4;
- float ry = read_f32(data + offset); offset += 4;
- float rz = read_f32(data + offset); offset += 4;
- float rw = read_f32(data + offset); offset += 4;
+ float rx = read_f32(data + offset);
+ offset += 4;
+ float ry = read_f32(data + offset);
+ offset += 4;
+ float rz = read_f32(data + offset);
+ offset += 4;
+ float rw = read_f32(data + offset);
+ offset += 4;
quat rot(rx, ry, rz, rw);
- float sx = read_f32(data + offset); offset += 4;
- float sy = read_f32(data + offset); offset += 4;
- float sz = read_f32(data + offset); offset += 4;
+ float sx = read_f32(data + offset);
+ offset += 4;
+ float sy = read_f32(data + offset);
+ offset += 4;
+ float sz = read_f32(data + offset);
+ offset += 4;
vec3 scale(sx, sy, sz);
- float cr = read_f32(data + offset); offset += 4;
- float cg = read_f32(data + offset); offset += 4;
- float cb = read_f32(data + offset); offset += 4;
- float ca = read_f32(data + offset); offset += 4;
+ float cr = read_f32(data + offset);
+ offset += 4;
+ float cg = read_f32(data + offset);
+ offset += 4;
+ float cb = read_f32(data + offset);
+ offset += 4;
+ float ca = read_f32(data + offset);
+ offset += 4;
vec4 color(cr, cg, cb, ca);
// Plane Distance (if type == PLANE)
@@ -127,9 +141,12 @@ bool LoadScene(Scene& scene, const uint8_t* data, size_t size) {
// Physics properties
if (offset + 4 + 4 + 4 > size)
return false;
- float mass = read_f32(data + offset); offset += 4;
- float restitution = read_f32(data + offset); offset += 4;
- uint32_t is_static_u32 = read_u32(data + offset); offset += 4;
+ float mass = read_f32(data + offset);
+ offset += 4;
+ float restitution = read_f32(data + offset);
+ offset += 4;
+ uint32_t is_static_u32 = read_u32(data + offset);
+ offset += 4;
bool is_static = (is_static_u32 != 0);
// Create Object3D