|
@@ -1,175 +1,158 @@
|
|
|
extends MeshInstance
|
|
|
|
|
|
-var latMin = 0
|
|
|
-var latMax = 1
|
|
|
-var lonMin = 0
|
|
|
-var lonMax = 1
|
|
|
-var resolution = 512
|
|
|
-var radius = 1737.4
|
|
|
-var rng = RandomNumberGenerator.new()
|
|
|
+var Point = preload("res://point.tscn")
|
|
|
+var TopoLoader = preload("res://TopoLoader.gd")
|
|
|
+var TextureLoader = preload("res://TextureLoader.gd")
|
|
|
+#var grid = load("res://tex/grid.png")
|
|
|
|
|
|
-var datafile = "user://sldem2015_512_00n_30n_000_045_float.img"
|
|
|
-var samplesPerLine = 23040
|
|
|
-var lines = 15360
|
|
|
-#var offset = 1737.4
|
|
|
-var scaleFact = 1
|
|
|
+var latMin:float = 0
|
|
|
+var latMax:float = 1
|
|
|
+var lonMin:float = 0.0
|
|
|
+var lonMax:float = 1.0
|
|
|
+var resolution:int = 512
|
|
|
+var radius:float = 10
|
|
|
+
|
|
|
+var origin:Vector3
|
|
|
+
|
|
|
+func setParams(latMinIN, latMaxIN, lonMinIN, lonMaxIN, resolutionIN, radiusIN:float):
|
|
|
+ latMin = latMinIN
|
|
|
+ latMax = latMaxIN
|
|
|
+ lonMin = lonMinIN
|
|
|
+ lonMax = lonMaxIN
|
|
|
+ resolution = resolutionIN
|
|
|
+ radius = radiusIN
|
|
|
|
|
|
-func init(startLat, startLon):
|
|
|
-
|
|
|
- self.latMin = startLat
|
|
|
- self.latMax = startLat + 1
|
|
|
- self.lonMin = startLon
|
|
|
- self.lonMax = startLon + 1
|
|
|
-
|
|
|
-# Called when the node enters the scene tree for the first time.
|
|
|
func _ready():
|
|
|
+ pass
|
|
|
+ #genMesh called from chunk
|
|
|
+ #self.genMesh()
|
|
|
|
|
|
- if ResourceLoader.exists("user://tile_"+str(latMin)+"-"+str(lonMin)+".tres"):
|
|
|
- print("loading tile from file: ", "user://tile_"+str(latMin)+"-"+str(lonMin)+".tres")
|
|
|
- mesh = ResourceLoader.load("user://tile_"+str(latMin)+"-"+str(lonMin)+".tres")
|
|
|
- else:
|
|
|
- self.genMesh()
|
|
|
-
|
|
|
- var texture = ImageTexture.new()
|
|
|
- var image = Image.new()
|
|
|
- #image.load("res://m-"+str(latMin+90)+"-"+str(lonMin+180)+".png")
|
|
|
- image.load("user://colorTiles/m-" + str(latMin+90)+"-"+str(lonMin+180)+".png")
|
|
|
- texture.create_from_image(image)
|
|
|
- var material=SpatialMaterial.new()
|
|
|
- material.albedo_texture = texture
|
|
|
- .set_material_override(material)
|
|
|
- #print("creating collition...")
|
|
|
- #.create_trimesh_collision()
|
|
|
-
|
|
|
func genMesh():
|
|
|
- var file = File.new()
|
|
|
- file.open(datafile, File.READ)
|
|
|
- #for lala in range(10):
|
|
|
- # file.seek(lala*samplesPerLine*4)
|
|
|
- # var blubb = ""
|
|
|
- # for bla in range(10):
|
|
|
- # blubb += " " + str(file.get_float())
|
|
|
- # print(blubb)
|
|
|
- rng.randomize()
|
|
|
+ #print("generating Mesh:")
|
|
|
+ #print("latMin: " + str(latMin))
|
|
|
+ #print("latMax: " + str(latMax))
|
|
|
+ #print("lonMin: " + str(lonMin))
|
|
|
+ #print("lonMax: " + str(lonMax))
|
|
|
+ #print("resolution: " + str(resolution))
|
|
|
+
|
|
|
+ var verts = convertToCartesian(genSphereCoords())
|
|
|
var arr = []
|
|
|
arr.resize(Mesh.ARRAY_MAX)
|
|
|
- #OS.delay_msec(2000)
|
|
|
- # PoolVectorXXArrays for mesh construction.
|
|
|
- var verts = PoolVector3Array()
|
|
|
- verts.resize((lonMax-lonMin) *resolution*(lonMax-lonMin) *resolution)
|
|
|
- var uvs = PoolVector2Array()
|
|
|
- uvs.resize((lonMax-lonMin) *resolution*(lonMax-lonMin) *resolution)
|
|
|
- var normals = PoolVector3Array()
|
|
|
- normals.resize((lonMax-lonMin) *resolution*resolution * (lonMax-lonMin))
|
|
|
- var indices = PoolIntArray()
|
|
|
- indices.resize(6* (lonMax-lonMin)*resolution*(lonMax-lonMin) * resolution*6)
|
|
|
- var i_idx = 0
|
|
|
+ arr[Mesh.ARRAY_VERTEX] = verts
|
|
|
+ arr[Mesh.ARRAY_TEX_UV] = genUV()
|
|
|
+ arr[Mesh.ARRAY_NORMAL] = genNormals(verts)
|
|
|
+ arr[Mesh.ARRAY_INDEX] = genIndex()
|
|
|
+ mesh = Mesh.new()
|
|
|
+ mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr)
|
|
|
+ var mat = SpatialMaterial.new()
|
|
|
+ #mat.albedo_color = Color(0.7,0.7,0.7,1)
|
|
|
+ var texl = TextureLoader.new()
|
|
|
+ mat.albedo_texture = texl.loadTexture(latMin, lonMin)
|
|
|
+ mesh.surface_set_material(0,mat)
|
|
|
+ .create_trimesh_collision()
|
|
|
|
|
|
+ var drawBubbles = false
|
|
|
+ if drawBubbles:
|
|
|
+ var i = 0.0
|
|
|
+ for vert in verts:
|
|
|
+ var point = Point.instance()
|
|
|
+ point.translate(vert)
|
|
|
+ var pointMat = SpatialMaterial.new()#point.mesh.surface_get_material(0)
|
|
|
+ mat.albedo_color = Color(i,0,0,1)
|
|
|
+ i+=0.1
|
|
|
+ point.mesh.surface_set_material(0,pointMat)
|
|
|
+ .get_parent().add_child(point)
|
|
|
|
|
|
- # Vertex indices.
|
|
|
- var thisrow = 0
|
|
|
- var prevrow = 0
|
|
|
- var point = 0
|
|
|
+func genNormals(verts:PoolVector3Array):
|
|
|
+ var normals = PoolVector3Array()
|
|
|
+ normals.resize(len(verts))
|
|
|
+ var v_idx = 0
|
|
|
+ for vert in verts:
|
|
|
+ normals[v_idx] = vert.normalized()
|
|
|
+ v_idx+=1
|
|
|
+ #print("normals")
|
|
|
+ #print(len(normals))
|
|
|
+ return normals
|
|
|
|
|
|
- print(
|
|
|
- "calculating segment "+str(latMin)+"-"+str(lonMin)+":\n",
|
|
|
- "lat:\n",
|
|
|
- " min: ", latMin*resolution, "\n",
|
|
|
- " max:", latMax*resolution, "\n",
|
|
|
- " count: ", (latMax-latMin) * resolution, "\n",
|
|
|
- "lon:\n",
|
|
|
- " min: ", lonMin*resolution, "\n",
|
|
|
- " max:", lonMax*resolution, "\n",
|
|
|
- " count: ", (lonMax-lonMin) * resolution, "\n"
|
|
|
- )
|
|
|
+func genUV():
|
|
|
+ var uvs = PoolVector2Array()
|
|
|
+ uvs.resize((resolution+1) * (resolution+1))
|
|
|
+ var v_idx = 0
|
|
|
+ for _y in range(0,resolution+1):
|
|
|
+ for _x in range(0,resolution+1):
|
|
|
+ var y = float(_y)
|
|
|
+ var x = float(_x)
|
|
|
+ var devider = float(resolution+1)
|
|
|
+ uvs[v_idx] = Vector2(x/devider,1-(y/devider))
|
|
|
+ v_idx+=1
|
|
|
+
|
|
|
+ #for v_idx in range(0,(resolution+1) * (resolution+1)):
|
|
|
+ # var y = v_idx / resolution
|
|
|
+ # var x = v_idx % resolution
|
|
|
+ # uvs[v_idx]=Vector2(clamp(x, 0, resolution),clamp(y, 0, resolution))
|
|
|
+ #print("uv")
|
|
|
+ #print(len(uvs))
|
|
|
+ return uvs
|
|
|
|
|
|
- #OS.delay_msec(2000)
|
|
|
-
|
|
|
- var vert = Vector3()
|
|
|
- # Loop over rings.
|
|
|
- for latPos in range(float(latMin)*resolution, float(latMax)*resolution):
|
|
|
- var latCur = float(latPos)/float(resolution)
|
|
|
- #jump to last line in file - current local lat - local startLat + local startLon
|
|
|
- file.seek(lines*samplesPerLine*4-latPos*samplesPerLine*4 - latMin*samplesPerLine*4 + lonMin*resolution*4)
|
|
|
- #file.seek(latPos*samplesPerLine*4 + latMin*samplesPerLine*4 + lonMin*resolution*4)
|
|
|
- #file.seek(latPos*samplesPerLine*4 + lonMin*resolution*4)
|
|
|
- #file.seek(((latMax*resolution-1-latPos)*samplesPerLine + lonMin*resolution)*4)
|
|
|
- #var v = float(latPos-latMin*resolution) / ((latMax-latMin) * resolution)
|
|
|
- var v = float(latPos-latMin*resolution) / ((latMax-latMin) * resolution)
|
|
|
- #var lat = float(latPos)*PI/(resolution*180)
|
|
|
- #var w = cos(lat)
|
|
|
- #var y = sin(lat)
|
|
|
- #print(v*100, "%")
|
|
|
-
|
|
|
- # Loop over segments in ring.
|
|
|
- for lonPos in range(float(lonMin)*resolution, float(lonMax)*resolution):
|
|
|
- var lonCur = float(lonPos)/float(resolution)
|
|
|
- var u = float(lonPos-lonMin*resolution) / ((lonMax - lonMin) * resolution)
|
|
|
- #var lon = float(lonPos)*PI/(resolution*180)
|
|
|
- #var x = sin(lon)
|
|
|
- #var z = cos(lon)
|
|
|
- #print("Lon: ", lon)
|
|
|
- #var height = file.get_float()/offset*radius+radius
|
|
|
- var height = file.get_float()+radius
|
|
|
- vert = Common.latLonToGlobal(latCur, lonCur, height)
|
|
|
- #vert = Vector3(scaleFact * x * height * w, scaleFact * y*height, scaleFact * z * height * w)
|
|
|
- verts[point] = vert
|
|
|
- normals[point] = vert.normalized()
|
|
|
- uvs[point] = Vector2(u, 1-v)
|
|
|
- point += 1
|
|
|
-
|
|
|
- # Create triangles in ring using indices.
|
|
|
- if latPos > lonMin*resolution and lonPos > lonMin*resolution:
|
|
|
- indices[i_idx] = (prevrow + (lonPos-lonMin*resolution) - 1)
|
|
|
- i_idx+=1
|
|
|
- indices[i_idx] = (thisrow + (lonPos-lonMin*resolution) - 1)
|
|
|
- i_idx+=1
|
|
|
- indices[i_idx] = (prevrow + (lonPos-lonMin*resolution))
|
|
|
- i_idx+=1
|
|
|
-
|
|
|
- indices[i_idx] = (prevrow + (lonPos-lonMin*resolution))
|
|
|
- i_idx+=1
|
|
|
- indices[i_idx] = (thisrow + (lonPos-lonMin*resolution) - 1)
|
|
|
- i_idx+=1
|
|
|
- indices[i_idx] = (thisrow + (lonPos-lonMin*resolution))
|
|
|
- i_idx+=1
|
|
|
-
|
|
|
-
|
|
|
- #if latPos > latMin*resolution:
|
|
|
- # indices[i_idx] = (prevrow + ((latMax - latMin) * resolution) - 1)
|
|
|
- # i_idx+=1
|
|
|
- # indices[i_idx] = (prevrow)
|
|
|
- # i_idx+=1
|
|
|
- # indices[i_idx] = (thisrow + ((latMax - latMin) * resolution) - 1)
|
|
|
- # i_idx+=1
|
|
|
-
|
|
|
- # indices[i_idx] = (prevrow)
|
|
|
- # i_idx+=1
|
|
|
- # indices[i_idx] = (prevrow + ((latMax - latMin) * resolution))
|
|
|
- # i_idx+=1
|
|
|
- # indices[i_idx] = (thisrow + ((latMax - latMin) * resolution) - 1)
|
|
|
- # i_idx+=1
|
|
|
- #print(vert)
|
|
|
-
|
|
|
- prevrow = thisrow
|
|
|
- thisrow = point
|
|
|
|
|
|
- file.close()
|
|
|
- print(vert)
|
|
|
- # Assign arrays to mesh array.
|
|
|
- arr[Mesh.ARRAY_VERTEX] = verts
|
|
|
- arr[Mesh.ARRAY_TEX_UV] = uvs
|
|
|
- arr[Mesh.ARRAY_NORMAL] = normals
|
|
|
- arr[Mesh.ARRAY_INDEX] = indices
|
|
|
+func genIndex():
|
|
|
+ var indices = PoolIntArray()
|
|
|
+ indices.resize(6* ((resolution) * (resolution)))
|
|
|
+
|
|
|
+ var i_idx = 0
|
|
|
+ for row in range(0, resolution):
|
|
|
+ for col in range(0,resolution):
|
|
|
+ var v_idx = row*(resolution+1)+col
|
|
|
+
|
|
|
+ indices[i_idx] = v_idx
|
|
|
+ i_idx+=1
|
|
|
+ indices[i_idx] = v_idx + resolution +1
|
|
|
+ i_idx+=1
|
|
|
+ indices[i_idx] = v_idx + 1
|
|
|
+ i_idx+=1
|
|
|
|
|
|
- mesh = Mesh.new()
|
|
|
- # Create mesh surface from mesh array.
|
|
|
- mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr)
|
|
|
- print(mesh)
|
|
|
- ResourceSaver.save("user://tile_"+str(latMin)+"-"+str(lonMin)+".tres", mesh, 32)
|
|
|
- print("saved tile_"+str(latMin)+"-"+str(lonMin))
|
|
|
+ indices[i_idx] = v_idx + resolution+1
|
|
|
+ i_idx+=1
|
|
|
+ indices[i_idx] = v_idx + resolution + 2
|
|
|
+ i_idx+=1
|
|
|
+ indices[i_idx] = v_idx + 1
|
|
|
+ i_idx+=1
|
|
|
+
|
|
|
+ #print("indices")
|
|
|
+ #print(len(indices))
|
|
|
+ return indices
|
|
|
+
|
|
|
+func genSphereCoords():
|
|
|
+ var tl = TopoLoader.new()
|
|
|
+ add_child(tl)
|
|
|
+ tl.open(latMin, lonMin)
|
|
|
+ tl.cacheArea(latMin, latMax, lonMin, lonMax)
|
|
|
+ var verts = PoolVector3Array()
|
|
|
+ var size = (resolution+1) * (resolution+1)#(lonMax-lonMin)*resolution * (latMax-latMin)*resolution
|
|
|
+ verts.resize(size)
|
|
|
|
|
|
+ var lonStep = (lonMax - lonMin)/resolution
|
|
|
+ var latStep = (latMax - latMin)/resolution
|
|
|
+ var v_idx = 0
|
|
|
+ for y in range(0,resolution+1):
|
|
|
+ for x in range(0,resolution+1):
|
|
|
+ var lat = latMin+latStep*y
|
|
|
+ var lon = lonMin+lonStep*x
|
|
|
+ verts[v_idx] = Vector3(lat, lon, radius+tl.read(lat,lon))
|
|
|
+ v_idx+=1
|
|
|
+ tl.close()
|
|
|
+ return verts
|
|
|
+
|
|
|
|
|
|
-# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
|
-#func _process(delta):
|
|
|
-# pass
|
|
|
+func convertToCartesian(verts:PoolVector3Array):
|
|
|
+ var carVerts = PoolVector3Array()
|
|
|
+ carVerts.resize(len(verts))
|
|
|
+ var v_idx = 0
|
|
|
+ for vert in verts:
|
|
|
+ if not origin:
|
|
|
+ origin = vert
|
|
|
+ carVerts[v_idx] = Common.latLonToGlobal(vert, Vector3())#, origin)
|
|
|
+ v_idx+=1
|
|
|
+ #print("Cartesian")
|
|
|
+ #print(len(carVerts))
|
|
|
+ return carVerts
|