Пример #1
0
    def get_data(self):
        verts_socket, edges_socket, faces_socket, matrix_socket = self.inputs[:
                                                                              4]
        edge_indices = [[]]
        face_indices = [[]]

        propv = verts_socket.sv_get(deepcopy=False, default=[[]])
        coords = propv

        if edges_socket.is_linked:
            prope = edges_socket.sv_get(deepcopy=False, default=[[]])
            edge_indices = prope

        if faces_socket.is_linked:
            propf = faces_socket.sv_get(deepcopy=False, default=[[]])
            face_indices = propf

        if matrix_socket.is_linked:
            m = matrix_socket.sv_get(deepcopy=False, default=[Matrix()])
            verts, matrix = match_long_repeat([propv, m])
            coords = [
                multiply_vectors_deep(mx, v) for mx, v in zip(matrix, verts)
            ]
        else:
            matrix = [Matrix()]
            verts = coords
        return match_long_repeat(
            [coords, edge_indices, face_indices, verts, matrix])
Пример #2
0
    def process(self):
        if not (self.id_data.sv_show and self.activate):
            callback_disable(node_id(self))
            return

        n_id = node_id(self)
        callback_disable(n_id)

        if not any(
            [self.display_verts, self.display_edges, self.display_faces]):
            return

        verts_socket, edges_socket, faces_socket, matrix_socket = self.inputs[:
                                                                              4]

        if verts_socket.is_linked:
            geom = lambda: None
            config = lambda: None

            config.vector_light = self.vector_light[:]
            config.vcol = self.vert_color[:]
            config.line4f = self.edge_color[:]
            config.face4f = self.face_color[:]
            config.display_verts = self.display_verts
            config.display_edges = self.display_edges
            config.display_faces = self.display_faces
            config.shade = self.selected_draw_mode

            # config.point_size = self.point_size
            config.line_width = self.line_width

            edge_indices = None
            face_indices = None

            propv = verts_socket.sv_get(deepcopy=False, default=[])
            coords = propv[0]

            if edges_socket.is_linked:
                prope = edges_socket.sv_get(deepcopy=False, default=[])
                edge_indices = prope[0]

            if faces_socket.is_linked:
                propf = faces_socket.sv_get(deepcopy=False, default=[])
                face_indices = propf[0]

            if matrix_socket.is_linked:
                # for now just deal with first
                m = matrix_socket.sv_get(deepcopy=False, default=[Matrix()])[0]
                coords = multiply_vectors_deep(m, coords)

            geom.verts = coords

            if self.display_verts and not any(
                [self.display_edges, self.display_faces]):
                draw_data = {
                    'tree_name': self.id_data.name[:],
                    'custom_function': draw_verts,
                    'args': (geom, config)
                }
                callback_enable(n_id, draw_data)
                return

            if edges_socket.is_linked and not faces_socket.is_linked:
                geom.edges = edge_indices
                draw_data = {
                    'tree_name': self.id_data.name[:],
                    'custom_function': draw_edges,
                    'args': (geom, config)
                }
                callback_enable(n_id, draw_data)
                return

            if faces_socket.is_linked:

                # we could offer different optimizations, like
                #  -expecting only tris as input, then no processing
                #  -expecting only quads, then minimal processing needed
                #  -expecting mixed bag, then ensure_triangles (current default)
                if self.display_faces:
                    geom.faces = ensure_triangles(coords, face_indices)

                if self.display_edges:
                    # we don't want to draw the inner edges of triangulated faces; use original face_indices.
                    # pass edges from socket if we can, else we manually compute them from faces
                    geom.edges = edge_indices if edges_socket.is_linked else edges_from_faces(
                        face_indices)

                if self.selected_draw_mode == 'facet' and self.display_faces:
                    facet_verts, facet_verts_vcols = generate_facet_data(
                        geom.verts, geom.faces, config.face4f,
                        config.vector_light)
                    geom.facet_verts = facet_verts
                    geom.facet_verts_vcols = facet_verts_vcols
                elif self.selected_draw_mode == 'smooth' and self.display_faces:
                    geom.smooth_vcols = generate_smooth_data(
                        geom.verts, geom.faces, config.face4f,
                        config.vector_light)
                elif self.selected_draw_mode == 'fragment' and self.display_faces:

                    config.draw_fragment_function = None

                    # double reload, for testing.
                    ND = self.node_dict.get(hash(self))
                    if not ND:
                        if self.custom_shader_location in bpy.data.texts:
                            self.populate_node_with_custom_shader_from_text()
                            ND = self.node_dict.get(hash(self))

                    if ND and ND.get('draw_fragment'):
                        config.draw_fragment_function = ND.get('draw_fragment')
                        config.shader = gpu.types.GPUShader(
                            self.custom_vertex_shader,
                            self.custom_fragment_shader)
                    else:
                        config.shader = gpu.types.GPUShader(
                            default_vertex_shader, default_fragment_shader)

                    config.batch = batch_for_shader(config.shader,
                                                    'TRIS',
                                                    {"position": geom.verts},
                                                    indices=geom.faces)

                draw_data = {
                    'tree_name': self.id_data.name[:],
                    'custom_function': draw_faces,
                    'args': (geom, config)
                }
                callback_enable(n_id, draw_data)
                return

            else:
                # draw verts only
                pass

            return

        elif matrix_socket.is_linked:
            matrices = matrix_socket.sv_get(deepcopy=False, default=[Matrix()])

            draw_data = {
                'tree_name': self.id_data.name[:],
                'custom_function': draw_matrix,
                'args': (matrices, )
            }

            callback_enable(n_id, draw_data)