Beispiel #1
0
 def setView(self, x, y, z, h, p, r):
     self.viewOrigin = Vec3(x, y, z)
     self.viewAngles = Vec3(h, p, r)
     quat = Quat()
     quat.setHpr(self.viewAngles)
     self.viewAngleVectors = [
         quat.getRight(), quat.getForward(),
         quat.getUp()
     ]
def getUpHPR(hpr):
    q = Quat()
    q.setHpr(VBase3(math.degrees(hpr.h), math.degrees(hpr.p), math.degrees(hpr.r)))
    v = q.getUp()
    return SP3(v.x, v.y, v.z)
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
Beispiel #4
0
    def drawFern(self, LOD, pos, quat, drawResourcesFactory, scale=1.0):
        scalar = random.random()
        scale *= scalar

        if scale < .3: return

        count = int((scalar**.7) * 12)

        if scale < .8:
            if LOD == self.lowLOD: return
        else:
            if LOD == self.midLOD: return

        leafResources = drawResourcesFactory.getDrawResources(
            self.leafDataIndex[LOD])
        leafTri = leafResources.getGeomTriangles()
        vertexWriter = leafResources.getWriter("vertex")
        normalWriter = leafResources.getWriter("normal")

        if self.leafTexture:
            texcoordWriter = leafResources.getWriter("texcoord")

        scale *= self.scalar * 3

        q2 = Quat()
        q3 = Quat()

        for i in xrange(count):
            p = (random.random()**2) * 60 + 20
            h = random.random() * 360
            q2.setHpr((h, p, 0))
            q3.setHpr((h, p - 20 - p / 4, 0))

            length1 = scale * 4
            length2 = scale * 3

            f = q2.getForward() * length1
            r = q2.getRight() * scale * .5
            f2 = q3.getForward() * length2 + f
            norm0 = q2.getUp()
            norm2 = q3.getUp()
            norm1 = norm0 + norm2
            norm1.normalize()

            for x in range(2):
                leafRow = vertexWriter.getWriteRow()

                vertexWriter.addData3f(pos)
                vertexWriter.addData3f(pos + f + r)
                vertexWriter.addData3f(pos + f - r)
                vertexWriter.addData3f(pos + f2)

                if self.leafTexture:
                    texcoordWriter.addData2f(0, 0)
                    texcoordWriter.addData2f(0, 1)
                    texcoordWriter.addData2f(1, 0)
                    texcoordWriter.addData2f(1, 1)

                if x == 1:
                    # back sides
                    norm0 = -norm0
                    norm1 = -norm1
                    norm2 = -norm2
                    leafTri.addVertices(leafRow + 1, leafRow, leafRow + 2)
                    leafTri.addVertices(leafRow + 3, leafRow + 1, leafRow + 2)
                else:
                    leafTri.addVertices(leafRow, leafRow + 1, leafRow + 2)
                    leafTri.addVertices(leafRow + 1, leafRow + 3, leafRow + 2)

                normalWriter.addData3f(norm0)
                normalWriter.addData3f(norm1)
                normalWriter.addData3f(norm1)
                normalWriter.addData3f(norm2)
Beispiel #5
0
def getUpHPR(hpr):
    q = Quat()
    q.setHpr(VBase3(math.degrees(hpr.h), math.degrees(hpr.p),
                math.degrees(hpr.r)))
    v = q.getUp()
    return SP3(v.x, v.y, v.z)
 def drawFern(self,LOD,pos,quat,drawResourcesFactory,scale=1.0):
     scalar=random.random()
     scale*=scalar
     
     if scale<.3: return
     
     count=int((scalar**.7)*12)
     
     if scale<.8:
         if LOD==self.lowLOD: return
     else:
         if LOD==self.midLOD: return
     
     
     leafResources=drawResourcesFactory.getDrawResources(self.leafDataIndex[LOD])
     leafTri=leafResources.getGeomTriangles()
     vertexWriter=leafResources.getWriter("vertex")
     normalWriter=leafResources.getWriter("normal")
     
     if self.leafTexture:
         texcoordWriter = leafResources.getWriter("texcoord")
     
     
     
     scale*=self.scalar*3
     
     q2=Quat()
     q3=Quat()
     
     for i in xrange(count):
         p=(random.random()**2)*60+20
         h=random.random()*360
         q2.setHpr((h,p,0))
         q3.setHpr((h,p-20-p/4,0))
         
         length1=scale*4
         length2=scale*3
         
         f=q2.getForward()*length1
         r=q2.getRight()*scale*.5
         f2=q3.getForward()*length2+f
         norm0=q2.getUp()
         norm2=q3.getUp()
         norm1=norm0+norm2
         norm1.normalize()
         
         for x in range(2):
             leafRow = vertexWriter.getWriteRow()
         
             vertexWriter.addData3f(pos)
             vertexWriter.addData3f(pos+f+r)
             vertexWriter.addData3f(pos+f-r)
             vertexWriter.addData3f(pos+f2)
             
             
             if self.leafTexture:
                 texcoordWriter.addData2f(0,0)
                 texcoordWriter.addData2f(0,1)
                 texcoordWriter.addData2f(1,0)
                 texcoordWriter.addData2f(1,1)
         
             if x==1:
                 # back sides
                 norm0=-norm0
                 norm1=-norm1
                 norm2=-norm2
                 leafTri.addVertices(leafRow+1,leafRow,leafRow+2)
                 leafTri.addVertices(leafRow+3,leafRow+1,leafRow+2)
             else:
                 leafTri.addVertices(leafRow,leafRow+1,leafRow+2)
                 leafTri.addVertices(leafRow+1,leafRow+3,leafRow+2)
                 
             normalWriter.addData3f(norm0)
             normalWriter.addData3f(norm1) 
             normalWriter.addData3f(norm1) 
             normalWriter.addData3f(norm2)
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