[Bf-blender-cvs] [22624ad774f] functions: cleanup handling of emitter action contexts
Jacques Lucke
noreply at git.blender.org
Wed Sep 4 19:43:15 CEST 2019
Commit: 22624ad774f59b172fffaeef186ab4b1787435f3
Author: Jacques Lucke
Date: Wed Sep 4 12:13:00 2019 +0200
Branches: functions
https://developer.blender.org/rB22624ad774f59b172fffaeef186ab4b1787435f3
cleanup handling of emitter action contexts
===================================================================
M source/blender/simulations/bparticles/action_contexts.hpp
M source/blender/simulations/bparticles/action_interface.hpp
M source/blender/simulations/bparticles/emitters.cpp
M source/blender/simulations/bparticles/events.cpp
M source/blender/simulations/bparticles/particle_function_input_providers.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/action_contexts.hpp b/source/blender/simulations/bparticles/action_contexts.hpp
index 3501ec6d635..c76c00b5bee 100644
--- a/source/blender/simulations/bparticles/action_contexts.hpp
+++ b/source/blender/simulations/bparticles/action_contexts.hpp
@@ -9,88 +9,7 @@ namespace BParticles {
using BLI::float3;
using BLI::float4x4;
-class MeshSurfaceActionContext : public ActionContext {
- public:
- virtual Object *object() const = 0;
- virtual ArrayRef<float4x4> world_transforms() const = 0;
- virtual ArrayRef<float3> local_positions() const = 0;
- virtual ArrayRef<float3> local_normals() const = 0;
- virtual ArrayRef<float3> world_normals() const = 0;
- virtual ArrayRef<uint> looptri_indices() const = 0;
-};
-
-class MeshEmitterContext : public MeshSurfaceActionContext, public EmitterActionContext {
- private:
- Object *m_object;
- ArrayRef<float4x4> m_world_transforms;
- ArrayRef<float3> m_local_positions;
- ArrayRef<float3> m_local_normals;
- ArrayRef<float3> m_world_normals;
- ArrayRef<uint> m_looptri_indices;
-
- ArrayRef<float4x4> m_all_world_transforms;
- ArrayRef<float3> m_all_local_positions;
- ArrayRef<float3> m_all_local_normals;
- ArrayRef<float3> m_all_world_normals;
- ArrayRef<uint> m_all_looptri_indices;
-
- public:
- MeshEmitterContext(Object *object,
- ArrayRef<float4x4> all_world_transforms,
- ArrayRef<float3> all_local_positions,
- ArrayRef<float3> all_local_normals,
- ArrayRef<float3> all_world_normals,
- ArrayRef<uint> all_looptri_indices)
- : m_object(object),
- m_all_world_transforms(all_world_transforms),
- m_all_local_positions(all_local_positions),
- m_all_local_normals(all_local_normals),
- m_all_world_normals(all_world_normals),
- m_all_looptri_indices(all_looptri_indices)
- {
- }
-
- void update(Range<uint> slice) override
- {
- m_world_transforms = m_all_world_transforms.slice(slice.start(), slice.size());
- m_local_positions = m_all_local_positions.slice(slice.start(), slice.size());
- m_local_normals = m_all_local_normals.slice(slice.start(), slice.size());
- m_world_normals = m_all_world_normals.slice(slice.start(), slice.size());
- m_looptri_indices = m_all_looptri_indices.slice(slice.start(), slice.size());
- }
-
- Object *object() const override
- {
- return m_object;
- }
-
- ArrayRef<float4x4> world_transforms() const override
- {
- return m_world_transforms;
- }
-
- ArrayRef<float3> local_positions() const override
- {
- return m_local_positions;
- }
-
- ArrayRef<float3> local_normals() const override
- {
- return m_local_normals;
- }
-
- ArrayRef<float3> world_normals() const override
- {
- return m_world_normals;
- }
-
- ArrayRef<uint> looptri_indices() const override
- {
- return m_looptri_indices;
- }
-};
-
-class MeshCollisionContext : public MeshSurfaceActionContext {
+class MeshSurfaceContext : public ActionContext {
private:
Object *m_object;
ArrayRef<float4x4> m_world_transforms;
@@ -100,12 +19,12 @@ class MeshCollisionContext : public MeshSurfaceActionContext {
ArrayRef<uint> m_looptri_indices;
public:
- MeshCollisionContext(Object *object,
- ArrayRef<float4x4> world_transforms,
- ArrayRef<float3> local_positions,
- ArrayRef<float3> local_normals,
- ArrayRef<float3> world_normals,
- ArrayRef<uint> looptri_indices)
+ MeshSurfaceContext(Object *object,
+ ArrayRef<float4x4> world_transforms,
+ ArrayRef<float3> local_positions,
+ ArrayRef<float3> local_normals,
+ ArrayRef<float3> world_normals,
+ ArrayRef<uint> looptri_indices)
: m_object(object),
m_world_transforms(world_transforms),
m_local_positions(local_positions),
@@ -115,32 +34,32 @@ class MeshCollisionContext : public MeshSurfaceActionContext {
{
}
- Object *object() const override
+ Object *object() const
{
return m_object;
}
- ArrayRef<float4x4> world_transforms() const override
+ ArrayRef<float4x4> world_transforms() const
{
return m_world_transforms;
}
- ArrayRef<float3> local_positions() const override
+ ArrayRef<float3> local_positions() const
{
return m_local_positions;
}
- ArrayRef<float3> local_normals() const override
+ ArrayRef<float3> local_normals() const
{
return m_local_normals;
}
- ArrayRef<float3> world_normals() const override
+ ArrayRef<float3> world_normals() const
{
return m_world_normals;
}
- ArrayRef<uint> looptri_indices() const override
+ ArrayRef<uint> looptri_indices() const
{
return m_looptri_indices;
}
diff --git a/source/blender/simulations/bparticles/action_interface.hpp b/source/blender/simulations/bparticles/action_interface.hpp
index 7e9d37e45cf..9b5b4f7f274 100644
--- a/source/blender/simulations/bparticles/action_interface.hpp
+++ b/source/blender/simulations/bparticles/action_interface.hpp
@@ -22,11 +22,6 @@ class ActionContext {
virtual ~ActionContext();
};
-class EmitterActionContext {
- public:
- virtual void update(Range<uint> slice) = 0;
-};
-
class SourceParticleActionContext : public ActionContext {
private:
ArrayRef<uint> m_all_source_indices;
@@ -92,9 +87,10 @@ class Action {
virtual void execute(ActionInterface &interface) = 0;
+ template<typename BuildContextF>
void execute_from_emitter(AttributesRefGroup &new_particles,
EmitterInterface &emitter_interface,
- EmitterActionContext *emitter_action_context = nullptr);
+ const BuildContextF &build_context);
void execute_from_event(EventExecuteInterface &event_interface,
ActionContext *action_context = nullptr);
void execute_for_subset(ArrayRef<uint> pindices, ActionInterface &action_interface);
@@ -128,31 +124,22 @@ inline ActionInterface::ActionInterface(ParticleAllocator &particle_allocator,
class EmptyActionContext : public ActionContext {
};
-class EmptyEmitterActionContext : public EmitterActionContext {
- void update(Range<uint> UNUSED(slice))
- {
- }
-};
-
+template<typename BuildContextF>
inline void Action::execute_from_emitter(AttributesRefGroup &new_particles,
EmitterInterface &emitter_interface,
- EmitterActionContext *emitter_action_context)
+ const BuildContextF &build_context)
{
AttributesInfo info;
std::array<void *, 0> buffers;
- EmptyEmitterActionContext empty_emitter_context;
- EmitterActionContext &used_emitter_context = (emitter_action_context == nullptr) ?
- empty_emitter_context :
- *emitter_action_context;
-
uint offset = 0;
for (AttributesRef attributes : new_particles) {
uint range_size = attributes.size();
-
- used_emitter_context.update(Range<uint>(offset, offset + range_size));
+ Range<uint> range(offset, offset + range_size);
offset += range_size;
+ auto action_context = build_context(range);
+
AttributesRef offsets(info, buffers, range_size);
TemporaryArray<float> durations(range_size);
durations.fill(0);
@@ -163,7 +150,7 @@ inline void Action::execute_from_emitter(AttributesRefGroup &new_particles,
offsets,
attributes.get<float>("Birth Time"),
durations,
- dynamic_cast<ActionContext &>(used_emitter_context));
+ action_context);
this->execute(action_interface);
}
}
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index ffd17d8f49a..71a56c85827 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -308,14 +308,15 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
new_particles.set<float3>("Position", positions_at_birth);
new_particles.set<float>("Birth Time", birth_times);
- MeshEmitterContext emitter_context(m_object,
- transforms_at_birth,
- local_positions,
- local_normals,
- world_normals,
- triangles_to_sample);
-
- m_on_birth_action->execute_from_emitter(new_particles, interface, &emitter_context);
+ m_on_birth_action->execute_from_emitter(
+ new_particles, interface, [&](Range<uint> range) -> MeshSurfaceContext {
+ return MeshSurfaceContext(m_object,
+ ArrayRef<float4x4>(transforms_at_birth).slice(range),
+ ArrayRef<float3>(local_positions).slice(range),
+ ArrayRef<float3>(local_normals).slice(range),
+ ArrayRef<float3>(world_normals).slice(range),
+ ArrayRef<uint>(triangles_to_sample).slice(range));
+ });
}
}
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index d560353bca4..d6da8943830 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -153,10 +153,10 @@ void MeshCollisionEvent::execute(EventExecuteInterface &interface)
last_collision_times[pindex] = interface.current_times()[pindex];
}
- MeshCollisionContext action_context(
+ MeshSurfaceContext surface_context(
m_object, world_transforms, local_positions, local_normals, world_normals, looptri_indices);
- m_action->execute_from_event(interface, &action_con
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list