[Bf-blender-cvs] [638913a3c08] master: Refactor: move Object .blend I/O to IDTypeInfo callbacks

Jacques Lucke noreply at git.blender.org
Fri Nov 6 18:25:59 CET 2020


Commit: 638913a3c08990697e08195e00f5f9cf472c04be
Author: Jacques Lucke
Date:   Fri Nov 6 18:25:44 2020 +0100
Branches: master
https://developer.blender.org/rB638913a3c08990697e08195e00f5f9cf472c04be

Refactor: move Object .blend I/O to IDTypeInfo callbacks

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/readfile.h
M	source/blender/blenloader/intern/versioning_legacy.c
M	source/blender/blenloader/intern/writefile.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 60a829ad0aa..28c912a4c9a 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -421,6 +421,9 @@ void BKE_object_modifiers_lib_link_common(void *userData,
                                           struct ID **idpoin,
                                           int cb_flag);
 
+struct PartEff;
+struct PartEff *BKE_object_do_version_give_parteff_245(struct Object *ob);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index ca259a9fbd1..f9aa6dcca6a 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -21,6 +21,9 @@
  * \ingroup bke
  */
 
+/* Allow using deprecated functionality for .blend file I/O. */
+#define DNA_DEPRECATED_ALLOW
+
 #include <math.h>
 #include <stdio.h>
 #include <string.h>
@@ -35,6 +38,7 @@
 #include "DNA_collection_types.h"
 #include "DNA_constraint_types.h"
 #include "DNA_defaults.h"
+#include "DNA_effect_types.h"
 #include "DNA_fluid_types.h"
 #include "DNA_gpencil_modifier_types.h"
 #include "DNA_gpencil_types.h"
@@ -47,6 +51,8 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_meta_types.h"
 #include "DNA_movieclip_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_object_fluidsim_types.h"
 #include "DNA_object_types.h"
 #include "DNA_pointcloud_types.h"
 #include "DNA_rigidbody_types.h"
@@ -519,6 +525,614 @@ static void object_foreach_id(ID *id, LibraryForeachIDData *data)
   }
 }
 
+static void write_defgroups(BlendWriter *writer, ListBase *defbase)
+{
+  LISTBASE_FOREACH (bDeformGroup *, defgroup, defbase) {
+    BLO_write_struct(writer, bDeformGroup, defgroup);
+  }
+}
+
+static void write_fmaps(BlendWriter *writer, ListBase *fbase)
+{
+  LISTBASE_FOREACH (bFaceMap *, fmap, fbase) {
+    BLO_write_struct(writer, bFaceMap, fmap);
+  }
+}
+
+static void object_blend_write(BlendWriter *writer, ID *id, const void *id_address)
+{
+  Object *ob = (Object *)id;
+
+  const bool is_undo = BLO_write_is_undo(writer);
+  if (ob->id.us > 0 || is_undo) {
+    /* Clean up, important in undo case to reduce false detection of changed data-blocks. */
+    BKE_object_runtime_reset(ob);
+
+    if (is_undo) {
+      /* For undo we stay in object mode during undo presses, so keep edit-mode disabled on save as
+       * well, can help reducing false detection of changed data-blocks. */
+      ob->mode &= ~OB_MODE_EDIT;
+    }
+
+    /* write LibData */
+    BLO_write_id_struct(writer, Object, id_address, &ob->id);
+    BKE_id_blend_write(writer, &ob->id);
+
+    if (ob->adt) {
+      BKE_animdata_blend_write(writer, ob->adt);
+    }
+
+    /* direct data */
+    BLO_write_pointer_array(writer, ob->totcol, ob->mat);
+    BLO_write_raw(writer, sizeof(char) * ob->totcol, ob->matbits);
+
+    bArmature *arm = NULL;
+    if (ob->type == OB_ARMATURE) {
+      arm = ob->data;
+      if (arm && ob->pose && arm->act_bone) {
+        BLI_strncpy(
+            ob->pose->proxy_act_bone, arm->act_bone->name, sizeof(ob->pose->proxy_act_bone));
+      }
+    }
+
+    BKE_pose_blend_write(writer, ob->pose, arm);
+    write_defgroups(writer, &ob->defbase);
+    write_fmaps(writer, &ob->fmaps);
+    BKE_constraint_blend_write(writer, &ob->constraints);
+    animviz_motionpath_blend_write(writer, ob->mpath);
+
+    BLO_write_struct(writer, PartDeflect, ob->pd);
+    if (ob->soft) {
+      /* Set deprecated pointers to prevent crashes of older Blenders */
+      ob->soft->pointcache = ob->soft->shared->pointcache;
+      ob->soft->ptcaches = ob->soft->shared->ptcaches;
+      BLO_write_struct(writer, SoftBody, ob->soft);
+      BLO_write_struct(writer, SoftBody_Shared, ob->soft->shared);
+      BKE_ptcache_blend_write(writer, &(ob->soft->shared->ptcaches));
+      BLO_write_struct(writer, EffectorWeights, ob->soft->effector_weights);
+    }
+
+    if (ob->rigidbody_object) {
+      /* TODO: if any extra data is added to handle duplis, will need separate function then */
+      BLO_write_struct(writer, RigidBodyOb, ob->rigidbody_object);
+    }
+    if (ob->rigidbody_constraint) {
+      BLO_write_struct(writer, RigidBodyCon, ob->rigidbody_constraint);
+    }
+
+    if (ob->type == OB_EMPTY && ob->empty_drawtype == OB_EMPTY_IMAGE) {
+      BLO_write_struct(writer, ImageUser, ob->iuser);
+    }
+
+    BKE_particle_system_blend_write(writer, &ob->particlesystem);
+    BKE_modifier_blend_write(writer, &ob->modifiers);
+    BKE_gpencil_modifier_blend_write(writer, &ob->greasepencil_modifiers);
+    BKE_shaderfx_blend_write(writer, &ob->shader_fx);
+
+    BLO_write_struct_list(writer, LinkData, &ob->pc_ids);
+
+    BKE_previewimg_blend_write(writer, ob->preview);
+  }
+}
+
+/* XXX deprecated - old animation system */
+static void direct_link_nlastrips(BlendDataReader *reader, ListBase *strips)
+{
+  BLO_read_list(reader, strips);
+
+  LISTBASE_FOREACH (bActionStrip *, strip, strips) {
+    BLO_read_list(reader, &strip->modifiers);
+  }
+}
+
+static void object_blend_read_data(BlendDataReader *reader, ID *id)
+{
+  Object *ob = (Object *)id;
+
+  PartEff *paf;
+
+  /* XXX This should not be needed - but seems like it can happen in some cases,
+   * so for now play safe. */
+  ob->proxy_from = NULL;
+
+  const bool is_undo = BLO_read_data_is_undo(reader);
+  if (ob->id.tag & (LIB_TAG_EXTERN | LIB_TAG_INDIRECT)) {
+    /* Do not allow any non-object mode for linked data.
+     * See T34776, T42780, T81027 for more information. */
+    ob->mode &= ~OB_MODE_ALL_MODE_DATA;
+  }
+  else if (is_undo) {
+    /* For undo we want to stay in object mode during undo presses, so keep some edit modes
+     * disabled.
+     * TODO: Check if we should not disable more edit modes here? */
+    ob->mode &= ~(OB_MODE_EDIT | OB_MODE_PARTICLE_EDIT);
+  }
+
+  BLO_read_data_address(reader, &ob->adt);
+  BKE_animdata_blend_read_data(reader, ob->adt);
+
+  BLO_read_data_address(reader, &ob->pose);
+  BKE_pose_blend_read_data(reader, ob->pose);
+
+  BLO_read_data_address(reader, &ob->mpath);
+  if (ob->mpath) {
+    animviz_motionpath_blend_read_data(reader, ob->mpath);
+  }
+
+  BLO_read_list(reader, &ob->defbase);
+  BLO_read_list(reader, &ob->fmaps);
+  /* XXX deprecated - old animation system <<< */
+  direct_link_nlastrips(reader, &ob->nlastrips);
+  BLO_read_list(reader, &ob->constraintChannels);
+  /* >>> XXX deprecated - old animation system */
+
+  BLO_read_pointer_array(reader, (void **)&ob->mat);
+  BLO_read_data_address(reader, &ob->matbits);
+
+  /* do it here, below old data gets converted */
+  BKE_modifier_blend_read_data(reader, &ob->modifiers, ob);
+  BKE_gpencil_modifier_blend_read_data(reader, &ob->greasepencil_modifiers);
+  BKE_shaderfx_blend_read_data(reader, &ob->shader_fx);
+
+  BLO_read_list(reader, &ob->effect);
+  paf = ob->effect.first;
+  while (paf) {
+    if (paf->type == EFF_PARTICLE) {
+      paf->keys = NULL;
+    }
+    if (paf->type == EFF_WAVE) {
+      WaveEff *wav = (WaveEff *)paf;
+      PartEff *next = paf->next;
+      WaveModifierData *wmd = (WaveModifierData *)BKE_modifier_new(eModifierType_Wave);
+
+      wmd->damp = wav->damp;
+      wmd->flag = wav->flag;
+      wmd->height = wav->height;
+      wmd->lifetime = wav->lifetime;
+      wmd->narrow = wav->narrow;
+      wmd->speed = wav->speed;
+      wmd->startx = wav->startx;
+      wmd->starty = wav->startx;
+      wmd->timeoffs = wav->timeoffs;
+      wmd->width = wav->width;
+
+      BLI_addtail(&ob->modifiers, wmd);
+
+      BLI_remlink(&ob->effect, paf);
+      MEM_freeN(paf);
+
+      paf = next;
+      continue;
+    }
+    if (paf->type == EFF_BUILD) {
+      BuildEff *baf = (BuildEff *)paf;
+      PartEff *next = paf->next;
+      BuildModifierData *bmd = (BuildModifierData *)BKE_modifier_new(eModifierType_Build);
+
+      bmd->start = baf->sfra;
+      bmd->length = baf->len;
+      bmd->randomize = 0;
+      bmd->seed = 1;
+
+      BLI_addtail(&ob->modifiers, bmd);
+
+      BLI_remlink(&ob->effect, paf);
+      MEM_freeN(paf);
+
+      paf = next;
+      continue;
+    }
+    paf = paf->next;
+  }
+
+  BLO_read_data_address(reader, &ob->pd);
+  BKE_particle_partdeflect_blend_read_data(reader, ob->pd);
+  BLO_read_data_address(reader, &ob->soft);
+  if (ob->soft) {
+    SoftBody *sb = ob->soft;
+
+    sb->bpoint = NULL; /* init pointers so it gets rebuilt nicely */
+    sb->bspring = NULL;
+    sb->scratch = NULL;
+    /* although not used anymore */
+    /* still have to be loaded to be compatible with old files */
+    BLO_read_pointer_array(reader, (void **)&sb->keys);
+    if (sb->keys) {
+      for (int a = 0; a < sb->totkey; a++) {
+        BLO_read_data_address(reader, &sb->keys[a]);
+      }
+    }
+
+    BLO_read_data_address(reader, &sb->effector_weights);
+    if (!sb->effector_weights) {
+      sb->effector_weights = BKE_effector_add_weights(NULL);
+    }
+
+    BLO_read_data_address(reader, &sb->shared);
+    if (sb->shared == NULL) {
+      /* Link deprecated caches if they exist, so we can use them for versioning.
+       * We should only do this when sb->shared == NULL, because those pointers
+       * are always set (for compatibility with older Blenders). We mustn't link
+       * the same pointcache twice. */
+      BKE_ptcache_blend_read_data(reader, &sb->ptcaches, &sb->pointcache, false);
+    }
+    else {
+      /* link caches */
+      BKE_ptcache_blend_read_data(reader, &sb->shared->ptcaches, &sb->shared->pointcache, false);
+    }
+  }
+  BLO_read_data_address(reader, &ob->fluidsimSettings); /* NT */
+
+  BLO_read_data_address(reader, &ob->rigidbody_object);
+  if (ob->rigidbody_object) {
+    RigidBodyOb *rbo = ob->rigidbody_object;
+    /* Allocate runtime-only struct */
+    rbo->shared = MEM_callocN(sizeof(*rbo->shared), "RigidBodyObShared");
+  }
+  BLO_read_data_address(reader, &ob->rigidbody_constraint);
+  if (ob->rigidbody_constraint) {
+    ob->rigidbody_constraint->physics_constraint = NULL;
+  }
+
+  BLO_read_list(reader, &ob->particlesystem);
+  BKE_particle_system_blend_read_data(reader, &ob->particlesystem);
+
+  BKE_constraint_blend_read_data(reader, &ob->constraints);


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list