extends Node func get_terrain(gck_map: String) -> MeshInstance: var finalmesh = MeshInstance.new() var gdunzip = load("res://addons/gdunzip/gdunzip.gd").new() var loaded = gdunzip.load(gck_map) if loaded: var gti_file = null for f in gdunzip.files: if f.ends_with(".gti"): gti_file = f if not gti_file: print("Could not find any gti file in "+gck_map) return finalmesh var terrain_bytes = gdunzip.uncompress(gti_file) if not terrain_bytes: print("Failed to decompress default.gti") return finalmesh var terrain = load("res://terrain.gd").new() var stream = StreamPeerBuffer.new() stream.data_array = terrain_bytes terrain._readgti(stream) var st = SurfaceTool.new() st.begin(Mesh.PRIMITIVE_TRIANGLES) for v in terrain.triangles: st.add_color(Color(v[4] / 255.0, v[5] / 255.0, v[6] / 255.0)) st.add_vertex(Vector3(v[0], v[2], v[1])) var m = st.commit() finalmesh.mesh = m # create heightmap and colormap var heightmap = Image.new() var colormap = Image.new() heightmap.create(terrain.xverticesnumber, terrain.yverticesnumber, false, Image.FORMAT_RGBA8) colormap.create(terrain.xverticesnumber, terrain.yverticesnumber, false, Image.FORMAT_RGBA8) heightmap.lock() colormap.lock() var minheight = terrain.minheight var maxheight = terrain.maxheight for x in range(terrain.xverticesnumber): for y in range(terrain.yverticesnumber): var height = terrain.vertices[y * terrain.xverticesnumber + x][2] var greypercentage = (height-minheight)/(maxheight-minheight) heightmap.set_pixel(x, y, Color(greypercentage, greypercentage , greypercentage)) var r = terrain.vertices[y * terrain.xverticesnumber + x][4] var g = terrain.vertices[y * terrain.xverticesnumber + x][5] var b = terrain.vertices[y * terrain.xverticesnumber + x][6] colormap.set_pixel(x, y, Color8(r, g, b)) heightmap.unlock() colormap.unlock() heightmap.save_png("res://heightmap.png") colormap.save_png("res://colormap.png") else: print("Could not open map "+gck_map) return finalmesh var mat = SpatialMaterial.new() mat.vertex_color_use_as_albedo = true mat.params_cull_mode = SpatialMaterial.CULL_DISABLED finalmesh.material_override = mat return finalmesh func read_pstring(s: StreamPeerBuffer) -> String: var res = '' var c = s.get_u8() while c != 0: var a = PoolByteArray([c]) res+=a.get_string_from_ascii() return res func load_bin(stream: StreamPeerBuffer) -> void: pass func read_chunk(stream: StreamPeerBuffer, chunktype: int): match(chunktype): 0x17: var scale = stream.get_float() 0x1d: var outdome_texture = stream.get_string(16) 0x1e: var dome_texture = stream.get_string(16) 0x1f: var dome_edge_texture = stream.get_string(16) 0x20: var WFall1Tex = stream.get_string(16) 0x21: var WFall2Tex = stream.get_string(16) 0x22: var WFall3Tex = stream.get_string(16) 0x23: var space_line_texture = stream.get_string(16) 0x24: var space_texture = stream.get_string(16) 0x25: var sea_texture = stream.get_string(16) 0x26: var glow_texture = stream.get_string(16) 0x27: var teleport = {} teleport["Index"] = stream.get_u8() teleport["X"] = stream.get_float() teleport["Y"] = stream.get_float() teleport["Z"] = stream.get_float() teleport["Angle"] = stream.get_float() 0x28: var r = stream.get_u8() var g = stream.get_u8() var b = stream.get_u8() var sun_color = [r, g, b] 0x29: var fog = {} fog["NearDistance"] = stream.get_float() fog["FarDistance"] = stream.get_float() var r = stream.get_u8() var g = stream.get_u8() var b = stream.get_u8() fog["Color"] = [r, g, b] 0x2a: var type = stream.get_32() var x = stream.get_float() var y = stream.get_float() var z = stream.get_float() var angle = stream.get_float() 0x2c: var music = stream.get_string(32)