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])
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)