Ejemplo n.º 1
0
    def gen_mesh(self, address):
        mesh = None

        if address in self._generated_meshes:
            mesh = self._generated_meshes[address]

        else:

            #b = datetime.now()

            bound_min_x, bound_min_z, bound_max_x, bound_max_z, face = CubeSphereMap.get_address_bounds(address)

            verts, noise = self._gen_verts(address)
                    
            faces = []
            v = 0
            for c in xrange(self._increments):
                for r in xrange(self._increments):
                    bl = v + c + r
                    tl = bl + 1
                    tr = tl + self._increments + 1
                    br = tr - 1
                    
                    faces.append((bl, tl, tr))
                    faces.append((bl, tr, br))
                v = v + self._increments
            
            tex_coords = []
            
            bound_width = bound_max_x - bound_min_x
            bound_height = bound_max_z - bound_min_z

            for i in xrange(self._increments + 1):
                # Generate 0.0 - 1.0 local uv coords
                c = i * (1.0 / (self._increments))

                # generate global uv coords i.e. 0.2 - 0.3
                #c = (i * (bound_width / float(self._increments) ) ) + bound_min_x
                tc = []

                for j in xrange(self._increments + 1):
                    # local
                    r = j * ( 1.0 / (self._increments))
                    
                    # global
                    #r = (j * ( bound_height / float(self._increments) ) )+ bound_min_z
                    
                    #y = j/self._increments
                    p = [c,r] 
                    tex_coords.append(p)
                    tc.append(p)

                # s = ""
                # for n in tc:
                #     s += "\t(%0.3f,%0.3f)," % (n[0], n[1])
                # print s
            #print "%s Vertex gen time: %3.5f" % (address, (datetime.now() - b).total_seconds())

            b = datetime.now()

            # Build a mesh
            mesh = Mesh(verts, faces, Preset.green, tex_coords=tex_coords)
            self._generated_meshes[address] = mesh
            self._generated_noise[address] = noise

            #print "%s Mesh obj Gen time: %3.5f" % (address, (datetime.now() - b).total_seconds())
        
        return mesh
Ejemplo n.º 2
0
    def _gen_verts(self, address):
        bound_min_x, bound_min_z, bound_max_x, bound_max_z, face = CubeSphereMap.get_address_bounds(address)

        verts = []
        noise_x = []

        h_height = self._max_height / 2.0

        for i in xrange(self._increments + 1):
            #c = i * (1.0 / self._increments)
            c = (i * ( (bound_max_x - bound_min_x) / float(self._increments) ) ) + bound_min_x
            nv = []

            noise_y = []
            for j in xrange(self._increments + 1):
                #r = j * ( 1.0 / self._increments )
                r = (j * ( (bound_max_z - bound_min_z) / float(self._increments) ) ) + bound_min_z
                
                p = CubeSphereMap.get_sphere_vector(c, r, face) * self._radius
                
                n = Vector3()#c, r, -1) * self._radius
                if True:
                
                    u = c
                    v = r
                    u = (u * 2.0) - 1.0
                    v = (v * 2.0) - 1.0
                    if face == CubeSphereMap.BACK:
                        n = Vector3(-u, -v, -1) * self._radius
                    elif face == CubeSphereMap.LEFT:
                        n = Vector3(-1, -v, u) * self._radius
                    elif face == CubeSphereMap.RIGHT:
                        n = Vector3(1, -v, -u) * self._radius
                    elif face == CubeSphereMap.TOP:
                        n = Vector3(u, 1, v) * self._radius
                    elif face == CubeSphereMap.BOTTOM:
                        n = Vector3(u, -1, -v) * self._radius
                    elif face == CubeSphereMap.FRONT:
                        n = Vector3(u, -v, 1) * self._radius
                else:
                # Adjust the surface level using noise
                    n = p.copy()

                # if face == CubeSphereMap.RIGHT:
                #     n.x = self._radius
                # elif face == CubeSphereMap.LEFT:
                #     n.x = -self._radius
                # elif face == CubeSphereMap.TOP:
                #     n.y = self._radius
                # elif face == CubeSphereMap.BOTTOM:
                #     n.y = -self._radius
                # elif face == CubeSphereMap.FRONT:
                #     n.z = self._radius
                # elif face == CubeSphereMap.BACK:
                #     n.z = -self._radius

                frac = self._get_noise(n)
                
                # if i == 0 and j == 0:
                #     frac = 5.0
                # if i == self._increments and j == self._increments:
                #     frac = 10.0

                # if j in [4, 6, 8, 20, 25, 30]:
                #     frac = 1
                # else:
                #     frac = -1

                # if i in [5,6,20,21]:
                #     frac = 1

                #noise.append(frac)
                noise_y.append(frac)

                nv.append(frac)
                #h = noise * self._max_height
                h = (frac * h_height ) + h_height
                
                # Increase the surface vector by the noise value
                n = p.normalized()
                n *= h

                p += n

                verts.append((p.x, p.y, p.z))
            # s = ""
            # for n in nv:
            #     s += "\t%0.3f," % n
            # print s
            noise_x.append(noise_y)
        return verts, noise_x
Ejemplo n.º 3
0
    def _calc_corners(self):
        # Calculate the Cubic coordinates of this quad
        x0, y0, x1, y1, face = CubeSphereMap.get_address_bounds(self._name)

        self._corners = [x0, y0, x1, y1]
        self._centre_coords = CubeSphereMap.get_address_centre(self._name)
        self._quad_centres = [
                                CubeSphereMap.get_address_centre(self._name+'A'),
                                CubeSphereMap.get_address_centre(self._name+'B'),
                                CubeSphereMap.get_address_centre(self._name+'D'),
                                CubeSphereMap.get_address_centre(self._name+'C')
                             ]

        # if self._root:
        #     self._corners.append(0.0) #tl x
        #     self._corners.append(0.0) #tl y
        #     self._corners.append(1.0) #br x
        #     self._corners.append(1.0) #br y
        # else:
        #     parent_corners = self.transform.parent.node.corners
            
        #     if self._quad == QuadName.TL:
        #         self._corners.append(parent_corners[0])
        #         self._corners.append(parent_corners[1])
        #         self._corners.append(parent_corners[0] + (parent_corners[2] - parent_corners[0]) * 0.5 )
        #         self._corners.append(parent_corners[1] + (parent_corners[3] - parent_corners[1]) * 0.5 )
                
        #     elif self._quad == QuadName.TR:
        #         self._corners.append(parent_corners[0] + (parent_corners[2] - parent_corners[0]) * 0.5)
        #         self._corners.append(parent_corners[1])
        #         self._corners.append(parent_corners[2])
        #         self._corners.append(parent_corners[1] + (parent_corners[3] - parent_corners[1]) * 0.5 )
                
        #     elif self._quad == QuadName.BL:
        #         self._corners.append(parent_corners[0])
        #         self._corners.append(parent_corners[1] + (parent_corners[3] - parent_corners[1]) * 0.5)
        #         self._corners.append(parent_corners[0] + (parent_corners[2] - parent_corners[0]) * 0.5)
        #         self._corners.append(parent_corners[3])
                
            
        #     elif self._quad == QuadName.BR:
        #         self._corners.append(parent_corners[0] + (parent_corners[2] - parent_corners[0]) * 0.5)
        #         self._corners.append(parent_corners[1] + (parent_corners[3] - parent_corners[1]) * 0.5)
        #         self._corners.append(parent_corners[2])
        #         self._corners.append(parent_corners[3])
                
                
        # mid_x = (self._corners[2] - self._corners[0]) / 2
        # mid_y = (self._corners[3] - self._corners[1]) / 2
        
        # self._centre_coords = [(self._corners[0] + mid_x), (self._corners[1] + mid_y)]
        
        # self._quad_centres = [ [self._corners[0] + (mid_x/2), self._corners[1] + (mid_y/2)], #TL
        #                        [self._corners[2] - (mid_x/2), self._corners[1] + (mid_y/2)], #TR
        #                        [self._corners[2] - (mid_x/2), self._corners[3] - (mid_y/2)], #BR
        #                        [self._corners[0] + (mid_x/2), self._corners[3] - (mid_y/2)]  #BL
        #                      ]
        
        # Get world positions for centres of child quads
        self._child_pos = [CubeSphereMap.get_sphere_position(self._quad_centres[QuadName.TL][0],
                                                               self._quad_centres[QuadName.TL][1],
                                                               self._face,
                                                               self._sphere_parent.radius),
                             CubeSphereMap.get_sphere_position(self._quad_centres[QuadName.TR][0],
                                                               self._quad_centres[QuadName.TR][1],
                                                               self._face,
                                                               self._sphere_parent.radius),
                             CubeSphereMap.get_sphere_position(self._quad_centres[QuadName.BR][0],
                                                               self._quad_centres[QuadName.BR][1],
                                                               self._face,
                                                               self._sphere_parent.radius),
                             CubeSphereMap.get_sphere_position(self._quad_centres[QuadName.BL][0],
                                                               self._quad_centres[QuadName.BL][1],
                                                               self._face,
                                                               self._sphere_parent.radius),
                             ]