Skip to content

Commit

Permalink
Fix GPUParticlesCollisionHeightField3D adding collisions excluded by …
Browse files Browse the repository at this point in the history
…its layer_mask
  • Loading branch information
Rudolph-B committed Jan 26, 2025
1 parent 4cf0231 commit 8115065
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 0 deletions.
6 changes: 6 additions & 0 deletions drivers/gles3/storage/particles_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1402,6 +1402,12 @@ bool ParticlesStorage::particles_collision_is_heightfield(RID p_particles_collis
return particles_collision->type == RS::PARTICLES_COLLISION_TYPE_HEIGHTFIELD_COLLIDE;
}

uint32_t ParticlesStorage::particles_collision_get_cull_mask(RID p_particles_collision) const {
const ParticlesCollision *particles_collision = particles_collision_owner.get_or_null(p_particles_collision);
ERR_FAIL_NULL_V(particles_collision, false);
return particles_collision->cull_mask;
}

Dependency *ParticlesStorage::particles_collision_get_dependency(RID p_particles_collision) const {
ParticlesCollision *pc = particles_collision_owner.get_or_null(p_particles_collision);
ERR_FAIL_NULL_V(pc, nullptr);
Expand Down
1 change: 1 addition & 0 deletions drivers/gles3/storage/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,7 @@ class ParticlesStorage : public RendererParticlesStorage {
Vector3 particles_collision_get_extents(RID p_particles_collision) const;
virtual bool particles_collision_is_heightfield(RID p_particles_collision) const override;
GLuint particles_collision_get_heightfield_framebuffer(RID p_particles_collision) const;
virtual uint32_t particles_collision_get_cull_mask(RID p_particles_collision) const override;

_FORCE_INLINE_ Size2i particles_collision_get_heightfield_size(RID p_particles_collision) const {
ParticlesCollision *particles_collision = particles_collision_owner.get_or_null(p_particles_collision);
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/dummy/storage/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ class ParticlesStorage : public RendererParticlesStorage {
virtual void particles_collision_set_height_field_resolution(RID p_particles_collision, RS::ParticlesCollisionHeightfieldResolution p_resolution) override {}
virtual AABB particles_collision_get_aabb(RID p_particles_collision) const override { return AABB(); }
virtual bool particles_collision_is_heightfield(RID p_particles_collision) const override { return false; }
virtual uint32_t particles_collision_get_cull_mask(RID p_particles_collision) const override { return 0; }

virtual RID particles_collision_instance_create(RID p_collision) override { return RID(); }
virtual void particles_collision_instance_free(RID p_rid) override {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1838,6 +1838,12 @@ void ParticlesStorage::particles_collision_set_cull_mask(RID p_particles_collisi
particles_collision->cull_mask = p_cull_mask;
}

uint32_t ParticlesStorage::particles_collision_get_cull_mask(RID p_particles_collision) const {
const ParticlesCollision *particles_collision = particles_collision_owner.get_or_null(p_particles_collision);
ERR_FAIL_NULL_V(particles_collision, false);
return particles_collision->cull_mask;
}

void ParticlesStorage::particles_collision_set_sphere_radius(RID p_particles_collision, real_t p_radius) {
ParticlesCollision *particles_collision = particles_collision_owner.get_or_null(p_particles_collision);
ERR_FAIL_NULL(particles_collision);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,7 @@ class ParticlesStorage : public RendererParticlesStorage {
Vector3 particles_collision_get_extents(RID p_particles_collision) const;
virtual bool particles_collision_is_heightfield(RID p_particles_collision) const override;
RID particles_collision_get_heightfield_framebuffer(RID p_particles_collision) const;
virtual uint32_t particles_collision_get_cull_mask(RID p_particles_collision) const override;

Dependency *particles_collision_get_dependency(RID p_particles) const;

Expand Down
5 changes: 5 additions & 0 deletions servers/rendering/renderer_scene_cull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3988,6 +3988,11 @@ void RendererSceneCull::render_particle_colliders() {
if (!instance || !((1 << instance->base_type) & (RS::INSTANCE_GEOMETRY_MASK & (~(1 << RS::INSTANCE_PARTICLES))))) { //all but particles to avoid self collision
continue;
}

if (!(instance->layer_mask & RSG::particles_storage->particles_collision_get_cull_mask(hfpc->base) & ((1 << 20) - 1))) { //forces editor/gizmo layers to be ignored
continue;
}

InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
ERR_FAIL_NULL(geom->geometry_instance);
scene_cull_result.geometry_instances.push_back(geom->geometry_instance);
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/storage/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ class RendererParticlesStorage {
virtual void particles_collision_set_height_field_resolution(RID p_particles_collision, RS::ParticlesCollisionHeightfieldResolution p_resolution) = 0; //for SDF and vector field
virtual AABB particles_collision_get_aabb(RID p_particles_collision) const = 0;
virtual bool particles_collision_is_heightfield(RID p_particles_collision) const = 0;
virtual uint32_t particles_collision_get_cull_mask(RID p_particles_collision) const = 0;

//used from 2D and 3D
virtual RID particles_collision_instance_create(RID p_collision) = 0;
Expand Down

0 comments on commit 8115065

Please sign in to comment.