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 latMin = 0 var latMax = 30 var lonMin = 0 var lonMax = 45 var cache = {} var file: File var fileReady = false signal fileReady # Called when the node enters the scene tree for the first time. func open(latMinIN, lonMinIn): latMin = (int(latMinIN)/30) * 30 latMax = latMin+30 lonMin = (int(lonMinIn)/45) * 45 lonMax = lonMin+45 if latMinIN >= 0: orientation = "N" else: orientation = "S" 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 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 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, latMax, orientation, 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