Beispiel #1
0
def childrens_playground_swingset(length=2.2, num=2, height=2.1, width=1.6):
    """
    """
    frame_thick = 0.06
    path = ddd.point([-width / 2, 0], name="Swing path").line_to([-width*2/6, height - width*2/6])
    path = path.arc_to([width*2/6, height - width *2/6], [0, height - width*2/6], ccw=False)
    path = path.line_to([width / 2, 0])

    side_mat = random.choice([ddd.mats.metal_paint_red, ddd.mats.metal_paint_green, ddd.mats.metal_paint_yellow])
    frameside = path.buffer(frame_thick / 2).material(side_mat)
    frameside = frameside.extrude(frame_thick, center=True).rotate(ddd.ROT_FLOOR_TO_FRONT).rotate(ddd.ROT_TOP_CCW)
    frameside = frameside.material(ddd.mats.steel)
    frameside = ddd.uv.map_cubic(frameside)

    frameside1 = frameside.translate([-length/2, 0, 0])
    frameside2 = frameside.translate([length/2, 0, 0])

    topbar = ddd.point([(-length + frame_thick) / 2, 0], name="Swing top bar").line_to([(length - frame_thick) / 2, 0])
    topbar = topbar.buffer(frame_thick / 2).extrude(frame_thick, center=True).translate([0, 0, height - frame_thick / 4])
    topbar = topbar.material(ddd.mats.steel)
    topbar = ddd.uv.map_cubic(topbar)

    swingset = ddd.group3([frameside1, frameside2, topbar], name="Playground swingset")

    for i in range(num):
        posx = -length / 2 + (i + 0.5) * (length / (num))
        swing = childrens_playground_swing(height=height - 0.4)
        swing = swing.translate([posx, 0, height])
        swingset.append(swing)

    item = swingset
    item = ddd.meshops.batch_by_material(item).clean(remove_degenerate=False)

    return item
Beispiel #2
0
def tap_push(r=0.01, height=0.1, length=0.15):
    base = ddd.point(name="Tap").buffer(r, resolution=2)
    path = ddd.point().line_to([0, height
                                ]).line_to([length, height
                                            ]).line_to([length, height * 0.5])
    item = base.extrude_along(path)
    item = item.rotate(ddd.ROT_FLOOR_TO_FRONT).rotate(ddd.ROT_TOP_CW)
    item = item.material(ddd.mats.steel)
    item = ddd.uv.map_cubic(item)
    return item
Beispiel #3
0
def trafficlights_head(height=0.8, depth=0.3):

    head = ddd.rect([-0.15, 0, 0.15, height], name="TrafficLight Box").material(ddd.mats.metal_paint_green).extrude(depth)
    disc_green = ddd.disc(ddd.point([0, 0.2]), r=0.09, name="TrafficLight Disc Green").material(ddd.mats.light_green).extrude(0.05)
    disc_orange = ddd.disc(ddd.point([0, 0.4]), r=0.09, name="TrafficLight Disc Green").material(ddd.mats.light_orange).extrude(0.05)
    disc_red = ddd.disc(ddd.point([0, 0.6]), r=0.09, name="TrafficLight Disc Green").material(ddd.mats.light_red).extrude(0.05)

    discs = ddd.group([disc_green, disc_orange, disc_red], name="TrafficLight Discs").translate([0, 0, depth])  # Put discs over head
    head = ddd.group([head, discs], name="TrafficLight Head").translate([0, -height / 2.0, 0])  # Center vertically
    head = head.rotate([math.pi / 2.0, 0, 0])
    head = ddd.uv.map_cubic(head)

    return head
Beispiel #4
0
def cable(a, b, thick=0.20):
    """
    Rigid cable (segment) between two points.

    TODO: this extrusion approach and rotation can be improved using extrude along like cable_catenary does.
    """
    a = np.array(a)
    b = np.array(b)

    #path = ddd.line([a, b])
    #path_section = ddd.point(name="Cable").buffer(thick * 0.5, resolution=1, cap_style=ddd.CAP_ROUND)
    #cable = path_section.extrude_path(path)

    length = np.linalg.norm(b - a)
    cable = ddd.point(name="Cable").buffer(thick * 0.5, resolution=1).extrude(length + thick).translate([0, 0, -thick * 0.5])
    cable = cable.merge_vertices().smooth(math.pi)
    cable = ddd.uv.map_cylindrical(cable, split=False)

    vector_up = [0, 0, 1]
    vector_dir = (b - a) / length
    rot_axis = np.cross(vector_up, vector_dir)
    rot_angle = math.asin(np.linalg.norm(rot_axis))
    if rot_angle > 0.00001:
        rotation = transformations.quaternion_about_axis(rot_angle, rot_axis / np.linalg.norm(rot_axis))
        cable = cable.rotate_quaternion(rotation)
    cable = cable.translate(a)

    return cable
Beispiel #5
0
def lighthouse(height=10, r=1.5):

    mat = random.choice([ddd.mats.metal_paint_green, ddd.mats.metal_paint_red])

    disc = ddd.point([0, 0]).buffer(r, resolution=3, cap_style=ddd.CAP_ROUND)
    obj = disc.extrude_step(disc, height * 0.3)
    obj = obj.extrude_step(disc.scale(0.7), height * 0.5)
    obj = obj.extrude_step(disc.scale(1.0), height * 0.18)
    obj = obj.extrude_step(disc.scale(1.2), height * 0.02)
    obj = obj.material(mat)
    obj = ddd.uv.map_cylindrical(obj)
    obj.name = "Lighthouse"

    lamp = lamp_ball(r=0.2).material(mat)
    lamp = ddd.uv.map_spherical(lamp)

    top = post(top=lamp, mat_post=ddd.mats.steel).translate([0, 0, height])

    rail = disc.scale(1.2).extrude_step(disc.scale(1.2), 1.0, base=False, cap=False)  #.twosided()
    rail = rail.translate([0, 0, height]).material(ddd.mats.railing)
    rail = ddd.uv.map_cylindrical(rail)

    obj = ddd.group([obj, top, rail], name="Lighthouse Small")

    return obj
Beispiel #6
0
def osm_augment_rocks_generate_rocks(obj, osm, root):
    """
    """
    item_density_m2 = 1.0 / 1000.0
    num_items = int((obj.area() * item_density_m2))

    def filter_func_noise(coords):
        val = noise.pnoise2(coords[0],
                            coords[1],
                            octaves=2,
                            persistence=0.5,
                            lacunarity=2,
                            repeatx=1024,
                            repeaty=1024,
                            base=0)
        return (val > random.uniform(-0.5, 0.5))

    items = ddd.group2(name='Rocks: %s' % obj.name)
    for p in obj.random_points(num_points=num_items,
                               filter_func=filter_func_noise):
        item = ddd.point(p, name="Rock")
        #item.extra['ddd:aug:status'] = 'added'
        item.extra['ddd:item'] = 'natural_rock'
        item.extra['ddd:angle'] = ddd.random.angle()
        items.append(item)

    root.find("/ItemsNodes").append(items.children)
Beispiel #7
0
def patio_chair(width=0.45, length=0.45, seat_height=0.40):
    seat_thick = 0.05
    seat = ddd.rect([0, 0, width, length], name="Chair seat").recenter().extrude(seat_thick)
    seat = ddd.uv.map_cubic(seat)
    seat = seat.translate([0, 0, seat_height - seat_thick])

    stool = ddd.group3([seat], name="Chair stool")

    leg_thick = 0.05
    leg_padding = leg_thick
    for c in [(1, 1), (-1, 1), (-1, -1), (1, -1)]:
        leg = ddd.point([c[0] * (width / 2 - leg_padding), c[1] * (length / 2 - leg_padding)]).buffer(leg_thick / 2).extrude(seat_height - seat_thick)
        leg = ddd.uv.map_cylindrical(leg)
        stool.append(leg)

    stool = stool.material(ddd.mats.steel)
    stool = ddd.collision.aabox_from_aabb(stool)

    back_height = 0.3
    back = ddd.rect([width, seat_thick], name="Chair Back").recenter().extrude(back_height)
    back = back.material(ddd.mats.steel)
    back = ddd.uv.map_cubic(back)
    back = back.translate([0, length / 2 - seat_thick, seat_height])
    back = ddd.collision.aabox_from_aabb(back)

    chair = ddd.group3([stool, back], name="Chair")
    chair.extra['ddd:mass'] = 2.5

    chair = ddd.meshops.batch_by_material(chair).clean(remove_degenerate=False)

    return chair
Beispiel #8
0
def osm_augment_plants_generate_grass_blades(obj, osm, root):
    """
    Generates grass blades.
    """
    blade_density_m2 = 1.0 / 20.0
    num_blades = int((obj.area() * blade_density_m2))

    def filter_func_noise(coords):
        val = noise.pnoise2(coords[0],
                            coords[1],
                            octaves=2,
                            persistence=0.5,
                            lacunarity=2,
                            repeatx=1024,
                            repeaty=1024,
                            base=0)
        return (val > random.uniform(-0.5, 0.5))

    blades = ddd.group2(name='Grass Blades: %s' % obj.name)
    for p in obj.random_points(num_points=num_blades,
                               filter_func=filter_func_noise):
        blade = ddd.point(p, name="Grass Blade")
        #blade.extra['ddd:aug:status'] = 'added'
        blade.extra['ddd:item'] = 'grass_blade'  # TODO: Change to DDD
        blades.append(blade)

    root.find("/ItemsNodes").append(blades.children)
Beispiel #9
0
    def generate_item_2d_outdoor_seating(self, feature):

        # Distribute centers for seating (ideally, grid if shape is almost square, sampled if not)
        # For now, using center:

        center = feature.centroid()

        table = center.copy(name="Outdoor seating table: %s" % feature.name)
        table.extra['osm:amenity'] = 'table'
        table.extra['osm:seats'] = random.randint(0, 4)

        umbrella = ddd.group2()
        if random.uniform(0, 1) < 0.8:
            umbrella = center.copy(name="Outdoor seating umbrella: %s" % feature.name)
            umbrella.extra['osmext:amenity'] = 'umbrella'

        chairs = ddd.group2(name="Outdoor seating seats")
        ang_offset = random.choice([0, math.pi / 2, math.pi, math.pi * 3/4])
        for i in range(table.extra['osm:seats']):
            ang = ang_offset + (2 * math.pi / table.extra['osm:seats']) * i + random.uniform(-0.1, 0.1)
            chair = ddd.point([0, random.uniform(0.7, 1.1)], name="Outdoor seating seat %d: %s" % (i, feature.name))
            chair = chair.rotate(ang).translate(center.geom.coords[0])
            chair.extra['osm:amenity'] = 'seat'
            chair.extra['ddd:angle'] = ang + random.uniform(-0.1, 0.1) # * (180 / math.pi)
            chairs.append(chair)

        item = ddd.group2([table, umbrella, chairs], "Outdoor seating: %s" % feature.name)

        return item

        '''
Beispiel #10
0
 def generate_item_3d_crane(self, item_2d):
     coords = item_2d.geom.coords[0]
     oriented_point = ddd.point(coords)
     try:
         oriented_point = ddd.snap.project(
             ddd.point(coords),
             self.osm.ways_2d['0'])  # FIXME: Align to coastline if any?
     except Exception as e:
         logger.error("Could not orient crane: %s", item_2d)
         oriented_point.extra['ddd:angle'] = 0
     item_3d = industrial.crane_vertical()
     item_3d = item_3d.rotate(
         [0, 0, oriented_point.extra['ddd:angle'] - math.pi / 2])
     item_3d = item_3d.translate([coords[0], coords[1], 0.0])
     item_3d.name = 'Crane: %s' % item_2d.name
     return item_3d
Beispiel #11
0
def column(r=0.1, height=2.0, top=None):
    col = ddd.point([0, 0]).buffer(r, resolution =1).extrude(height)
    col = ddd.uv.map_cubic(col)
    if top:
        top = top.translate([0, 0, height])
        col = ddd.group([col, top])
    return col
Beispiel #12
0
    def uv_apply_func(x, y, z, idx):
        # Find nearest point in shape (or children), and return its height
        closest_o, closest_d = obj_2d.closest(ddd.point([x, y]))
        closest_uv = None
        closest_distsqr = float('inf')
        if closest_o.extra.get('uv', None):
            for idx, v in enumerate(closest_o.geom.exterior.coords):
                point_2d = [v[0], v[1], 0]
                diff = [point_2d[0] - x, point_2d[1] - y]
                distsqr = (diff[0]**2) + (diff[1]**2)
                if (distsqr < closest_distsqr):
                    closest_uv = closest_o.extra['uv'][idx]
                    closest_distsqr = distsqr
        else:
            logger.error(
                "Closest object has no UV mapping: %s (%s) (obj_2d=%s, obj_3d=%s)",
                closest_o, closest_o.extra.get('uv', None), obj_2d, obj_3d)
            raise DDDException("Closest object has no UV mapping: %s (%s)" %
                               (closest_o, closest_o.extra.get('uv', None)),
                               ddd_obj=obj_3d)

        if closest_uv is None:
            logger.error("Error mapping 3D from 2D (3d=%s, 2d=%s %s %s)",
                         obj_3d, obj_2d, obj_2d.geom,
                         [x.geom for x in obj_2d.children])
            raise DDDException(
                "Could not map 3D from 2D (no closest vertex found): %s" %
                obj_3d,
                ddd_obj=obj_3d)

        return closest_uv
Beispiel #13
0
def childrens_playground_arc(length=3.25, width=1.0, sides=7, height=None):

    arc_thick = 0.08
    bar_thick = 0.05
    if height is None:
        height = length / 2 * 0.9

    circleline = ddd.regularpolygon(sides * 2, name="Childrens Playground Arc Side Arc").rotate(-math.pi / 2).outline().scale([length / 2, height])
    arcline = circleline.intersection(ddd.rect([-length, 0.1, length, height * 2]))
    arc = circleline.buffer(arc_thick / 2).intersection(ddd.rect([-length, 0, length, height * 2]))
    arc = arc.extrude(arc_thick, center=True).material(ddd.mats.metal_paint_red)
    arc = arc.rotate(ddd.ROT_FLOOR_TO_FRONT)
    arc = ddd.uv.map_cubic(arc)

    arc1 = arc.copy().translate([0, -width / 2, 0])
    arc2 = arc.copy().translate([0, +width / 2, 0])
    item = ddd.group([arc1, arc2])

    bar = ddd.point(name="Childrens Playground Arc Bar").buffer(bar_thick / 2).extrude(width - arc_thick, center=True).rotate(ddd.ROT_FLOOR_TO_FRONT)
    bar = ddd.uv.map_cubic(bar)
    mats = [ddd.mats.metal_paint_white, ddd.mats.metal_paint_red]
    for idx, p in enumerate(arcline.geom.coords[1:-1]):
        pbar = bar.copy().translate([p[0], 0, p[1]])
        pbar = pbar.material(mats[idx % 2])
        item.append(pbar)

    item = ddd.meshops.batch_by_material(item).clean(remove_degenerate=False)

    return item
Beispiel #14
0
def cart_wheel_axis(height_to_axis=0.1,
                    wheel_radius=0.075,
                    width=0.06,
                    thick_interior=0.032):
    """
    """
    #wheel_radius = height_to_axis * 0.75
    #height_to_axis = wheel_radius * 1.25 # 0.10

    item = ddd.point().line_to([0, -height_to_axis]).line_to(
        [width, -height_to_axis - wheel_radius * 0.5]).line_to([width, 0])
    item = ddd.polygon(item.geom.coords)

    item = item.translate([-width * 0.5, 0]).triangulate().twosided()
    item = item.rotate(ddd.ROT_FLOOR_TO_FRONT).rotate(ddd.ROT_TOP_CW)

    side1 = item.copy().translate([-thick_interior, 0, 0])
    side2 = item.copy().translate([thick_interior, 0, 0])

    item = side1.append(side2)
    item = item.combine()
    item = item.material(ddd.mats.steel)
    item = ddd.uv.map_cubic(item)

    item.set('ddd:connector:axis', [0, 0, -height_to_axis])

    return item
Beispiel #15
0
def bar_u(height=0.8, width=0.4, r=0.15, thick=0.1):
    """
    A U-shaped figure, like that used for handles, bycicle stands...
    """
    vertical_height = height - r

    base = ddd.regularpolygon(6, r=thick * 0.5, name="U-Shape")

    path = ddd.point().line_to([0,
                                vertical_height]).arc_to([r, height],
                                                         [r, vertical_height],
                                                         True,
                                                         resolution=1)
    path = path.line_to([width - r,
                         height]).arc_to([width, vertical_height],
                                         [width - r, vertical_height],
                                         True,
                                         resolution=1)
    path = path.line_to([width, 0])

    item = base.extrude_along(path)
    item = item.rotate(ddd.ROT_FLOOR_TO_FRONT)  #.rotate(ddd.ROT_TOP_CW)
    item = item.translate([-width * 0.5, 0, 0])
    item = item.material(ddd.mats.steel)
    item = ddd.uv.map_cubic(item)
    return item
Beispiel #16
0
def osm_augment_plants_generate_flowers(obj, osm, root):
    blade_density_m2 = 1.0 / 20.0
    num_blades = int((obj.area() * blade_density_m2))

    def filter_func_noise(coords):
        val = noise.pnoise2(coords[0],
                            coords[1],
                            octaves=2,
                            persistence=0.5,
                            lacunarity=2,
                            repeatx=1024,
                            repeaty=1024,
                            base=0)
        return (val > random.uniform(-0.5, 0.5))

    blades = ddd.group2(name='Flowers: %s' % obj.name)
    for p in obj.random_points(num_points=num_blades,
                               filter_func=filter_func_noise):
        blade = ddd.point(p, name="Flowers")
        #blade.extra['ddd:aug:status'] = 'added'
        blade.extra['ddd:item'] = 'flowers'
        blade.extra['ddd:flowers:type'] = random.choice(('blue', 'roses'))
        blades.append(blade)

    root.find("/ItemsNodes").append(blades.children)
Beispiel #17
0
def childrens_playground_slide(length=4.5, height=None, width=0.60):

    slide_thick = 0.03
    side_thick = 0.06
    if height is None:
        height = length * 0.45

    side_mat = random.choice([ddd.mats.metal_paint_red, ddd.mats.metal_paint_green, ddd.mats.metal_paint_yellow])

    slideline = ddd.point([0, 0], name="Slide").line_to([0.5, 0]).line_to([3, 1.5]).line_to([3.5, 1.5])
    # TODO: slideline.interpolate_cubic(), or slideline.smooth() or similar
    slideprofile = slideline.buffer(slide_thick / 2, cap_style=ddd.CAP_FLAT)
    slide = slideprofile.scale([1 / 4.5 * length, 1 / 2.0 * height])
    slide = slide.extrude(width - side_thick, center=True).rotate(ddd.ROT_FLOOR_TO_FRONT)
    slide = slide.material(ddd.mats.steel)
    slide = ddd.uv.map_cubic(slide)

    slidesideprofile = slideline.line_to([3.5, 1.7]).line_to([3, 1.7]).line_to([0.5, 0.2]).line_to([0, 0.2])
    slidesideprofile = ddd.polygon(list(slidesideprofile.geom.coords), name="Slide profile")
    stairssideprofile = ddd.polygon([[3.5, 1.5], [3.5, 2], [4, 2], [4, 1.5], [4.5, 0], [4.0, 0], [3.5, 1.5]])
    stairssideprofile = stairssideprofile.union(ddd.point([3.75, 2]).buffer(0.25, cap_style=ddd.CAP_ROUND))
    stairssideprofile = stairssideprofile.subtract(ddd.point([3.75, 2]).buffer(0.15, cap_style=ddd.CAP_ROUND, resolution=2))  # Hole
    stairssideprofile = stairssideprofile.translate([-0.25, 0])
    slidesideprofile = slidesideprofile.union(stairssideprofile)

    slidesideprofile = slidesideprofile.scale([1 / 4.5 * length, 1 / 2.0 * height])
    slidesideprofile = slidesideprofile.extrude(side_thick, center=True).rotate(ddd.ROT_FLOOR_TO_FRONT)
    slidesideprofile = slidesideprofile.material(side_mat)
    slidesideprofile = ddd.uv.map_cubic(slidesideprofile)

    slidesideprofile1 = slidesideprofile.translate([0, width / 2, 0])
    slidesideprofile2 = slidesideprofile.translate([0, -width / 2, 0])

    item = ddd.group([slide, slidesideprofile1, slidesideprofile2])

    numsteps = int((height - 1) / 0.3) + 1
    for i in range(numsteps):
        step = ddd.box([-0.1, -((width - side_thick) / 2), 0, 0.1, ((width - side_thick) / 2), 0.05], name="Slide Step")
        step = step.translate([4 - (i + 1) * (0.5 / (numsteps + 1)), 0, (i + 1) * 0.3]).material(ddd.mats.steel)
        step = ddd.uv.map_cubic(step)
        item.append(step)

    item = item.translate([-4.5/2, 0, 0]).rotate(ddd.ROT_TOP_CCW)

    item = ddd.meshops.batch_by_material(item).clean(remove_degenerate=False)

    return item
Beispiel #18
0
def room_items(root, pipeline, obj):

    points = obj.random_points(5)
    for p in points:
        pos = [p[0], p[1]]
        item = ddd.point(pos, "ItemRandom")
        item.extra['godot:instance'] = "res://scenes/items/ItemGeneric.tscn"
        root.find("/Items").append(item)
Beispiel #19
0
def osm_config_locale_es_vigo(root, osm, pipeline):
    config = ddd.point([-8.723, 42.238], name="Vigo Config")
    config.extra['osm:tree:type'] = {
        'default': 1.9,
        'fir': 0.1
    }  #, 'fir': 1, 'palm': 0.25}
    #config.extra['ddd:aug:itemfill:types'] = {'default': 1, 'fir': 1}

    pipeline.data['ddd:config:items'].append(config)
Beispiel #20
0
def floor_decoration_objects_fore(root, pipeline, obj):

    sprites_obj_floor = [
        ddd.mats.obj_bush_def,
        ddd.mats.obj_bush_wide,
        ddd.mats.obj_tree1,
        ddd.mats.obj_tree2,
        ddd.mats.obj_tree3,
        ddd.mats.obj_tree4,  # ddd.mats.obj_tree_intro,
        ddd.mats.obj_barsx4,
        ddd.mats.obj_plant,
        ddd.mats.obj_grid_panel,
        ddd.mats.obj_grid_panel_broken,
        ddd.mats.obj_plantsx1,
        ddd.mats.obj_plantsx3,
        ddd.mats.obj_flowerpot,
        ddd.mats.obj_flowers1,
        ddd.mats.obj_flowers2,
        # ddd.mats.obj_mailbox, ddd.mats.obj_bin, ddd.mats.obj_bench,
    ]

    line = obj.extra['floor_line']
    l = line.geom.length

    for d in (random.uniform(0.0, 1.0) *
              l, ):  # random.uniform(0.0, 1.0) * l):
        p, segment_idx, segment_coords_a, segment_coords_b = line.interpolate_segment(
            d)

        pos = [p[0], p[1] - 20.0]
        rndscale = random.uniform(0.8, 1.3)

        itempos = ddd.point(pos, "Floor Deco Object Fore")
        itempos = ddd.snap.project(itempos, line, +16.0 * rndscale)

        materials_floor = sprites_obj_floor
        material = random.choice(materials_floor)

        item = TextureAtlasUtils().create_sprite_rect(material)
        item = item.material(material)

        # TODO: Scale to sprite dimensions
        # item = item.scale([32.0, -32.0])
        rndscale = rndscale * material.extra.get("godot:obj:scale", 1.0)
        item.extra['godot:scale'] = [rndscale, rndscale]
        item = item.scale([rndscale, rndscale])

        item = ddd.align.anchor(item, [0.0, 0.5])

        item = item.translate(itempos.centroid())
        item.extra['ddd:angle'] = itempos.extra['ddd:angle'] - math.pi / 2.0
        item.extra['ddd:z_index'] = 39  #  39  # 45
        item.extra['godot:self_modulate'] = [
            0.45 * 255, 0.4 * 255, 0.4 * 255, 255
        ]
        item.extra['godot:light_mask'] = 0
        root.find("/Rooms/").append(item)
Beispiel #21
0
def osm_config_locale_es_huesca(root, osm, pipeline):
    config = ddd.point([-0.4116850, 42.1367415], name="Huesca Config")
    config.extra['osm:tree:type'] = {
        'default': 1,
        'fir': 0.1
    }  #, 'fir': 1, 'palm': 0.25}
    #config.extra['ddd:aug:itemfill:types'] = {'default': 1, 'fir': 1}

    pipeline.data['ddd:config:items'].append(config)
Beispiel #22
0
def treetop(r=1.75, flatness=0.3, subdivisions=1):
    treetop = ddd.sphere(center=ddd.point([random.uniform(-r * 0.2, r * 0.2), random.uniform(-r * 0.2, r * 0.2), 0]), r=r, subdivisions=subdivisions)
    treetop = treetop.scale([1.0, 1.0, (1.0 - flatness) * random.uniform(0.85, 1.15)])
    treetop = treetop.smooth(math.pi * 2 / 3)
    treetop = ddd.uv.map_spherical(treetop, scale=[3, 2])
    treetop = filters.noise_random(treetop, scale=0.25)
    treetop.extra['ddd:collider'] = False
    treetop.name = "Treetop"
    return treetop
Beispiel #23
0
def features_gen(pipeline, root, logger):

    area = ddd.disc(r=100.0)

    points_coords = area.random_points(num_points=200)
    points = ddd.group2([ddd.point(c) for c in points_coords], name="Points")
    points.extra['points_coords'] = points_coords

    root.find("/Features2").append(area)
    root.find("/Features2").append(points)
Beispiel #24
0
def patio_umbrella(side=2.5, height=2.5):
    base_height = 0.04
    base_side = 0.4
    base_weight = ddd.rect([base_side, base_side], name="Base weight").recenter()
    base_weight = base_weight.extrude(base_height).material(ddd.mats.metal_paint_white)
    base_weight = ddd.uv.map_cubic(base_weight)

    pole_r = 0.04
    pole = ddd.point(name="Pole").buffer(pole_r).extrude(height - base_height).translate([0, 0, base_height])
    pole = pole.material(ddd.mats.metal_paint_white)
    pole = ddd.uv.map_cylindrical(pole)

    umbrella_height = height - 1.8
    umbrella = ddd.rect([side, side], name="Umbrella").recenter().material(ddd.mats.rope)
    umbrella = umbrella.extrude_step(ddd.point(), umbrella_height, base=False, cap=False)
    umbrella = umbrella.twosided().translate([0, 0, height - umbrella_height - 0.02])
    umbrella = ddd.uv.map_cubic(umbrella)
    #EXTRUSION_METHOD_WRAP
    item = ddd.group([base_weight, pole, umbrella])
    return item
Beispiel #25
0
def ladder_pool(height=1.75, width=0.6):
    """
    """
    arc_thick = 0.08
    bar_thick = 0.05
    arc_radius = 0.35
    steps_interval = 0.30

    height_above_ground = arc_radius

    circleline = ddd.point([-arc_radius, 0], "Ladder").arc_to([arc_radius, 0], [0, 0], False, resolution=4)
    circleline = circleline.line_rel([0, -(height - height_above_ground)])
    circleline = circleline.arc_to([0, -(height - height_above_ground + arc_radius)], [0, -(height - height_above_ground)], False)
    #circleline = circleline.simplify(0.01)
    #regularpolygon(sides * 2, name="Childrens Playground Arc Side Arc").rotate(-math.pi / 2).outline().scale([length / 2, height])
    #arcline = circleline.intersection(ddd.rect([-length, 0.1, length, height * 2]))
    arc = circleline.buffer(arc_thick / 2, cap_style=ddd.CAP_FLAT)  #.intersection(ddd.rect([-length, 0, length, height * 2]))
    arc = arc.extrude(arc_thick, center=True).material(ddd.mats.steel)
    arc = arc.rotate(ddd.ROT_FLOOR_TO_FRONT)
    arc = ddd.uv.map_cubic(arc)

    arc1 = arc.copy().translate([0, -width / 2, 0])
    arc2 = arc.copy().translate([0, +width / 2, 0])
    item = ddd.group([arc1, arc2])

    bar = ddd.point(name="Ladder step").buffer(bar_thick / 2).extrude(width - arc_thick, center=True).rotate(ddd.ROT_FLOOR_TO_FRONT)
    bar = bar.material(ddd.mats.steel)
    bar = ddd.uv.map_cubic(bar)

    stepsline = ddd.line([[arc_radius, 0], [arc_radius, -(height - height_above_ground)]])
    numsteps = int(stepsline.length() / steps_interval) + 1
    step_interval_adjusted = stepsline.length() / numsteps
    for idx in range(numsteps):
        (p, segment_idx, segment_coords_a, segment_coords_b) = stepsline.interpolate_segment(idx * step_interval_adjusted)
        pbar = bar.copy().translate([p[0], 0, p[1]])
        item.append(pbar)

    item = item.combine()
    item = item.rotate(ddd.ROT_TOP_CW)

    return item
Beispiel #26
0
def post_box(height=1.10, r=0.35):
    circle = ddd.point([0, 0]).buffer(r, resolution=3, cap_style=ddd.CAP_ROUND)
    obj = circle.extrude_step(circle, 0.35)
    obj = obj.extrude_step(circle.scale([0.9, 0.9, 1]), 0.02)
    obj = obj.extrude_step(circle.scale([0.9, 0.9, 1]), height - 0.4)
    obj = obj.extrude_step(circle.scale([1.0, 1.0, 1]), 0.05)
    obj = obj.extrude_step(circle.scale([1.0, 1.0, 1]), 0.10)
    obj = obj.extrude_step(circle.scale([0.6, 0.6, 1]), 0.05)
    obj = obj.material(ddd.mats.metal_paint_yellow)
    obj = ddd.uv.map_cylindrical(obj)
    obj.name = "Post Box"
    logger.warn("Post Box collider should be a cylinder.")
    return obj
Beispiel #27
0
 def uv_apply_func(x, y, z, idx):
     # Find nearest point in path
     d = path.geom.project(ddd.point([x, y, z]).geom)
     #print(x, y, z, idx, d, path)
     interpolate_result = path.interpolate_segment(d)
     if interpolate_result:
         p, segment_idx, segment_coords_a, segment_coords_b = interpolate_result
         pol = LinearRing([segment_coords_a, segment_coords_b, [x, y, z]])
         return (line_x_offset + (line_x_width * (-1 if pol.is_ccw else 1)),
                 (d * line_d_scale) + line_d_offset)
     else:
         logger.error("Cannot interpolate segment: %s", path)
         return (line_x_offset, d)
Beispiel #28
0
    def generate_item_2d_childrens_playground(self, feature):

        # Distribute centers for seating (ideally, grid if shape is almost square, sampled if not)
        # For now, using center:

        center = feature.centroid()
        #if center.geom.is_empty: return ddd.group2()

        items = [ddd.point(name="Swingset Swing", extra={'osm:playground': 'swing'}),
                 ddd.point(name="Swingset Monkey Bar", extra={'osm:playground': 'monkey_bar'})]
        if random.uniform(0, 1) < 0.8:
            items.append(ddd.point(name="Swingset Sandbox", extra={'osm:playground': 'sandbox'}))
        if random.uniform(0, 1) < 0.8:
            items.append(ddd.point(name="Swingset Slide", extra={'osm:playground': 'slide'}))
        if random.uniform(0, 1) < 0.8:
            items.append(ddd.point(name="Swingset Swing 2", extra={'osm:playground': 'swing'}))

        items = ddd.group2(items, name="Childrens Playground: %s" % feature.name)

        items = ddd.align.polar(items, 3, offset=random.uniform(0, math.pi * 2))
        items = items.translate(center.geom.coords[0])

        return items
Beispiel #29
0
def ceiling_decoration_objects_fore(root, pipeline, obj):

    sprites_obj_ceiling = [  # ddd.mats.obj_pipes,
        ddd.mats.obj_vines1, ddd.mats.obj_vines2, ddd.mats.obj_vines_h1,
        ddd.mats.obj_vines_h2, ddd.mats.obj_cables_h, ddd.mats.obj_cables2,
        ddd.mats.obj_beam1, ddd.mats.obj_beam2
    ]

    line = obj.extra['ceiling_line']
    l = line.length()

    min_length = 50
    if l < min_length: return

    positions = [
        random.uniform(0.0, 1.0) * l for _ in range(1 + int(l / 200.0))
    ]
    for d in positions:
        p, segment_idx, segment_coords_a, segment_coords_b = line.interpolate_segment(
            d)

        pos = [p[0], p[1] - 20.0]
        rndscale = random.uniform(0.8, 1.3)

        itempos = ddd.point(pos, "Ceiling Deco Object")
        itempos = ddd.snap.project(itempos, line, 0.0 * rndscale)

        materials_ceiling = sprites_obj_ceiling
        material = random.choice(materials_ceiling)

        item = TextureAtlasUtils().create_sprite_rect(material)
        item.name = "Ceiling Deco Object Fore: %s" % material.name
        item = item.material(material)

        # TODO: Scale to sprite dimensions
        # item = item.scale([32.0, -32.0])
        item.extra['godot:scale'] = [rndscale, rndscale]
        item = item.scale([rndscale, rndscale])

        item = ddd.align.anchor(item, [0.5, -0.5])

        item = item.translate(itempos.centroid())
        # item.extra['ddd:angle'] = itempos.extra['ddd:angle'] - math.pi / 2.0
        item.extra['ddd:z_index'] = 39  #  39  # 45
        item.extra['godot:self_modulate'] = [
            0.35 * 255, 0.3 * 255, 0.3 * 255, 255
        ]
        item.extra['godot:light_mask'] = 0

        root.find("/Rooms/").append(item)
Beispiel #30
0
def room_items(root, pipeline, obj):

    obj = pipeline.data['rooms:background_union']

    points = obj.random_points(5)  #50

    return  # No random objects

    for p in points:
        pos = [p[0], p[1]]
        item = ddd.point(pos, "ItemRandom")
        item.extra['gdc:item'] = True
        item.extra['godot:instance'] = "res://scenes/items/ItemGeneric.tscn"
        root.find("/Items").append(item)