[Bf-blender-cvs] [1d807a8399a] functions: Allow emitters to emit multiple types of particles
Jacques Lucke
noreply at git.blender.org
Wed Jun 26 18:19:16 CEST 2019
Commit: 1d807a8399a69e8e111a4b29ab66817664283598
Author: Jacques Lucke
Date: Wed Jun 26 14:46:44 2019 +0200
Branches: functions
https://developer.blender.org/rB1d807a8399a69e8e111a4b29ab66817664283598
Allow emitters to emit multiple types of particles
===================================================================
M source/blender/simulations/bparticles/c_wrapper.cpp
M source/blender/simulations/bparticles/core.cpp
M source/blender/simulations/bparticles/core.hpp
M source/blender/simulations/bparticles/emitters.cpp
M source/blender/simulations/bparticles/simulate.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 4fdf4aa677b..1eb5705ab02 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -50,13 +50,13 @@ void BParticles_state_free(BParticlesState state)
delete unwrap(state);
}
-class ModifierStepParticleInfluences : public ParticleInfluences {
+class ModifierParticleType : public ParticleType {
public:
SmallVector<Force *> m_forces;
SmallVector<Event *> m_events;
SmallVector<Action *> m_actions;
- ~ModifierStepParticleInfluences()
+ ~ModifierParticleType()
{
for (Force *force : m_forces) {
delete force;
@@ -83,39 +83,20 @@ class ModifierStepParticleInfluences : public ParticleInfluences {
}
};
-class ModifierParticleType : public ParticleType {
- public:
- SmallVector<Emitter *> m_emitters;
- ModifierStepParticleInfluences m_influences;
-
- ~ModifierParticleType()
- {
- for (Emitter *emitter : m_emitters) {
- delete emitter;
- }
- }
-
- ArrayRef<Emitter *> emitters() override
- {
- return m_emitters;
- }
-
- ParticleInfluences &influences() override
- {
- return m_influences;
- }
-};
-
class ModifierStepDescription : public StepDescription {
public:
float m_duration;
SmallMap<uint, ModifierParticleType *> m_types;
+ SmallVector<Emitter *> m_emitters;
~ModifierStepDescription()
{
for (auto *type : m_types.values()) {
delete type;
}
+ for (Emitter *emitter : m_emitters) {
+ delete emitter;
+ }
}
float step_duration() override
@@ -123,6 +104,11 @@ class ModifierStepDescription : public StepDescription {
return m_duration;
}
+ ArrayRef<Emitter *> emitters() override
+ {
+ return m_emitters;
+ }
+
ArrayRef<uint> particle_type_ids() override
{
return {0};
@@ -148,22 +134,22 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
description.m_types.add_new(0, type);
if (npmd->emitter_object) {
- type->m_emitters.append(EMITTER_mesh_surface((Mesh *)npmd->emitter_object->data,
- npmd->emitter_object->obmat,
- npmd->control1)
- .release());
+ description.m_emitters.append(EMITTER_mesh_surface((Mesh *)npmd->emitter_object->data,
+ npmd->emitter_object->obmat,
+ npmd->control1)
+ .release());
}
BVHTreeFromMesh treedata = {0};
if (npmd->collision_object) {
BKE_bvhtree_from_mesh_get(
&treedata, (Mesh *)npmd->collision_object->data, BVHTREE_FROM_LOOPTRI, 4);
- type->m_influences.m_events.append(
+ type->m_events.append(
EVENT_mesh_collection(&treedata, npmd->collision_object->obmat).release());
- type->m_influences.m_actions.append(ACTION_kill().release());
+ type->m_actions.append(ACTION_kill().release());
}
- type->m_influences.m_forces.append(FORCE_directional({0, 0, -2}).release());
- type->m_influences.m_events.append(EVENT_age_reached(3.0f).release());
- type->m_influences.m_actions.append(ACTION_move({0, 1, 0}).release());
+ type->m_forces.append(FORCE_directional({0, 0, -2}).release());
+ type->m_events.append(EVENT_age_reached(3.0f).release());
+ type->m_actions.append(ACTION_move({0, 1, 0}).release());
simulate_step(state, description);
if (npmd->collision_object) {
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index 4febe4bf7b7..a9faa67c74c 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -18,10 +18,6 @@ Event::~Event()
{
}
-ParticleInfluences::~ParticleInfluences()
-{
-}
-
ParticleType::~ParticleType()
{
}
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index 44fa355743f..d60af1f87c2 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -198,7 +198,7 @@ class EmitterTarget {
}
};
-using RequestEmitterTarget = std::function<EmitterTarget &()>;
+using RequestEmitterTarget = std::function<EmitterTarget &(uint particle_type_id)>;
class EmitterInterface {
private:
@@ -209,19 +209,19 @@ class EmitterInterface {
{
}
- EmitterTarget &request_raw()
+ EmitterTarget &request_raw(uint particle_type_id)
{
- EmitterTarget &target = m_request_target();
+ EmitterTarget &target = m_request_target(particle_type_id);
BLI_assert(target.size() > 0);
return target;
}
- JoinedAttributeArrays request(uint size)
+ JoinedAttributeArrays request(uint particle_type_id, uint size)
{
SmallVector<AttributeArrays> arrays_list;
uint remaining_size = size;
while (remaining_size > 0) {
- EmitterTarget &target = this->request_raw();
+ EmitterTarget &target = this->request_raw(particle_type_id);
uint size_to_use = std::min(target.size(), remaining_size);
target.set_initialized(size_to_use);
@@ -229,8 +229,9 @@ class EmitterInterface {
remaining_size -= size_to_use;
}
- AttributesInfo &info = (arrays_list.size() == 0) ? this->request_raw().attributes().info() :
- arrays_list[0].info();
+ AttributesInfo &info = (arrays_list.size() == 0) ?
+ this->request_raw(particle_type_id).attributes().info() :
+ arrays_list[0].info();
return JoinedAttributeArrays(info, arrays_list);
}
@@ -243,28 +244,21 @@ class Emitter {
virtual void emit(EmitterInterface &interface) = 0;
};
-class ParticleInfluences {
+class ParticleType {
public:
- virtual ~ParticleInfluences();
+ virtual ~ParticleType();
virtual ArrayRef<Force *> forces() = 0;
virtual ArrayRef<Event *> events() = 0;
virtual ArrayRef<Action *> action_per_event() = 0;
};
-class ParticleType {
- public:
- virtual ~ParticleType();
-
- virtual ArrayRef<Emitter *> emitters() = 0;
- virtual ParticleInfluences &influences() = 0;
-};
-
class StepDescription {
public:
virtual ~StepDescription();
virtual float step_duration() = 0;
+ virtual ArrayRef<Emitter *> emitters() = 0;
virtual ArrayRef<uint> particle_type_ids() = 0;
virtual ParticleType &particle_type(uint type_id) = 0;
@@ -284,6 +278,11 @@ class ParticlesState {
{
return m_particle_containers;
}
+
+ ParticlesContainer &particle_container(uint type_id)
+ {
+ return *m_particle_containers.lookup(type_id);
+ }
};
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index c7820ad6a93..b072954f124 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -22,7 +22,7 @@ class PointEmitter : public Emitter {
void emit(EmitterInterface &interface) override
{
- auto &target = interface.request_raw();
+ auto &target = interface.request_raw(0);
auto positions = target.attributes().get_float3("Position");
auto velocities = target.attributes().get_float3("Velocity");
@@ -69,7 +69,7 @@ class SurfaceEmitter : public Emitter {
velocities.append(m_transform.transform_direction(normal * m_normal_velocity));
}
- auto target = interface.request(positions.size());
+ auto target = interface.request(0, positions.size());
target.set_float3("Position", positions);
target.set_float3("Velocity", velocities);
}
@@ -100,7 +100,7 @@ class PathEmitter : public Emitter {
}
}
- auto target = interface.request(positions.size());
+ auto target = interface.request(0, positions.size());
target.set_float3("Position", positions);
target.set_float3("Velocity", SmallVector<float3>(positions.size()));
}
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 86efb0ed4bd..3ce7a3a47e7 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -143,7 +143,7 @@ BLI_NOINLINE static void compute_combined_forces_on_particles(ParticleSet partic
BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
ArrayRef<float> durations,
- ParticleInfluences &influences,
+ ParticleType &particle_type,
IdealOffsets r_offsets)
{
BLI_assert(particles.size() == durations.size());
@@ -151,7 +151,7 @@ BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
BLI_assert(particles.size() == r_offsets.velocity_offsets.size());
SmallVector<float3> combined_force{particles.size()};
- compute_combined_forces_on_particles(particles, influences.forces(), combined_force);
+ compute_combined_forces_on_particles(particles, particle_type.forces(), combined_force);
auto velocities = particles.attributes().get_float3("Velocity");
@@ -170,7 +170,7 @@ BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
BLI_NOINLINE static void simulate_to_next_event(ParticleSet particles,
ArrayRef<float> durations,
float end_time,
- ParticleInfluences &influences,
+ ParticleType &particle_type,
ArrayRef<float> last_event_times,
SmallVector<uint> &r_unfinished_particle_indices,
SmallVector<float> &r_remaining_durations)
@@ -179,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list