[Bf-blender-cvs] [019407810b9] master: Refactor: move modifier .blend I/O to blenkernel
Jacques Lucke
noreply at git.blender.org
Fri Nov 6 17:13:24 CET 2020
Commit: 019407810b9eeebce0e7fdaf5fa89906a40841ed
Author: Jacques Lucke
Date: Fri Nov 6 17:13:04 2020 +0100
Branches: master
https://developer.blender.org/rB019407810b9eeebce0e7fdaf5fa89906a40841ed
Refactor: move modifier .blend I/O to blenkernel
Ref T76372.
===================================================================
M source/blender/blenkernel/BKE_modifier.h
M source/blender/blenkernel/intern/modifier.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 4909fe012b5..a2c3787bcd2 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -30,6 +30,7 @@ extern "C" {
struct ARegionType;
struct BMEditMesh;
struct BlendDataReader;
+struct BlendLibReader;
struct BlendWriter;
struct CustomData_MeshMasks;
struct DepsNodeHandle;
@@ -535,6 +536,12 @@ struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object
void BKE_modifier_check_uuids_unique_and_report(const struct Object *object);
+void BKE_modifier_blend_write(struct BlendWriter *writer, struct ListBase *modbase);
+void BKE_modifier_blend_read_data(struct BlendDataReader *reader,
+ struct ListBase *lb,
+ struct Object *ob);
+void BKE_modifier_blend_read_lib(struct BlendLibReader *reader, struct Object *ob);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 0054d2f76d1..3c8b685a0e0 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -24,6 +24,9 @@
* \ingroup bke
*/
+/* Allow using deprecated functionality for .blend file I/O. */
+#define DNA_DEPRECATED_ALLOW
+
#include <float.h>
#include <math.h>
#include <stdarg.h>
@@ -34,8 +37,12 @@
#include "MEM_guardedalloc.h"
#include "DNA_armature_types.h"
+#include "DNA_cloth_types.h"
+#include "DNA_fluid_types.h"
#include "DNA_gpencil_modifier_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_object_fluidsim_types.h"
+#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -54,6 +61,8 @@
#include "BKE_appdir.h"
#include "BKE_editmesh.h"
#include "BKE_editmesh_cache.h"
+#include "BKE_effect.h"
+#include "BKE_fluid.h"
#include "BKE_global.h"
#include "BKE_gpencil_modifier.h"
#include "BKE_idtype.h"
@@ -64,6 +73,7 @@
#include "BKE_mesh_wrapper.h"
#include "BKE_multires.h"
#include "BKE_object.h"
+#include "BKE_pointcache.h"
/* may move these, only for BKE_modifier_path_relbase */
#include "BKE_main.h"
@@ -74,6 +84,8 @@
#include "MOD_modifiertypes.h"
+#include "BLO_read_write.h"
+
#include "CLG_log.h"
static CLG_LogRef LOG = {"bke.modifier"};
@@ -1116,3 +1128,423 @@ void BKE_modifier_check_uuids_unique_and_report(const Object *object)
BLI_gset_free(used_uuids, NULL);
}
+
+void BKE_modifier_blend_write(BlendWriter *writer, ListBase *modbase)
+{
+ if (modbase == NULL) {
+ return;
+ }
+
+ LISTBASE_FOREACH (ModifierData *, md, modbase) {
+ const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
+ if (mti == NULL) {
+ return;
+ }
+
+ BLO_write_struct_by_name(writer, mti->structName, md);
+
+ if (md->type == eModifierType_Cloth) {
+ ClothModifierData *clmd = (ClothModifierData *)md;
+
+ BLO_write_struct(writer, ClothSimSettings, clmd->sim_parms);
+ BLO_write_struct(writer, ClothCollSettings, clmd->coll_parms);
+ BLO_write_struct(writer, EffectorWeights, clmd->sim_parms->effector_weights);
+ BKE_ptcache_blend_write(writer, &clmd->ptcaches);
+ }
+ else if (md->type == eModifierType_Fluid) {
+ FluidModifierData *fmd = (FluidModifierData *)md;
+
+ if (fmd->type & MOD_FLUID_TYPE_DOMAIN) {
+ BLO_write_struct(writer, FluidDomainSettings, fmd->domain);
+
+ if (fmd->domain) {
+ BKE_ptcache_blend_write(writer, &(fmd->domain->ptcaches[0]));
+
+ /* create fake pointcache so that old blender versions can read it */
+ fmd->domain->point_cache[1] = BKE_ptcache_add(&fmd->domain->ptcaches[1]);
+ fmd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE | PTCACHE_FAKE_SMOKE;
+ fmd->domain->point_cache[1]->step = 1;
+
+ BKE_ptcache_blend_write(writer, &(fmd->domain->ptcaches[1]));
+
+ if (fmd->domain->coba) {
+ BLO_write_struct(writer, ColorBand, fmd->domain->coba);
+ }
+
+ /* cleanup the fake pointcache */
+ BKE_ptcache_free_list(&fmd->domain->ptcaches[1]);
+ fmd->domain->point_cache[1] = NULL;
+
+ BLO_write_struct(writer, EffectorWeights, fmd->domain->effector_weights);
+ }
+ }
+ else if (fmd->type & MOD_FLUID_TYPE_FLOW) {
+ BLO_write_struct(writer, FluidFlowSettings, fmd->flow);
+ }
+ else if (fmd->type & MOD_FLUID_TYPE_EFFEC) {
+ BLO_write_struct(writer, FluidEffectorSettings, fmd->effector);
+ }
+ }
+ else if (md->type == eModifierType_Fluidsim) {
+ FluidsimModifierData *fluidmd = (FluidsimModifierData *)md;
+
+ BLO_write_struct(writer, FluidsimSettings, fluidmd->fss);
+ }
+ else if (md->type == eModifierType_DynamicPaint) {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+
+ if (pmd->canvas) {
+ BLO_write_struct(writer, DynamicPaintCanvasSettings, pmd->canvas);
+
+ /* write surfaces */
+ LISTBASE_FOREACH (DynamicPaintSurface *, surface, &pmd->canvas->surfaces) {
+ BLO_write_struct(writer, DynamicPaintSurface, surface);
+ }
+ /* write caches and effector weights */
+ LISTBASE_FOREACH (DynamicPaintSurface *, surface, &pmd->canvas->surfaces) {
+ BKE_ptcache_blend_write(writer, &(surface->ptcaches));
+
+ BLO_write_struct(writer, EffectorWeights, surface->effector_weights);
+ }
+ }
+ if (pmd->brush) {
+ BLO_write_struct(writer, DynamicPaintBrushSettings, pmd->brush);
+ BLO_write_struct(writer, ColorBand, pmd->brush->paint_ramp);
+ BLO_write_struct(writer, ColorBand, pmd->brush->vel_ramp);
+ }
+ }
+ else if (md->type == eModifierType_Collision) {
+
+#if 0
+ CollisionModifierData *collmd = (CollisionModifierData *)md;
+ // TODO: CollisionModifier should use pointcache
+ // + have proper reset events before enabling this
+ writestruct(wd, DATA, MVert, collmd->numverts, collmd->x);
+ writestruct(wd, DATA, MVert, collmd->numverts, collmd->xnew);
+ writestruct(wd, DATA, MFace, collmd->numfaces, collmd->mfaces);
+#endif
+ }
+
+ if (mti->blendWrite != NULL) {
+ mti->blendWrite(writer, md);
+ }
+ }
+}
+
+/* TODO(sergey): Find a better place for this.
+ *
+ * Unfortunately, this can not be done as a regular do_versions() since the modifier type is
+ * set to NONE, so the do_versions code wouldn't know where the modifier came from.
+ *
+ * The best approach seems to have the functionality in versioning_280.c but still call the
+ * function from #BKE_modifier_blend_read_data().
+ */
+
+/* Domain, inflow, ... */
+static void modifier_ensure_type(FluidModifierData *fluid_modifier_data, int type)
+{
+ fluid_modifier_data->type = type;
+ BKE_fluid_modifier_free(fluid_modifier_data);
+ BKE_fluid_modifier_create_type_data(fluid_modifier_data);
+}
+
+/**
+ * \note The old_modifier_data is NOT linked.
+ * This means that in order to access sub-data pointers #BLO_read_get_new_data_address is to be
+ * used.
+ */
+static ModifierData *modifier_replace_with_fluid(BlendDataReader *reader,
+ Object *object,
+ ListBase *modifiers,
+ ModifierData *old_modifier_data)
+{
+ ModifierData *new_modifier_data = BKE_modifier_new(eModifierType_Fluid);
+ FluidModifierData *fluid_modifier_data = (FluidModifierData *)new_modifier_data;
+
+ if (old_modifier_data->type == eModifierType_Fluidsim) {
+ FluidsimModifierData *old_fluidsim_modifier_data = (FluidsimModifierData *)old_modifier_data;
+ FluidsimSettings *old_fluidsim_settings = BLO_read_get_new_data_address(
+ reader, old_fluidsim_modifier_data->fss);
+ switch (old_fluidsim_settings->type) {
+ case OB_FLUIDSIM_ENABLE:
+ modifier_ensure_type(fluid_modifier_data, 0);
+ break;
+ case OB_FLUIDSIM_DOMAIN:
+ modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_DOMAIN);
+ BKE_fluid_domain_type_set(object, fluid_modifier_data->domain, FLUID_DOMAIN_TYPE_LIQUID);
+ break;
+ case OB_FLUIDSIM_FLUID:
+ modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_FLOW);
+ BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_LIQUID);
+ /* No need to emit liquid far away from surface. */
+ fluid_modifier_data->flow->surface_distance = 0.0f;
+ break;
+ case OB_FLUIDSIM_OBSTACLE:
+ modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_EFFEC);
+ BKE_fluid_effector_type_set(
+ object, fluid_modifier_data->effector, FLUID_EFFECTOR_TYPE_COLLISION);
+ break;
+ case OB_FLUIDSIM_INFLOW:
+ modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_FLOW);
+ BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_LIQUID);
+ BKE_fluid_flow_behavior_set(object, fluid_modifier_data->flow, FLUID_FLOW_BEHAVIOR_INFLOW);
+ /* No need to emit liquid far away from surface. */
+ fluid_modifier_data->flow->surface_distance = 0.0f;
+ break;
+ case OB_FLUIDSIM_OUTFLOW:
+ modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_FLOW);
+ BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_LIQUID);
+ BKE_fluid_flow_behavior_set(
+ object, fluid_modifier_data->flow, FLUID_FLOW_BEHAVIOR_OUTFLOW);
+ break;
+ case OB_FLUIDSIM_PARTICLE:
+ /* "Particle" type objects not being used by Mantaflow fluid simulations.
+ * Skip this object, secondary particles can only be enabled through the domain object. */
+ break;
+ case OB_FLUIDSIM_CONTROL:
+ /* "Control" type objects not being used by Mantaflow fluid simulations.
+ * Use guiding type instead which is similar. */
+ modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_EFFEC);
+ BKE_fluid_effector_type_set(
+ object, fluid_modifier_data->effector, FLU
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list