Esempio n. 1
0
def np_rotate_one_center(props, mat):
    center = np.array(props[1][0])[np.newaxis, :]
    verts = np.array(props[0])
    if np.linalg.norm(center[0]) > 0:
        return matrix_apply_np(verts - center, mat) + center

    return matrix_apply_np(verts, mat)
Esempio n. 2
0
def preprocess_verts(noise_matrix, verts, numpy_mode):
    if isinstance(noise_matrix[0], Matrix):
        if numpy_mode:
            verts = [
                matrix_apply_np(
                    vs if isinstance(vs, np.ndarray) else np.array(vs),
                    m.inverted())
                for vs, m in zip_long_repeat(verts, noise_matrix)
                ]
        else:
            verts = [
                matrix_apply_np(
                    vs if isinstance(vs, np.ndarray) else np.array(vs),
                    m.inverted()).tolist()
                for vs, m in zip_long_repeat(verts, noise_matrix)
                ]
    else:
        verts = [[m.inverted() @ Vector(v) for v, m in zip(vs, cycle(ms))] for vs, ms in zip_long_repeat(verts, noise_matrix)]

    return verts
Esempio n. 3
0
def make_verts(size, x_verts, y_verts, z_verts, matrix, origin):
    '''creates cube verts, first vertical faces as a roll and after the bottom and top caps'''
    size_h = size / 2
    if origin == 'CENTER':
        offset = [0, 0, 0]
    elif origin == 'BOTTOM':
        offset = [0, 0, size_h]
    else:
        offset = [size_h, size_h, size_h]

    sidex = np.linspace(-size_h + offset[0], size_h + offset[0], x_verts)
    sidey = np.linspace(-size_h + offset[1], size_h + offset[1], y_verts)
    sidez = np.linspace(-size_h + offset[2], size_h + offset[2], z_verts)

    z_spread = 2 * x_verts + 2 * y_verts - 4

    roll = np.zeros((z_spread * z_verts, 3))
    row_id = np.arange(z_spread * z_verts) % z_spread

    plane_y1 = row_id < y_verts
    plane_x1 = np.all((y_verts - 2 < row_id, row_id < y_verts + x_verts - 1),
                      axis=0)
    plane_y2 = np.all(
        (y_verts + x_verts - 3 < row_id, row_id < z_spread - x_verts + 2),
        axis=0)
    plane_x2 = row_id > z_spread - x_verts + 1

    roll[:, 2] = np.repeat(sidez, z_spread)
    roll[plane_y1, 0] = sidex[0]
    roll[plane_y1, 1] = np.repeat(sidey, z_verts).reshape(-1, z_verts).T.flat

    roll[plane_x1, 0] = np.repeat(sidex, z_verts).reshape(-1, z_verts).T.flat
    roll[plane_x1, 1] = sidey[-1]

    roll[plane_y2, 0] = sidex[-1]
    roll[plane_y2, 1] = np.repeat(np.flip(sidey),
                                  z_verts).reshape(-1, z_verts).T.flat

    roll[plane_x2, 1] = sidey[0]
    roll[plane_x2, 0] = np.repeat(np.flip(sidex[1:-1]),
                                  z_verts).reshape(-1, z_verts).T.flat

    x_coords, y_coords = np.meshgrid(sidex[1:-1],
                                     sidey[1:-1],
                                     sparse=False,
                                     indexing='xy')
    z_coords = np.full(x_coords.shape, -size_h + offset[2])
    bottom = np.array([x_coords, y_coords, z_coords]).T.reshape(-1, 3)
    top = np.array([x_coords, y_coords, z_coords + size]).T.reshape(-1, 3)

    if not matrix == Matrix():
        return matrix_apply_np(np.concatenate([roll, bottom, top]), matrix)

    return np.concatenate([roll, bottom, top])
Esempio n. 4
0
def copy_object_and_transform_np(
        vertices: np.ndarray, edges: np.ndarray, faces: PyFaces,
        matrices: List[Matrix]) -> Tuple[np.ndarray, np.ndarray, PyFaces]:
    # Get mesh and list of matrices
    # Each matrices create copy of given mesh and transform it

    meshes: List[Tuple[np.ndarray, np.ndarray, PyFaces]] = []
    for matrix in matrices:
        new_verts = matrix_apply_np(vertices, matrix)
        meshes.append((new_verts, edges, faces))

    return mesh_join_np(*list(zip(*meshes)), False)
Esempio n. 5
0
def make_verts_grid(sidex, sidey, matrix, direction):
    y_coords, x_coords = np.meshgrid(sidey, sidex, sparse=False, indexing='xy')
    z_coords = np.full(x_coords.shape, 0.0)
    if direction == 'XY':
        plane = np.array([x_coords, y_coords, z_coords]).T.reshape(-1, 3)
    elif direction == 'YZ':
        plane = np.array([z_coords, x_coords, y_coords]).T.reshape(-1, 3)
    else:
        plane = np.array([y_coords, z_coords, x_coords]).T.reshape(-1, 3)

    if not matrix == Matrix():
        return matrix_apply_np(plane, matrix)
    return plane
Esempio n. 6
0
def v_normal_numpy(verts, pols, noise_type, n_props, result, output_numpy):
    bm = bmesh_from_pydata(verts, [], pols, normal_update=True)
    normals = np.array([v.normal for v in bm.verts])
    scale, seed, matrix, smooth, interpolate = n_props
    noise_function = noise_numpy_types[noise_type][interpolate]
    smooth = smooth
    np_verts = np.array(verts)
    n_v = noise_function(matrix_apply_np(np_verts, matrix), seed, smooth)
    if output_numpy:
        result.append(np_verts + normals * n_v[:, np.newaxis] * scale)
    else:
        result.append(
            (np_verts + normals * n_v[:, np.newaxis] * scale).tolist())
    bm.free()
Esempio n. 7
0
def v_noise_numpy(verts, _, noise_type, n_props, result, output_numpy):
    scale, seed, matrix, smooth, interpolate = n_props
    noise_function = noise_numpy_types[noise_type][interpolate]
    smooth = smooth
    np_verts = np.array(verts)
    distorted_v = matrix_apply_np(np_verts, matrix)

    n_v = np.stack(
        (noise_function(distorted_v, seed,
                        smooth), noise_function(distorted_v, seed + 1, smooth),
         noise_function(distorted_v, seed + 2, smooth))).T

    if output_numpy:
        result.append(np_verts + (2 * n_v - 1) * scale)
    else:
        result.append((np_verts + (2 * n_v - 1) * scale).tolist())
Esempio n. 8
0
    def vector_transform(af_verts, transformation, transformation_mode,
                         iterations, coeff):
        if transformation_mode == 'MATRIX':
            matrix = transformation
            for i in range(iterations):
                af_verts += (matrix_apply_np(af_verts, matrix) -
                             af_verts) * coeff[i % len(coeff)]
        elif transformation_mode == 'VECTOR':
            offset_verts = numpy_full_list_cycle(np.array(transformation),
                                                 af_verts.shape[0])
            for i in range(iterations):
                af_verts += offset_verts * coeff[i % len(coeff)]
        elif transformation_mode == 'VECTOR_FIELD':
            for i in range(iterations):
                i_coeff = coeff[i % len(coeff)]
                xs, ys, zs = transformation.evaluate_grid(
                    af_verts[:, 0], af_verts[:, 1], af_verts[:, 2])
                af_verts[:, 0] += xs * i_coeff
                af_verts[:, 1] += ys * i_coeff
                af_verts[:, 2] += zs * i_coeff

        return af_verts
Esempio n. 9
0
def apply_matrix_to_vectors_np(vertices, matrices, out_verts):
    r_vertices = [np.array(v) for v in vertices]
    max_v = len(vertices) - 1
    for i, mat in enumerate(matrices):
        vert_id = min(i, max_v)
        out_verts.append(matrix_apply_np(r_vertices[vert_id], mat))
Esempio n. 10
0
 def apply_matrix(self, matrix) -> NpMesh:
     """It will generate new vertices with given matrix applied"""
     self.vertices.data = matrix_apply_np(self.vertices.data, matrix)
     return self
Esempio n. 11
0
def np_rotate_many_centers(props, mat, np_local_match):
    verts, centers = np_local_match([np.array(p) for p in props[:2]])
    return matrix_apply_np(verts - centers, mat) + centers
Esempio n. 12
0
def extrude_edges(vertices, edges, faces, edge_mask, face_data, matrices):
    if not matrices:
        matrices = [Matrix()]
    if face_data:
        face_data_matched = repeat_last_for_length(face_data, len(faces))
    if edge_mask:
        edge_mask_matched = repeat_last_for_length(edge_mask, len(edges))

    if isinstance(edges, np_ndarray):
        if edge_mask:
            np_edges = edges[edge_mask_matched]
        else:
            np_edges = edges
    else:
        if edge_mask:
            np_edges = np_array(edges)[edge_mask_matched]
        else:
            np_edges = np_array(edges)
    if isinstance(vertices, np_ndarray):
        np_verts = vertices
    else:
        np_verts = np_array(vertices)

    affeced_verts_idx = np_unique(np_edges)
    if len(matrices) == 1:
        extruded_verts = matrix_apply_np(np_verts[affeced_verts_idx],
                                         matrices[0])
        new_vertices = np_concatenate([np_verts, extruded_verts]).tolist()
    else:
        extruded_verts = [
            m @ Vector(v) for v, m in zip(np_verts[affeced_verts_idx].tolist(),
                                          cycle(matrices))
        ]
        new_vertices = vertices + extruded_verts

    top_edges = np_edges + len(vertices)
    mid_edges = np_zeros((len(affeced_verts_idx), 2), dtype=int)
    mid_edges[:, 0] = affeced_verts_idx
    mid_edges[:, 1] = affeced_verts_idx + len(vertices)
    extruded_edges_py = (np_concatenate([top_edges, mid_edges])).tolist()
    extruded_faces = np_zeros((len(np_edges), 4), dtype=int)
    extruded_faces[:, :2] = np_edges
    extruded_faces[:, 2] = top_edges[:, 1]
    extruded_faces[:, 3] = top_edges[:, 0]
    extruded_faces_py = extruded_faces.tolist()
    if isinstance(edges, np_ndarray):
        new_edges = np_concatenate([edges, top_edges, mid_edges]).tolist()
    else:
        new_edges = edges + extruded_edges_py

    if faces and faces[0]:
        if isinstance(faces, np_ndarray):
            new_faces = np_concatenate([faces, extruded_faces]).tolist()
        else:
            new_faces = faces + extruded_faces_py
    else:
        new_faces = extruded_faces_py

    if face_data:
        bvh = bvh_tree_from_polygons(vertices,
                                     faces,
                                     all_triangles=False,
                                     epsilon=0.0,
                                     safe_check=True)
        mid_points = (np_verts[np_edges[:, 1]] + np_verts[np_edges[:, 0]]) / 2
        face_idx = [bvh.find_nearest(P)[2] for P in mid_points.tolist()]
        new_face_data = face_data_matched + [
            face_data_matched[p] for p in face_idx
        ]
    else:
        new_face_data = []

    return (new_vertices, new_edges, new_faces, extruded_verts,
            extruded_edges_py, extruded_faces_py, new_face_data)