[Bf-blender-cvs] [c8bf758a9a7] functions: restructure solver api

Jacques Lucke noreply at git.blender.org
Thu Jun 20 15:51:01 CEST 2019


Commit: c8bf758a9a7a0189498481a317c80dd5a40beeab
Author: Jacques Lucke
Date:   Thu Jun 20 11:04:45 2019 +0200
Branches: functions
https://developer.blender.org/rBc8bf758a9a7a0189498481a317c80dd5a40beeab

restructure solver api

Now I have to bring back all the functionality that was there already.

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

M	source/blender/modifiers/intern/MOD_nodeparticles.c
M	source/blender/simulations/BParticles.h
M	source/blender/simulations/CMakeLists.txt
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/particles_container.hpp
D	source/blender/simulations/bparticles/playground_solver.hpp
A	source/blender/simulations/bparticles/simulate.cpp
A	source/blender/simulations/bparticles/simulate.hpp

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

diff --git a/source/blender/modifiers/intern/MOD_nodeparticles.c b/source/blender/modifiers/intern/MOD_nodeparticles.c
index 0589297b140..422a742c8ff 100644
--- a/source/blender/modifiers/intern/MOD_nodeparticles.c
+++ b/source/blender/modifiers/intern/MOD_nodeparticles.c
@@ -49,104 +49,44 @@
 #include "BParticles.h"
 
 typedef struct RuntimeData {
-  BParticlesDescription description;
-  BParticlesSolver solver;
   BParticlesState state;
   float last_simulated_frame;
 } RuntimeData;
 
-static RuntimeData *get_runtime_data(NodeParticlesModifierData *npmd)
+static RuntimeData *get_runtime_struct(NodeParticlesModifierData *npmd)
 {
-  RuntimeData *data = npmd->modifier.runtime;
-  BLI_assert(data);
-  return data;
-}
-
-static BParticlesDescription create_current_description(Object *UNUSED(self),
-                                                        NodeParticlesModifierData *npmd,
-                                                        Depsgraph *UNUSED(depsgraph))
-{
-  return BParticles_playground_description(npmd->control1, npmd->control2, npmd->emitter_object);
-}
-
-static void ensure_runtime_data(Object *self,
-                                NodeParticlesModifierData *npmd,
-                                Depsgraph *depsgraph)
-{
-  if (npmd->modifier.runtime != NULL) {
-    return;
+  if (npmd->modifier.runtime == NULL) {
+    RuntimeData *runtime = MEM_callocN(sizeof(RuntimeData), __func__);
+    runtime->state = NULL;
+    runtime->last_simulated_frame = 0.0f;
+    npmd->modifier.runtime = runtime;
   }
 
-  RuntimeData *runtime = MEM_callocN(sizeof(RuntimeData), __func__);
-
-  runtime->description = create_current_description(self, npmd, depsgraph);
-  runtime->solver = BParticles_solver_build(runtime->description);
-  runtime->state = BParticles_state_init(runtime->solver);
-  runtime->last_simulated_frame = 0.0f;
-
-  npmd->modifier.runtime = runtime;
+  return npmd->modifier.runtime;
 }
 
 static void free_runtime_data(RuntimeData *runtime)
 {
   BParticles_state_free(runtime->state);
-  BParticles_solver_free(runtime->solver);
-  BParticles_description_free(runtime->description);
   MEM_freeN(runtime);
 }
 
-static void clear_runtime_data(NodeParticlesModifierData *npmd)
+static void free_modifier_runtime_data(NodeParticlesModifierData *npmd)
 {
-  if (npmd->modifier.runtime != NULL) {
-    free_runtime_data(npmd->modifier.runtime);
+  RuntimeData *runtime = (RuntimeData *)npmd->modifier.runtime;
+  if (runtime != NULL) {
+    free_runtime_data(runtime);
     npmd->modifier.runtime = NULL;
   }
 }
 
-static Mesh *applyModifier(ModifierData *md,
-                           const struct ModifierEvalContext *ctx,
-                           Mesh *UNUSED(mesh))
+static Mesh *mesh_from_particles_state(BParticlesState state)
 {
-  NodeParticlesModifierData *npmd = (NodeParticlesModifierData *)md;
-  ensure_runtime_data(ctx->object, npmd, ctx->depsgraph);
-  RuntimeData *runtime = get_runtime_data(npmd);
-
-  Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
-  float current_frame = BKE_scene_frame_get(scene);
-  float fps = FPS;
-
-  if (current_frame != runtime->last_simulated_frame) {
-    BParticlesDescription new_description = create_current_description(
-        ctx->object, npmd, ctx->depsgraph);
-    BParticlesSolver new_solver = BParticles_solver_build(new_description);
-
-    if (current_frame == runtime->last_simulated_frame + 1) {
-      BParticles_state_adapt(new_solver, runtime->state);
-
-      BParticles_solver_free(runtime->solver);
-      BParticles_description_free(runtime->description);
-      runtime->description = new_description;
-      runtime->solver = new_solver;
-
-      BParticles_state_step(runtime->solver, runtime->state, 1.0f / fps);
-    }
-    else {
-      BParticles_state_free(runtime->state);
-      BParticles_solver_free(runtime->solver);
-      BParticles_description_free(runtime->description);
-
-      runtime->description = new_description;
-      runtime->solver = new_solver;
-      runtime->state = BParticles_state_init(new_solver);
-    }
-    runtime->last_simulated_frame = current_frame;
-  }
-
-  uint point_amount = BParticles_state_particle_count(runtime->solver, runtime->state);
+  uint point_amount = BParticles_state_particle_count(state);
   Mesh *mesh = BKE_mesh_new_nomain(point_amount, 0, 0, 0, 0);
 
   float(*positions)[3] = MEM_malloc_arrayN(point_amount, sizeof(float[3]), __func__);
-  BParticles_state_get_positions(runtime->solver, runtime->state, positions);
+  BParticles_state_get_positions(state, positions);
 
   for (uint i = 0; i < point_amount; i++) {
     copy_v3_v3(mesh->mvert[i].co, positions[i]);
@@ -157,6 +97,37 @@ static Mesh *applyModifier(ModifierData *md,
   return mesh;
 }
 
+static Mesh *applyModifier(ModifierData *md,
+                           const struct ModifierEvalContext *ctx,
+                           Mesh *UNUSED(mesh))
+{
+  NodeParticlesModifierData *npmd = (NodeParticlesModifierData *)md;
+  RuntimeData *runtime = get_runtime_struct(npmd);
+
+  if (runtime->state == NULL) {
+    runtime->state = BParticles_new_empty_state();
+  }
+
+  Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
+  float current_frame = BKE_scene_frame_get(scene);
+
+  if (current_frame == runtime->last_simulated_frame) {
+    /* do nothing */
+  }
+  else if (current_frame == runtime->last_simulated_frame + 1.0f) {
+    BParticles_simulate_modifier(npmd, ctx->depsgraph, runtime->state);
+    runtime->last_simulated_frame = current_frame;
+  }
+  else {
+    free_modifier_runtime_data(npmd);
+    runtime = get_runtime_struct(npmd);
+    runtime->state = BParticles_new_empty_state();
+    runtime->last_simulated_frame = current_frame;
+  }
+
+  return mesh_from_particles_state(runtime->state);
+}
+
 static void initData(ModifierData *UNUSED(md))
 {
 }
@@ -164,7 +135,7 @@ static void initData(ModifierData *UNUSED(md))
 static void freeData(ModifierData *md)
 {
   NodeParticlesModifierData *npmd = (NodeParticlesModifierData *)md;
-  clear_runtime_data(npmd);
+  free_modifier_runtime_data(npmd);
 }
 
 static void freeRuntimeData(void *runtime_data_v)
@@ -172,8 +143,8 @@ static void freeRuntimeData(void *runtime_data_v)
   if (runtime_data_v == NULL) {
     return;
   }
-  RuntimeData *data = (RuntimeData *)runtime_data_v;
-  free_runtime_data(data);
+  RuntimeData *runtime = (RuntimeData *)runtime_data_v;
+  free_runtime_data(runtime);
 }
 
 static bool dependsOnTime(ModifierData *UNUSED(md))
diff --git a/source/blender/simulations/BParticles.h b/source/blender/simulations/BParticles.h
index 5fdc78a4b52..ca04093f3c9 100644
--- a/source/blender/simulations/BParticles.h
+++ b/source/blender/simulations/BParticles.h
@@ -8,29 +8,20 @@
 extern "C" {
 #endif
 
-struct Object;
+struct Depsgraph;
+struct NodeParticlesModifierData;
 
-typedef struct OpaqueBParticlesDescription *BParticlesDescription;
-typedef struct OpaqueBParticlesSolver *BParticlesSolver;
 typedef struct OpaqueBParticlesState *BParticlesState;
 
-BParticlesDescription BParticles_playground_description(float control1,
-                                                        float control2,
-                                                        struct Object *object);
-void BParticles_description_free(BParticlesDescription description);
-
-BParticlesSolver BParticles_solver_build(BParticlesDescription description);
-void BParticles_solver_free(BParticlesSolver solver);
-
-BParticlesState BParticles_state_init(BParticlesSolver solver);
-void BParticles_state_adapt(BParticlesSolver new_solver, BParticlesState state_to_adapt);
-void BParticles_state_step(BParticlesSolver solver, BParticlesState state, float elapsed_seconds);
+BParticlesState BParticles_new_empty_state(void);
 void BParticles_state_free(BParticlesState state);
 
-uint BParticles_state_particle_count(BParticlesSolver solver, BParticlesState state);
-void BParticles_state_get_positions(BParticlesSolver solver,
-                                    BParticlesState state,
-                                    float (*dst)[3]);
+void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
+                                  Depsgraph *depsgraph,
+                                  BParticlesState state);
+
+uint BParticles_state_particle_count(BParticlesState state);
+void BParticles_state_get_positions(BParticlesState state, float (*dst)[3]);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/simulations/CMakeLists.txt b/source/blender/simulations/CMakeLists.txt
index 08770db1712..18d05de52b6 100644
--- a/source/blender/simulations/CMakeLists.txt
+++ b/source/blender/simulations/CMakeLists.txt
@@ -19,8 +19,8 @@ set(SRC
   bparticles/core.cpp
   bparticles/particles_container.hpp
   bparticles/particles_container.cpp
-  bparticles/playground_solver.hpp
-  bparticles/playground_solver.cpp
+  bparticles/simulate.hpp
+  bparticles/simulate.cpp
   bparticles/emitters.hpp
   bparticles/emitters.cpp
   bparticles/forces.hpp
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 238961a7c18..c5b471795a5 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -1,9 +1,9 @@
 #include "BParticles.h"
 #include "core.hpp"
 #include "particles_container.hpp"
-#include "playground_solver.hpp"
 #include "emitters.hpp"
 #include "forces.hpp"
+#include "simulate.hpp"
 
 #include "BLI_timeit.hpp"
 #include "BLI_listbase.h"
@@ -23,109 +23,64 @@
     return (T2)value; \
   }
 
-using BParticles::AttributeArrays;
-using BParticles::AttributeType;
-using BParticles::Description;
-using BParticles::Emitter;
-using BParticles::EmitterHelper;
-using BParticles::EmitterTarget;
-using BParticles::ParticlesBlock;
-using BParticles::Solver;
-using BParticles::StateBase;
-using BParticles::WrappedState;
+using namespace BParticles;
 
 using BLI::ArrayRef;
 using BLI::float3;
 using BLI::SmallVector;
 using BLI::StringRef;
 
-WRAPPERS(BParticles::Description *, BParticlesDescription);
-WRAPPERS(BParticles::Solver *, BParticlesSolver);
-WRAPPERS(BParticles::WrappedState *, BParticlesState);
+WRAPPERS(ParticlesState *, BParticlesState);
 


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list