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