[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