Коммит 752c0617 создал по автору Ilya Portnov's avatar Ilya Portnov
Просмотр файлов

Inset Special node: possibility to work with inset = zero.

This adds a new parameter - "Zero inset faces". It defines what to do
with faces when inset is set to zero. Old behaivour (skip such faces as
if they were masked out) is defined by "Skip" mode. In "Fan" mode, such
faces are processed as usual - the internal face just becomes
degenerated and so is merged into single vertex, so we have a fan-like
stucture.
владелец e7fba561
...@@ -34,7 +34,7 @@ from sverchok.data_structure import ( ...@@ -34,7 +34,7 @@ from sverchok.data_structure import (
''' very non optimal routines. beware. I know this ''' ''' very non optimal routines. beware. I know this '''
def inset_special(vertices, faces, inset_rates, distances, ignores, make_inners, normal_mode="Fast"): def inset_special(vertices, faces, inset_rates, distances, ignores, make_inners, normal_mode="Exact", zero_mode="SKIP"):
new_faces = [] new_faces = []
new_ignores = [] new_ignores = []
...@@ -112,6 +112,17 @@ def inset_special(vertices, faces, inset_rates, distances, ignores, make_inners, ...@@ -112,6 +112,17 @@ def inset_special(vertices, faces, inset_rates, distances, ignores, make_inners,
verts = [vertices[i] for i in face] verts = [vertices[i] for i in face]
avg_vec = get_average_vector(verts, n) avg_vec = get_average_vector(verts, n)
if abs(inset_by) < 1e-6:
normal = calc_normal(verts)
new_vertex = avg_vec.lerp(avg_vec + normal, distance)
vertices.append(new_vertex)
new_vertex_idx = current_verts_idx
new_faces
for i, j in zip(face, face[1:]):
new_faces.append([i, j, new_vertex_idx])
new_faces.append([face[-1], face[0], new_vertex_idx])
return
# lerp and add to vertices immediately # lerp and add to vertices immediately
new_verts_prime = [avg_vec.lerp(v, inset_by) for v in verts] new_verts_prime = [avg_vec.lerp(v, inset_by) for v in verts]
...@@ -133,7 +144,8 @@ def inset_special(vertices, faces, inset_rates, distances, ignores, make_inners, ...@@ -133,7 +144,8 @@ def inset_special(vertices, faces, inset_rates, distances, ignores, make_inners,
for idx, face in enumerate(faces): for idx, face in enumerate(faces):
inset_by = inset_rates[idx] inset_by = inset_rates[idx]
if (inset_by > 0) and (not ignores[idx]): good_inset = (inset_by > 0) or (zero_mode == 'FAN')
if good_inset and (not ignores[idx]):
new_inner_from(face, inset_by, distances[idx], make_inners[idx]) new_inner_from(face, inset_by, distances[idx], make_inners[idx])
else: else:
new_faces.append(face) new_faces.append(face)
...@@ -162,6 +174,7 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode): ...@@ -162,6 +174,7 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode):
inset : FloatProperty( inset : FloatProperty(
name='Inset', name='Inset',
description='inset amount', description='inset amount',
min = 0.0,
default=0.1, update=updateNode) default=0.1, update=updateNode)
distance: FloatProperty( distance: FloatProperty(
name='Distance', name='Distance',
...@@ -173,10 +186,21 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode): ...@@ -173,10 +186,21 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode):
normal_mode : EnumProperty(name = "Normals", normal_mode : EnumProperty(name = "Normals",
description = "Normals calculation algorithm", description = "Normals calculation algorithm",
default = "Fast", default = "Exact",
items = normal_modes, items = normal_modes,
update = updateNode) update = updateNode)
zero_modes = [
("SKIP", "Skip", "Do not process such faces", 0),
("FAN", "Fan", "Make a fan-like structure from such faces", 1)
]
zero_mode : EnumProperty(name = "Zero inset faces",
description = "What to do with faces when inset is equal to zero",
default = "SKIP",
items = zero_modes,
update = updateNode)
# axis = FloatVectorProperty( # axis = FloatVectorProperty(
# name='axis', description='axis relative to normal', # name='axis', description='axis relative to normal',
# default=(0,0,1), update=updateNode) # default=(0,0,1), update=updateNode)
...@@ -198,6 +222,7 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode): ...@@ -198,6 +222,7 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode):
def draw_buttons_ext(self, context, layout): def draw_buttons_ext(self, context, layout):
layout.prop(self, "normal_mode") layout.prop(self, "normal_mode")
layout.prop(self, "zero_mode")
def process(self): def process(self):
i = self.inputs i = self.inputs
...@@ -240,7 +265,8 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode): ...@@ -240,7 +265,8 @@ class SvInsetSpecial(bpy.types.Node, SverchCustomTreeNode):
'distances': distance_vals, 'distances': distance_vals,
'make_inners': make_inners, 'make_inners': make_inners,
'ignores': ignores, 'ignores': ignores,
'normal_mode': self.normal_mode 'normal_mode': self.normal_mode,
'zero_mode': self.zero_mode
} }
res = inset_special(**func_args) res = inset_special(**func_args)
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать