diff options
Diffstat (limited to 'src/3d')
| -rw-r--r-- | src/3d/object.h | 2 | ||||
| -rw-r--r-- | src/3d/physics.cc | 3 | ||||
| -rw-r--r-- | src/3d/renderer.h | 7 | ||||
| -rw-r--r-- | src/3d/renderer_draw.cc | 138 | ||||
| -rw-r--r-- | src/3d/renderer_pipelines.cc | 4 | ||||
| -rw-r--r-- | src/3d/scene_loader.cc | 51 |
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 |
