[Bf-blender-cvs] [77d8f118efb] functions: avoid stepping when the emitter is moving quickly
Jacques Lucke
noreply at git.blender.org
Mon Jul 1 17:47:25 CEST 2019
Commit: 77d8f118efb3eb3418bbf21fcf42846fd86fc930
Author: Jacques Lucke
Date: Mon Jul 1 17:29:14 2019 +0200
Branches: functions
https://developer.blender.org/rB77d8f118efb3eb3418bbf21fcf42846fd86fc930
avoid stepping when the emitter is moving quickly
===================================================================
M source/blender/blenlib/BLI_math.hpp
M source/blender/makesdna/DNA_modifier_types.h
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/emitters.hpp
===================================================================
diff --git a/source/blender/blenlib/BLI_math.hpp b/source/blender/blenlib/BLI_math.hpp
index 47e0d88cd03..5eab8c94cbe 100644
--- a/source/blender/blenlib/BLI_math.hpp
+++ b/source/blender/blenlib/BLI_math.hpp
@@ -129,11 +129,11 @@ struct float3 {
};
struct float4x4 {
- float v[4][4];
+ float values[4][4];
float4x4(float *matrix)
{
- memcpy(v, matrix, sizeof(float) * 16);
+ memcpy(values, matrix, sizeof(float) * 16);
}
float4x4(float matrix[4][4]) : float4x4((float *)matrix)
@@ -148,7 +148,7 @@ struct float4x4 {
float4x4 inverted() const
{
float result[4][4];
- invert_m4_m4(result, (float(*)[4])this);
+ invert_m4_m4(result, values);
return result;
}
@@ -159,15 +159,22 @@ struct float4x4 {
float3 transform_position(float3 position)
{
- mul_m4_v3((float(*)[4])this, position);
+ mul_m4_v3(values, position);
return position;
}
float3 transform_direction(float3 direction)
{
- mul_mat3_m4_v3((float(*)[4])this, direction);
+ mul_mat3_m4_v3(values, direction);
return direction;
}
+
+ static float4x4 interpolate(float4x4 a, float4x4 b, float t)
+ {
+ float result[4][4];
+ interp_m4_m4m4(result, a.values, b.values, t);
+ return result;
+ }
};
} // namespace BLI
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 84a52a3fdf1..a0a06feea49 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1969,6 +1969,7 @@ typedef struct NodeParticlesModifierData {
float control1, control2;
struct Object *emitter_object;
struct Object *collision_object;
+ float last_emitter_transforms[4][4];
} NodeParticlesModifierData;
#endif /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 3d517e6b416..0ff9c7f5412 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -234,8 +234,12 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
type0->m_integrator->m_forces.append(FORCE_directional({0, 0, -2}));
if (npmd->emitter_object) {
- description.m_emitters.append(EMITTER_mesh_surface(
- 0, (Mesh *)npmd->emitter_object->data, npmd->emitter_object->obmat, npmd->control1));
+ description.m_emitters.append(EMITTER_mesh_surface(0,
+ (Mesh *)npmd->emitter_object->data,
+ npmd->last_emitter_transforms,
+ npmd->emitter_object->obmat,
+ npmd->control1));
+ copy_m4_m4(npmd->last_emitter_transforms, npmd->emitter_object->obmat);
}
BVHTreeFromMesh treedata = {0};
if (npmd->collision_object) {
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index c80d6ddc76f..f5831ee5372 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -304,6 +304,16 @@ void TimeSpanEmitTarget::set_randomized_birth_moments()
this->set_float("Birth Time", birth_times);
}
+void TimeSpanEmitTarget::set_birth_moments(ArrayRef<float> time_factors)
+{
+ BLI_assert(time_factors.size() == m_size);
+ SmallVector<float> birth_times(time_factors.size());
+ for (uint i = 0; i < m_size; i++) {
+ birth_times[i] = m_time_span.interpolate(time_factors[i]);
+ }
+ this->set_float("Birth Time", birth_times);
+}
+
/* EventFilterInterface
*****************************************/
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e7f909e215c..9e1a6932b3b 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -349,6 +349,11 @@ class TimeSpanEmitTarget : public EmitTargetBase {
* Randomize the birth times within a time span.
*/
void set_randomized_birth_moments();
+
+ /**
+ * Set custom bith moments. All values should be in [0, 1].
+ */
+ void set_birth_moments(ArrayRef<float> time_factors);
};
/**
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 938cc554a97..a275092c430 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -33,14 +33,20 @@ class SurfaceEmitter : public Emitter {
private:
uint m_particle_type_id;
Mesh *m_mesh;
- float4x4 m_transform;
+ float4x4 m_transform_start;
+ float4x4 m_transform_end;
float m_normal_velocity;
public:
- SurfaceEmitter(uint particle_type_id, Mesh *mesh, float4x4 transform, float normal_velocity)
+ SurfaceEmitter(uint particle_type_id,
+ Mesh *mesh,
+ float4x4 transform_start,
+ float4x4 transform_end,
+ float normal_velocity)
: m_particle_type_id(particle_type_id),
m_mesh(mesh),
- m_transform(transform),
+ m_transform_start(transform_start),
+ m_transform_end(transform_end),
m_normal_velocity(normal_velocity)
{
}
@@ -54,26 +60,31 @@ class SurfaceEmitter : public Emitter {
SmallVector<float3> positions;
SmallVector<float3> velocities;
+ SmallVector<float> birth_moments;
for (int i = 0; i < triangle_amount; i++) {
MLoopTri triangle = triangles[i];
+ float birth_moment = (rand() % 1000) / 1000.0f;
float3 v1 = verts[loops[triangle.tri[0]].v].co;
float3 v2 = verts[loops[triangle.tri[1]].v].co;
float3 v3 = verts[loops[triangle.tri[2]].v].co;
+ float3 pos = (v1 + v2 + v3) / 3.0f;
float3 normal;
normal_tri_v3(normal, v1, v2, v3);
- float3 pos = (v1 + v2 + v3) / 3.0f;
- positions.append(m_transform.transform_position(pos));
- velocities.append(m_transform.transform_direction(normal * m_normal_velocity));
+ float4x4 transform = float4x4::interpolate(m_transform_start, m_transform_end, birth_moment);
+
+ positions.append(transform.transform_position(pos));
+ velocities.append(transform.transform_direction(normal * m_normal_velocity));
+ birth_moments.append(birth_moment);
}
auto &target = interface.request(m_particle_type_id, positions.size());
target.set_float3("Position", positions);
target.set_float3("Velocity", velocities);
- target.set_randomized_birth_moments();
+ target.set_birth_moments(birth_moments);
}
};
@@ -134,10 +145,12 @@ Emitter *EMITTER_point(float3 point)
Emitter *EMITTER_mesh_surface(uint particle_type_id,
Mesh *mesh,
- const float4x4 &transform,
+ const float4x4 &transform_start,
+ const float4x4 &transform_end,
float normal_velocity)
{
- return new SurfaceEmitter(particle_type_id, mesh, transform, normal_velocity);
+ return new SurfaceEmitter(
+ particle_type_id, mesh, transform_start, transform_end, normal_velocity);
}
Emitter *EMITTER_path(Path *path, float4x4 transform)
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index d219bd7f064..79e82621444 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -12,7 +12,8 @@ using BLI::float4x4;
Emitter *EMITTER_point(float3 point);
Emitter *EMITTER_mesh_surface(uint particle_type_id,
struct Mesh *mesh,
- const float4x4 &transform,
+ const float4x4 &transform_start,
+ const float4x4 &transform_end,
float normal_velocity);
Emitter *EMITTER_path(struct Path *path, float4x4 transform);
Emitter *EMITTER_emit_at_start();
More information about the Bf-blender-cvs
mailing list