Skip to content

Commit

Permalink
SvRecursiveNode mixin (#3954)
Browse files Browse the repository at this point in the history
* Recursive Nodes Mixin

* Calculate Normals Recursived

* Vector Polar Out Recursived

* Calculate Normals Recursived 2

* Merge by Distance Recursived

* Normals bugfix

* Mesh Join (Mk2) Recursived

* docs updating

* extracting logic from node
  • Loading branch information
vicdoval authored Mar 6, 2021
1 parent 120ee53 commit 8183d4d
Show file tree
Hide file tree
Showing 17 changed files with 1,538 additions and 1,023 deletions.
31 changes: 30 additions & 1 deletion core/sockets.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class SvSocketProcessing():
# for input sockets, if the node knows it can handle simplified data.
# For outputs, these properties are not used.
allow_flatten : BoolProperty(default = False)
allow_flatten_topology : BoolProperty(default = False)
allow_simplify : BoolProperty(default = False)
allow_graft : BoolProperty(default = False)
allow_unwrap : BoolProperty(default = False)
Expand Down Expand Up @@ -193,6 +194,10 @@ def update_simplify_flag(self, context):

process_from_socket(self, context)

use_flatten_topology : BoolProperty(
name = "Flatten Topology",
default = False,
update = process_from_socket)
# Only one of properties can be set to true: use_flatten or use_simplfy
use_flatten : BoolProperty(
name = "Flatten",
Expand All @@ -208,6 +213,8 @@ def get_mode_flags(self):
flags = []
if self.use_flatten:
flags.append('F')
if self.use_flatten_topology:
flags.append('FT')
if self.use_simplify:
flags.append('S')
if self.use_graft:
Expand All @@ -221,6 +228,9 @@ def get_mode_flags(self):
def can_flatten(self):
return hasattr(self, 'do_flatten') and (self.allow_flatten or self.is_output)

def can_flatten_topology(self):
return hasattr(self, 'do_flat_topology') and (self.allow_flatten_topology or self.is_output)

def can_simplify(self):
return hasattr(self, 'do_simplify') and (self.allow_simplify or self.is_output)

Expand Down Expand Up @@ -255,6 +265,8 @@ def preprocess_input(self, data):

def postprocess_output(self, data):
result = data
if self.use_flatten_topology:
result = self.do_flat_topology(data)
if self.use_flatten:
result = self.do_flatten(data)
elif self.use_simplify:
Expand All @@ -279,6 +291,8 @@ def draw_menu_button(self, context, layout, node, text):
layout.menu('SV_MT_SocketOptionsMenu', text='', icon='TRIA_DOWN')

def draw_menu_items(self, context, layout):
if self.can_flatten_topology():
layout.prop(self, 'use_flatten_topology')
self.draw_simplify_modes(layout)
if self.can_graft():
layout.prop(self, 'use_graft')
Expand Down Expand Up @@ -313,6 +327,10 @@ class SvSocketCommon(SvSocketProcessing):
objects_number: IntProperty(min=0, options={'SKIP_SAVE'})

description : StringProperty()
is_mandatory: BoolProperty(default=False)
nesting_level: IntProperty(default=2)
default_mode: EnumProperty(items=enum_item_4(['NONE', 'EMPTY_LIST', 'MATRIX', 'MASK']), default='EMPTY_LIST')
pre_processing: EnumProperty(items=enum_item_4(['NONE', 'ONE_ITEM']), default='NONE')

def get_link_parameter_node(self):
return self.quick_link_to_node
Expand Down Expand Up @@ -662,7 +680,7 @@ class SvVerticesSocket(NodeSocket, SvSocketCommon):

color = (0.9, 0.6, 0.2, 1.0)
quick_link_to_node = 'GenVectorsNode'

nesting_level: IntProperty(default=3)
def setup_parameter_node(self, param_node):
if self.use_prop or self.get_prop_name():
value = self.sv_get()[0][0]
Expand All @@ -681,6 +699,9 @@ def setup_parameter_node(self, param_node):
def do_simplify(self, data):
return flatten_data(data, 2)

def do_flat_topology(self, data):
return flatten_data(data, 3)

@property
def default_property(self):
return self.prop
Expand Down Expand Up @@ -927,6 +948,8 @@ def draw_property(self, layout, prop_origin=None, prop_name=None):

def draw_menu_items(self, context, layout):
self.draw_simplify_modes(layout)
if self.can_flatten_topology():
layout.prop(self, 'use_flatten_topology')
if self.can_graft():
layout.prop(self, 'use_graft')
if not self.use_flatten:
Expand All @@ -936,6 +959,9 @@ def draw_menu_items(self, context, layout):
if self.can_wrap():
layout.prop(self, 'use_wrap')

def do_flat_topology(self, data):
return flatten_data(data, 3)

def do_flatten(self, data):
return flatten_data(data, 1)

Expand Down Expand Up @@ -972,6 +998,9 @@ def preprocess_input(self, data):

def postprocess_output(self, data):
result = data

if self.use_flatten_topology:
result = self.do_flat_topology(data)
if self.use_flatten:
result = self.do_flatten(data)
elif self.use_simplify:
Expand Down
27 changes: 27 additions & 0 deletions data_structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,33 @@ def ensure_nesting_level(data, target_level, data_types=SIMPLE_DATA_TYPES, input
result = [result]
return result

def ensure_min_nesting(data, target_level, data_types=SIMPLE_DATA_TYPES, input_name=None):
"""
data: number, or list of numbers, or list of lists, etc.
target_level: minimum data nesting level required for further processing.
data_types: list or tuple of types.
input_name: name of input socket data was taken from. Optional. If specified,
used for error reporting.
Wraps data in so many [] as required to achieve target nesting level.
If data already has too high nesting level the same data will be returned
ensure_nesting_level(17, 0) == 17
ensure_nesting_level(17, 1) == [17]
ensure_nesting_level([17], 1) == [17]
ensure_nesting_level([17], 2) == [[17]]
ensure_nesting_level([(1,2,3)], 3) == [[(1,2,3)]]
ensure_nesting_level([[[17]]], 1) => [[[17]]]
"""

current_level = get_data_nesting_level(data, data_types)
if current_level >= target_level:
return data
result = data
for i in range(target_level - current_level):
result = [result]
return result

def flatten_data(data, target_level=1, data_types=SIMPLE_DATA_TYPES):
"""
Reduce nesting level of `data` to `target_level`, by concatenating nested sub-lists.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ The inner workings go something like::
print(mesh_join(verts_nested, keys_nested))

# result
[(0.2, 1.5, 0.1), (1.2, 0.5, 0.1), (1.2, 1.5, 0.1),
(0.2, 2.5, 5.1), (0.2, 0.5, 2.1), (0.2, 2.5, 0.1),
(0.2, 1.4, 0.1), (1.2, 0.2, 0.3), (1.2, 4.5, 4.1),
(0.2, 1.5, 3.4), (5.2, 6.5, 2.1), (0.2, 5.5, 2.1)]
[(0.2, 1.5, 0.1), (1.2, 0.5, 0.1), (1.2, 1.5, 0.1),
(0.2, 2.5, 5.1), (0.2, 0.5, 2.1), (0.2, 2.5, 0.1),
(0.2, 1.4, 0.1), (1.2, 0.2, 0.3), (1.2, 4.5, 4.1),
(0.2, 1.5, 3.4), (5.2, 6.5, 2.1), (0.2, 5.5, 2.1)]

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

Expand All @@ -55,7 +55,7 @@ The inner workings go something like::
Inputs & Outputs
----------------

The inputs and outputs are *vertices* and *polygons / edges*.
The inputs and outputs are *vertices*, edges and *polygons*.

Expects a nested collection of vertex lists. Each nested list represents an object which can itself have many vertices and key lists.

Expand All @@ -67,4 +67,4 @@ Examples
:alt: MeshJoinDemo1.PNG

Notes
-----
-----
2 changes: 1 addition & 1 deletion docs/nodes/modifier_change/modifier_change_index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Modifier Change
holes_fill
flip_normals
merge_by_distance
mesh_join
mesh_join_mk2
mesh_separate
objects_along_edge
offset
Expand Down
2 changes: 1 addition & 1 deletion index.md
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@
SvEdgeBoomNode
SvDissolveMeshElements
SvPols2EdgsNodeMk2
SvMeshJoinNode
SvMeshJoinNodeMk2
---
SvFillsHoleNode
SvRecalcNormalsNode
Expand Down
Loading

0 comments on commit 8183d4d

Please sign in to comment.