コード例 #1
0
def decorate_roof(obj, options=Map()):
    settings = options.options
    if not settings.roof:
        return obj

    material = Blocks.match(settings.roof_material)
    if material:
        obj.material = material

    if str.startswith(settings.roof, "pointy"):
        height = settings.roof_pointy_multiplier * options.radius
        pointy = V3(options.center.x,
                    options.center.y + options.height + height,
                    options.center.z)

        for i, vec in enumerate(options.corner_vectors):
            roof_line = vg.getLine(vec.x, vec.y + 1, vec.z, pointy.x,
                                   pointy.y + 1, pointy.z)
            obj.points_edges += roof_line

            if not settings.roof == "pointy_lines":
                next_roof_point = options.corner_vectors[(i + 1) % len(
                    options.corner_vectors)]

                # Triangle to pointy face
                triangle_face = [vec, pointy, next_roof_point]
                roof_face = vg.unique_points(
                    vg.getFace([V3(v.x, v.y + 1, v.z) for v in triangle_face]))
                obj.points = obj.points.union(roof_face)

    elif str.startswith(settings.roof, "triangular"):
        obj.decorations.append("roof_triangular")
    elif str.startswith(settings.roof, "battlement"):
        height = settings.roof_battlement_height or 1
        spacing = settings.roof_battlement_space or 2

        for i, vec in enumerate(options.corner_vectors):
            next_roof_point = options.corner_vectors[(i + 1) % len(
                options.corner_vectors)]
            # TODO: Add X,Z outward from center as option
            roof_line = vg.getLine(vec.x, vec.y + height, vec.z,
                                   next_roof_point.x,
                                   next_roof_point.y + height,
                                   next_roof_point.z)

            obj.points = obj.points.union(
                vg.points_spaced(roof_line, Map(every=spacing)))

    elif str.startswith(settings.roof, "shape"):
        obj.decorations.append("roof_floating_shape")
    return obj
コード例 #2
0
def build_basic_shape(obj, options):
    vertices = options.vertices

    # TODO: Add width for the wall - how to add end lines to that?

    options.p1 = p1 = vertices[0]
    options.p2 = p2 = vertices[1]

    obj.inside_vector = vg.inside_vector(p1=p1, center=options.center, p2=p2)
    obj.outside_vector = obj.inside_vector * -1

    h = options.height or 5
    if h > 1:
        obj.vertices = vertices_with_up = [p1, p2,
                                           vg.up(p2, h),
                                           vg.up(p1, h)]  # points straight up
        obj.height = options.height or (vg.highest(vertices_with_up) -
                                        vg.lowest(vertices_with_up) + 1)
        obj.points, obj.top_line, obj.bottom_line, obj.left_line, obj.right_line = vg.rectangular_face(
            p1, p2, h)
        obj.points_edges = obj.top_line + obj.bottom_line + obj.left_line + obj.right_line
    else:
        obj.vertices = [p1, p2]  # points straight up
        obj.height = h
        obj.points_edges = obj.points = obj.top_line = obj.bottom_line = vg.getLine(
            p1.x, p1.y, p1.z, p2.x, p2.y, p2.z)
        obj.left_line = obj.points[0]
        obj.right_line = obj.points[-1]

    obj.cardinality = vg.cardinality(p1, p2)
    return obj
コード例 #3
0
def decorate_castle_outer_wall(obj, options):
    height = options.options.roof_battlement_height
    spacing = options.options.roof_battlement_space

    p1 = options.p1
    p2 = options.p2

    # TODO: Add in inner and outer, create walkway and arrow slits

    # TODO: Add X,Z outward from center as option
    roof_line = vg.getLine(p1.x, p1.y + height, p1.z, p2.x, p2.y + height, p2.z)
    obj.points.extend(vg.points_spaced(roof_line, Map(every=spacing)))

    mid_points = vg.middle_of_line(obj.bottom(), Map(center=True, max_width=2, point_per=10))
    for vec in mid_points:
        obj.features.append(
            Feature("door", vec, Map(cardinality=obj.cardinality, door_inside=options.options.door_inside)))

    return obj