extends Node #var Downloader = preload("res://downloader.gd") var filePrefix = "user://topo/" var formatString = "SLDEM2015_%s_%02d%s_%02d%s_%03d_%03d_FLOAT.IMG" # example sldem2015_512_00n_30n_000_045_float.img var datafile = "user://topo/sldem2015_512_00n_30n_000_045_float.img" var samplesPerLine = 23040 var lines = 15360 var offset = 1737.4*1000 var scaleFact = 1 var resolution = 512 var orientation: String = "N" var maxheight = 10.783 var minheight = -8.719 var latMin = 0 var latMax = 30 var lonMin = 0 var lonMax = 45 var cache = {} var file: File var fileReady = false onready var heightmap = Image.new() signal fileReady # Called when the node enters the scene tree for the first time. func open(latMinIN, lonMinIn): latMin = (int(latMinIN)/30) * 30 if latMinIN >= 0: orientation = "N" latMax = latMin+30 else: orientation = "S" latMax = latMin-30 lonMin = (int(lonMinIn)/45) * 45 lonMax = lonMin+45 file = File.new() print("opening topo: "+getFilepath()) var err = file.open(getFilepath(), File.READ) if err == 7: Downloader.connect("file_downloaded", self, "_http_request_completed") Downloader.download(getFilename(), "topo") var dl = Downloader.Download.new() while not dl._file_name == getFilepath(): dl = yield(Messenger, "fileDownloaded") file.open(getFilepath(), File.READ) fileReady = true emit_signal("fileReady") return true elif err != 0: push_error("error opening file err:%s" %err) return false else: fileReady = true return true func _http_request_completed(download): fileReady = true emit_signal("fileReady") func close(): file.close() #queue_free() func clear(): file.close() cache = {} func cacheArea(latMinIN, latMaxIN, lonMinIN, lonMaxIN): if not _validate(latMinIN,lonMinIN) and not _validate(latMaxIN,lonMaxIN) : print("out of scope!") return if not file.is_open(): var err = file.open(getFilepath(), File.READ) var lat = latMinIN while lat <= latMaxIN: cache[lat]={} var line = abs(lat)*resolution*samplesPerLine*4 # the origin of each .img file lies in it's upper left corner # so we need to read the files from the end on the northern hemisphere if lat >= 0: var origin = latMax*resolution*samplesPerLine*4 file.seek((origin - line) + lonMinIN*resolution*4) else: file.seek(line + lonMinIN*resolution*4) var lon = lonMinIN while lon <= lonMaxIN: cache[lat][lon] = file.get_float() lon += 1.0/float(resolution) lat += 1.0/float(resolution) return func createHeightmap(): var minLat var minLon var maxLat var maxLon var idxX = 0 var idxY = 0 var value = 0.0 heightmap.create(len(cache[cache.keys()[0]]), len(cache), false, Image.FORMAT_RF) heightmap.lock() for y in cache.keys(): if not minLat: minLat = y for x in cache[y].keys(): if not minLon: minLon = x value = inverse_lerp(minheight, maxheight, cache[y][x]) heightmap.set_pixel(idxX, idxY, Color(value,0,0))#Color(cache[y][x],0,0)) maxLon = x idxX += 1 maxLat = y idxY += 1 idxX = 0 heightmap.unlock() var heightmapfilepath = "user://heightmap/%s:%s-%s:%s.png"%[minLat, minLon, maxLat, maxLon] heightmap.save_png(heightmapfilepath) return heightmap func read(lat,lon): if _validate(lat,lon): return cache[lat][lon] else: print("out of scope!") func _validate(lat,lon): var condition = true if abs(lat) > latMax: condition = false if abs(lat) < latMin: condition = false if lon > lonMax: condition = false if lon < lonMin: condition = false return condition #if abs(lat) <= latMax and abs(lat) >= latMin and lon <= lonMax and lon >= lonMin: # return true #return false func getFilename(): # example sldem2015_512_00n_30n_000_045_float.img # "%s/sldem2015_%s_%0*d%s_%0*d%s_%00*d_%00*d_float.img" var properties if orientation == "S": properties = [resolution, abs(latMax), orientation, abs(latMin), orientation, lonMin, lonMax] else: properties = [resolution, latMin, orientation, latMax, orientation, lonMin, lonMax] return formatString % properties func getFilepath(): return filePrefix+getFilename() # Called every frame. 'delta' is the elapsed time since the previous frame. #func _process(delta): # pass