[Bf-blender-cvs] [de5971b1dfb] functions: initial positional event abstraction
Jacques Lucke
noreply at git.blender.org
Tue Jun 18 14:31:58 CEST 2019
Commit: de5971b1dfbfba443273ac57c5ccb69ca1104145
Author: Jacques Lucke
Date: Tue Jun 18 14:21:35 2019 +0200
Branches: functions
https://developer.blender.org/rBde5971b1dfbfba443273ac57c5ccb69ca1104145
initial positional event abstraction
===================================================================
M source/blender/simulations/bparticles/core.cpp
M source/blender/simulations/bparticles/core.hpp
M source/blender/simulations/bparticles/playground_solver.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index 44c01dd7499..9acd6cae267 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -32,6 +32,10 @@ Action::~Action()
{
}
+PositionalEvent::~PositionalEvent()
+{
+}
+
void adapt_state(Solver *new_solver, WrappedState *wrapped_state)
{
wrapped_state->m_solver = new_solver;
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e889ca72b6e..93188538978 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -41,6 +41,16 @@ class Action {
virtual void execute(AttributeArrays &attributes, ArrayRef<uint> indices_to_influence) = 0;
};
+class PositionalEvent {
+ public:
+ virtual ~PositionalEvent();
+
+ virtual void filter(AttributeArrays attributes,
+ ArrayRef<float3> next_movement,
+ SmallVector<uint> &r_filtered_indices,
+ SmallVector<float> &r_time_factors) = 0;
+};
+
class EmitterInfo {
private:
EmitterInfo()
diff --git a/source/blender/simulations/bparticles/playground_solver.cpp b/source/blender/simulations/bparticles/playground_solver.cpp
index 598badcd9f0..1405b89084d 100644
--- a/source/blender/simulations/bparticles/playground_solver.cpp
+++ b/source/blender/simulations/bparticles/playground_solver.cpp
@@ -18,6 +18,24 @@ class MoveUpAction : public BParticles::Action {
}
};
+class HitPlaneEvent : public PositionalEvent {
+ public:
+ virtual void filter(AttributeArrays attributes,
+ ArrayRef<float3> next_movement,
+ SmallVector<uint> &r_filtered_indices,
+ SmallVector<float> &r_time_factors) override
+ {
+ auto positions = attributes.get_float3("Position");
+ for (uint i = 0; i < attributes.size(); i++) {
+ if (positions[i].y < 2.0f && positions[i].y + next_movement[i].y >= 2.0f) {
+ float time_factor = (2.0f - positions[i].y) / next_movement[i].y;
+ r_filtered_indices.append(i);
+ r_time_factors.append(time_factor);
+ }
+ }
+ }
+};
+
class SimpleSolver : public Solver {
struct MyState : StateBase {
@@ -125,16 +143,13 @@ class SimpleSolver : public Solver {
auto positions = attributes.get_float3("Position");
auto velocities = attributes.get_float3("Velocity");
- SmallVector<uint> indices;
- for (uint i = 0; i < attributes.size(); i++) {
- float y_offset = position_offsets[i].y;
- if (positions[i].y < 2 && positions[i].y + y_offset >= 2.0f) {
- indices.append(i);
- }
- }
+ HitPlaneEvent event;
+ SmallVector<uint> triggered_indices;
+ SmallVector<float> triggered_time_factors;
+ event.filter(attributes, position_offsets, triggered_indices, triggered_time_factors);
MoveUpAction action;
- action.execute(attributes, indices);
+ action.execute(attributes, triggered_indices);
auto birth_times = attributes.get_float("Birth Time");
auto kill_states = attributes.get_byte("Kill State");
More information about the Bf-blender-cvs
mailing list