Коммит ea69d2ae создал по автору generalpancakemstr's avatar generalpancakemstr
Просмотр файлов

Moved levels parameter below data inputs, settings use socket parameters;...

Moved levels parameter below data inputs, settings use socket parameters; Better handling of no inputs situation; Internal check to prevent subidivision level greater than 5; added node muting implementation; added node documentation.
владелец e40f6f21
...@@ -6,6 +6,7 @@ Modifier Change ...@@ -6,6 +6,7 @@ Modifier Change
:maxdepth: 1 :maxdepth: 1
bevel bevel
opensubdivide
subdivide_mk2 subdivide_mk2
subdivide_lite subdivide_lite
subdivide_to_quads subdivide_to_quads
......
Subdivision Node
===================
Functionality
-------------
This node applies [Catmull-Clark subdivision](https://en.wikipedia.org/wiki/Catmull%E2%80%93Clark_subdivision_surface) (as implemented by the [OpenSubdiv](https://github.com/PixarAnimationStudios/OpenSubdiv)) to the input mesh at the specified number of levels.
Inputs
------
This node has the following inputs:
- **Vertices**. Vertices of input mesh.
- **Edges**. Edges of input mesh (**optional**).
- **Faces**. Faces of input mesh.
Parameters
----------
This node has the following parameters:
- **Levels**. Maximum subdivision level to be applied to input mesh.
Outputs
-------
This node has the following outputs:
- **Vertices**. All vertices of resulting mesh.
- **Edges**. All edges of resulting mesh.
- **Faces**. All faces of resulting mesh.
**Note**: **Vertices** and **Faces** inputs **must** be compatible, in that the **Faces** input **may not refer to vertex indices that do not exist in the Vertices list** (e.g. **Faces** cannot refer to vertex 7, provided a list of **Vertices** with only 5 vertices).
Unexpected behavior may occur if using Faces from one mesh with Vertices from another.
Indicies in **NewEdges**, **NewFaces**, **OldEdges**, **OldFaces** outputs relate to vertices in **Vertices** output.
Examples of usage
-----------------
.. image:: https...
...@@ -21,9 +21,6 @@ from bpy.props import IntProperty ...@@ -21,9 +21,6 @@ from bpy.props import IntProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode, match_long_repeat from sverchok.data_structure import updateNode, match_long_repeat
# from sverchok.utils.modules.ctypes_pyOpenSubdiv import pyOpenSubdiv
# openSubdivide = pyOpenSubdiv
enable_module = False enable_module = False
try: try:
import pyOpenSubdiv import pyOpenSubdiv
...@@ -32,7 +29,6 @@ try: ...@@ -32,7 +29,6 @@ try:
except ModuleNotFoundError: except ModuleNotFoundError:
enable_module = False enable_module = False
from itertools import chain from itertools import chain
import traceback import traceback
class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode): class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode):
...@@ -40,14 +36,32 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode): ...@@ -40,14 +36,32 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode):
bl_label = "OpenSubdiv" bl_label = "OpenSubdiv"
bl_icon = 'OUTLINER_OB_EMPTY' bl_icon = 'OUTLINER_OB_EMPTY'
sv_icon = None sv_icon = None
maxlevel : IntProperty(name='level',default=0,min=0,max=5,update=updateNode) maxSubdivision = 5 # Creates a self.maxSubdivision attribute
maxlevel : IntProperty(name='level',default=0,min=0,max=maxSubdivision,update=updateNode)
def sv_init(self,context):
self.inputs.new('SvStringsSocket', "Levels").prop_name='maxlevel' # Mute Node Implementation
@property
def sv_internal_links(self):
mapping = [
(self.inputs['Vertices'],self.outputs['Vertices']),
(self.inputs['Edges'],self.outputs['Edges']),
(self.inputs['Faces'],self.outputs['Faces'])
]
return mapping
def sv_init(self,context):
self.inputs.new('SvVerticesSocket', "Vertices") self.inputs.new('SvVerticesSocket', "Vertices")
self.inputs.new('SvStringsSocket',"Edges")
self.inputs.new('SvStringsSocket', "Faces") self.inputs.new('SvStringsSocket', "Faces")
socket = self.inputs.new('SvStringsSocket', "Levels")
socket.use_prop=True
socket.prop_name = 'maxlevel'
socket.default_property_type = 'int'
socket.default_int_property = 0
socket.int_range = (0,self.maxSubdivision) # This does not actually appear to limit the subdivision levels
self.outputs.new('SvVerticesSocket', "Vertices") self.outputs.new('SvVerticesSocket', "Vertices")
self.outputs.new('SvStringsSocket', "Edges") self.outputs.new('SvStringsSocket', "Edges")
self.outputs.new('SvStringsSocket', "Faces") self.outputs.new('SvStringsSocket', "Faces")
...@@ -60,6 +74,11 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode): ...@@ -60,6 +74,11 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode):
edges = [] edges = []
face_sets = self.inputs['Faces'].sv_get(default=[],deepcopy=False) face_sets = self.inputs['Faces'].sv_get(default=[],deepcopy=False)
new_meshes = {
'vertices':[],
'edges':[],
'faces':[]
}
if(vert_sets != [] and face_sets != []): if(vert_sets != [] and face_sets != []):
subdivision_levels = self.inputs["Levels"].sv_get()[0] subdivision_levels = self.inputs["Levels"].sv_get()[0]
...@@ -67,15 +86,9 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode): ...@@ -67,15 +86,9 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode):
# This is definitely gonna crash. # This is definitely gonna crash.
# I think I'll take the "wait and see how" approach? # I think I'll take the "wait and see how" approach?
parameters = zip(*match_long_repeat([subdivision_levels,vert_sets,face_sets])) parameters = zip(*match_long_repeat([subdivision_levels,vert_sets,face_sets]))
new_meshes = {
'vertices':[],
'edges':[],
'faces':[]
}
for params in parameters: for params in parameters:
subdivision_level = params[0] subdivision_level = params[0] if params[0] <= self.maxSubdivision else self.maxSubdivision
vertices = params[1] vertices = params[1]
faces = params[2] faces = params[2]
faceVerts = list(chain.from_iterable(faces)) faceVerts = list(chain.from_iterable(faces))
...@@ -87,15 +100,9 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode): ...@@ -87,15 +100,9 @@ class SvOpenSubdivideNode(bpy.types.Node,SverchCustomTreeNode):
new_meshes['edges'].append(new_mesh['edges']) new_meshes['edges'].append(new_mesh['edges'])
new_meshes['faces'].append(new_mesh['faces']) new_meshes['faces'].append(new_mesh['faces'])
self.outputs['Vertices'].sv_set(new_meshes['vertices']) self.outputs['Vertices'].sv_set(new_meshes['vertices'])
self.outputs['Edges'].sv_set(new_meshes['edges']) self.outputs['Edges'].sv_set(new_meshes['edges'])
self.outputs['Faces'].sv_set(new_meshes['faces']) self.outputs['Faces'].sv_set(new_meshes['faces'])
else:
self.outputs['Vertices'].sv_set(vertices)
self.outputs['Edges'].sv_set(edges)
self.outputs['Faces'].sv_set(faces)
def register(): def register():
bpy.utils.register_class(SvOpenSubdivideNode) bpy.utils.register_class(SvOpenSubdivideNode)
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать