[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