[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