def process(self): Points = self.inputs[1] Colors = self.outputs[0] if Colors.is_linked: dps = get_sv_depsgraph() obj = self.inputs[0].sv_get()[0] # triangulate faces bvh = BVHTree.FromObject(obj, dps) point = Points.sv_get()[0] outc = [] ran = range(3) image = bpy.data.images[self.image] width, height = image.size # Must be exactly the same vertically and horizontally, square image. pixels = np.array(image.pixels[:]).reshape(width, height, 4) uvMap = obj.data.uv_layers[0].data for P in point: loc, norm, ind, dist = bvh.find_nearest(P) found_poly = obj.data.polygons[ind] verticesIndices = found_poly.vertices p1, p2, p3 = [ obj.data.vertices[verticesIndices[i]].co for i in ran ] uvMapIndices = found_poly.loop_indices uv1, uv2, uv3 = [ uvMap[uvMapIndices[i]].uv.to_3d() for i in ran ] V = barycentric_transform(loc, p1, p2, p3, uv1, uv2, uv3) outc.append(pixels[int(V.y * (width - 1)), int(V.x * (height - 1))].tolist()) Colors.sv_set([outc])
def process(self): Object, Points, Colors = self.inputs dps = get_sv_depsgraph() obj = Object.sv_get()[0] # triangulate faces bvh = BVHTree.FromObject(obj, dps) point = Points.sv_get()[0] color = Colors.sv_get()[0] ran = range(3) image = bpy.data.images[self.image] width, height = image.size uvMap = obj.data.uv_layers[0].data pixels = np.array(image.pixels[:]).reshape(width, height, 4) for P, C in zip(point, safc(point, color)): loc, norm, ind, dist = bvh.find_nearest(P) found_poly = obj.data.polygons[ind] verticesIndices = found_poly.vertices p1, p2, p3 = [ obj.data.vertices[verticesIndices[i]].co for i in ran ] uvMapIndices = found_poly.loop_indices uv1, uv2, uv3 = [uvMap[uvMapIndices[i]].uv.to_3d() for i in ran] V = barycentric_transform(loc, p1, p2, p3, uv1, uv2, uv3) Vx, Vy = int(V.x * (width - 1)), int(V.y * (height - 1)) pixels[Vy, Vx] = C image.pixels = pixels.flatten().tolist()
def process(self): O, V, L, S = self.inputs outL, outV = self.outputs # this may not work in render mode. sv_depsgraph = get_sv_depsgraph() # listobj = [i.particle_systems.active.particles for i in O.sv_get() if i.particle_systems] listobj = [] for obj in O.sv_get(): if not obj.particle_systems: continue obj = sv_depsgraph.objects[obj.name] particle_systems = obj.evaluated_get(sv_depsgraph).particle_systems particles = particle_systems[0].particles listobj.append(particles) if V.is_linked: for i, i2 in zip(listobj, V.sv_get()): i.foreach_set('velocity', np.array(safc(i, i2)).flatten()) if S.is_linked: for i, i2 in zip(listobj, S.sv_get()): i.foreach_set('size', safc(i, i2)) if L.is_linked: for i, i2 in zip(listobj, L.sv_get()): i.foreach_set('location', np.array(safc(i, i2)).flatten()) if outL.is_linked: if self.Filt_D: outL.sv_set([[i.location[:] for i in Plist if i.alive_state == 'ALIVE'] for Plist in listobj]) else: outL.sv_set([[i.location[:] for i in Plist] for Plist in listobj]) if outV.is_linked: outV.sv_set([[i.velocity[:] for i in Plist] for Plist in listobj])
def sweep_between(self, construct): self.ensure_bevels(construct) # -- get verts without depsgraph, just path verts path_obj = bpy.data.objects.get(construct.traject.name) path_obj_data = path_obj.to_mesh() path_verts = [v.co for v in path_obj_data.vertices] num_path_verts = len(path_verts) # -- use the depsgraph for the bevelled objects sv_depsgraph = get_sv_depsgraph() shape_a = sv_depsgraph.objects[construct.shape_a.name] shape_b = sv_depsgraph.objects[construct.shape_b.name] shape_a_data = shape_a.to_mesh() shape_b_data = shape_b.to_mesh() num_verts_shape_a = len(shape_a_data.vertices) num_verts_shape_b = len(shape_b_data.vertices) if num_verts_shape_a == num_verts_shape_b: # -- get vertices extrusion_a = sv_depsgraph.objects[construct.extrusion_a.name] extrusion_b = sv_depsgraph.objects[construct.extrusion_b.name] extruded_data_a = extrusion_a.to_mesh( preserve_all_data_layers=True, depsgraph=sv_depsgraph) extruded_data_b = extrusion_b.to_mesh( preserve_all_data_layers=True, depsgraph=sv_depsgraph) verts_a = [v.co[:] for v in extruded_data_a.vertices] verts_b = [v.co[:] for v in extruded_data_b.vertices] # -- perform mix verts_final = self.mix(verts_a, verts_b, construct.factors, divider=num_verts_shape_a) # -- because both A and B should have identical topology, we'll copy A's edges/faces. edges = extruded_data_a.edge_keys faces = [list(p.vertices) for p in extruded_data_a.polygons] # -- cleanup extrusion_a.to_mesh_clear() extrusion_b.to_mesh_clear() return verts_final, edges, faces else: print( "nope, they are not the same topology, ideally you will use PolyLine Viewer output" ) # -- cleanup path_obj.to_mesh_clear() shape_a.to_mesh_clear() shape_b.to_mesh_clear()
def process(self): objs = self.inputs[0].sv_get() if isinstance(objs[0], list): objs = objs[0] o1, o2, o3, o4, o5, o6, o7, o8 = self.outputs vs, vn, es, ps, pa, pc, pn, ms = [], [], [], [], [], [], [], [] if self.modifiers: sv_depsgraph = get_sv_depsgraph() ot = objs[0].type in ['MESH', 'CURVE', 'FONT', 'SURFACE', 'META'] for obj in objs: with self.sv_throttle_tree_update(): if o8.is_linked: ms.append(obj.matrix_world) if ot: if self.modifiers: obj = sv_depsgraph.objects[obj.name] obj_data = obj.to_mesh(preserve_all_data_layers=True, depsgraph=sv_depsgraph) else: obj_data = obj.to_mesh() if o1.is_linked: vs.append([v.co[:] for v in obj_data.vertices]) if o2.is_linked: vn.append([v.normal[:] for v in obj_data.vertices]) if o3.is_linked: es.append(obj_data.edge_keys) if o4.is_linked: ps.append([p.vertices[:] for p in obj_data.polygons]) if o5.is_linked: pa.append([p.area for p in obj_data.polygons]) if o6.is_linked: pc.append([p.center[:] for p in obj_data.polygons]) if o7.is_linked: pn.append([p.normal[:] for p in obj_data.polygons]) obj.to_mesh_clear() for i, i2 in zip(self.outputs, [vs, vn, es, ps, pa, pc, pn, ms]): if i.is_linked: i.sv_set(i2)
def process(self): objs = self.inputs[0].sv_get(default=[[]]) if not self.object_names and not objs[0]: return data_objects = bpy.data.objects outputs = self.outputs vers_out_grouped = [] o_vs, o_es, o_ps, o_vn, o_mi, o_pa, o_pc, o_pn, o_ms, o_ob = [s.is_linked for s in self.outputs[:10]] vs, es, ps, vn, mi, pa, pc, pn, ms = [[] for s in self.outputs[:9]] if self.modifiers: sv_depsgraph = get_sv_depsgraph() out_np = self.out_np if not self.output_np_all else [True for i in range(7)] if isinstance(objs[0], list): objs = objs[0] if not objs: objs = (data_objects.get(o.name) for o in self.object_names) # iterate through references for obj in objs: if not obj: continue # code inside this context can trigger dependancy graph update events, # it is necessary to call throttle here to prevent Sverchok from responding to these updates: # not doing so would trigger recursive updates and Blender would likely become unresponsive. with self.sv_throttle_tree_update(): mtrx = obj.matrix_world if obj.type in {'EMPTY', 'CAMERA', 'LAMP' }: if o_ms: ms.append(mtrx) continue try: if obj.mode == 'EDIT' and obj.type == 'MESH': # Mesh objects do not currently return what you see # from 3dview while in edit mode when using obj.to_mesh. me = obj.data bm = bmesh.from_edit_mesh(me) vers, edgs, pols = pydata_from_bmesh(bm) if o_vs: vs.append(vers) if o_es: es.append(edgs) if o_ps: ps.append(pols) if o_vn: vn.append([v.normal[:] for v in bm.verts]) if o_mi: mi.append(self.get_materials_from_bmesh(bm)) if o_pa: pa.append([p.calc_area() for p in bm.faces]) if o_pc: pc.append([p.calc_center_median()[:] for p in bm.faces]) if o_pn: pn.append([p.normal[:] for p in bm.faces]) del bm else: if self.modifiers: obj = sv_depsgraph.objects[obj.name] obj_data = obj.to_mesh(preserve_all_data_layers=True, depsgraph=sv_depsgraph) else: obj_data = obj.to_mesh() if o_vs: vs.append(read_verts(obj_data, out_np[0])) if o_es: es.append(read_edges(obj_data, out_np[1])) if o_ps: ps.append([list(p.vertices) for p in obj_data.polygons]) if self.vergroups: vers_out_grouped.append(get_vertgroups(obj_data)) if o_vn: vn.append(read_verts_normal(obj_data, out_np[2])) if o_mi: mi.append(read_materials_idx(obj_data, out_np[3])) if o_pa: pa.append(read_face_area(obj_data, out_np[4])) if o_pc: if out_np[5]: pc.append(read_face_center(obj_data, output_numpy=True)) else: pc.append([p.center[:] for p in obj_data.polygons]) if o_pn: if out_np[6]: pn.append(read_face_normal(obj_data, True)) else: pn.append([p.normal[:] for p in obj_data.polygons]) obj.to_mesh_clear() except Exception as err: print('failure in process between frozen area', self.name, err) if o_ms: ms.append(mtrx) for i, i2 in zip(self.outputs, [vs, es, ps, vn, mi, pa, pc, pn, ms]): if i.is_linked: i.sv_set(i2) if vers_out_grouped and vers_out_grouped[0]: if 'Vers_grouped' in outputs and self.vergroups: outputs['Vers_grouped'].sv_set(vers_out_grouped) if o_ob: if self.by_input: outputs['Object'].sv_set(objs) else: outputs['Object'].sv_set([data_objects.get(o.name) for o in self.object_names])
def process(self): if not self.object_names: return scene = bpy.context.scene data_objects = bpy.data.objects outputs = self.outputs edgs_out = [] vers_out = [] vers_out_grouped = [] pols_out = [] mtrx_out = [] materials_out = [] if self.modifiers: sv_depsgraph = get_sv_depsgraph() # iterate through references for obj in (data_objects.get(o.name) for o in self.object_names): if not obj: continue edgs = [] vers = [] vers_grouped = [] pols = [] mtrx = [] materials = [] mtrx = obj.matrix_world if obj.type in {'EMPTY', 'CAMERA', 'LAMP' }: mtrx_out.append(mtrx) continue try: if obj.mode == 'EDIT' and obj.type == 'MESH': # Mesh objects do not currently return what you see # from 3dview while in edit mode when using obj.to_mesh. me = obj.data bm = bmesh.from_edit_mesh(me) vers, edgs, pols = pydata_from_bmesh(bm) materials = self.get_materials_from_bmesh(bm) del bm else: if self.modifiers: obj = sv_depsgraph.objects[obj.name] obj_data = obj.to_mesh(preserve_all_data_layers=True, depsgraph=sv_depsgraph) else: obj_data = obj.to_mesh() if obj_data.polygons: pols = [list(p.vertices) for p in obj_data.polygons] vers, vers_grouped = self.get_verts_and_vertgroups(obj_data) materials = self.get_materials_from_mesh(obj_data) edgs = obj_data.edge_keys obj.to_mesh_clear() except Exception as err: print('failure in process between frozen area', self.name, err) vers_out.append(vers) edgs_out.append(edgs) pols_out.append(pols) mtrx_out.append(mtrx) materials_out.append(materials) vers_out_grouped.append(vers_grouped) if vers_out and vers_out[0]: outputs['Vertices'].sv_set(vers_out) outputs['Edges'].sv_set(edgs_out) outputs['Polygons'].sv_set(pols_out) if 'MaterialIdx' in outputs: outputs['MaterialIdx'].sv_set(materials_out) if 'Vers_grouped' in outputs and self.vergroups: outputs['Vers_grouped'].sv_set(vers_out_grouped) outputs['Matrixes'].sv_set(mtrx_out) outputs['Object'].sv_set([data_objects.get(o.name) for o in self.object_names])