[Bf-blender-cvs] [bde76782ebf] functions: sample varying float4x4

Jacques Lucke noreply at git.blender.org
Mon Sep 2 12:32:01 CEST 2019


Commit: bde76782ebfd80804afd63785b7118dd525237a3
Author: Jacques Lucke
Date:   Mon Sep 2 11:13:19 2019 +0200
Branches: functions
https://developer.blender.org/rBbde76782ebfd80804afd63785b7118dd525237a3

sample varying float4x4

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

M	source/blender/simulations/bparticles/emitters.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 c052972d110..9975cd69027 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -247,6 +247,16 @@ static BLI_NOINLINE void sample_looptris(Mesh *mesh,
   }
 }
 
+static BLI_NOINLINE void sample_varying_transform(const VaryingFloat4x4 &transform,
+                                                  ArrayRef<float> times,
+                                                  float time_offset,
+                                                  MutableArrayRef<float4x4> r_transforms)
+{
+  for (uint i = 0; i < times.size(); i++) {
+    r_transforms[i] = transform.interpolate(times[i] + time_offset);
+  }
+}
+
 void SurfaceEmitter::emit(EmitterInterface &interface)
 {
   if (m_object == nullptr) {
@@ -289,6 +299,12 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
   TemporaryArray<float3> local_normals(particles_to_emit);
   sample_looptris(mesh, triangles, triangles_to_sample, local_positions, local_normals);
 
+  float epsilon = 0.01f;
+  TemporaryArray<float4x4> transforms_at_birth(particles_to_emit);
+  TemporaryArray<float4x4> transforms_before_birth(particles_to_emit);
+  sample_varying_transform(m_transform, birth_moments, 0.0f, transforms_at_birth);
+  sample_varying_transform(m_transform, birth_moments, -epsilon, transforms_before_birth);
+
   Vector<float3> positions;
   Vector<float3> velocities;
   Vector<float> sizes;
@@ -299,9 +315,8 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
     float3 pos = local_positions[i];
     float3 normal = local_normals[i];
 
-    float epsilon = 0.01f;
-    float4x4 transform_at_birth = m_transform.interpolate(birth_moment);
-    float4x4 transform_before_birth = m_transform.interpolate(birth_moment - epsilon);
+    float4x4 &transform_at_birth = transforms_at_birth[i];
+    float4x4 &transform_before_birth = transforms_before_birth[i];
 
     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/world_state.hpp b/source/blender/simulations/bparticles/world_state.hpp
index 580689c5714..f0226070a32 100644
--- a/source/blender/simulations/bparticles/world_state.hpp
+++ b/source/blender/simulations/bparticles/world_state.hpp
@@ -16,7 +16,7 @@ using BLI::StringRef;
 struct VaryingFloat {
   float start, end;
 
-  float interpolate(float t)
+  float interpolate(float t) const
   {
     return start * (1.0f - t) + end * t;
   }
@@ -25,7 +25,7 @@ struct VaryingFloat {
 struct VaryingFloat3 {
   float3 start, end;
 
-  float3 interpolate(float t)
+  float3 interpolate(float t) const
   {
     return float3::interpolate(start, end, t);
   }
@@ -35,7 +35,7 @@ struct VaryingFloat4x4 {
   /* TODO: store decomposed matrices */
   float4x4 start, end;
 
-  float4x4 interpolate(float t)
+  float4x4 interpolate(float t) const
   {
     return float4x4::interpolate(start, end, t);
   }



More information about the Bf-blender-cvs mailing list