[Bf-blender-cvs] [44721780941] spreadsheet-active-node: initial code

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


Commit: 447217809411fbd84ede78d487452b3a0991731e
Author: Jacques Lucke
Date:   Wed Mar 31 12:03:26 2021 +0200
Branches: spreadsheet-active-node
https://developer.blender.org/rB447217809411fbd84ede78d487452b3a0991731e

initial code

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/intern/geometry_component_mesh.cc
M	source/blender/blenkernel/intern/geometry_component_pointcloud.cc
M	source/blender/blenkernel/intern/geometry_set.cc
M	source/blender/editors/space_node/node_edit.c
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
M	source/blender/modifiers/intern/MOD_nodes.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 4454669b59a..ae0d2daff2d 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -141,6 +141,8 @@ class GeometryComponent {
   /* The returned component should be of the same type as the type this is called on. */
   virtual GeometryComponent *copy() const = 0;
 
+  virtual void ensure_own_non_instances();
+
   void user_add() const;
   void user_remove() const;
   bool is_mutable() const;
@@ -315,6 +317,8 @@ struct GeometrySet {
 
   void clear();
 
+  void ensure_own_non_instances();
+
   /* Utility methods for creation. */
   static GeometrySet create_with_mesh(
       Mesh *mesh, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
@@ -374,6 +378,8 @@ class MeshComponent : public GeometryComponent {
 
   bool is_empty() const final;
 
+  void ensure_own_non_instances() override;
+
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_MESH;
 
  private:
@@ -404,6 +410,8 @@ class PointCloudComponent : public GeometryComponent {
 
   bool is_empty() const final;
 
+  void ensure_own_non_instances() override;
+
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_POINT_CLOUD;
 
  private:
diff --git a/source/blender/blenkernel/intern/geometry_component_mesh.cc b/source/blender/blenkernel/intern/geometry_component_mesh.cc
index f0f46717744..0d6e7ee97f7 100644
--- a/source/blender/blenkernel/intern/geometry_component_mesh.cc
+++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc
@@ -157,6 +157,15 @@ bool MeshComponent::is_empty() const
   return mesh_ == nullptr;
 }
 
+void MeshComponent::ensure_own_non_instances()
+{
+  BLI_assert(this->is_mutable());
+  if (ownership_ != GeometryOwnershipType::Owned) {
+    mesh_ = BKE_mesh_copy_for_eval(mesh_, false);
+    ownership_ = GeometryOwnershipType::Owned;
+  }
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/geometry_component_pointcloud.cc b/source/blender/blenkernel/intern/geometry_component_pointcloud.cc
index 32c4ee8a6a6..a175ce55c4b 100644
--- a/source/blender/blenkernel/intern/geometry_component_pointcloud.cc
+++ b/source/blender/blenkernel/intern/geometry_component_pointcloud.cc
@@ -107,6 +107,15 @@ bool PointCloudComponent::is_empty() const
   return pointcloud_ == nullptr;
 }
 
+void PointCloudComponent::ensure_own_non_instances()
+{
+  BLI_assert(this->is_mutable());
+  if (ownership_ != GeometryOwnershipType::Owned) {
+    pointcloud_ = BKE_pointcloud_copy_for_eval(pointcloud_, false);
+    ownership_ = GeometryOwnershipType::Owned;
+  }
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 9f57fcfb2ba..cb1bf4131fe 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -89,6 +89,10 @@ bool GeometryComponent::is_mutable() const
   return users_ <= 1;
 }
 
+void GeometryComponent::ensure_own_non_instances()
+{
+}
+
 GeometryComponentType GeometryComponent::type() const
 {
   return type_;
@@ -211,6 +215,14 @@ void GeometrySet::clear()
   components_.clear();
 }
 
+void GeometrySet::ensure_own_non_instances()
+{
+  for (GeometryComponentType type : components_.keys()) {
+    GeometryComponent &component = this->get_component_for_write(type);
+    component.ensure_own_non_instances();
+  }
+}
+
 /* Returns a read-only mesh or null. */
 const Mesh *GeometrySet::get_mesh_for_read() const
 {
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 8fdee01f78e..cc05900c474 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -41,6 +41,7 @@
 #include "BKE_node.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
+#include "BKE_workspace.h"
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
@@ -669,6 +670,16 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node, bool *r_acti
   }
 
   nodeSetActive(ntree, node);
+  LISTBASE_FOREACH (wmWindow *, window, &((wmWindowManager *)bmain->wm.first)->windows) {
+    bScreen *screen = BKE_workspace_active_screen_get(window->workspace_hook);
+    LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
+      if (area->spacetype == SPACE_SPREADSHEET) {
+        SpaceSpreadsheet *sspreadsheet = area->spacedata.first;
+        DEG_id_tag_update(&ntree->id, ID_RECALC_COPY_ON_WRITE);
+        ED_area_tag_redraw(area);
+      }
+    }
+  }
 
   if (node->type != NODE_GROUP) {
     const bool was_output = (node->flag & NODE_DO_OUTPUT) != 0;
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
index 910bc0a34ec..8d8ff008712 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
@@ -34,6 +34,8 @@
 #include "spreadsheet_from_geometry.hh"
 #include "spreadsheet_intern.hh"
 
+GeometrySet *get_cached_geometry_set_ptr();
+
 namespace blender::ed::spreadsheet {
 
 using blender::bke::ReadAttribute;
@@ -199,6 +201,10 @@ static GeometrySet get_display_geometry_set(SpaceSpreadsheet *sspreadsheet,
                                             Object *object_eval,
                                             const GeometryComponentType used_component_type)
 {
+  if (get_cached_geometry_set_ptr() != nullptr) {
+    return *get_cached_geometry_set_ptr();
+  }
+
   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) {
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 8f9aa5c89ad..871e28fad74 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -252,6 +252,21 @@ 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_;
@@ -401,6 +416,16 @@ class GeometryNodesEvaluator {
         node, node_inputs_map, node_outputs_map, handle_map_, self_object_, modifier_, depsgraph_};
     this->execute_node(node, params);
 
+    if (node->bnode()->flag & NODE_ACTIVE) {
+      for (const OutputSocketRef *output_socket : node->outputs()) {
+        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);
+        }
+      }
+    }
+
     /* Forward computed outputs to linked input sockets. */
     for (const OutputSocketRef *output_socket : node->outputs()) {
       if (output_socket->is_available()) {



More information about the Bf-blender-cvs mailing list