Ejemplo n.º 1
0
    def _gen_texture(self, address, resolution=None):
        texture_name = None

        # If the a texture for the address has already been generated
        if address in self._generated_textures:
            texture_name = self._generated_textures[address]

        # Otherwise generate a new texture
        else:

            face = CubeSphereMap.get_address_face(address)
            level = len(address)

            name = "planet_texture"
            size = self._increments #256

            if not resolution is None:
                size = resolution

            data = None
            format_size = 4
            pitch = size * format_size
            format = "RGBA"

            #b = datetime.now()

            # Generate the data for the texture
            
            #perlin = Perlin(12345)

            # Generate sphere coordinates for the address
            # verts = []
            # for x in range(size):
            #     o = ""
            #     x /= float(size)

            #     for y in range(size):
            #         y /= float(size)
            #         # verts.append( Vector3(x, y, 0.5) )
            #         coord = CubeSphereMap.get_sphere_vector(x, y, face) * self._radius
            #         # #print coord
            #         verts.append( coord )

            #         o += " (%1.2f, %1.2f)" % (x, y)
            #verts = self._gen_verts(address)
            # mesh = self._generated_meshes[address]
            # verts = mesh.vertices
                
                #print o

            #ignoring faces
            #print verts
            # as image data is loaded from bottom-left to top-right vertex data
            # needs to be transformed as it is generated top-left to bottom-right

            # t_data = []
            # for x in xrange(size-1, -1, -1):
            #     row_start = x * size
            #     row_end = row_start + size
            #     t_data += verts[row_start:row_end]

            # for x in range(size):
            #     row_start = x * size
            #     row_end = row_start + size

                # o = ""
                # for v in verts[row_start:row_end]:
                #     o += " (%1.2f, %1.2f, %1.2f)" % (v.x, v.y, v.z)

            # Generate noise
            #data = [self._noise.ridged_multi_fractal3(v[0], v[1], v[2], 0, 1.0) for v in t_data]
            #data = [self._noise.ridged_multi_fractal3(v[0], v[1], v[2], 0, 1.0) for v in t_data]
            
            # data = [perlin.noise3(v.x, v.x, v.x) * 255.0 for v in verts]

            # first_scale = 8 * self._octaves

            #second_scale = 0.5 * self._octaves
            
            # data = []

            noise = self._generated_noise[address]

            # t_data = []
            # for x in xrange(size-1, -1, -1):
            #     row_start = x * size
            #     row_end = row_start + size
            #     t_data += noise[row_start:row_end]

            # for x in range(size):
            #     row_start = x * size
            #     row_end = row_start + size

            # noise = t_data

            colour_data = []

            #for v in verts:
            # for n in noise:
            for y in range(self._increments):#,-1,-1):
                nv = []
                for x in range(self._increments):#,-1,-1):

                    n = noise[x][y]
                    # # convert the height to a colour value
                    # #height = ( (v.magnitude() - self._radius) / self._max_height ) * 255.0

                    #nv.append(n)

                    # if n > 1.0:
                    #     print "n: %3.2f x: %d y: %d" % ( n, x, y)

                    height = (n * 128.0) + 128.0

                    # #height = 150.0
                    # #print height

                    colour = Preset.white

                    if 200 >= height >= 150:
                        colour = Preset.green
                    elif 150 > height > 100:
                        colour = Preset.yellow
                    elif 100 >= height:
                        colour = Preset.blue
                    
                    # if 50 > height:
                    #     colour = Preset.blue
                    # else:
                    #     colour = Preset.red

                    # if x == 0 or x == self._increments-1:
                    #     colour = Preset.yellow

                    # if y == 0 or y == self._increments-1:
                    #     colour = Preset.green
                    
                    # colour = Preset.red

                    # colour = colour.tinted(Preset.green, (y/float(size)))
                    # colour = colour.tinted(Preset.blue, (x/float(size)))

                    colour_data += [colour.r * 255.0, colour.g * 255.0, colour.b * 255.0, colour.a * 255.0]
                # s = ""
                # for n in noise[x]:
                #     s += "\t%0.3f," % n
                # print s

            #e = datetime.now() - b

            #print "%s Tex Colours Gen time: %3.5f" % (address, e.total_seconds())#(e.seconds +  (e.microseconds / 1000000.0) ) )

            # colour_data = []
            # for n in noise:
            
            #     nv.append(n)

            #     height = (n * 128.0) + 128.0

            #     if 100 > height:
            #         colour = Preset.blue
            #     else:
            #         colour = Preset.red

            #     colour_data += [colour.r * 255.0, colour.g * 255.0, colour.b * 255.0, colour.a * 255.0]

            #b = datetime.now()

            # Transform noise to colour data
            array_data = numpy.array(colour_data, 'f')

            # array_data = numpy.random.random_integers(low=0,
            #                                           high=255,
            #                                           size = (size * size, format_size))

            #array_data *= 255
            # array_data[:,3] = 255
            array_data.shape = -1
            tex_data = (GLubyte * array_data.size)(*array_data.astype('u1'))

            #test_plane = SceneManager.get_instance().current_scene.root.transform.get_child_with_name("test_plane")

            texture_name = "planet_texture_%s" % address
            
            new_planet_texture = GeneratedTexture(name=texture_name, width=size, height=size)
            new_planet_texture.wrapped = False
            new_planet_texture.smoothed = True

            new_planet_texture.set_data(format, pitch, tex_data)

            TextureManager.get_instance().add_texture(new_planet_texture)
            
            #test_plane.node.renderer.material.texture = "planet_texture"
            
            #e = datetime.now() - b

            #print "%s Tex Gen Vid card copy time: %3.5f" % (address, e.total_seconds())#(e.seconds +  (e.microseconds / 1000000.0) ) )

            #new_planet_texture.image.save(texture_name+'.png')

            self._generated_textures[address] = texture_name

        return texture_name