[Bf-blender-cvs] [993e8af9434] spreadsheet-active-node: cleanup

Jacques Lucke noreply at git.blender.org
Wed Mar 31 13:31:15 CEST 2021


Commit: 993e8af9434adc6d29efa10e1f4710f81db8a225
Author: Jacques Lucke
Date:   Wed Mar 31 12:41:26 2021 +0200
Branches: spreadsheet-active-node
https://developer.blender.org/rB993e8af9434adc6d29efa10e1f4710f81db8a225

cleanup

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

M	source/blender/blenkernel/intern/object.c
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/modifiers/intern/MOD_nodes.cc

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

diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 8c5a4966633..1413fddd18c 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1756,6 +1756,10 @@ void BKE_object_free_derived_caches(Object *ob)
     BKE_geometry_set_free(ob->runtime.geometry_set_eval);
     ob->runtime.geometry_set_eval = NULL;
   }
+  if (ob->runtime.geometry_set_preview != NULL) {
+    BKE_geometry_set_free(ob->runtime.geometry_set_preview);
+    ob->runtime.geometry_set_preview = NULL;
+  }
 }
 
 void BKE_object_free_caches(Object *object)
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
index fb93337c47f..50b8fbcb062 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
@@ -34,8 +34,6 @@
 #include "spreadsheet_from_geometry.hh"
 #include "spreadsheet_intern.hh"
 
-GeometrySet *get_cached_geometry_set_ptr();
-
 namespace blender::ed::spreadsheet {
 
 using blender::bke::ReadAttribute;
@@ -201,33 +199,8 @@ static GeometrySet get_display_geometry_set(SpaceSpreadsheet *sspreadsheet,
                                             Object *object_eval,
                                             const GeometryComponentType used_component_type)
 {
-  if (sspreadsheet->object_eval_state == SPREADSHEET_OBJECT_EVAL_STATE_NODE) {
-    if (get_cached_geometry_set_ptr() != nullptr) {
-      return *get_cached_geometry_set_ptr();
-    }
-    return {};
-  }
-
   GeometrySet geometry_set;
-  if (sspreadsheet->object_eval_state == SPREADSHEET_OBJECT_EVAL_STATE_FINAL) {
-    if (used_component_type == GEO_COMPONENT_TYPE_MESH && object_eval->mode == OB_MODE_EDIT) {
-      Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(object_eval, false);
-      if (mesh == nullptr) {
-        return geometry_set;
-      }
-      BKE_mesh_wrapper_ensure_mdata(mesh);
-      MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-      mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly);
-      mesh_component.copy_vertex_group_names_from_object(*object_eval);
-    }
-    else {
-      if (object_eval->runtime.geometry_set_eval != nullptr) {
-        /* This does not copy the geometry data itself. */
-        geometry_set = *object_eval->runtime.geometry_set_eval;
-      }
-    }
-  }
-  else {
+  if (sspreadsheet->object_eval_state == SPREADSHEET_OBJECT_EVAL_STATE_ORIGINAL) {
     Object *object_orig = DEG_get_original_object(object_eval);
     if (object_orig->type == OB_MESH) {
       MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
@@ -256,6 +229,30 @@ static GeometrySet get_display_geometry_set(SpaceSpreadsheet *sspreadsheet,
       pointcloud_component.replace(pointcloud, GeometryOwnershipType::ReadOnly);
     }
   }
+  else {
+    if (used_component_type == GEO_COMPONENT_TYPE_MESH && object_eval->mode == OB_MODE_EDIT) {
+      Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(object_eval, false);
+      if (mesh == nullptr) {
+        return geometry_set;
+      }
+      BKE_mesh_wrapper_ensure_mdata(mesh);
+      MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+      mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly);
+      mesh_component.copy_vertex_group_names_from_object(*object_eval);
+    }
+    else {
+      if (sspreadsheet->object_eval_state == SPREADSHEET_OBJECT_EVAL_STATE_NODE) {
+        if (object_eval->runtime.geometry_set_preview != nullptr) {
+          geometry_set = *object_eval->runtime.geometry_set_preview;
+        }
+      }
+      else if (sspreadsheet->object_eval_state == SPREADSHEET_OBJECT_EVAL_STATE_FINAL) {
+        if (object_eval->runtime.geometry_set_eval != nullptr) {
+          geometry_set = *object_eval->runtime.geometry_set_eval;
+        }
+      }
+    }
+  }
   return geometry_set;
 }
 
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 686cf2048eb..0912e2d9b2f 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -167,6 +167,7 @@ typedef struct Object_Runtime {
    * the data.
    */
   struct GeometrySet *geometry_set_eval;
+  struct GeometrySet *geometry_set_preview;
 
   /**
    * Mesh structure created during object evaluation.
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 871e28fad74..7815234b037 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -252,21 +252,6 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
   return false;
 }
 
-static std::optional<GeometrySet> &get_cached_geometry_set()
-{
-  static std::optional<GeometrySet> geometry;
-  return geometry;
-}
-
-GeometrySet *get_cached_geometry_set_ptr();
-GeometrySet *get_cached_geometry_set_ptr()
-{
-  if (get_cached_geometry_set().has_value()) {
-    return &*get_cached_geometry_set();
-  }
-  return nullptr;
-}
-
 class GeometryNodesEvaluator {
  private:
   blender::LinearAllocator<> allocator_;
@@ -421,7 +406,11 @@ class GeometryNodesEvaluator {
         if (output_socket->is_available() && output_socket->bsocket()->type == SOCK_GEOMETRY) {
           GeometrySet value = node_outputs_map.lookup<GeometrySet>(output_socket->identifier());
           value.ensure_own_non_instances();
-          get_cached_geometry_set() = std::move(value);
+          static std::mutex mutex;
+          std::lock_guard lock{mutex};
+          delete self_object_->runtime.geometry_set_preview;
+          const_cast<Object *>(self_object_)->runtime.geometry_set_preview = new GeometrySet(
+              std::move(value));
         }
       }
     }



More information about the Bf-blender-cvs mailing list