[Bf-blender-cvs] [06fab69664e] functions: visualize different particle types with vertex colors

Jacques Lucke noreply at git.blender.org
Wed Jun 26 18:19:23 CEST 2019


Commit: 06fab69664e962bd33277d90568452cf28859472
Author: Jacques Lucke
Date:   Wed Jun 26 18:18:38 2019 +0200
Branches: functions
https://developer.blender.org/rB06fab69664e962bd33277d90568452cf28859472

visualize different particle types with vertex colors

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

M	source/blender/modifiers/intern/MOD_nodeparticles.c
M	source/blender/simulations/BParticles.h
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp

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

diff --git a/source/blender/modifiers/intern/MOD_nodeparticles.c b/source/blender/modifiers/intern/MOD_nodeparticles.c
index d616dc5b57a..2e98f865a90 100644
--- a/source/blender/modifiers/intern/MOD_nodeparticles.c
+++ b/source/blender/modifiers/intern/MOD_nodeparticles.c
@@ -179,7 +179,7 @@ static Mesh *applyModifier(ModifierData *md,
     runtime->last_simulated_frame = current_frame;
   }
 
-  return point_mesh_from_particle_state(runtime->state);
+  return BParticles_test_mesh_from_state(runtime->state);
 }
 
 static void initData(ModifierData *md)
diff --git a/source/blender/simulations/BParticles.h b/source/blender/simulations/BParticles.h
index ca04093f3c9..70cc46237f2 100644
--- a/source/blender/simulations/BParticles.h
+++ b/source/blender/simulations/BParticles.h
@@ -8,6 +8,7 @@
 extern "C" {
 #endif
 
+struct Mesh;
 struct Depsgraph;
 struct NodeParticlesModifierData;
 
@@ -23,6 +24,8 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
 uint BParticles_state_particle_count(BParticlesState state);
 void BParticles_state_get_positions(BParticlesState state, float (*dst)[3]);
 
+struct Mesh *BParticles_test_mesh_from_state(BParticlesState state_c);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 1eb5705ab02..81a03613fad 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -12,7 +12,11 @@
 
 #include "BKE_curve.h"
 #include "BKE_bvhutils.h"
+#include "BKE_mesh.h"
+#include "BKE_customdata.h"
 
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_curve_types.h"
@@ -111,7 +115,7 @@ class ModifierStepDescription : public StepDescription {
 
   ArrayRef<uint> particle_type_ids() override
   {
-    return {0};
+    return {0, 1};
   }
 
   ParticleType &particle_type(uint type_id) override
@@ -130,26 +134,35 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
   ModifierStepDescription description;
   description.m_duration = 1.0f / 24.0f;
 
-  auto *type = new ModifierParticleType();
-  description.m_types.add_new(0, type);
+  auto *type0 = new ModifierParticleType();
+  description.m_types.add_new(0, type0);
 
   if (npmd->emitter_object) {
-    description.m_emitters.append(EMITTER_mesh_surface((Mesh *)npmd->emitter_object->data,
-                                                       npmd->emitter_object->obmat,
-                                                       npmd->control1)
-                                      .release());
+    description.m_emitters.append(
+        EMITTER_mesh_surface(
+            0, (Mesh *)npmd->emitter_object->data, npmd->emitter_object->obmat, npmd->control1)
+            .release());
+    description.m_emitters.append(
+        EMITTER_mesh_surface(
+            1, (Mesh *)npmd->emitter_object->data, npmd->emitter_object->obmat, npmd->control1)
+            .release());
   }
   BVHTreeFromMesh treedata = {0};
   if (npmd->collision_object) {
     BKE_bvhtree_from_mesh_get(
         &treedata, (Mesh *)npmd->collision_object->data, BVHTREE_FROM_LOOPTRI, 4);
-    type->m_events.append(
+    type0->m_events.append(
         EVENT_mesh_collection(&treedata, npmd->collision_object->obmat).release());
-    type->m_actions.append(ACTION_kill().release());
+    type0->m_actions.append(ACTION_kill().release());
   }
-  type->m_forces.append(FORCE_directional({0, 0, -2}).release());
-  type->m_events.append(EVENT_age_reached(3.0f).release());
-  type->m_actions.append(ACTION_move({0, 1, 0}).release());
+  type0->m_forces.append(FORCE_directional({0, 0, -2}).release());
+  type0->m_events.append(EVENT_age_reached(3.0f).release());
+  type0->m_actions.append(ACTION_move({0, 1, 0}).release());
+
+  auto *type1 = new ModifierParticleType();
+  description.m_types.add_new(1, type1);
+  type1->m_forces.append(FORCE_directional({0, 0, 1}).release());
+
   simulate_step(state, description);
 
   if (npmd->collision_object) {
@@ -189,3 +202,93 @@ void BParticles_state_get_positions(BParticlesState state_c, float (*dst_c)[3])
     }
   }
 }
+
+static inline void append_tetrahedon_mesh_data(float3 position,
+                                               float scale,
+                                               MLoopCol color,
+                                               SmallVector<float3> &vertex_positions,
+                                               SmallVector<uint> &poly_starts,
+                                               SmallVector<uint> &poly_lengths,
+                                               SmallVector<uint> &loops,
+                                               SmallVector<MLoopCol> &loop_colors)
+{
+  uint vertex_offset = vertex_positions.size();
+
+  vertex_positions.append(position + scale * float3(1, -1, -1));
+  vertex_positions.append(position + scale * float3(1, 1, 1));
+  vertex_positions.append(position + scale * float3(-1, -1, 1));
+  vertex_positions.append(position + scale * float3(-1, 1, -1));
+
+  poly_lengths.append_n_times(3, 4);
+
+  poly_starts.append(loops.size());
+  loops.extend({vertex_offset + 0, vertex_offset + 1, vertex_offset + 2});
+  poly_starts.append(loops.size());
+  loops.extend({vertex_offset + 0, vertex_offset + 3, vertex_offset + 1});
+  poly_starts.append(loops.size());
+  loops.extend({vertex_offset + 0, vertex_offset + 2, vertex_offset + 3});
+  poly_starts.append(loops.size());
+  loops.extend({vertex_offset + 1, vertex_offset + 2, vertex_offset + 3});
+
+  loop_colors.append_n_times(color, 12);
+}
+
+Mesh *BParticles_test_mesh_from_state(BParticlesState state_c)
+{
+  ParticlesState &state = *unwrap(state_c);
+
+  SmallVector<float3> vertex_positions;
+  SmallVector<uint> poly_starts;
+  SmallVector<uint> poly_lengths;
+  SmallVector<uint> loops;
+  SmallVector<MLoopCol> loop_colors;
+
+  SmallVector<MLoopCol> colors_to_use = {
+      {230, 30, 30, 255}, {30, 230, 30, 255}, {30, 30, 230, 255}};
+
+  uint type_index = 0;
+  for (ParticlesContainer *container : state.particle_containers().values()) {
+    for (ParticlesBlock *block : container->active_blocks()) {
+      AttributeArrays attributes = block->slice_active();
+      auto positions = attributes.get_float3("Position");
+
+      for (uint pindex = 0; pindex < attributes.size(); pindex++) {
+        append_tetrahedon_mesh_data(positions[pindex],
+                                    0.03f,
+                                    colors_to_use[type_index],
+                                    vertex_positions,
+                                    poly_starts,
+                                    poly_lengths,
+                                    loops,
+                                    loop_colors);
+      }
+    }
+    type_index++;
+  }
+
+  Mesh *mesh = BKE_mesh_new_nomain(
+      vertex_positions.size(), 0, 0, loops.size(), poly_starts.size());
+
+  for (uint i = 0; i < vertex_positions.size(); i++) {
+    copy_v3_v3(mesh->mvert[i].co, vertex_positions[i]);
+  }
+
+  for (uint i = 0; i < poly_starts.size(); i++) {
+    mesh->mpoly[i].loopstart = poly_starts[i];
+    mesh->mpoly[i].totloop = poly_lengths[i];
+  }
+
+  for (uint i = 0; i < loops.size(); i++) {
+    mesh->mloop[i].v = loops[i];
+  }
+
+  MLoopCol *mesh_loop_colors = (MLoopCol *)CustomData_add_layer_named(
+      &mesh->ldata, CD_MLOOPCOL, CD_DEFAULT, nullptr, mesh->totloop, "test");
+
+  for (uint i = 0; i < loop_colors.size(); i++) {
+    mesh_loop_colors[i] = loop_colors[i];
+  }
+
+  BKE_mesh_calc_edges(mesh, false, false);
+  return mesh;
+}
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index b072954f124..948db9c4a35 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -34,13 +34,17 @@ class PointEmitter : public Emitter {
 
 class SurfaceEmitter : public Emitter {
  private:
+  uint m_particle_type_id;
   Mesh *m_mesh;
   float4x4 m_transform;
   float m_normal_velocity;
 
  public:
-  SurfaceEmitter(Mesh *mesh, float4x4 transform, float normal_velocity)
-      : m_mesh(mesh), m_transform(transform), m_normal_velocity(normal_velocity)
+  SurfaceEmitter(uint particle_type_id, Mesh *mesh, float4x4 transform, float normal_velocity)
+      : m_particle_type_id(particle_type_id),
+        m_mesh(mesh),
+        m_transform(transform),
+        m_normal_velocity(normal_velocity)
   {
   }
 
@@ -69,7 +73,7 @@ class SurfaceEmitter : public Emitter {
       velocities.append(m_transform.transform_direction(normal * m_normal_velocity));
     }
 
-    auto target = interface.request(0, positions.size());
+    auto target = interface.request(m_particle_type_id, positions.size());
     target.set_float3("Position", positions);
     target.set_float3("Velocity", velocities);
   }
@@ -112,11 +116,12 @@ std::unique_ptr<Emitter> EMITTER_point(float3 point)
   return std::unique_ptr<Emitter>(emitter);
 }
 
-std::unique_ptr<Emitter> EMITTER_mesh_surface(Mesh *mesh,
+std::unique_ptr<Emitter> EMITTER_mesh_surface(uint particle_type_id,
+                                              Mesh *mesh,
                                               const float4x4 &transform,
                                               float normal_velocity)
 {
-  Emitter *emitter = new SurfaceEmitter(mesh, transform, normal_velocity);
+  Emitter *emitter = new SurfaceEmitter(particle_type_id, mesh, transform, normal_velocity);
   return std::unique_ptr<Emitter>(emitter);
 }
 
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 285a5726c87..51c7a3f68fa 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -8,7 +8,8 @@ struct Path;
 namespace BParticles {
 
 std::unique_ptr<Emitter> EMITTER_point(float3 point);
-std::unique_ptr<Emitter> EMITTER_mesh_surface(struct Mesh *mesh,
+std::unique_ptr<Emitter> EMITTER_mesh_surface(uint particle_type_id,
+                                              st

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list