summaryrefslogtreecommitdiff
path: root/src/3d
diff options
context:
space:
mode:
Diffstat (limited to 'src/3d')
-rw-r--r--src/3d/object.h5
-rw-r--r--src/3d/physics.cc2
-rw-r--r--src/3d/renderer.cc2
-rw-r--r--src/3d/renderer.h1
-rw-r--r--src/3d/renderer_draw.cc20
5 files changed, 18 insertions, 12 deletions
diff --git a/src/3d/object.h b/src/3d/object.h
index a8eb98c..e2cd15a 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,
+ CUBE, // Legacy alias for BOX (value 0, kept for binary scene compat)
SPHERE,
PLANE,
TORUS,
@@ -17,6 +17,7 @@ enum class ObjectType {
SKYBOX,
MESH
// Add more SDF types here
+ // NOTE: CUBE == BOX semantically. Use BOX for new code.
};
struct BoundingVolume {
@@ -46,7 +47,7 @@ class Object3D {
std::shared_ptr<void>
shared_user_data; // For tool-specific data managed with shared ownership
- Object3D(ObjectType t = ObjectType::CUBE)
+ Object3D(ObjectType t = ObjectType::BOX)
: position(0, 0, 0), rotation(0, 0, 0, 1), scale(1, 1, 1), type(t),
color(1, 1, 1, 1), velocity(0, 0, 0), mass(1.0f), restitution(0.5f),
is_static(false), mesh_asset_id((AssetId)0), local_extent(1, 1, 1),
diff --git a/src/3d/physics.cc b/src/3d/physics.cc
index db27e95..788246f 100644
--- a/src/3d/physics.cc
+++ b/src/3d/physics.cc
@@ -16,7 +16,7 @@ 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) {
+ } 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.cc b/src/3d/renderer.cc
index 7f2f800..e3e8ce7 100644
--- a/src/3d/renderer.cc
+++ b/src/3d/renderer.cc
@@ -108,10 +108,12 @@ void Renderer3D::resize(int width, int height) {
void Renderer3D::set_noise_texture(WGPUTextureView noise_view) {
noise_texture_view_ = noise_view;
+ bind_group_dirty_ = true;
}
void Renderer3D::set_sky_texture(WGPUTextureView sky_view) {
sky_texture_view_ = sky_view;
+ bind_group_dirty_ = true;
}
void Renderer3D::add_debug_aabb(const vec3& min, const vec3& max,
diff --git a/src/3d/renderer.h b/src/3d/renderer.h
index 8f933b5..21192f3 100644
--- a/src/3d/renderer.h
+++ b/src/3d/renderer.h
@@ -125,6 +125,7 @@ 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 bind_group_dirty_ = true; // Recreate bind group when textures change
std::map<AssetId, MeshGpuData> mesh_cache_;
const MeshGpuData* temp_mesh_override_ = nullptr; // HACK for test_mesh tool
diff --git a/src/3d/renderer_draw.cc b/src/3d/renderer_draw.cc
index dca7113..929f261 100644
--- a/src/3d/renderer_draw.cc
+++ b/src/3d/renderer_draw.cc
@@ -27,8 +27,8 @@ void Renderer3D::update_uniforms(const Scene& scene, const Camera& camera,
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::CUBE: type_id = 2.0f; break; // CUBE is same as BOX
case ObjectType::TORUS: type_id = 3.0f; break;
case ObjectType::PLANE: type_id = 4.0f; break;
case ObjectType::MESH: type_id = 5.0f; break;
@@ -63,7 +63,11 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
const Camera& camera, float time) {
update_uniforms(scene, camera, time);
- // Lazy Bind Group creation
+ // Recreate bind group only when textures or BVH mode change
+ if (!bind_group_dirty_) {
+ // Skip bind group rebuild — reuse existing
+ } else {
+ bind_group_dirty_ = false;
if (bind_group_)
wgpuBindGroupRelease(bind_group_);
@@ -115,11 +119,9 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
bg_entries.push_back(e);
}
- // Select the correct pipeline and bind group layout
- WGPURenderPipeline current_pipeline =
- bvh_enabled_ ? pipeline_ : pipeline_no_bvh_;
+ WGPURenderPipeline cp = bvh_enabled_ ? pipeline_ : pipeline_no_bvh_;
WGPUBindGroupLayout current_layout =
- wgpuRenderPipelineGetBindGroupLayout(current_pipeline, 0);
+ wgpuRenderPipelineGetBindGroupLayout(cp, 0);
WGPUBindGroupDescriptor bg_desc = {};
bg_desc.layout = current_layout;
@@ -129,10 +131,10 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
bind_group_ = wgpuDeviceCreateBindGroup(device_, &bg_desc);
wgpuBindGroupLayoutRelease(current_layout);
+ } // end dirty block
- wgpuRenderPassEncoderSetPipeline(pass, current_pipeline);
-
- wgpuRenderPassEncoderSetBindGroup(pass, 0, bind_group_, 0, nullptr);
+ WGPURenderPipeline current_pipeline =
+ bvh_enabled_ ? pipeline_ : pipeline_no_bvh_;
uint32_t instance_count =
(uint32_t)std::min((size_t)kMaxObjects, scene.objects.size());