150 lines
4.4 KiB
GDScript
150 lines
4.4 KiB
GDScript
extends ImmediateGeometry
|
|
|
|
var signature
|
|
var u0
|
|
var xoffset
|
|
var yoffset
|
|
var minheight
|
|
var maxheight
|
|
var xverticesnumber
|
|
var yverticesnumber
|
|
var stretch
|
|
var u1
|
|
var u2
|
|
var u3
|
|
var u4
|
|
var version
|
|
var u6
|
|
var u7
|
|
var u8
|
|
var tex
|
|
|
|
var edges
|
|
var file = File.new()
|
|
|
|
var vertices = []
|
|
var triangles = []
|
|
|
|
func _ready():
|
|
return
|
|
clear()
|
|
readgti("res://default.gti")
|
|
# triangles = [[-1, 0, -1, 0, 1, 255, 251], [-1,0,1, 0, 224, 255, 0], [1,0,-1, 0, 1, 0, 0]]
|
|
print("vertices: "+str(len(vertices)))
|
|
print("draw "+str(len(triangles)))
|
|
assert(len(triangles) % 3 == 0)
|
|
begin(Mesh.PRIMITIVE_TRIANGLES)
|
|
for i in range(len(triangles)):
|
|
var vertex = triangles[i]
|
|
if not vertex:
|
|
print(i)
|
|
else:
|
|
print("color: ("+str(vertex[6] / 255.0)+")")
|
|
set_color(Color(vertex[4] / 255.0, vertex[5] / 255.0, vertex[6] / 255.0))
|
|
add_vertex(Vector3(vertex[0], vertex[2], vertex[1]))
|
|
end()
|
|
|
|
func fill():
|
|
print("version="+str(version))
|
|
# fill read values
|
|
print("fill")
|
|
var p = 0
|
|
while p < xverticesnumber * yverticesnumber:
|
|
var b = file.get_8()
|
|
if b >= 0x80:
|
|
while b != 0x00:
|
|
if p >= xverticesnumber * yverticesnumber:
|
|
return
|
|
b = (b + 1) & 0xFF
|
|
p+=1
|
|
else:
|
|
while b != 0xff:
|
|
if p >= xverticesnumber * yverticesnumber:
|
|
return
|
|
if version != 7:
|
|
vertices[p][2] = file.get_float() # height
|
|
vertices[p][3] = file.get_8() # triangulation
|
|
vertices[p][4] = file.get_8() # R
|
|
vertices[p][5] = file.get_8() # G
|
|
vertices[p][6] = file.get_8() # B
|
|
else:
|
|
vertices[p][2] = file.get_float() # height
|
|
vertices[p][3] = file.get_8() # triangulation
|
|
vertices[p][4] = file.get_8() # R
|
|
vertices[p][5] = file.get_8() # G
|
|
vertices[p][6] = file.get_8() # B
|
|
var unk = file.get_8() # unk
|
|
# print("["+ str(vertices[p][0]) + ", "+ str(vertices[p][1])+", "+ str(vertices[p][2])+", "+ str(vertices[p][3])+", "+ str(vertices[p][4])+", "+ str(vertices[p][5])+", "+ str(vertices[p][6])+", "+str(b)+"]")
|
|
p+=1
|
|
b = (b - 1) & 0xFF
|
|
|
|
func readgti(filename):
|
|
file.open(filename, File.READ)
|
|
if not file.is_open():
|
|
get_tree().quit()
|
|
return
|
|
signature = file.get_32()
|
|
u0 = file.get_32()
|
|
xoffset = file.get_float()
|
|
yoffset = file.get_float()
|
|
minheight = file.get_float()
|
|
maxheight = file.get_float()
|
|
xverticesnumber = file.get_32()
|
|
yverticesnumber = file.get_32()
|
|
stretch = file.get_float()
|
|
u1 = file.get_float()
|
|
u2 = file.get_float()
|
|
u3 = file.get_float()
|
|
u4 = file.get_float()
|
|
version = file.get_16()
|
|
u6 = file.get_16()
|
|
u7 = file.get_float()
|
|
u8 = file.get_float()
|
|
tex = file.get_buffer(32).get_string_from_ascii()
|
|
|
|
vertices.resize(xverticesnumber * yverticesnumber)
|
|
|
|
# initialize empty terrain
|
|
print("init")
|
|
for y in range(yverticesnumber):
|
|
for x in range(xverticesnumber):
|
|
vertices[y * xverticesnumber + x] = []
|
|
vertices[y * xverticesnumber + x].append(xoffset + x * stretch) # 0: x
|
|
vertices[y * xverticesnumber + x].append(yoffset + y * stretch) # 1: y
|
|
vertices[y * xverticesnumber + x].append(minheight) # 2: height
|
|
vertices[y * xverticesnumber + x].append(0) # 3: triangulation value
|
|
vertices[y * xverticesnumber + x].append(0) # 4: R
|
|
vertices[y * xverticesnumber + x].append(0) # 5: G
|
|
vertices[y * xverticesnumber + x].append(0) # 6: B
|
|
|
|
|
|
fill()
|
|
file.close()
|
|
|
|
# sort triangles
|
|
print("sort")
|
|
var i = 0
|
|
# triangles.resize(2*len(vertices))
|
|
for y in range(yverticesnumber-1):
|
|
for x in range(xverticesnumber-1):
|
|
var b = (vertices[y * xverticesnumber + x][3] & 7) % 128
|
|
if b == 4 or b == 5 or b == 7:
|
|
triangles.append(vertices[(y+1) * xverticesnumber + x])
|
|
triangles.append(vertices[y * xverticesnumber + x])
|
|
triangles.append(vertices[(y+1) * xverticesnumber + (x+1)])
|
|
if b == 5 or b == 3:
|
|
triangles.append(vertices[y * xverticesnumber + (x + 1)])
|
|
triangles.append(vertices[y * xverticesnumber + x])
|
|
triangles.append(vertices[(y + 1) * xverticesnumber + (x + 1)])
|
|
for y in range (yverticesnumber-1):
|
|
for x in range(xverticesnumber-1):
|
|
var b = (vertices[y * xverticesnumber + x][3] & 7) % 128
|
|
if b == 1 or b == 6:
|
|
triangles.append(vertices[(y + 1) * xverticesnumber + x])
|
|
triangles.append(vertices[y * xverticesnumber + x])
|
|
triangles.append(vertices[y * xverticesnumber + (x + 1)])
|
|
if b == 2 or b == 6:
|
|
triangles.append(vertices[y * xverticesnumber + (x + 1)])
|
|
triangles.append(vertices[(y + 1) * xverticesnumber + x])
|
|
triangles.append(vertices[(y + 1) * xverticesnumber + (x + 1)])
|