Пример #1
0
 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])
Пример #2
0
 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()
Пример #3
0
    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])
Пример #4
0
    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()
Пример #5
0
    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)
Пример #6
0
    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])
Пример #7
0
    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])