def generate_residential_zone(centers, models, terrain, map, json_out):
    houses = models['houses']

    # for testing
    # houses = [h for h in houses if 'kittyvision/house11.dae' in h['full_path']]
    # assert len(houses) == 1

    num_gen = 0
    models = []
    for x, y, z in iterate_poisson_samples(centers, map,
                                           'Residential Buildings', 15, 1):
        pt = numpy.array([x, y, z], dtype=numpy.float32)
        pt = scene.mapgen_coords_to_sirikata(pt, terrain)

        scale = random.uniform(4.0, 8.0)

        m = scene.SceneModel(random.choice(houses)['full_path'],
                             x=float(pt[0]),
                             y=float(pt[1]),
                             z=float(pt[2]),
                             scale=scale,
                             model_type='house')
        models.append(m)

    models = remove_overlapping(models)
    for m in models:
        json_out.append(m.to_json())
        num_gen += 1

    print 'Generated (%d) Residential Buildings' % num_gen
def generate_commercial_zone(centers, models, terrain, map, json_out):
    commercial = models['commercial_buildings']

    # for testing
    # commercial = [c for c in commercial if 'emily2e/models/cityimport.dae' in c['full_path']]
    # assert len(commercial) == 1

    num_gen = 0
    models = []
    for x, y, z in iterate_poisson_samples(centers, map,
                                           'Commercial Buildings', 20, 2):
        pt = numpy.array([x, y, z], dtype=numpy.float32)
        pt = scene.mapgen_coords_to_sirikata(pt, terrain)

        scale = random.uniform(6.0, 10.0)

        m = scene.SceneModel(random.choice(commercial)['full_path'],
                             x=float(pt[0]),
                             y=float(pt[1]),
                             z=float(pt[2]),
                             scale=scale,
                             model_type='commercial')
        models.append(m)

    models = remove_overlapping(models)
    for m in models:
        json_out.append(m.to_json())
        num_gen += 1

    print 'Generated (%d) Commercial Buildings' % num_gen
def generate_winter(models, terrain, map, json_out):
    winter = models['winter']
    snow = [c for c in map.centers.values() if c.biome == 'SNOW']
    random.shuffle(snow)

    winter = winter + winter
    snow = snow[:len(winter)]

    for center, winter_model in progress.bar(
            zip(snow, winter), label='Generating winter objects...'):
        center_pt = numpy.array(
            [center.x, center.y, center.elevation * Z_SCALE],
            dtype=numpy.float32)
        center_pt = scene.mapgen_coords_to_sirikata(center_pt, terrain)
        scale = random.uniform(3.0, 10.0)

        m = scene.SceneModel(winter_model['full_path'],
                             x=float(center_pt[0]),
                             y=float(center_pt[1]),
                             z=float(center_pt[2]),
                             scale=scale,
                             model_type='winter')

        json_out.append(m.to_json())

    print 'Generated (%d) winter objects' % len(winter)
def generate_forest(centers, models, terrain, map, json_out, name, radius,
                    num_samples):
    trees = models['trees']

    # for testing
    # trees = [t for t in trees if 'jterrace/palm.dae' in t['full_path']]
    # assert len(trees) == 1

    num_gen = 0
    for x, y, z in iterate_poisson_samples(centers, map, name, radius,
                                           num_samples):
        pt = numpy.array([x, y, z], dtype=numpy.float32)
        pt = scene.mapgen_coords_to_sirikata(pt, terrain)

        scale = random.uniform(3.0, 10.0)

        m = scene.SceneModel(random.choice(trees)['full_path'],
                             x=float(pt[0]),
                             y=float(pt[1]),
                             z=float(pt[2]),
                             scale=scale,
                             model_type='tree')

        json_out.append(m.to_json())
        num_gen += 1

    print 'Generated (%d) %s' % (num_gen, name)
def generate_flying(models, terrain, map, json_out):
    terrain_bounds = scene.sirikata_bounds(terrain.boundsInfo)
    minpt, maxpt = terrain_bounds
    minpt *= terrain.scale
    maxpt *= terrain.scale
    height_max = (maxpt[2] - minpt[2]) * 1.20

    flying_models = models['flying']
    centers = map.centers.values()
    random.shuffle(centers)
    centers = centers[:len(flying_models)]
    for center, flying_model in progress.bar(
            zip(centers,
                flying_models), label='Generating flying objects... '):
        center_pt = numpy.array(
            [center.x, center.y, center.elevation * Z_SCALE],
            dtype=numpy.float32)
        center_pt = scene.mapgen_coords_to_sirikata(center_pt, terrain)

        rand_height = random.uniform(center_pt[2], height_max) * 1.10

        m = scene.SceneModel(flying_model['full_path'],
                             x=float(center_pt[0]),
                             y=float(center_pt[1]),
                             z=rand_height,
                             scale=random.uniform(1.0, 8.0),
                             model_type='flying')
        json_out.append(m.to_json())
    print 'Generated (%d) flying objects' % len(flying_models)
def generate_boats(models, terrain, map, json_out):
    boats = models['boats']
    oceans = [c for c in map.centers.values() if c.biome == 'OCEAN']
    lakes = [c for c in map.centers.values() if c.biome == 'LAKE']
    random.shuffle(lakes)
    random.shuffle(oceans)

    lakes = lakes[:len(boats)]
    oceans = oceans[:len(boats) * 2]
    centers = oceans + lakes
    boats = boats + boats + boats

    for center, boat_model in progress.bar(zip(centers, boats),
                                           label='Generating boats...'):
        center_pt = numpy.array(
            [center.x, center.y, center.elevation * Z_SCALE],
            dtype=numpy.float32)
        center_pt = scene.mapgen_coords_to_sirikata(center_pt, terrain)
        scale = random.uniform(5.0, 15.0)

        m = scene.SceneModel(boat_model['full_path'],
                             x=float(center_pt[0]),
                             y=float(center_pt[1]),
                             z=float(center_pt[2]) - scale * 2 * 0.05,
                             scale=scale,
                             model_type='boat')

        json_out.append(m.to_json())

    print 'Generated (%d) boat objects' % len(boats)
def generate_commercial_zone(centers, models, terrain, map, json_out):
    commercial = models['commercial_buildings']
    
    # for testing
    # commercial = [c for c in commercial if 'emily2e/models/cityimport.dae' in c['full_path']]
    # assert len(commercial) == 1
    
    num_gen = 0
    models = []
    for x, y, z in iterate_poisson_samples(centers, map, 'Commercial Buildings', 20, 2):
        pt = numpy.array([x,y,z], dtype=numpy.float32)
        pt = scene.mapgen_coords_to_sirikata(pt, terrain)
        
        scale = random.uniform(6.0, 10.0)
        
        m = scene.SceneModel(random.choice(commercial)['full_path'],
                       x=float(pt[0]),
                       y=float(pt[1]),
                       z=float(pt[2]),
                       scale=scale,
                       model_type='commercial')
        models.append(m)
    
    models = remove_overlapping(models)
    for m in models:            
        json_out.append(m.to_json())
        num_gen += 1
                
    print 'Generated (%d) Commercial Buildings' % num_gen
def generate_residential_zone(centers, models, terrain, map, json_out):
    houses = models['houses']
    
    # for testing
    # houses = [h for h in houses if 'kittyvision/house11.dae' in h['full_path']]
    # assert len(houses) == 1
    
    num_gen = 0
    models = []
    for x, y, z in iterate_poisson_samples(centers, map, 'Residential Buildings', 15, 1):
        pt = numpy.array([x,y,z], dtype=numpy.float32)
        pt = scene.mapgen_coords_to_sirikata(pt, terrain)
        
        scale = random.uniform(4.0, 8.0)
        
        m = scene.SceneModel(random.choice(houses)['full_path'],
                       x=float(pt[0]),
                       y=float(pt[1]),
                       z=float(pt[2]),
                       scale=scale,
                       model_type='house')
        models.append(m)
    
    models = remove_overlapping(models)
    for m in models:            
        json_out.append(m.to_json())
        num_gen += 1
                
    print 'Generated (%d) Residential Buildings' % num_gen
def generate_forest(centers, models, terrain, map, json_out, name, radius, num_samples):
    trees = models['trees']
    
    # for testing
    # trees = [t for t in trees if 'jterrace/palm.dae' in t['full_path']]
    # assert len(trees) == 1

    num_gen = 0 
    for x, y, z in iterate_poisson_samples(centers, map, name, radius, num_samples):
        pt = numpy.array([x,y,z], dtype=numpy.float32)
        pt = scene.mapgen_coords_to_sirikata(pt, terrain)
        
        scale = random.uniform(3.0, 10.0)
        
        m = scene.SceneModel(random.choice(trees)['full_path'],
                       x=float(pt[0]),
                       y=float(pt[1]),
                       z=float(pt[2]),
                       scale=scale,
                       model_type='tree')
        
        json_out.append(m.to_json())
        num_gen += 1
                
    print 'Generated (%d) %s' % (num_gen, name)
def generate_boats(models, terrain, map, json_out):
    boats = models['boats']
    oceans = [c for c in map.centers.values() if c.biome == 'OCEAN']
    lakes = [c for c in map.centers.values() if c.biome == 'LAKE']
    random.shuffle(lakes)
    random.shuffle(oceans)
    
    lakes = lakes[:len(boats)]
    oceans = oceans[:len(boats)*2]
    centers = oceans + lakes
    boats = boats + boats + boats
    
    for center, boat_model in progress.bar(zip(centers, boats), label='Generating boats...'):
        center_pt = numpy.array([center.x, center.y, center.elevation * Z_SCALE], dtype=numpy.float32)
        center_pt = scene.mapgen_coords_to_sirikata(center_pt, terrain)
        scale = random.uniform(5.0, 15.0)
        
        m = scene.SceneModel(boat_model['full_path'],
                       x=float(center_pt[0]),
                       y=float(center_pt[1]),
                       z=float(center_pt[2]) - scale * 2 * 0.05,
                       scale=scale,
                       model_type='boat')
        
        json_out.append(m.to_json())
    
    print 'Generated (%d) boat objects' % len(boats)
def generate_flying(models, terrain, map, json_out):
    terrain_bounds = scene.sirikata_bounds(terrain.boundsInfo)
    minpt, maxpt = terrain_bounds
    minpt *= terrain.scale
    maxpt *= terrain.scale
    height_max = (maxpt[2] - minpt[2]) * 1.20
    
    flying_models = models['flying']
    centers = map.centers.values()
    random.shuffle(centers)
    centers = centers[:len(flying_models)]
    for center, flying_model in progress.bar(zip(centers, flying_models), label='Generating flying objects... '):
        center_pt = numpy.array([center.x, center.y, center.elevation * Z_SCALE], dtype=numpy.float32)
        center_pt = scene.mapgen_coords_to_sirikata(center_pt, terrain)

        rand_height = random.uniform(center_pt[2], height_max) * 1.10
        
        m = scene.SceneModel(flying_model['full_path'],
                       x=float(center_pt[0]),
                       y=float(center_pt[1]),
                       z=rand_height,
                       scale=random.uniform(1.0, 8.0),
                       model_type='flying')
        json_out.append(m.to_json())
    print 'Generated (%d) flying objects' % len(flying_models)
def generate_winter(models, terrain, map, json_out):
    winter = models['winter']
    snow = [c for c in map.centers.values() if c.biome == 'SNOW']
    random.shuffle(snow)
    
    winter = winter + winter
    snow = snow[:len(winter)]
    
    for center, winter_model in progress.bar(zip(snow, winter), label='Generating winter objects...'):
        center_pt = numpy.array([center.x, center.y, center.elevation * Z_SCALE], dtype=numpy.float32)
        center_pt = scene.mapgen_coords_to_sirikata(center_pt, terrain)
        scale = random.uniform(3.0, 10.0)
        
        m = scene.SceneModel(winter_model['full_path'],
                       x=float(center_pt[0]),
                       y=float(center_pt[1]),
                       z=float(center_pt[2]),
                       scale=scale,
                       model_type='winter')
        
        json_out.append(m.to_json())
    
    print 'Generated (%d) winter objects' % len(winter)
def generate_roads(models, terrain, map, json_out):
    numroads = 0
    for center in progress.bar(map.centers.values(),
                               label='Generating roads... '):
        road_edges = [
            e for e in center.edges
            if e.is_road and e.corner0 is not None and e.corner1 is not None
        ]
        if len(road_edges) != 2:
            continue

        e1, e2 = road_edges
        e1_0 = numpy.array(
            [e1.corner0.x, e1.corner0.y, e1.corner0.elevation * Z_SCALE],
            dtype=numpy.float32)
        e1_1 = numpy.array(
            [e1.corner1.x, e1.corner1.y, e1.corner1.elevation * Z_SCALE],
            dtype=numpy.float32)
        e2_0 = numpy.array(
            [e2.corner0.x, e2.corner0.y, e2.corner0.elevation * Z_SCALE],
            dtype=numpy.float32)
        e2_1 = numpy.array(
            [e2.corner1.x, e2.corner1.y, e2.corner1.elevation * Z_SCALE],
            dtype=numpy.float32)

        region_center = numpy.array(
            [center.x, center.y, center.elevation * Z_SCALE])

        for end1, edge1, edge2 in [(region_center, e1_0, e1_1),
                                   (region_center, e2_0, e2_1)]:
            end2 = v3mid(edge1, edge2)

            midpt = v3mid(end1, end2)
            midpt = scene.mapgen_coords_to_sirikata(midpt, terrain)

            kata_pt1 = scene.mapgen_coords_to_sirikata(end1, terrain)
            kata_pt2 = scene.mapgen_coords_to_sirikata(end2, terrain)

            scale = v3dist(kata_pt1, kata_pt2) / 2

            m = scene.SceneModel(ROAD_PATH,
                                 x=float(midpt[0]),
                                 y=float(midpt[1]),
                                 z=float(midpt[2]),
                                 scale=scale,
                                 model_type='road')

            kataboundmin, kataboundmax = scene.sirikata_bounds(m.boundsInfo)
            scenemin = kataboundmin * scale + midpt
            scenemax = kataboundmax * scale + midpt
            xmid = (scenemax[0] - scenemin[0]) / 2.0 + scenemin[0]
            road_edge1 = numpy.array([xmid, scenemin[1], scenemin[2]],
                                     dtype=numpy.float32)
            road_edge2 = numpy.array([xmid, scenemax[1], scenemin[2]],
                                     dtype=numpy.float32)

            midv3 = Vec3(midpt[0], midpt[1], midpt[2])
            src = Vec3(road_edge2[0], road_edge2[1], road_edge2[2])
            src -= midv3
            src_copy = Vec3(src)
            target = Vec3(kata_pt1[0], kata_pt1[1], kata_pt1[2])
            target -= midv3
            cross = src.cross(target)
            w = math.sqrt(
                src.lengthSquared() * target.lengthSquared()) + src.dot(target)
            q = Quat(w, cross)
            q.normalize()

            orig_up = q.getUp()
            orig_up.normalize()

            edge1_kata = scene.mapgen_coords_to_sirikata(edge1, terrain)
            edge2_kata = scene.mapgen_coords_to_sirikata(edge2, terrain)
            new_up = normal_vector(kata_pt1, edge1_kata, edge2_kata)
            new_up = Vec3(new_up[0], new_up[1], new_up[2])
            rotate_about = orig_up.cross(new_up)
            rotate_about.normalize()
            angle_between = orig_up.angleDeg(new_up)
            r = Quat()
            r.setFromAxisAngle(angle_between, rotate_about)
            r.normalize()
            q *= r
            q.normalize()

            m.orient_x = q.getI()
            m.orient_y = q.getJ()
            m.orient_z = q.getK()
            m.orient_w = q.getR()

            numroads += 1
            json_out.append(m.to_json())

    print 'Generated (%d) road objects' % numroads
def generate_roads(models, terrain, map, json_out):
    numroads = 0
    for center in progress.bar(map.centers.values(), label='Generating roads... '):
        road_edges = [e for e in center.edges if e.is_road and e.corner0 is not None and e.corner1 is not None]
        if len(road_edges) != 2:
            continue
        
        e1, e2 = road_edges
        e1_0 = numpy.array([e1.corner0.x, e1.corner0.y, e1.corner0.elevation * Z_SCALE], dtype=numpy.float32)
        e1_1 = numpy.array([e1.corner1.x, e1.corner1.y, e1.corner1.elevation * Z_SCALE], dtype=numpy.float32)
        e2_0 = numpy.array([e2.corner0.x, e2.corner0.y, e2.corner0.elevation * Z_SCALE], dtype=numpy.float32)
        e2_1 = numpy.array([e2.corner1.x, e2.corner1.y, e2.corner1.elevation * Z_SCALE], dtype=numpy.float32)
        
        region_center = numpy.array([center.x, center.y, center.elevation * Z_SCALE])
        
        for end1, edge1, edge2 in [(region_center, e1_0, e1_1), (region_center, e2_0, e2_1)]:
            end2 = v3mid(edge1, edge2)
            
            midpt = v3mid(end1, end2)
            midpt = scene.mapgen_coords_to_sirikata(midpt, terrain)
            
            kata_pt1 = scene.mapgen_coords_to_sirikata(end1, terrain)
            kata_pt2 = scene.mapgen_coords_to_sirikata(end2, terrain)
            
            scale = v3dist(kata_pt1, kata_pt2) / 2
            
            m = scene.SceneModel(ROAD_PATH,
                           x=float(midpt[0]),
                           y=float(midpt[1]),
                           z=float(midpt[2]),
                           scale=scale,
                           model_type='road')
            
            kataboundmin, kataboundmax = scene.sirikata_bounds(m.boundsInfo)
            scenemin = kataboundmin * scale + midpt
            scenemax = kataboundmax * scale + midpt
            xmid = (scenemax[0] - scenemin[0]) / 2.0 + scenemin[0]
            road_edge1 = numpy.array([xmid, scenemin[1], scenemin[2]], dtype=numpy.float32)
            road_edge2 = numpy.array([xmid, scenemax[1], scenemin[2]], dtype=numpy.float32)
            
            midv3 = Vec3(midpt[0], midpt[1], midpt[2])
            src = Vec3(road_edge2[0], road_edge2[1], road_edge2[2])
            src -= midv3
            src_copy = Vec3(src)
            target = Vec3(kata_pt1[0], kata_pt1[1], kata_pt1[2])
            target -= midv3
            cross = src.cross(target)
            w = math.sqrt(src.lengthSquared() * target.lengthSquared()) + src.dot(target)
            q = Quat(w, cross)
            q.normalize()
            
            orig_up = q.getUp()
            orig_up.normalize()
            
            edge1_kata = scene.mapgen_coords_to_sirikata(edge1, terrain)
            edge2_kata = scene.mapgen_coords_to_sirikata(edge2, terrain)
            new_up = normal_vector(kata_pt1, edge1_kata, edge2_kata)
            new_up = Vec3(new_up[0], new_up[1], new_up[2])
            rotate_about = orig_up.cross(new_up)
            rotate_about.normalize()
            angle_between = orig_up.angleDeg(new_up)
            r = Quat()
            r.setFromAxisAngle(angle_between, rotate_about)
            r.normalize()
            q *= r
            q.normalize()
            
            m.orient_x = q.getI()
            m.orient_y = q.getJ()
            m.orient_z = q.getK()
            m.orient_w = q.getR()
            
            numroads += 1
            json_out.append(m.to_json())
    
    print 'Generated (%d) road objects' % numroads