[Bf-blender-cvs] [e83f46ea763] master: Geometry Nodes: Use Mesh instead of BMesh in split edges node

2022-11-20 Thread Wannes Malfait
Commit: e83f46ea7630163ae836f04cff867eee99032efa
Author: Wannes Malfait
Date:   Sun Nov 20 15:42:10 2022 -0600
Branches: master
https://developer.blender.org/rBe83f46ea7630163ae836f04cff867eee99032efa

Geometry Nodes: Use Mesh instead of BMesh in split edges node

Rewrite the edge split code to operate directly on Mesh instead
of BMesh. This allows for the use of multi-threading and makes
the node around 2 times faster. Around 15% of the time is spent
just on the creation of the topology maps, so these being cached
on the mesh could cause an even greater speedup. The new node
gave identical results compared to the BMesh version on all the
meshes I tested it on (up to permutation of the indices).

Here are some of the results on a few simple test cases:
(Intel i7-7700HQ (8 cores) @ 2.800GHz , with 50% of edges selected)
|   | 370x370 UV Sphere | 400x400 Grid | Suzanne 4 subdiv levels |
| - | - | -- | - |
| Mesh  | 89ms  | 111ms  | 76ms  |
| BMesh | 200ms | 276ms  | 208ms |

Differential Revision: https://developer.blender.org/D16399

===

M   source/blender/blenkernel/BKE_mesh_mapping.h
M   source/blender/blenkernel/intern/mesh_mapping.cc
M   source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
M   tests/python/CMakeLists.txt

===

diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h 
b/source/blender/blenkernel/BKE_mesh_mapping.h
index c5c81b31b79..a0ded44f630 100644
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@ -352,11 +352,21 @@ Array build_loop_to_poly_map(Span polys, int 
loops_num);
 
 Array> build_vert_to_edge_map(Span edges, int verts_num);
 Array> build_vert_to_loop_map(Span loops, int verts_num);
+Array> build_edge_to_loop_map(Span loops, int edges_num);
+Vector> build_edge_to_loop_map_resizable(Span loops, int 
edges_num);
 
 inline int previous_poly_loop(const MPoly , int loop_i)
 {
   return loop_i - 1 + (loop_i == poly.loopstart) * poly.totloop;
 }
 
+inline int next_poly_loop(const MPoly , int loop_i)
+{
+  if (loop_i == poly.loopstart + poly.totloop - 1) {
+return poly.loopstart;
+  }
+  return loop_i + 1;
+}
+
 }  // namespace blender::bke::mesh_topology
 #endif
diff --git a/source/blender/blenkernel/intern/mesh_mapping.cc 
b/source/blender/blenkernel/intern/mesh_mapping.cc
index ed4ae94da7f..98fb8a7fb42 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.cc
+++ b/source/blender/blenkernel/intern/mesh_mapping.cc
@@ -586,6 +586,24 @@ Array> build_vert_to_loop_map(const 
Span loops, const int ver
   return map;
 }
 
+Array> build_edge_to_loop_map(const Span loops, const int 
edges_num)
+{
+  Array> map(edges_num);
+  for (const int64_t i : loops.index_range()) {
+map[loops[i].e].append(int(i));
+  }
+  return map;
+}
+
+Vector> build_edge_to_loop_map_resizable(const Span loops, 
const int edges_num)
+{
+  Vector> map(edges_num);
+  for (const int64_t i : loops.index_range()) {
+map[loops[i].e].append(int(i));
+  }
+  return map;
+}
+
 }  // namespace blender::bke::mesh_topology
 
 /** \} */
diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc 
b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
index 0b4d5bd53f3..1a19897a148 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
@@ -1,13 +1,15 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
+#include "BLI_array_utils.hh"
+#include "BLI_task.hh"
+
 #include "DNA_mesh_types.h"
 
+#include "BKE_attribute_math.hh"
 #include "BKE_mesh.h"
+#include "BKE_mesh_mapping.h"
 #include "BKE_mesh_runtime.h"
 
-#include "bmesh.h"
-#include "bmesh_tools.h"
-
 #include "node_geometry_util.hh"
 
 namespace blender::nodes::node_geo_edge_split_cc {
@@ -19,30 +21,410 @@ static void node_declare(NodeDeclarationBuilder )
   b.add_output(N_("Mesh"));
 }
 
-static Mesh *mesh_edge_split(const Mesh , const IndexMask selection)
+/* Naively checks if the first vertices and the second vertices are the same. 
*/
+static inline bool naive_edges_equal(const MEdge , const MEdge )
+{
+  return edge1.v1 == edge2.v1 && edge1.v2 == edge2.v2;
+}
+
+static void transfer_attributes(const Map 
,
+const Span new_to_old_verts_map,
+const Span new_to_old_edges_map,
+const AttributeAccessor src_attributes,
+MutableAttributeAccessor dst_attributes)
+{
+  for (Map::Item entry : attributes.items()) {
+const AttributeIDRef attribute_id = en

[Bf-blender-cvs] [9b591a104b3] blender-v3.3-release: Fix T101137: Crash with Transform Node

2022-09-21 Thread Wannes Malfait
Commit: 9b591a104b35c345bdb05874f4b9b6cc4aba1284
Author: Wannes Malfait
Date:   Sun Sep 18 22:58:51 2022 -0500
Branches: blender-v3.3-release
https://developer.blender.org/rB9b591a104b35c345bdb05874f4b9b6cc4aba1284

Fix T101137: Crash with Transform Node

In `BKE_mesh_tag_coords_changed_uniformly` the checks for dirty vertex
and dirty poly normals were swapped around, causing an assert to be
triggered.

Differential Revision: https://developer.blender.org/D16002

===

M   source/blender/blenkernel/intern/mesh_runtime.cc

===

diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc 
b/source/blender/blenkernel/intern/mesh_runtime.cc
index 4521c519f45..77f4cec6ed2 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.cc
+++ b/source/blender/blenkernel/intern/mesh_runtime.cc
@@ -274,10 +274,10 @@ void BKE_mesh_tag_coords_changed_uniformly(Mesh *mesh)
   BKE_mesh_tag_coords_changed(mesh);
   /* The normals didn't change, since all vertices moved by the same amount. */
   if (!vert_normals_were_dirty) {
-BKE_mesh_poly_normals_clear_dirty(mesh);
+BKE_mesh_vertex_normals_clear_dirty(mesh);
   }
   if (!poly_normals_were_dirty) {
-BKE_mesh_vertex_normals_clear_dirty(mesh);
+BKE_mesh_poly_normals_clear_dirty(mesh);
   }
 }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [822fb550f2a] temp-T97352-3d-texturing-seam-bleeding-b2: Fix T101137: Crash with Transform Node

2022-09-20 Thread Wannes Malfait
Commit: 822fb550f2a5592c740ae5e6a71e29fcd5fe9b8b
Author: Wannes Malfait
Date:   Sun Sep 18 22:58:51 2022 -0500
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB822fb550f2a5592c740ae5e6a71e29fcd5fe9b8b

Fix T101137: Crash with Transform Node

In `BKE_mesh_tag_coords_changed_uniformly` the checks for dirty vertex
and dirty poly normals were swapped around, causing an assert to be
triggered.

Differential Revision: https://developer.blender.org/D16002

===

M   source/blender/blenkernel/intern/mesh_runtime.cc

===

diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc 
b/source/blender/blenkernel/intern/mesh_runtime.cc
index a66f2a714e7..4b6433edd5a 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.cc
+++ b/source/blender/blenkernel/intern/mesh_runtime.cc
@@ -280,10 +280,10 @@ void BKE_mesh_tag_coords_changed_uniformly(Mesh *mesh)
   BKE_mesh_tag_coords_changed(mesh);
   /* The normals didn't change, since all verts moved by the same amount. */
   if (!vert_normals_were_dirty) {
-BKE_mesh_poly_normals_clear_dirty(mesh);
+BKE_mesh_vertex_normals_clear_dirty(mesh);
   }
   if (!poly_normals_were_dirty) {
-BKE_mesh_vertex_normals_clear_dirty(mesh);
+BKE_mesh_poly_normals_clear_dirty(mesh);
   }
 }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [bef948d2416] temp-T97352-3d-texturing-seam-bleeding-b2: Geometry Nodes: New Face Set Boundaries node

2022-09-20 Thread Wannes Malfait
Commit: bef948d24161cb3465ef48726c0edd82db525ae1
Author: Wannes Malfait
Date:   Sat Sep 17 22:18:52 2022 -0500
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rBbef948d24161cb3465ef48726c0edd82db525ae1

Geometry Nodes: New Face Set Boundaries node

With the recent addition of the UV unwrapping node, there is a need to
be able to create seams easily. This node does that by outputting a
selection of the boundaries between different input face sets. In the
context of UV mapping, one inputs the "patches" you want, and the node
gives you the seams needed to make those patches.

Differential Revision: https://developer.blender.org/D15423

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/CMakeLists.txt
A   source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index b7d09215676..89b729595db 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -128,6 +128,7 @@ def mesh_node_items(context):
 yield NodeItem("GeometryNodeInputMeshEdgeVertices")
 yield NodeItem("GeometryNodeInputMeshFaceArea")
 yield NodeItem("GeometryNodeInputMeshFaceNeighbors")
+yield NodeItem("GeometryNodeMeshFaceSetBoundaries")
 yield NodeItem("GeometryNodeInputMeshFaceIsPlanar")
 yield NodeItem("GeometryNodeInputShadeSmooth")
 yield NodeItem("GeometryNodeInputMeshIsland")
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 55bf24f943e..75654a86409 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1525,6 +1525,7 @@ struct TexResult;
 #define GEO_NODE_INPUT_SHORTEST_EDGE_PATHS 1168
 #define GEO_NODE_EDGE_PATHS_TO_CURVES 1169
 #define GEO_NODE_EDGE_PATHS_TO_SELECTION 1170
+#define GEO_NODE_MESH_FACE_SET_BOUNDARIES 1171
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index c462d03e3da..1af04d3034c 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -4748,6 +4748,7 @@ static void registerGeometryNodes()
   register_node_type_geo_material_replace();
   register_node_type_geo_material_selection();
   register_node_type_geo_merge_by_distance();
+  register_node_type_geo_mesh_face_set_boundaries();
   register_node_type_geo_mesh_primitive_circle();
   register_node_type_geo_mesh_primitive_cone();
   register_node_type_geo_mesh_primitive_cube();
diff --git a/source/blender/nodes/NOD_geometry.h 
b/source/blender/nodes/NOD_geometry.h
index e16cd7a253f..63af2c71d45 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -95,6 +95,7 @@ void register_node_type_geo_join_geometry(void);
 void register_node_type_geo_material_replace(void);
 void register_node_type_geo_material_selection(void);
 void register_node_type_geo_merge_by_distance(void);
+void register_node_type_geo_mesh_face_set_boundaries(void);
 void register_node_type_geo_mesh_primitive_circle(void);
 void register_node_type_geo_mesh_primitive_cone(void);
 void register_node_type_geo_mesh_primitive_cube(void);
diff --git a/source/blender/nodes/NOD_static_types.h 
b/source/blender/nodes/NOD_static_types.h
index d587da823f1..73fb2bf32c8 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -352,6 +352,7 @@ DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, 
"JOIN_GEOMETRY", JoinGeometry,
 DefNode(GeometryNode, GEO_NODE_MATERIAL_SELECTION, 0, "MATERIAL_SELECTION", 
MaterialSelection, "Material Selection", "Provide a selection of faces that use 
the specified material")
 DefNode(GeometryNode, GEO_NODE_MERGE_BY_DISTANCE, 
def_geo_merge_by_distance,"MERGE_BY_DISTANCE", MergeByDistance, "Merge by 
Distance", "Merge vertices or points within a given distance")
 DefNode(GeometryNode, GEO_NODE_MESH_BOOLEAN, def_geo_boolean, "MESH_BOOLEAN", 
MeshBoolean, "Mesh Boolean", "Cut, subtract, or join multiple mesh inputs")
+DefNode(GeometryNode, GEO_NODE_MESH_FACE_SET_BOUNDARIES, 0, 
"MESH_FACE_SET_BOUNDARIES", MeshFaceSetBoundaries, "Face Set Boundaries", "Find 
edges on the boundaries between face sets")
 DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_CIRCLE, def_geo_mesh_circle, 
"MESH_PRIMITIVE_CIRC

[Bf-blender-cvs] [8a9f6a2e0a1] master: Fix T101137: Crash with Transform Node

2022-09-18 Thread Wannes Malfait
Commit: 8a9f6a2e0a15ed6d5fcab7030249f0211b667d60
Author: Wannes Malfait
Date:   Sun Sep 18 22:58:51 2022 -0500
Branches: master
https://developer.blender.org/rB8a9f6a2e0a15ed6d5fcab7030249f0211b667d60

Fix T101137: Crash with Transform Node

In `BKE_mesh_tag_coords_changed_uniformly` the checks for dirty vertex
and dirty poly normals were swapped around, causing an assert to be
triggered.

Differential Revision: https://developer.blender.org/D16002

===

M   source/blender/blenkernel/intern/mesh_runtime.cc

===

diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc 
b/source/blender/blenkernel/intern/mesh_runtime.cc
index a66f2a714e7..4b6433edd5a 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.cc
+++ b/source/blender/blenkernel/intern/mesh_runtime.cc
@@ -280,10 +280,10 @@ void BKE_mesh_tag_coords_changed_uniformly(Mesh *mesh)
   BKE_mesh_tag_coords_changed(mesh);
   /* The normals didn't change, since all verts moved by the same amount. */
   if (!vert_normals_were_dirty) {
-BKE_mesh_poly_normals_clear_dirty(mesh);
+BKE_mesh_vertex_normals_clear_dirty(mesh);
   }
   if (!poly_normals_were_dirty) {
-BKE_mesh_vertex_normals_clear_dirty(mesh);
+BKE_mesh_poly_normals_clear_dirty(mesh);
   }
 }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [3ff15a9e23b] master: Geometry Nodes: New Face Set Boundaries node

2022-09-17 Thread Wannes Malfait
Commit: 3ff15a9e23bd8a20ee514944779a898f1fe5accb
Author: Wannes Malfait
Date:   Sat Sep 17 22:18:52 2022 -0500
Branches: master
https://developer.blender.org/rB3ff15a9e23bd8a20ee514944779a898f1fe5accb

Geometry Nodes: New Face Set Boundaries node

With the recent addition of the UV unwrapping node, there is a need to
be able to create seams easily. This node does that by outputting a
selection of the boundaries between different input face sets. In the
context of UV mapping, one inputs the "patches" you want, and the node
gives you the seams needed to make those patches.

Differential Revision: https://developer.blender.org/D15423

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/CMakeLists.txt
A   source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index b7d09215676..89b729595db 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -128,6 +128,7 @@ def mesh_node_items(context):
 yield NodeItem("GeometryNodeInputMeshEdgeVertices")
 yield NodeItem("GeometryNodeInputMeshFaceArea")
 yield NodeItem("GeometryNodeInputMeshFaceNeighbors")
+yield NodeItem("GeometryNodeMeshFaceSetBoundaries")
 yield NodeItem("GeometryNodeInputMeshFaceIsPlanar")
 yield NodeItem("GeometryNodeInputShadeSmooth")
 yield NodeItem("GeometryNodeInputMeshIsland")
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 55bf24f943e..75654a86409 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1525,6 +1525,7 @@ struct TexResult;
 #define GEO_NODE_INPUT_SHORTEST_EDGE_PATHS 1168
 #define GEO_NODE_EDGE_PATHS_TO_CURVES 1169
 #define GEO_NODE_EDGE_PATHS_TO_SELECTION 1170
+#define GEO_NODE_MESH_FACE_SET_BOUNDARIES 1171
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index c462d03e3da..1af04d3034c 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -4748,6 +4748,7 @@ static void registerGeometryNodes()
   register_node_type_geo_material_replace();
   register_node_type_geo_material_selection();
   register_node_type_geo_merge_by_distance();
+  register_node_type_geo_mesh_face_set_boundaries();
   register_node_type_geo_mesh_primitive_circle();
   register_node_type_geo_mesh_primitive_cone();
   register_node_type_geo_mesh_primitive_cube();
diff --git a/source/blender/nodes/NOD_geometry.h 
b/source/blender/nodes/NOD_geometry.h
index e16cd7a253f..63af2c71d45 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -95,6 +95,7 @@ void register_node_type_geo_join_geometry(void);
 void register_node_type_geo_material_replace(void);
 void register_node_type_geo_material_selection(void);
 void register_node_type_geo_merge_by_distance(void);
+void register_node_type_geo_mesh_face_set_boundaries(void);
 void register_node_type_geo_mesh_primitive_circle(void);
 void register_node_type_geo_mesh_primitive_cone(void);
 void register_node_type_geo_mesh_primitive_cube(void);
diff --git a/source/blender/nodes/NOD_static_types.h 
b/source/blender/nodes/NOD_static_types.h
index d587da823f1..73fb2bf32c8 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -352,6 +352,7 @@ DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, 
"JOIN_GEOMETRY", JoinGeometry,
 DefNode(GeometryNode, GEO_NODE_MATERIAL_SELECTION, 0, "MATERIAL_SELECTION", 
MaterialSelection, "Material Selection", "Provide a selection of faces that use 
the specified material")
 DefNode(GeometryNode, GEO_NODE_MERGE_BY_DISTANCE, 
def_geo_merge_by_distance,"MERGE_BY_DISTANCE", MergeByDistance, "Merge by 
Distance", "Merge vertices or points within a given distance")
 DefNode(GeometryNode, GEO_NODE_MESH_BOOLEAN, def_geo_boolean, "MESH_BOOLEAN", 
MeshBoolean, "Mesh Boolean", "Cut, subtract, or join multiple mesh inputs")
+DefNode(GeometryNode, GEO_NODE_MESH_FACE_SET_BOUNDARIES, 0, 
"MESH_FACE_SET_BOUNDARIES", MeshFaceSetBoundaries, "Face Set Boundaries", "Find 
edges on the boundaries between face sets")
 DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_CIRCLE, def_geo_mesh_circle, 
"MESH_PRIMITIVE_CIRCLE", MeshCircle, "Mesh Circle&quo

[Bf-blender-cvs] [75611838300] master: Fix T99667: regression in Delete Geometry node

2022-07-20 Thread Wannes Malfait
Commit: 75611838300be7c01cf7020006e81f64ec75aaf2
Author: Wannes Malfait
Date:   Wed Jul 20 15:48:48 2022 +0200
Branches: master
https://developer.blender.org/rB75611838300be7c01cf7020006e81f64ec75aaf2

Fix T99667: regression in Delete Geometry node

Differential Revision: https://developer.blender.org/D15445

===

M   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc 
b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
index 582bcbc3395..b74b4e45199 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
@@ -1072,7 +1072,7 @@ static void separate_mesh_selection(GeometrySet 
_set,
   evaluator.evaluate();
   const VArray selection = evaluator.get_evaluated(0);
   /* Check if there is anything to delete. */
-  if (selection.is_single() && selection.get_internal_single()) {
+  if (selection.is_empty() || (selection.is_single() && 
selection.get_internal_single())) {
 return;
   }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [eeb0279e890] master: Geometry Nodes: Use std::move in dual mesh node

2022-02-28 Thread Wannes Malfait
Commit: eeb0279e890e7b021e0ac9dd48d2bcf6bef8300b
Author: Wannes Malfait
Date:   Mon Feb 28 15:16:01 2022 -0500
Branches: master
https://developer.blender.org/rBeeb0279e890e7b021e0ac9dd48d2bcf6bef8300b

Geometry Nodes: Use std::move in dual mesh node

Add a std::move in some places to prevent arrays from being copied.
These cases were potentially optimized by the compiler, but this makes
it more explicit.

Differential Revision: https://developer.blender.org/D14129

===

M   source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc 
b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
index f50c2ed5322..5a2c32a6c8e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
@@ -646,13 +646,13 @@ static void calc_dual_mesh(GeometrySet _set,
 Array shared_edges(loop_indices.size());
 vertex_ok = sort_vertex_polys(
 mesh_in, i, false, edge_types, loop_indices, shared_edges, 
sorted_corners);
-vertex_shared_edges[i] = shared_edges;
+vertex_shared_edges[i] = std::move(shared_edges);
   }
   else {
 Array shared_edges(loop_indices.size() - 1);
 vertex_ok = sort_vertex_polys(
 mesh_in, i, true, edge_types, loop_indices, shared_edges, 
sorted_corners);
-vertex_shared_edges[i] = shared_edges;
+vertex_shared_edges[i] = std::move(shared_edges);
   }
   if (!vertex_ok) {
 /* The sorting failed which means that the vertex is non-manifold and 
should be ignored
@@ -660,7 +660,7 @@ static void calc_dual_mesh(GeometrySet _set,
 vertex_types[i] = VertexType::NonManifold;
 continue;
   }
-  vertex_corners[i] = sorted_corners;
+  vertex_corners[i] = std::move(sorted_corners);
 }
   });

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [82fc68ed90b] blender-v3.1-release: Fix T95542: Dual Mesh crashes with some non-manifold vertices

2022-02-18 Thread Wannes Malfait
Commit: 82fc68ed90bf1429579eddd5df14caf60b791b45
Author: Wannes Malfait
Date:   Fri Feb 18 11:35:08 2022 -0600
Branches: blender-v3.1-release
https://developer.blender.org/rB82fc68ed90bf1429579eddd5df14caf60b791b45

Fix T95542: Dual Mesh crashes with some non-manifold vertices

The problem was that the code for sorting polygons around a vertex
assumed that it was a manifold or boundary vertex. However in some cases
the vertex could still be nonmanifold causing the crash. The cases where
the sorting fails are now detected and these vertices are then marked as
nonmanifold.

Differential Revision: https://developer.blender.org/D14065

===

M   source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc 
b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
index f6be6c1e7fb..41de84f7ad1 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
@@ -286,7 +286,7 @@ static void create_vertex_poly_map(const Mesh ,
  * boundary vertex, the first and last polygon have a boundary edge connected 
to the vertex. The
  * `r_shared_edges` array at index i is set to the index of the shared edge 
between the i-th and
  * `(i+1)-th` sorted polygon. Similarly the `r_sorted_corners` array at index 
i is set to the
- * corner in the i-th sorted polygon.
+ * corner in the i-th sorted polygon. If the polygons couldn't be sorted, 
`false` is returned.
  *
  * How the faces are sorted (see diagrams below):
  * (For this explanation we'll assume all faces are oriented clockwise)
@@ -335,7 +335,7 @@ static void create_vertex_poly_map(const Mesh ,
  * - Finally if we are in the normal case we also need to add the last "shared 
edge" to close the
  *   loop.
  */
-static void sort_vertex_polys(const Mesh ,
+static bool sort_vertex_polys(const Mesh ,
   const int vertex_index,
   const bool boundary_vertex,
   const Span edge_types,
@@ -344,7 +344,7 @@ static void sort_vertex_polys(const Mesh ,
   MutableSpan r_sorted_corners)
 {
   if (connected_polygons.size() <= 2 && (!boundary_vertex || 
connected_polygons.size() == 0)) {
-return;
+return true;
   }
 
   /* For each polygon store the two corners whose edge contains the vertex. */
@@ -448,8 +448,11 @@ static void sort_vertex_polys(const Mesh ,
 break;
   }
 }
-
-BLI_assert(j != connected_polygons.size());
+if (j == connected_polygons.size()) {
+  /* The vertex is not manifold because the polygons around the vertex 
don't form a loop, and
+   * hence can't be sorted. */
+  return false;
+}
 
 std::swap(connected_polygons[i + 1], connected_polygons[j]);
 std::swap(poly_vertex_corners[i + 1], poly_vertex_corners[j]);
@@ -459,6 +462,7 @@ static void sort_vertex_polys(const Mesh ,
 /* Shared edge between first and last polygon. */
 r_shared_edges.last() = shared_edge_i;
   }
+  return true;
 }
 
 /**
@@ -651,18 +655,25 @@ static void calc_dual_mesh(GeometrySet _set,
   }
   MutableSpan loop_indices = vertex_poly_indices[i];
   Array sorted_corners(loop_indices.size());
+  bool vertex_ok = true;
   if (vertex_types[i] == VertexType::Normal) {
 Array shared_edges(loop_indices.size());
-sort_vertex_polys(
+vertex_ok = sort_vertex_polys(
 mesh_in, i, false, edge_types, loop_indices, shared_edges, 
sorted_corners);
 vertex_shared_edges[i] = shared_edges;
   }
   else {
 Array shared_edges(loop_indices.size() - 1);
-sort_vertex_polys(
+vertex_ok = sort_vertex_polys(
 mesh_in, i, true, edge_types, loop_indices, shared_edges, 
sorted_corners);
 vertex_shared_edges[i] = shared_edges;
   }
+  if (!vertex_ok) {
+/* The sorting failed which means that the vertex is non-manifold and 
should be ignored
+ * further on. */
+vertex_types[i] = VertexType::NonManifold;
+continue;
+  }
   vertex_corners[i] = sorted_corners;
 }
   });

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [229d0ace026] blender-v3.1-release: Fix T95532: Merge node deletes everything for empty selections

2022-02-07 Thread Wannes Malfait
Commit: 229d0ace026ffb3591fdad4c5a6e0530c1243025
Author: Wannes Malfait
Date:   Mon Feb 7 16:08:36 2022 -0600
Branches: blender-v3.1-release
https://developer.blender.org/rB229d0ace026ffb3591fdad4c5a6e0530c1243025

Fix T95532: Merge node deletes everything for empty selections

The problem was that nullptr was returned which is a valid value for
Mesh * and hence the returned optional was treated as having some value.
There was no check for point clouds so that was fixed as well.

Differential Revision: https://developer.blender.org/D14026

===

M   source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc 
b/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc
index 3c790079b5b..89227c773cc 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc
@@ -60,7 +60,7 @@ static std::optional mesh_merge_by_distance(const 
MeshComponent _co
 
   const IndexMask selection = evaluator.get_evaluated_as_mask(0);
   if (selection.is_empty()) {
-return nullptr;
+return std::nullopt;
   }
 
   const Mesh  = *mesh_component.get_for_read();
@@ -78,7 +78,9 @@ static void node_geo_exec(GeoNodeExecParams params)
 if (geometry_set.has_pointcloud()) {
   PointCloud *result = pointcloud_merge_by_distance(
   *geometry_set.get_component_for_read(), 
merge_distance, selection);
-  geometry_set.replace_pointcloud(result);
+  if (result) {
+geometry_set.replace_pointcloud(result);
+  }
 }
 if (geometry_set.has_mesh()) {
   std::optional result = mesh_merge_by_distance(

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [e9092110ff1] master: Fix T94144: Duplicate edges in dual mesh node

2021-12-20 Thread Wannes Malfait
Commit: e9092110ff1c647bd9d7b2d92dfaef44ba0b9b96
Author: Wannes Malfait
Date:   Mon Dec 20 13:08:05 2021 -0600
Branches: master
https://developer.blender.org/rBe9092110ff1c647bd9d7b2d92dfaef44ba0b9b96

Fix T94144: Duplicate edges in dual mesh node

The duplicated edges were caused by 'oversubdivided' edges, i.e. edges
where some of the vertices on them are only connected to two polygons.
The fix finds these vertices and 'dissolves' them so that only one edge
is created.

For most 'normal' meshes this shouldn't occurr, or only very little, so
the performance impact of this change should be neglegible. In practice
this is also avoidable by triangulating the mesh first.

Differential Revision: https://developer.blender.org/D13445

===

M   source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc 
b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
index a3bbeca7af3..d1cbaa540d7 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
@@ -537,6 +537,77 @@ static void add_edge(const Mesh ,
   loop_edges.append(new_edge_i);
 }
 
+/* Returns true if the vertex is connected only to the two polygons and is not 
on the boundary. */
+static bool vertex_needs_dissolving(const int vertex,
+const int first_poly_index,
+const int second_poly_index,
+const Span vertex_types,
+const Span> 
vertex_poly_indices)
+{
+  /* Order is guaranteed to be the same because 2poly verts that are not on 
the boundary are
+   * ignored in `sort_vertex_polys`. */
+  return (vertex_types[vertex] != VertexType::Boundary &&
+  vertex_poly_indices[vertex].size() == 2 &&
+  vertex_poly_indices[vertex][0] == first_poly_index &&
+  vertex_poly_indices[vertex][1] == second_poly_index);
+}
+
+/**
+ * Finds 'normal' vertices which are connected to only two polygons and marks 
them to not be
+ * used in the datastructures derived from the mesh. For each pair of polygons 
which has such a
+ * vertex, an edge is created for the dual mesh between the centers of those 
two polygons. All
+ * edges in the input mesh which contain such a vertex are marked as 'done' to 
prevent duplicate
+ * edges being created. (See T94144)
+ */
+static void dissolve_redundant_verts(const Mesh ,
+ const Span> 
vertex_poly_indices,
+ MutableSpan vertex_types,
+ MutableSpan old_to_new_edges_map,
+ Vector _edges,
+ Vector _to_old_edges_map)
+{
+  for (const int vert_i : IndexRange(mesh.totvert)) {
+if (vertex_poly_indices[vert_i].size() != 2 || vertex_types[vert_i] != 
VertexType::Normal) {
+  continue;
+}
+const int first_poly_index = vertex_poly_indices[vert_i][0];
+const int second_poly_index = vertex_poly_indices[vert_i][1];
+const int new_edge_index = new_edges.size();
+bool edge_created = false;
+const MPoly  = mesh.mpoly[first_poly_index];
+for (const MLoop  : Span([poly.loopstart], 
poly.totloop)) {
+  const MEdge  = mesh.medge[loop.e];
+  const int v1 = edge.v1;
+  const int v2 = edge.v2;
+  bool mark_edge = false;
+  if (vertex_needs_dissolving(
+  v1, first_poly_index, second_poly_index, vertex_types, 
vertex_poly_indices)) {
+/* This vertex is now 'removed' and should be ignored elsewhere. */
+vertex_types[v1] = VertexType::Loose;
+mark_edge = true;
+  }
+  if (vertex_needs_dissolving(
+  v2, first_poly_index, second_poly_index, vertex_types, 
vertex_poly_indices)) {
+/* This vertex is now 'removed' and should be ignored elsewhere. */
+vertex_types[v2] = VertexType::Loose;
+mark_edge = true;
+  }
+  if (mark_edge) {
+if (!edge_created) {
+  MEdge new_edge = MEdge(edge);
+  /* The vertex indices in the dual mesh are the polygon indices of 
the input mesh. */
+  new_edge.v1 = first_poly_index;
+  new_edge.v2 = second_poly_index;
+  new_to_old_edges_map.append(loop.e);
+  new_edges.append(new_edge);
+  edge_created = true;
+}
+old_to_new_edges_map[loop.e] = new_edge_index;
+  }
+}
+  }
+}
+
 /**
  * Calculate the barycentric dual of a mesh. The dual is only "dual" in terms 
of connectivity,
  * i.e. applying the function twice will give the same vertices, edges, and 
faces, but not the
@@ -564,6 +635,9 @@ static void calc_dual_mesh(GeometrySet _set,
   Array vertex_typ

[Bf-blender-cvs] [d54a08c8af1] master: Geometry Nodes: Dual Mesh Node

2021-12-01 Thread Wannes Malfait
Commit: d54a08c8af12514a976be8996ebbad64682f54cc
Author: Wannes Malfait
Date:   Wed Dec 1 11:11:50 2021 -0500
Branches: master
https://developer.blender.org/rBd54a08c8af12514a976be8996ebbad64682f54cc

Geometry Nodes: Dual Mesh Node

This node calculates the dual of the input mesh. This means that faces
get replaced with vertices and vertices with faces. In principle this
only makes sense when the mesh in manifold, but there is an option to
keep the (non-manifold) boundaries of the mesh intact.

Attributes are propagated:
 - Point domain goes to face domain and vice versa
 - Edge domain and Face corner domain gets mapped to itself
Because of the duality, when the mesh is manifold, the attributes get
mapped to themselves when applying the node twice.

Thanks to Leul Mulugeta (@Leul) for help with the
ascii diagrams in the code comments.

Note that this does not work well with some non-manifold geometry,
like an edge connected to more than 2 faces, or a vertex connected to
only two faces, while not being in the boundary. This is because there
is no good way to define the dual at some of those points. This type
of non-manifold vertices are just removed for this reason.

Differential Revision: https://developer.blender.org/D12949

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/CMakeLists.txt
A   source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index 76050445023..4880a07115a 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -141,6 +141,7 @@ def mesh_node_items(context):
 yield NodeItem("GeometryNodeLegacySubdivisionSurface", 
poll=geometry_nodes_legacy_poll)
 yield NodeItemCustom(draw=lambda self, layout, context: 
layout.separator())
 
+yield NodeItem("GeometryNodeDualMesh")
 yield NodeItem("GeometryNodeMeshBoolean")
 yield NodeItem("GeometryNodeMeshToCurve")
 yield NodeItem("GeometryNodeMeshToPoints")
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 9f6b413dcaa..ebbc149fceb 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1555,6 +1555,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_INPUT_ID 1134
 #define GEO_NODE_SET_ID 1135
 #define GEO_NODE_ATTRIBUTE_DOMAIN_SIZE 1136
+#define GEO_NODE_DUAL_MESH 1137
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index bf18eb9951b..4178e7577d8 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5891,6 +5891,7 @@ static void registerGeometryNodes()
   register_node_type_geo_curve_trim();
   register_node_type_geo_delete_geometry();
   register_node_type_geo_distribute_points_on_faces();
+  register_node_type_geo_dual_mesh();
   register_node_type_geo_edge_split();
   register_node_type_geo_image_texture();
   register_node_type_geo_input_curve_handles();
diff --git a/source/blender/nodes/NOD_geometry.h 
b/source/blender/nodes/NOD_geometry.h
index dab86350da8..a3d36788ee2 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -95,6 +95,7 @@ void register_node_type_geo_curve_to_points(void);
 void register_node_type_geo_curve_trim(void);
 void register_node_type_geo_delete_geometry(void);
 void register_node_type_geo_distribute_points_on_faces(void);
+void register_node_type_geo_dual_mesh(void);
 void register_node_type_geo_edge_split(void);
 void register_node_type_geo_image_texture(void);
 void register_node_type_geo_input_curve_handles(void);
diff --git a/source/blender/nodes/NOD_static_types.h 
b/source/blender/nodes/NOD_static_types.h
index 05985c4062b..7df670c5397 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -347,6 +347,7 @@ DefNode(GeometryNode, GEO_NODE_CURVE_TO_MESH, 0, 
"CURVE_TO_MESH", CurveToMesh, "
 DefNode(GeometryNode, GEO_NODE_CURVE_TO_POINTS, def_geo_curve_to_points, 
"CURVE_TO_POINTS", CurveToPoints, "Curve to Points", "")
 DefNode(GeometryNode, GEO_NODE_DELETE_GEOMETRY, def_geo_delete_geometry, 
"DELETE_GEOMETRY", DeleteGeometry, "Delete Geometry", "")
 DefNode(GeometryNode, GEO_NODE_DISTRIBUTE_POINTS_ON_FACES, 
def_geo_distribute_points_on_faces, "DISTRIBUTE_POINTS_ON_FACES", 
DistributePointsOnFaces, "D

[Bf-blender-cvs] [5e3877e0c85] master: Fix T92149: Crash in delete geometry node after curve fill node

2021-10-12 Thread Wannes Malfait
Commit: 5e3877e0c8560f27a5cd7b303666b235fb148165
Author: Wannes Malfait
Date:   Tue Oct 12 10:58:38 2021 -0500
Branches: master
https://developer.blender.org/rB5e3877e0c8560f27a5cd7b303666b235fb148165

Fix T92149: Crash in delete geometry node after curve fill node

There was only a check for the component but not for if it was empty.
Because the curve fill node produces an empty curve component, a
nullptr was read, causing a crash. Generally nodes shouldn't produce
empty components, but currently we cannot rely on that fact.

Differential Revision: https://developer.blender.org/D12838

===

M   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc 
b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
index e4f6d3d766e..25f0d355c9e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
@@ -1156,19 +1156,19 @@ void separate_geometry(GeometrySet _set,
bool _is_error)
 {
   bool some_valid_domain = false;
-  if (geometry_set.has()) {
+  if (geometry_set.has_pointcloud()) {
 if (domain == ATTR_DOMAIN_POINT) {
   separate_point_cloud_selection(geometry_set, selection_field, invert);
   some_valid_domain = true;
 }
   }
-  if (geometry_set.has()) {
+  if (geometry_set.has_mesh()) {
 if (domain != ATTR_DOMAIN_CURVE) {
   separate_mesh_selection(geometry_set, selection_field, domain, mode, 
invert);
   some_valid_domain = true;
 }
   }
-  if (geometry_set.has()) {
+  if (geometry_set.has_curve()) {
 if (ELEM(domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CURVE)) {
   separate_curve_selection(geometry_set, selection_field, domain, invert);
   some_valid_domain = true;

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [0c7e836a1da] master: Fix T92150: Incorrect invert in Delete Geometry node

2021-10-12 Thread Wannes Malfait
Commit: 0c7e836a1da0e637187d1d0c2cde9d6d89a6d0df
Author: Wannes Malfait
Date:   Tue Oct 12 10:57:12 2021 -0500
Branches: master
https://developer.blender.org/rB0c7e836a1da0e637187d1d0c2cde9d6d89a6d0df

Fix T92150: Incorrect invert in Delete Geometry node

The selection was inverted when deleting points from a spline.

Differential Revision: https://developer.blender.org/D12840

===

M   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc 
b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
index 33f8c53e343..e4f6d3d766e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
@@ -371,7 +371,7 @@ static std::unique_ptr curve_separate(const 
CurveEval _curve,
 
   indices_to_copy.clear();
   for (const int i_point : IndexRange(spline.size())) {
-if (selection[selection_index] == invert) {
+if (selection[selection_index] != invert) {
   /* Append i_point instead of selection_index because we need indices 
local to the spline
* for copying. */
   indices_to_copy.append(i_point);

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [9c004864511] master: Geometry Nodes: Separate and Delete Geometry for fields

2021-10-11 Thread Wannes Malfait
Commit: 9c004864511f80e48a48a4d8e459d8f05c40f64d
Author: Wannes Malfait
Date:   Mon Oct 11 08:38:02 2021 -0500
Branches: master
https://developer.blender.org/rB9c004864511f80e48a48a4d8e459d8f05c40f64d

Geometry Nodes: Separate and Delete Geometry for fields

Delete Geometry:
This adds a copy of the old node in the legacy folder and updates the
node to work with fields. The invert option is removed, because it is
something that should be very easy with fields, and to be consistent
with other nodes which have a selection. There is also a dropdown to
select the domain, because the domain can't be determined from the
field input. When the domain does not belong on any of the components
an info message is displayed.

Separate Geometry:
A more general version of the old Point Separate node. The "inverted"
output is the same as using the delete geometry node.

Differential Revision: https://developer.blender.org/D12574

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/makesdna/DNA_node_types.h
M   source/blender/makesrna/RNA_enum_items.h
M   source/blender/makesrna/intern/rna_attribute.c
M   source/blender/makesrna/intern/rna_nodetree.c
M   source/blender/nodes/CMakeLists.txt
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/node_geometry_util.hh
M   source/blender/nodes/geometry/nodes/legacy/node_geo_delete_geometry.cc
A   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
A   source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index 155fa59c315..d73fbe5dc76 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -552,9 +552,11 @@ geometry_node_categories = [
 NodeItem("GeometryNodeProximity"),
 NodeItem("GeometryNodeBoundBox"),
 NodeItem("GeometryNodeConvexHull"),
+NodeItem("GeometryNodeDeleteGeometry"),
 NodeItem("GeometryNodeTransform"),
 NodeItem("GeometryNodeJoinGeometry"),
 NodeItem("GeometryNodeSeparateComponents"),
+NodeItem("GeometryNodeSeparateGeometry"),
 NodeItem("GeometryNodeSetPosition"),
 NodeItem("GeometryNodeRealizeInstances"),
 ]),
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 447e0268701..ef9021fd465 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1515,6 +1515,9 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_CURVE_SET_HANDLES 1100
 #define GEO_NODE_POINTS_TO_VOLUME 1101
 #define GEO_NODE_CURVE_HANDLE_TYPE_SELECTION 1102
+#define GEO_NODE_DELETE_GEOMETRY 1103
+#define GEO_NODE_SEPARATE_GEOMETRY 1104
+
 /** \} */
 
 /*  */
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index cad5d4eff41..bff2ed936d9 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5712,6 +5712,7 @@ static void registerGeometryNodes()
   register_node_type_geo_legacy_curve_set_handles();
   register_node_type_geo_legacy_attribute_proximity();
   register_node_type_geo_legacy_attribute_randomize();
+  register_node_type_geo_legacy_delete_geometry();
   register_node_type_geo_legacy_material_assign();
   register_node_type_geo_legacy_points_to_volume();
   register_node_type_geo_legacy_select_by_material();
@@ -5803,6 +5804,7 @@ static void registerGeometryNodes()
   register_node_type_geo_realize_instances();
   register_node_type_geo_sample_texture();
   register_node_type_geo_separate_components();
+  register_node_type_geo_separate_geometry();
   register_node_type_geo_set_position();
   register_node_type_geo_string_join();
   register_node_type_geo_string_to_curves();
diff --git a/source/blender/makesdna/DNA_node_types.h 
b/source/blender/makesdna/DNA_node_types.h
index cbfa4e702ea..52a3755a959 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1538,6 +1538,18 @@ typedef struct NodeGeometryStringToCurves {
   char _pad[1];
 } NodeGeometryStringToCurves;
 
+typedef struct NodeGeometryDeleteGeometry {
+  /* AttributeDomain. */
+  int8_t domain;
+  /* GeometryNodeDeleteGeometryMode. */
+  int8_t mode;
+} NodeGeometryDeleteGeometry;
+
+typedef struct NodeGeometrySeparateGeometry {
+  /* AttributeDomain. */
+  int8_t domain;
+} NodeGeome

[Bf-blender-cvs] [ca4de4ff77c] temp-geometry-nodes-delete-geometry-image-texture: Geometry Nodes: Separate + Delete Geometry for fields

2021-10-07 Thread Wannes Malfait
Commit: ca4de4ff77cef415d0a0861b41742f1b48def774
Author: Wannes Malfait
Date:   Thu Oct 7 11:38:02 2021 +0200
Branches: temp-geometry-nodes-delete-geometry-image-texture
https://developer.blender.org/rBca4de4ff77cef415d0a0861b41742f1b48def774

Geometry Nodes: Separate + Delete Geometry for fields

Delete Geometry:
This adds a copy of the old node in the legacy folder and updates the node to
work with fields. The invert option is removed, because it something that should
be very easy with fields, and to be consistent with other nodes which have a
selection. There is also a dropdown to select the domain, because the domain
can't be determined from the field input. When the domain does not belong on
any of the components an info message is displayed.

{F10416062}

Separate Geometry:
A more general version of the old Point Separate node. The "inverted" output is 
the
same as using the delete geometry node.

{F10518721}

Possible things to change:
- The name of the outputs of the Separate Geometry node
- Add option for "smooth" {D10979} . This is probably best for a dedicated node 
since it only applies to meshes.

Reviewed By: JacquesLucke

Differential Revision: https://developer.blender.org/D12574

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/makesdna/DNA_node_types.h
M   source/blender/makesrna/RNA_enum_items.h
M   source/blender/makesrna/intern/rna_attribute.c
M   source/blender/makesrna/intern/rna_nodetree.c
M   source/blender/nodes/CMakeLists.txt
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/node_geometry_util.hh
M   source/blender/nodes/geometry/nodes/legacy/node_geo_delete_geometry.cc
A   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
A   source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index fab57a85823..908a00ad9be 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -552,9 +552,11 @@ geometry_node_categories = [
 NodeItem("GeometryNodeProximity"),
 NodeItem("GeometryNodeBoundBox"),
 NodeItem("GeometryNodeConvexHull"),
+NodeItem("GeometryNodeDeleteGeometry"),
 NodeItem("GeometryNodeTransform"),
 NodeItem("GeometryNodeJoinGeometry"),
 NodeItem("GeometryNodeSeparateComponents"),
+NodeItem("GeometryNodeSeparateGeometry"),
 NodeItem("GeometryNodeSetPosition"),
 NodeItem("GeometryNodeRealizeInstances"),
 ]),
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 79ae9d71762..025726cabb9 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1515,6 +1515,9 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_CURVE_SET_HANDLES 1100
 #define GEO_NODE_POINTS_TO_VOLUME 1101
 #define GEO_NODE_CURVE_HANDLE_TYPE_SELECTION 1102
+#define GEO_NODE_DELETE_GEOMETRY 1103
+#define GEO_NODE_SEPARATE_GEOMETRY 1104
+
 /** \} */
 
 /*  */
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index 75b9d07ca98..d3eb33b1267 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5712,6 +5712,7 @@ static void registerGeometryNodes()
   register_node_type_geo_legacy_curve_set_handles();
   register_node_type_geo_legacy_attribute_proximity();
   register_node_type_geo_legacy_attribute_randomize();
+  register_node_type_geo_legacy_delete_geometry();
   register_node_type_geo_legacy_material_assign();
   register_node_type_geo_legacy_points_to_volume();
   register_node_type_geo_legacy_select_by_material();
@@ -5803,6 +5804,7 @@ static void registerGeometryNodes()
   register_node_type_geo_realize_instances();
   register_node_type_geo_sample_texture();
   register_node_type_geo_separate_components();
+  register_node_type_geo_separate_geometry();
   register_node_type_geo_set_position();
   register_node_type_geo_string_join();
   register_node_type_geo_string_to_curves();
diff --git a/source/blender/makesdna/DNA_node_types.h 
b/source/blender/makesdna/DNA_node_types.h
index ea87cef1118..732c487e51f 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1538,6 +1538,18 @@ typedef struct NodeGeometryStringToCurves {
   char _pad[1];

[Bf-blender-cvs] [0748444b5c3] temp-geometry-nodes-delete-geometry-image-texture: Geometry Nodes: Separate + Delete Geometry for fields

2021-10-06 Thread Wannes Malfait
Commit: 0748444b5c30a44a551f40fa7c78d5c0a7da1a23
Author: Wannes Malfait
Date:   Wed Oct 6 14:48:18 2021 +0200
Branches: temp-geometry-nodes-delete-geometry-image-texture
https://developer.blender.org/rB0748444b5c30a44a551f40fa7c78d5c0a7da1a23

Geometry Nodes: Separate + Delete Geometry for fields

Delete Geometry:
This adds a copy of the old node in the legacy folder and updates the node to
work with fields. The invert option is removed, because it something that should
be very easy with fields, and to be consistent with other nodes which have a
selection. There is also a dropdown to select the domain, because the domain
can't be determined from the field input. When the domain does not belong on
any of the components an info message is displayed.

{F10416062}

Separate Geometry:
A more general version of the old Point Separate node. The "inverted" output is 
the
same as using the delete geometry node.

{F10518721}

Possible things to change:
- The name of the outputs of the Separate Geometry node
- Add option for "smooth" {D10979} . This is probably best for a dedicated node 
since it only applies to meshes.

Reviewed By: JacquesLucke

Differential Revision: https://developer.blender.org/D12574

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/makesdna/DNA_node_types.h
M   source/blender/makesrna/RNA_enum_items.h
M   source/blender/makesrna/intern/rna_attribute.c
M   source/blender/makesrna/intern/rna_nodetree.c
M   source/blender/nodes/CMakeLists.txt
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/node_geometry_util.hh
M   source/blender/nodes/geometry/nodes/legacy/node_geo_delete_geometry.cc
A   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
A   source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index fab57a85823..908a00ad9be 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -552,9 +552,11 @@ geometry_node_categories = [
 NodeItem("GeometryNodeProximity"),
 NodeItem("GeometryNodeBoundBox"),
 NodeItem("GeometryNodeConvexHull"),
+NodeItem("GeometryNodeDeleteGeometry"),
 NodeItem("GeometryNodeTransform"),
 NodeItem("GeometryNodeJoinGeometry"),
 NodeItem("GeometryNodeSeparateComponents"),
+NodeItem("GeometryNodeSeparateGeometry"),
 NodeItem("GeometryNodeSetPosition"),
 NodeItem("GeometryNodeRealizeInstances"),
 ]),
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 79ae9d71762..025726cabb9 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1515,6 +1515,9 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_CURVE_SET_HANDLES 1100
 #define GEO_NODE_POINTS_TO_VOLUME 1101
 #define GEO_NODE_CURVE_HANDLE_TYPE_SELECTION 1102
+#define GEO_NODE_DELETE_GEOMETRY 1103
+#define GEO_NODE_SEPARATE_GEOMETRY 1104
+
 /** \} */
 
 /*  */
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index 75b9d07ca98..d3eb33b1267 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5712,6 +5712,7 @@ static void registerGeometryNodes()
   register_node_type_geo_legacy_curve_set_handles();
   register_node_type_geo_legacy_attribute_proximity();
   register_node_type_geo_legacy_attribute_randomize();
+  register_node_type_geo_legacy_delete_geometry();
   register_node_type_geo_legacy_material_assign();
   register_node_type_geo_legacy_points_to_volume();
   register_node_type_geo_legacy_select_by_material();
@@ -5803,6 +5804,7 @@ static void registerGeometryNodes()
   register_node_type_geo_realize_instances();
   register_node_type_geo_sample_texture();
   register_node_type_geo_separate_components();
+  register_node_type_geo_separate_geometry();
   register_node_type_geo_set_position();
   register_node_type_geo_string_join();
   register_node_type_geo_string_to_curves();
diff --git a/source/blender/makesdna/DNA_node_types.h 
b/source/blender/makesdna/DNA_node_types.h
index ea87cef1118..732c487e51f 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1538,6 +1538,18 @@ typedef struct NodeGeometryStringToCurves {
   char _pad[1];

[Bf-blender-cvs] [cd692c69546] master: Geometry Nodes: Add labels for switch node texture sockets

2021-08-09 Thread Wannes Malfait
Commit: cd692c6954629e977250ec7c12509ffd3f90bd07
Author: Wannes Malfait
Date:   Mon Aug 9 17:30:44 2021 -0500
Branches: master
https://developer.blender.org/rBcd692c6954629e977250ec7c12509ffd3f90bd07

Geometry Nodes: Add labels for switch node texture sockets

This makes texture sockets have a label by default. This can be changed
by adding the SOCK_HIDE_LABEL flag to the socket. With this change the
switch node now shows the labels "True" and "False" like for the other
types of sockets.

===

M   source/blender/editors/space_node/drawnode.cc
M   source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc

===

diff --git a/source/blender/editors/space_node/drawnode.cc 
b/source/blender/editors/space_node/drawnode.cc
index 95eb1ccc025..b5acdede81b 100644
--- a/source/blender/editors/space_node/drawnode.cc
+++ b/source/blender/editors/space_node/drawnode.cc
@@ -3596,8 +3596,26 @@ static void std_node_socket_draw(
   break;
 }
 case SOCK_TEXTURE: {
-  uiTemplateID(
-  layout, C, ptr, "default_value", "texture.new", nullptr, nullptr, 0, 
ICON_NONE, nullptr);
+  if (text == "") {
+uiTemplateID(layout,
+ C,
+ ptr,
+ "default_value",
+ "texture.new",
+ nullptr,
+ nullptr,
+ 0,
+ ICON_NONE,
+ nullptr);
+  }
+  else {
+/* 0.3 split ratio is inconsistent, but use it here because the "New" 
button is large. */
+uiLayout *row = uiLayoutSplit(layout, 0.3f, false);
+uiItemL(row, text, 0);
+uiTemplateID(
+row, C, ptr, "default_value", "texture.new", nullptr, nullptr, 0, 
ICON_NONE, nullptr);
+  }
+
   break;
 }
 case SOCK_MATERIAL: {
diff --git 
a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc 
b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc
index e0a3f5ad334..5f02061da97 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc
@@ -30,7 +30,7 @@
 
 static bNodeSocketTemplate geo_node_attribute_sample_texture_in[] = {
 {SOCK_GEOMETRY, N_("Geometry")},
-{SOCK_TEXTURE, N_("Texture")},
+{SOCK_TEXTURE, N_("Texture"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 
PROP_NONE, SOCK_HIDE_LABEL},
 {SOCK_STRING, N_("Mapping")},
 {SOCK_STRING, N_("Result")},
 {-1, ""},

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [b304616f2ad] master: Fix T90221: geometry viewer node links to other socket types

2021-07-28 Thread Wannes Malfait
Commit: b304616f2addbba19d1863ea2af73194946df501
Author: Wannes Malfait
Date:   Wed Jul 28 15:48:31 2021 +0200
Branches: master
https://developer.blender.org/rBb304616f2addbba19d1863ea2af73194946df501

Fix T90221: geometry viewer node links to other socket types

The viewer node in geometry node trees only supports geometry nodes.
This patch ensures that when ctrl shift clicking on a node, it will only
link to geometry sockets.

Differential Revision: https://developer.blender.org/D12055

===

M   source/blender/editors/space_node/node_relationships.cc

===

diff --git a/source/blender/editors/space_node/node_relationships.cc 
b/source/blender/editors/space_node/node_relationships.cc
index 61a874b2b2d..c6c3ca27d6e 100644
--- a/source/blender/editors/space_node/node_relationships.cc
+++ b/source/blender/editors/space_node/node_relationships.cc
@@ -664,9 +664,19 @@ static int node_link_viewer(const bContext *C, bNode 
*tonode)
   nodeRemLink(snode->edittree, link);
 
   /* find a socket after the previously connected socket */
-  for (sock = sock->next; sock; sock = sock->next) {
-if (!nodeSocketIsHidden(sock)) {
-  break;
+  if (ED_node_is_geometry(snode)) {
+/* Geometry nodes viewer only supports geometry sockets for now. */
+for (sock = sock->next; sock; sock = sock->next) {
+  if (sock->type == SOCK_GEOMETRY && !nodeSocketIsHidden(sock)) {
+break;
+  }
+}
+  }
+  else {
+for (sock = sock->next; sock; sock = sock->next) {
+  if (!nodeSocketIsHidden(sock)) {
+break;
+  }
 }
   }
 }
@@ -674,19 +684,40 @@ static int node_link_viewer(const bContext *C, bNode 
*tonode)
 
   if (tonode) {
 /* Find a selected socket that overrides the socket to connect to */
-LISTBASE_FOREACH (bNodeSocket *, sock2, >outputs) {
-  if (!nodeSocketIsHidden(sock2) && sock2->flag & SELECT) {
-sock = sock2;
-break;
+if (ED_node_is_geometry(snode)) {
+  /* Geometry nodes viewer only supports geometry sockets for now. */
+  LISTBASE_FOREACH (bNodeSocket *, sock2, >outputs) {
+if (sock2->type == SOCK_GEOMETRY && !nodeSocketIsHidden(sock2) && 
sock2->flag & SELECT) {
+  sock = sock2;
+  break;
+}
+  }
+}
+else {
+  LISTBASE_FOREACH (bNodeSocket *, sock2, >outputs) {
+if (!nodeSocketIsHidden(sock2) && sock2->flag & SELECT) {
+  sock = sock2;
+  break;
+}
   }
 }
   }
 
   /* find a socket starting from the first socket */
   if (!sock) {
-for (sock = (bNodeSocket *)tonode->outputs.first; sock; sock = sock->next) 
{
-  if (!nodeSocketIsHidden(sock)) {
-break;
+if (ED_node_is_geometry(snode)) {
+  /* Geometry nodes viewer only supports geometry sockets for now. */
+  for (sock = (bNodeSocket *)tonode->outputs.first; sock; sock = 
sock->next) {
+if (sock->type == SOCK_GEOMETRY && !nodeSocketIsHidden(sock)) {
+  break;
+}
+  }
+}
+else {
+  for (sock = (bNodeSocket *)tonode->outputs.first; sock; sock = 
sock->next) {
+if (!nodeSocketIsHidden(sock)) {
+  break;
+}
   }
 }
   }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [31fcb934a4c] master: Fix T89415: update multi input indices after deleting a node

2021-07-28 Thread Wannes Malfait
Commit: 31fcb934a4c13563cec9afd41c5a88d50fc845d1
Author: Wannes Malfait
Date:   Wed Jul 28 15:43:24 2021 +0200
Branches: master
https://developer.blender.org/rB31fcb934a4c13563cec9afd41c5a88d50fc845d1

Fix T89415: update multi input indices after deleting a node

When deleting a node, links attached to that node are deleted, but if one
of those links was connected to a multi input socket, the indices of the
other links connected to it were not updated. This adds updates both in
the case of a normal delete as well as after a delete with reconnect.

Differential Revision: https://developer.blender.org/D11716

===

M   source/blender/blenkernel/intern/node.cc

===

diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index e9608457896..9888e23a7bd 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -2504,6 +2504,22 @@ bool nodeLinkIsHidden(const bNodeLink *link)
   return nodeSocketIsHidden(link->fromsock) || 
nodeSocketIsHidden(link->tosock);
 }
 
+/* Adjust the indices of links connected to the given multi input socket after 
deleting the link at
+ * `deleted_index`. This function also works if the link has not yet been 
deleted. */
+static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree,
+  bNodeSocket *sock,
+  int deleted_index)
+{
+  LISTBASE_FOREACH (bNodeLink *, link, >links) {
+/* We only need to adjust those with a greater index, because the others 
will have the same
+ * index. */
+if (link->tosock != sock || link->multi_input_socket_index <= 
deleted_index) {
+  continue;
+}
+link->multi_input_socket_index -= 1;
+  }
+}
+
 void nodeInternalRelink(bNodeTree *ntree, bNode *node)
 {
   /* store link pointers in output sockets, for efficient lookup */
@@ -2537,10 +2553,18 @@ void nodeInternalRelink(bNodeTree *ntree, bNode *node)
   ntree->update |= NTREE_UPDATE_LINKS;
 }
 else {
+  if (link->tosock->flag & SOCK_MULTI_INPUT) {
+adjust_multi_input_indices_after_removed_link(
+ntree, link->tosock, link->multi_input_socket_index);
+  }
   nodeRemLink(ntree, link);
 }
   }
   else {
+if (link->tosock->flag & SOCK_MULTI_INPUT) {
+  adjust_multi_input_indices_after_removed_link(
+  ntree, link->tosock, link->multi_input_socket_index);
+};
 nodeRemLink(ntree, link);
   }
 }
@@ -2991,6 +3015,11 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
 }
 
 if (lb) {
+  /* Only bother adjusting if the socket is not on the node we're 
deleting. */
+  if (link->tonode != node && link->tosock->flag & SOCK_MULTI_INPUT) {
+adjust_multi_input_indices_after_removed_link(
+ntree, link->tosock, link->multi_input_socket_index);
+  }
   LISTBASE_FOREACH (bNodeSocket *, sock, lb) {
 if (link->fromsock == sock || link->tosock == sock) {
   nodeRemLink(ntree, link);

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [464797078d4] master: Geometry Nodes: Add Delete Geometry Node

2021-06-01 Thread Wannes Malfait
Commit: 464797078d44a55b45560f561b20a546ce46bcd7
Author: Wannes Malfait
Date:   Tue Jun 1 17:32:03 2021 -0400
Branches: master
https://developer.blender.org/rB464797078d44a55b45560f561b20a546ce46bcd7

Geometry Nodes: Add Delete Geometry Node

This node is similar to the mask modifier, but it deletes the elements
of the geometry corresponding to the selection, which is retrieved as
a boolean attribute. The node currently supports both mesh and point
cloud data. For meshes, which elements are deleted depends on the
domain of the input selection attribute, just like how behavior depends
on the selection mode in mesh edit mode.

In the future this node will support curve data, and ideally volume
data in some way.

Differential Revision: https://developer.blender.org/D10748

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/modifiers/intern/MOD_mask.cc
M   source/blender/nodes/CMakeLists.txt
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
M   source/blender/nodes/geometry/node_geometry_util.hh
A   source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
M   source/blender/nodes/geometry/nodes/node_geo_point_separate.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index 05c7ef756c7..d4c21bf5a23 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -507,6 +507,7 @@ geometry_node_categories = [
 ]),
 GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=[
 NodeItem("GeometryNodeBoundBox"),
+NodeItem("GeometryNodeDeleteGeometry"),
 NodeItem("GeometryNodeTransform"),
 NodeItem("GeometryNodeJoinGeometry"),
 ]),
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index fb6647cb68d..00111910d66 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1430,6 +1430,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_INPUT_MATERIAL 1050
 #define GEO_NODE_MATERIAL_REPLACE 1051
 #define GEO_NODE_MESH_TO_CURVE 1052
+#define GEO_NODE_DELETE_GEOMETRY 1053
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index d0864e85373..0923917aa55 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5052,6 +5052,7 @@ static void registerGeometryNodes()
   register_node_type_geo_collection_info();
   register_node_type_geo_curve_to_mesh();
   register_node_type_geo_curve_resample();
+  register_node_type_geo_delete_geometry();
   register_node_type_geo_edge_split();
   register_node_type_geo_input_material();
   register_node_type_geo_is_viewport();
diff --git a/source/blender/modifiers/intern/MOD_mask.cc 
b/source/blender/modifiers/intern/MOD_mask.cc
index 812bfe3b375..a77f6cfe8ba 100644
--- a/source/blender/modifiers/intern/MOD_mask.cc
+++ b/source/blender/modifiers/intern/MOD_mask.cc
@@ -69,6 +69,19 @@ using blender::MutableSpan;
 using blender::Span;
 using blender::Vector;
 
+/* For delete geometry node. */
+void copy_masked_vertices_to_new_mesh(const Mesh _mesh, Mesh _mesh, 
Span vertex_map);
+void copy_masked_edges_to_new_mesh(const Mesh _mesh,
+   Mesh _mesh,
+   Span vertex_map,
+   Span edge_map);
+void copy_masked_polys_to_new_mesh(const Mesh _mesh,
+   Mesh _mesh,
+   Span vertex_map,
+   Span edge_map,
+   Span masked_poly_indices,
+   Span new_loop_starts);
+
 static void initData(ModifierData *md)
 {
   MaskModifierData *mmd = (MaskModifierData *)md;
@@ -237,9 +250,7 @@ static void computed_masked_polygons(const Mesh *mesh,
   *r_num_masked_loops = num_masked_loops;
 }
 
-static void copy_masked_vertices_to_new_mesh(const Mesh _mesh,
- Mesh _mesh,
- Span vertex_map)
+void copy_masked_vertices_to_new_mesh(const Mesh _mesh, Mesh _mesh, 
Span vertex_map)
 {
   BLI_assert(src_mesh.totvert == vertex_map.size());
   for (const int i_src : vertex_map.index_range()) {
@@ -256,10 +267,10 @@ static void copy_masked_vertices_to_new_mesh(const Mesh 
_mesh,
   }
 }
 
-static void copy_masked_edges_to_new_mesh(const Mesh _mesh,
-  Mesh _mesh,
-  Span vertex_map,
-  

[Bf-blender-cvs] [ba698f08127] master: Geometry Nodes: update callbacks with 2 new socket types

2021-05-17 Thread Wannes Malfait
Commit: ba698f081270f807820a63355a3c7bb83f5f5a38
Author: Wannes Malfait
Date:   Mon May 17 11:11:25 2021 +0200
Branches: master
https://developer.blender.org/rBba698f081270f807820a63355a3c7bb83f5f5a38

Geometry Nodes: update callbacks with 2 new socket types

===

M   source/blender/nodes/geometry/node_geometry_tree.cc

===

diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc 
b/source/blender/nodes/geometry/node_geometry_tree.cc
index f13ddabbf2c..f4cd00b88ed 100644
--- a/source/blender/nodes/geometry/node_geometry_tree.cc
+++ b/source/blender/nodes/geometry/node_geometry_tree.cc
@@ -86,12 +86,13 @@ static void foreach_nodeclass(Scene *UNUSED(scene), void 
*calldata, bNodeClassCa
 
 static bool geometry_node_tree_validate_link(bNodeTree *UNUSED(ntree), 
bNodeLink *link)
 {
-  /* Geometry, string, object and collection sockets can only be connected to 
themselves. */
-  if (ELEM(link->fromsock->type, SOCK_GEOMETRY, SOCK_STRING, SOCK_OBJECT, 
SOCK_COLLECTION) ||
-  ELEM(link->tosock->type, SOCK_GEOMETRY, SOCK_STRING, SOCK_OBJECT, 
SOCK_COLLECTION)) {
-return (link->tosock->type == link->fromsock->type);
+  /* Geometry, string, object, material, texture and collection sockets can 
only be connected to
+   * themselves. The other types can be converted between each other. */
+  if (ELEM(link->fromsock->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, 
SOCK_BOOLEAN, SOCK_INT) &&
+  ELEM(link->tosock->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, 
SOCK_BOOLEAN, SOCK_INT)) {
+return true;
   }
-  return true;
+  return (link->tosock->type == link->fromsock->type);
 }
 
 static bool geometry_node_tree_socket_type_valid(eNodeSocketDatatype 
socket_type,
@@ -106,7 +107,9 @@ static bool 
geometry_node_tree_socket_type_valid(eNodeSocketDatatype socket_type
   SOCK_STRING,
   SOCK_OBJECT,
   SOCK_GEOMETRY,
-  SOCK_COLLECTION);
+  SOCK_COLLECTION,
+  SOCK_TEXTURE,
+  SOCK_MATERIAL);
 }
 
 void register_node_tree_type_geo(void)

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [65244ac1c3f] master: Geometry Nodes: Link error when implicit conversion isn't possible

2021-05-11 Thread Wannes Malfait
Commit: 65244ac1c3f13802852d5ca2e340b85cc3e94c7a
Author: Wannes Malfait
Date:   Tue May 11 16:46:02 2021 -0500
Branches: master
https://developer.blender.org/rB65244ac1c3f13802852d5ca2e340b85cc3e94c7a

Geometry Nodes: Link error when implicit conversion isn't possible

This turns links red if no implicit conversion can be made between the
from socket and the to socket. For geometry nodes this happens with
object, geometry, collection, and string sockets that are connected to
a different type. The change is simply implementing a callback that is
already implemented for other node tree types.

Differential Revision: https://developer.blender.org/D11229

===

M   source/blender/nodes/geometry/node_geometry_tree.cc

===

diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc 
b/source/blender/nodes/geometry/node_geometry_tree.cc
index afb86ff57b8..f13ddabbf2c 100644
--- a/source/blender/nodes/geometry/node_geometry_tree.cc
+++ b/source/blender/nodes/geometry/node_geometry_tree.cc
@@ -84,6 +84,16 @@ static void foreach_nodeclass(Scene *UNUSED(scene), void 
*calldata, bNodeClassCa
   func(calldata, NODE_CLASS_LAYOUT, N_("Layout"));
 }
 
+static bool geometry_node_tree_validate_link(bNodeTree *UNUSED(ntree), 
bNodeLink *link)
+{
+  /* Geometry, string, object and collection sockets can only be connected to 
themselves. */
+  if (ELEM(link->fromsock->type, SOCK_GEOMETRY, SOCK_STRING, SOCK_OBJECT, 
SOCK_COLLECTION) ||
+  ELEM(link->tosock->type, SOCK_GEOMETRY, SOCK_STRING, SOCK_OBJECT, 
SOCK_COLLECTION)) {
+return (link->tosock->type == link->fromsock->type);
+  }
+  return true;
+}
+
 static bool geometry_node_tree_socket_type_valid(eNodeSocketDatatype 
socket_type,
  bNodeTreeType 
*UNUSED(ntreetype))
 {
@@ -113,6 +123,7 @@ void register_node_tree_type_geo(void)
   tt->get_from_context = geometry_node_tree_get_from_context;
   tt->foreach_nodeclass = foreach_nodeclass;
   tt->valid_socket_type = geometry_node_tree_socket_type_valid;
+  tt->validate_link = geometry_node_tree_validate_link;
 
   ntreeTypeAdd(tt);
 }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [ec0a3ff4568] blender-v2.83-release: Fix build error: use of unintialized variable

2021-05-06 Thread Wannes Malfait
Commit: ec0a3ff4568a918b3cc86ff845347d552087e726
Author: Wannes Malfait
Date:   Thu Apr 29 14:48:21 2021 +0530
Branches: blender-v2.83-release
https://developer.blender.org/rBec0a3ff4568a918b3cc86ff845347d552087e726

Fix build error: use of unintialized variable

Differential Revision: https://developer.blender.org/D5

===

M   source/blender/bmesh/tools/bmesh_bisect_plane.c

===

diff --git a/source/blender/bmesh/tools/bmesh_bisect_plane.c 
b/source/blender/bmesh/tools/bmesh_bisect_plane.c
index 12517cc930d..a0698517ce8 100644
--- a/source/blender/bmesh/tools/bmesh_bisect_plane.c
+++ b/source/blender/bmesh/tools/bmesh_bisect_plane.c
@@ -212,7 +212,7 @@ static void bm_face_bisect_verts(
 }
 else {
 
-  uint i;
+  uint i = 0;
 
   /*  */
   /* Check contiguous spans of centered vertices (skipping when 
necessary). */

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [47aca2b4c40] master: Nodes: Add a callback to check for valid socket type

2021-04-29 Thread Wannes Malfait
Commit: 47aca2b4c402ec35ea52c18afcc0840bcf283b26
Author: Wannes Malfait
Date:   Thu Apr 29 23:36:46 2021 -0500
Branches: master
https://developer.blender.org/rB47aca2b4c402ec35ea52c18afcc0840bcf283b26

Nodes: Add a callback to check for valid socket type

This adds a callback to bNodeTreeType to check which socket types are
valid for the tree type. Function has been implemented for the normal
tree types, and can be implemented for custom node trees with python,
by adding a `classmethod` to the tree. However, only builtin socket
types are supported.

This is relevant for T87049, but it also has the advantage that it is
now clear which node trees support which sockets. Previously this
was assumed to be known by all developers.

Differential Revision: https://developer.blender.org/D10938

===

M   source/blender/blenkernel/BKE_node.h
M   source/blender/makesrna/intern/rna_nodetree.c
M   source/blender/nodes/composite/node_composite_tree.c
M   source/blender/nodes/geometry/node_geometry_tree.cc
M   source/blender/nodes/shader/node_shader_tree.c
M   source/blender/nodes/texture/node_texture_tree.c

===

diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index b913e76836c..819c148f0ad 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -410,6 +410,9 @@ typedef struct bNodeTreeType {
 
   void (*node_add_init)(struct bNodeTree *ntree, struct bNode *bnode);
 
+  /* Check if the socket type is valid for this tree type. */
+  bool (*valid_socket_type)(enum eNodeSocketDatatype socket_type, struct 
bNodeTreeType *ntreetype);
+
   /* RNA integration */
   ExtensionRNA rna_ext;
 } bNodeTreeType;
diff --git a/source/blender/makesrna/intern/rna_nodetree.c 
b/source/blender/makesrna/intern/rna_nodetree.c
index a738084dbcd..3b81b591f6d 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -971,6 +971,32 @@ static void rna_NodeTree_get_from_context(
   RNA_parameter_list_free();
 }
 
+static bool rna_NodeTree_valid_socket_type(eNodeSocketDatatype socket_type,
+   bNodeTreeType *ntreetype)
+{
+  extern FunctionRNA rna_NodeTree_valid_socket_type_func;
+
+  PointerRNA ptr;
+  ParameterList list;
+  FunctionRNA *func;
+  void *ret;
+  bool valid;
+
+  RNA_pointer_create(NULL, ntreetype->rna_ext.srna, NULL, ); /* dummy */
+  func = _NodeTree_valid_socket_type_func;
+
+  RNA_parameter_list_create(, , func);
+  RNA_parameter_set_lookup(, "type", _type);
+  ntreetype->rna_ext.call(NULL, , func, );
+
+  RNA_parameter_get_lookup(, "valid", );
+  valid = *(bool *)ret;
+
+  RNA_parameter_list_free();
+
+  return valid;
+}
+
 static void rna_NodeTree_unregister(Main *UNUSED(bmain), StructRNA *type)
 {
   bNodeTreeType *nt = RNA_struct_blender_type_get(type);
@@ -999,7 +1025,7 @@ static StructRNA *rna_NodeTree_register(Main *bmain,
   bNodeTreeType *nt, dummynt;
   bNodeTree dummyntree;
   PointerRNA dummyptr;
-  int have_function[3];
+  int have_function[4];
 
   /* setup dummy tree & tree type to store static properties in */
   memset(, 0, sizeof(bNodeTreeType));
@@ -1045,6 +1071,7 @@ static StructRNA *rna_NodeTree_register(Main *bmain,
   nt->poll = (have_function[0]) ? rna_NodeTree_poll : NULL;
   nt->update = (have_function[1]) ? rna_NodeTree_update_reg : NULL;
   nt->get_from_context = (have_function[2]) ? rna_NodeTree_get_from_context : 
NULL;
+  nt->valid_socket_type = (have_function[3]) ? rna_NodeTree_valid_socket_type 
: NULL;
 
   ntreeTypeAdd(nt);
 
@@ -11414,6 +11441,14 @@ static void rna_def_nodetree(BlenderRNA *brna)
   parm = RNA_def_pointer(
   func, "result_3", "ID", "From ID", "Original ID data-block selected from 
the context");
   RNA_def_function_output(func, parm);
+
+  /* Check for support of a socket type. */
+  func = RNA_def_function(srna, "valid_socket_type", NULL);
+  RNA_def_function_ui_description(func, "Check if the socket type is valid for 
the node tree");
+  RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
+  parm = RNA_def_enum(func, "type", node_socket_type_items, 0, "", "");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  RNA_def_function_return(func, RNA_def_boolean(func, "valid", false, "", ""));
 }
 
 static void rna_def_composite_nodetree(BlenderRNA *brna)
diff --git a/source/blender/nodes/composite/node_composite_tree.c 
b/source/blender/nodes/composite/node_composite_tree.c
index 085b5c463b9..19815d01278 100644
--- a/source/blender/nodes/composite/node_composite_tree.c
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -205,6 +205,12 @@ static void 

[Bf-blender-cvs] [8c73f44a019] blender-v2.93-release: Fix build error: use of unintialized variable

2021-04-29 Thread Wannes Malfait
Commit: 8c73f44a019cd087436184484d7200a8f709a6e1
Author: Wannes Malfait
Date:   Thu Apr 29 14:48:21 2021 +0530
Branches: blender-v2.93-release
https://developer.blender.org/rB8c73f44a019cd087436184484d7200a8f709a6e1

Fix build error: use of unintialized variable

Differential Revision: https://developer.blender.org/D5

===

M   source/blender/bmesh/tools/bmesh_bisect_plane.c

===

diff --git a/source/blender/bmesh/tools/bmesh_bisect_plane.c 
b/source/blender/bmesh/tools/bmesh_bisect_plane.c
index 40ac6c0348c..f840a3770ff 100644
--- a/source/blender/bmesh/tools/bmesh_bisect_plane.c
+++ b/source/blender/bmesh/tools/bmesh_bisect_plane.c
@@ -208,7 +208,7 @@ static void bm_face_bisect_verts(
 }
 else {
 
-  uint i;
+  uint i = 0;
 
   /*  */
   /* Check contiguous spans of centered vertices (skipping when 
necessary). */

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [f903e3a3fd0] master: Fix build error: use of unintialized variable

2021-04-29 Thread Wannes Malfait
Commit: f903e3a3fd003e5295f7aea35710a77b2e74f846
Author: Wannes Malfait
Date:   Thu Apr 29 14:48:21 2021 +0530
Branches: master
https://developer.blender.org/rBf903e3a3fd003e5295f7aea35710a77b2e74f846

Fix build error: use of unintialized variable

Differential Revision: https://developer.blender.org/D5

===

M   source/blender/bmesh/tools/bmesh_bisect_plane.c

===

diff --git a/source/blender/bmesh/tools/bmesh_bisect_plane.c 
b/source/blender/bmesh/tools/bmesh_bisect_plane.c
index 40ac6c0348c..f840a3770ff 100644
--- a/source/blender/bmesh/tools/bmesh_bisect_plane.c
+++ b/source/blender/bmesh/tools/bmesh_bisect_plane.c
@@ -208,7 +208,7 @@ static void bm_face_bisect_verts(
 }
 else {
 
-  uint i;
+  uint i = 0;
 
   /*  */
   /* Check contiguous spans of centered vertices (skipping when 
necessary). */

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [58818cba407] blender-v2.93-release: Fix T87359: set group output in geometry node tree update callback

2021-04-16 Thread Wannes Malfait
Commit: 58818cba40794905f9323080e60884e090f2d388
Author: Wannes Malfait
Date:   Fri Apr 16 11:37:49 2021 +0200
Branches: blender-v2.93-release
https://developer.blender.org/rB58818cba40794905f9323080e60884e090f2d388

Fix T87359: set group output in geometry node tree update callback

This also fixes T85511.

Differential Revision: https://developer.blender.org/D10970

===

M   source/blender/nodes/geometry/node_geometry_tree.cc

===

diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc 
b/source/blender/nodes/geometry/node_geometry_tree.cc
index 2c4c7da64cc..6d3b1d55005 100644
--- a/source/blender/nodes/geometry/node_geometry_tree.cc
+++ b/source/blender/nodes/geometry/node_geometry_tree.cc
@@ -67,6 +67,8 @@ static void geometry_node_tree_get_from_context(const 
bContext *C,
 
 static void geometry_node_tree_update(bNodeTree *ntree)
 {
+  ntreeSetOutput(ntree);
+
   /* Needed to give correct types to reroutes. */
   ntree_update_reroute_nodes(ntree);
 }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [93114180d71] master: Geometry Nodes: Use distance units for socket values

2021-04-06 Thread Wannes Malfait
Commit: 93114180d71a7160954c30efba3012294c39c93b
Author: Wannes Malfait
Date:   Tue Apr 6 12:02:28 2021 -0500
Branches: master
https://developer.blender.org/rB93114180d71a7160954c30efba3012294c39c93b

Geometry Nodes: Use distance units for socket values

This adds the property subtybe `PROP_DISTANCE` where appropriate.

Differential Revision: https://developer.blender.org/D10900

===

M   source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
M   source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
M   source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc

===

diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc 
b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
index 1e1f5e9d085..8f0708c9263 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -44,7 +44,7 @@ using blender::bke::GeometryInstanceGroup;
 
 static bNodeSocketTemplate geo_node_point_distribute_in[] = {
 {SOCK_GEOMETRY, N_("Geometry")},
-{SOCK_FLOAT, N_("Distance Min"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f, 
PROP_NONE},
+{SOCK_FLOAT, N_("Distance Min"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f, 
PROP_DISTANCE},
 {SOCK_FLOAT, N_("Density Max"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f, 
PROP_NONE},
 {SOCK_STRING, N_("Density Attribute")},
 {SOCK_INT, N_("Seed"), 0, 0, 0, 0, -1, 1},
diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc 
b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
index eb441a0a568..a9eb136597e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
@@ -31,7 +31,7 @@
 static bNodeSocketTemplate geo_node_points_to_volume_in[] = {
 {SOCK_GEOMETRY, N_("Geometry")},
 {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
-{SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX},
+{SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX, 
PROP_DISTANCE},
 {SOCK_FLOAT, N_("Voxel Amount"), 64.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
 {SOCK_STRING, N_("Radius")},
 {SOCK_FLOAT, N_("Radius"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc 
b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
index 1c0e7106b19..348ad453ddc 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
@@ -37,7 +37,7 @@
 static bNodeSocketTemplate geo_node_volume_to_mesh_in[] = {
 {SOCK_GEOMETRY, N_("Geometry")},
 {SOCK_STRING, N_("Density")},
-{SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX},
+{SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX, 
PROP_DISTANCE},
 {SOCK_FLOAT, N_("Voxel Amount"), 64.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
 {SOCK_FLOAT, N_("Threshold"), 0.1f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
 {SOCK_FLOAT, N_("Adaptivity"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 
PROP_FACTOR},

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [6ddd280b210] master: Nodes: Expose multi input socket in python API

2021-03-30 Thread Wannes Malfait
Commit: 6ddd280b21025cdce981f64cabae35348804b95c
Author: Wannes Malfait
Date:   Tue Mar 30 10:15:23 2021 -0500
Branches: master
https://developer.blender.org/rB6ddd280b21025cdce981f64cabae35348804b95c

Nodes: Expose multi input socket in python API

It was not possible to determine if a socket was multi input previously
with BPY. This patch exposes the flag as a read-only property of a node
socket. This is important for addons which automatically add connections
between nodes.

Differential Revision: https://developer.blender.org/D10847

===

M   source/blender/makesrna/intern/rna_nodetree.c

===

diff --git a/source/blender/makesrna/intern/rna_nodetree.c 
b/source/blender/makesrna/intern/rna_nodetree.c
index 32b75243537..277cfada44d 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -9697,6 +9697,12 @@ static void rna_def_node_socket(BlenderRNA *brna)
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
   RNA_def_property_ui_text(prop, "Linked", "True if the socket is connected");
 
+  prop = RNA_def_property(srna, "is_multi_input", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "flag", SOCK_MULTI_INPUT);
+  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_ui_text(
+  prop, "Multi Input", "True if the socket can accept multiple ordered 
input links");
+
   prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SOCK_COLLAPSED);

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [2a4bde04c5e] master: Fix T86655: remove doubled transforms

2021-03-17 Thread Wannes Malfait
Commit: 2a4bde04c5e62d979b60556b882002b87c5ea5f4
Author: Wannes Malfait
Date:   Wed Mar 17 12:23:17 2021 +0100
Branches: master
https://developer.blender.org/rB2a4bde04c5e62d979b60556b882002b87c5ea5f4

Fix T86655: remove doubled transforms

Differential Revision: https://developer.blender.org/D10744

===

M   source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc

===

diff --git 
a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc 
b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
index 9137be064de..e0fdce361d5 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
@@ -82,8 +82,6 @@ static void 
geo_node_mesh_primitive_cylinder_exec(GeoNodeExecParams params)
   Mesh *mesh = create_cylinder_or_cone_mesh(
   location, rotation, radius, radius, depth, verts_num, fill_type);
 
-  transform_mesh(mesh, location, rotation, float3(1));
-
   params.set_output("Geometry", GeometrySet::create_with_mesh(mesh));
 }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [359d0029fe7] master: Fix T85763: Align Rotation to Vector node fails for collinear vectors

2021-02-19 Thread Wannes Malfait
Commit: 359d0029fe7601163c449730d42f12d84163fcd8
Author: Wannes Malfait
Date:   Fri Feb 19 11:37:15 2021 +0100
Branches: master
https://developer.blender.org/rB359d0029fe7601163c449730d42f12d84163fcd8

Fix T85763: Align Rotation to Vector node fails for collinear vectors

If the axes are aligned in auto pivot mode then the rotation axis would be 
(0,0,0).
We now fall back to the x axis in this case. If that fails, we fall back to the 
y axis.

Differential Revision: https://developer.blender.org/D10466

===

M   source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc

===

diff --git 
a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc 
b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
index a81adbbd754..3da447af98a 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
@@ -65,7 +65,15 @@ static void align_rotations_auto_pivot(const 
Float3ReadAttribute ,
 mul_v3_m3v3(old_axis, old_rotation, local_main_axis);
 
 const float3 new_axis = vector.normalized();
-const float3 rotation_axis = float3::cross_high_precision(old_axis, 
new_axis);
+float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis);
+if (is_zero_v3(rotation_axis)) {
+  /* The vectors are linearly dependent, so we fall back to another axis. 
*/
+  rotation_axis = float3::cross_high_precision(old_axis, float3(1, 0, 0));
+  if (is_zero_v3(rotation_axis))
+/* This is now guaranteed to not be zero. */
+rotation_axis = float3::cross_high_precision(old_axis, float3(0, 1, 
0));
+}
+
 const float full_angle = angle_normalized_v3v3(old_axis, new_axis);
 const float angle = factors[i] * full_angle;

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [a2ba37e5b63] master: Geometry Nodes: Add Combine and Separate XYZ nodes for attributes

2021-02-09 Thread Wannes Malfait
Commit: a2ba37e5b6310bed0d4381619a8edeae2d05fbd2
Author: Wannes Malfait
Date:   Tue Feb 9 11:12:24 2021 -0600
Branches: master
https://developer.blender.org/rBa2ba37e5b6310bed0d4381619a8edeae2d05fbd2

Geometry Nodes: Add Combine and Separate XYZ nodes for attributes

These are similar to the regular "Combine XYZ" and "Separate XYZ" nodes,
but they work on attributes. They will make it easier to switch between
vector attributes and float attributes.

Differential Revision: https://developer.blender.org/D10308

===

M   release/scripts/startup/nodeitems_builtins.py
M   source/blender/blenkernel/BKE_node.h
M   source/blender/blenkernel/intern/node.cc
M   source/blender/makesdna/DNA_node_types.h
M   source/blender/makesrna/intern/rna_nodetree.c
M   source/blender/nodes/CMakeLists.txt
M   source/blender/nodes/NOD_geometry.h
M   source/blender/nodes/NOD_static_types.h
A   source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc
A   source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc

===

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index 40b57fd10de..9d7485a0837 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -491,6 +491,8 @@ geometry_node_categories = [
 NodeItem("GeometryNodeAttributeColorRamp"),
 NodeItem("GeometryNodeAttributeVectorMath"),
 NodeItem("GeometryNodeAttributeSampleTexture"),
+NodeItem("GeometryNodeAttributeCombineXYZ"),
+NodeItem("GeometryNodeAttributeSeparateXYZ"),
 ]),
 GeometryNodeCategory("GEO_COLOR", "Color", items=[
 NodeItem("ShaderNodeValToRGB"),
diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index f4f753c4084..7984bbc980a 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1370,6 +1370,8 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_IS_VIEWPORT 1024
 #define GEO_NODE_ATTRIBUTE_PROXIMITY 1025
 #define GEO_NODE_VOLUME_TO_MESH 1026
+#define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027
+#define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc 
b/source/blender/blenkernel/intern/node.cc
index a4440d3d9f3..ed8dd84a9bb 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -4753,12 +4753,14 @@ static void registerGeometryNodes()
 
   register_node_type_geo_align_rotation_to_vector();
   register_node_type_geo_attribute_color_ramp();
+  register_node_type_geo_attribute_combine_xyz();
   register_node_type_geo_attribute_compare();
   register_node_type_geo_attribute_fill();
   register_node_type_geo_attribute_math();
   register_node_type_geo_attribute_mix();
   register_node_type_geo_attribute_proximity();
   register_node_type_geo_attribute_randomize();
+  register_node_type_geo_attribute_separate_xyz();
   register_node_type_geo_attribute_vector_math();
   register_node_type_geo_boolean();
   register_node_type_geo_collection_info();
diff --git a/source/blender/makesdna/DNA_node_types.h 
b/source/blender/makesdna/DNA_node_types.h
index e8748e28776..61b0b469426 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1216,6 +1216,20 @@ typedef struct NodeGeometryVolumeToMesh {
   char _pad[7];
 } NodeGeometryVolumeToMesh;
 
+typedef struct NodeAttributeCombineXYZ {
+  /* GeometryNodeAttributeInputMode. */
+  uint8_t input_type_x;
+  uint8_t input_type_y;
+  uint8_t input_type_z;
+
+  char _pad[1];
+} NodeAttributeCombineXYZ;
+
+typedef struct NodeAttributeSeparateXYZ {
+  /* GeometryNodeAttributeInputMode. */
+  uint8_t input_type;
+} NodeAttributeSeparateXYZ;
+
 /* script node mode */
 #define NODE_SCRIPT_INTERNAL 0
 #define NODE_SCRIPT_EXTERNAL 1
diff --git a/source/blender/makesrna/intern/rna_nodetree.c 
b/source/blender/makesrna/intern/rna_nodetree.c
index c67a3e4448b..c00f843c76e 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -9029,6 +9029,39 @@ static void def_geo_volume_to_mesh(StructRNA *srna)
   prop = RNA_def_property(srna, "resolution_mode", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_items(prop, resolution_mode_items);
   RNA_def_property_ui_text(prop, "Resolution Mode", "How the voxel size is 
specified");
+}
+
+static void def_geo_attribute_combine_xyz(StructRNA *srna)
+{
+  PropertyRNA *prop;
+
+  RNA_def_struct_sdna_from(srna, "NodeAttributeCombineXYZ", "storage");
+
+  prop = RNA_def_property(srna, "input_type_x", P

[Bf-blender-cvs] [6fb7d0f5592] blender-v2.92-release: Fix T84713: Geometry nodes reroute sockets have incorrect type

2021-01-16 Thread Wannes Malfait
Commit: 6fb7d0f5592793196c8100ef6cdbdf99ed695952
Author: Wannes Malfait
Date:   Sat Jan 16 13:09:19 2021 -0600
Branches: blender-v2.92-release
https://developer.blender.org/rB6fb7d0f5592793196c8100ef6cdbdf99ed695952

Fix T84713: Geometry nodes reroute sockets have incorrect type

This implements the node tree update function, which is needed so that the
reroutes get updated to the correct type. It is based on the same code in
the shader and compositor node trees.

Differential Revision: https://developer.blender.org/D10123

===

M   source/blender/nodes/geometry/node_geometry_tree.cc

===

diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc 
b/source/blender/nodes/geometry/node_geometry_tree.cc
index da77e8896fb..87178c52ab9 100644
--- a/source/blender/nodes/geometry/node_geometry_tree.cc
+++ b/source/blender/nodes/geometry/node_geometry_tree.cc
@@ -32,6 +32,8 @@
 
 #include "RNA_access.h"
 
+#include "node_common.h"
+
 bNodeTreeType *ntreeType_Geometry;
 
 static void geometry_node_tree_get_from_context(const bContext *C,
@@ -63,6 +65,12 @@ static void geometry_node_tree_get_from_context(const 
bContext *C,
   }
 }
 
+static void geometry_node_tree_update(bNodeTree *ntree)
+{
+  /* Needed to give correct types to reroutes. */
+  ntree_update_reroute_nodes(ntree);
+}
+
 void register_node_tree_type_geo(void)
 {
   bNodeTreeType *tt = ntreeType_Geometry = static_cast(
@@ -73,7 +81,7 @@ void register_node_tree_type_geo(void)
   tt->ui_icon = 0; /* defined in drawnode.c */
   strcpy(tt->ui_description, N_("Geometry nodes"));
   tt->rna_ext.srna = _GeometryNodeTree;
-
+  tt->update = geometry_node_tree_update;
   tt->get_from_context = geometry_node_tree_get_from_context;
 
   ntreeTypeAdd(tt);

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs