[Bf-blender-cvs] [f2421c042ea] functions: abstract interpolated vectors and matrices

Jacques Lucke noreply at git.blender.org
Mon Jul 15 18:12:38 CEST 2019


Commit: f2421c042ea76065a8ebe294a58bfd17906847e1
Author: Jacques Lucke
Date:   Mon Jul 15 15:35:45 2019 +0200
Branches: functions
https://developer.blender.org/rBf2421c042ea76065a8ebe294a58bfd17906847e1

abstract interpolated vectors and matrices

===================================================================

M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp
M	source/blender/simulations/bparticles/inserters.cpp
M	source/blender/simulations/bparticles/world_state.hpp

===================================================================

diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 919c5eaf636..1166433c3e8 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -23,7 +23,7 @@ void PointEmitter::emit(EmitterInterface &interface)
 
   for (uint i = 0; i < m_amount; i++) {
     float t = i / (float)m_amount;
-    float3 point = float3::interpolate(m_start, m_end, t);
+    float3 point = m_point.interpolate(t);
     new_positions[i] = point;
   }
 
@@ -89,11 +89,8 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
     normal_tri_v3(normal, v1, v2, v3);
 
     float epsilon = 0.01f;
-    /* TODO: interpolate decomposed matrices */
-    float4x4 transform_at_birth = float4x4::interpolate(
-        m_transform_start, m_transform_end, birth_moment);
-    float4x4 transform_before_birth = float4x4::interpolate(
-        m_transform_start, m_transform_end, birth_moment - epsilon);
+    float4x4 transform_at_birth = m_transform.interpolate(birth_moment);
+    float4x4 transform_before_birth = m_transform.interpolate(birth_moment - epsilon);
 
     float3 point_at_birth = transform_at_birth.transform_position(pos);
     float3 point_before_birth = transform_before_birth.transform_position(pos);
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index f95d1c55407..de3a50e0204 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -16,7 +16,7 @@ struct SurfaceEmitter : public Emitter {
   std::unique_ptr<Action> m_action;
 
   Object *m_object;
-  float4x4 m_transform_start, m_transform_end;
+  InterpolatedFloat4x4 m_transform;
   float m_rate;
   float m_normal_velocity;
   float m_emitter_velocity;
@@ -27,7 +27,7 @@ struct SurfaceEmitter : public Emitter {
 
 struct PointEmitter : public Emitter {
   std::string m_particle_type_name;
-  float3 m_start, m_end;
+  InterpolatedFloat3 m_point;
   uint m_amount;
 
   void emit(EmitterInterface &interface) override;
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index fa4f59aeec0..98bbab3800f 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -243,9 +243,8 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
   emitter->m_emitter_velocity = fn_out.get<float>(3);
   emitter->m_size = fn_out.get<float>(4);
 
-  emitter->m_transform_end = emitter->m_object->obmat;
-  emitter->m_transform_start = ctx.world_state.get_last_and_store_current(
-      bnode->name, emitter->m_transform_end);
+  emitter->m_transform = ctx.world_state.get_interpolated_value(bnode->name,
+                                                                emitter->m_object->obmat);
 
   return emitter;
 }
@@ -263,8 +262,7 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
 
   auto emitter = std::unique_ptr<PointEmitter>(new PointEmitter());
   emitter->m_particle_type_name = particle_type_name.to_std_string();
-  emitter->m_end = fn_out.get<float3>(0);
-  emitter->m_start = ctx.world_state.get_last_and_store_current(bnode->name, emitter->m_end);
+  emitter->m_point = ctx.world_state.get_interpolated_value(bnode->name, fn_out.get<float3>(0));
   emitter->m_amount = 10;
   return emitter;
 }
diff --git a/source/blender/simulations/bparticles/world_state.hpp b/source/blender/simulations/bparticles/world_state.hpp
index 949eb787425..2a0625ae0e9 100644
--- a/source/blender/simulations/bparticles/world_state.hpp
+++ b/source/blender/simulations/bparticles/world_state.hpp
@@ -13,6 +13,25 @@ using BLI::SmallMap;
 using BLI::StringMap;
 using BLI::StringRef;
 
+struct InterpolatedFloat3 {
+  float3 start, end;
+
+  float3 interpolate(float t)
+  {
+    return float3::interpolate(start, end, t);
+  }
+};
+
+struct InterpolatedFloat4x4 {
+  /* TODO: store decomposed matrices */
+  float4x4 start, end;
+
+  float4x4 interpolate(float t)
+  {
+    return float4x4::interpolate(start, end, t);
+  }
+};
+
 class WorldState {
  private:
   template<typename T> struct OldAndNew {
@@ -49,6 +68,18 @@ class WorldState {
     }
   }
 
+  InterpolatedFloat3 get_interpolated_value(StringRef id, float3 current)
+  {
+    float3 last = this->get_last_and_store_current(id, current);
+    return {last, current};
+  }
+
+  InterpolatedFloat4x4 get_interpolated_value(StringRef id, float4x4 current)
+  {
+    float4x4 last = this->get_last_and_store_current(id, current);
+    return {last, current};
+  }
+
   void current_step_is_over()
   {
     for (auto &item : m_float3.values()) {



More information about the Bf-blender-cvs mailing list