135 lines
4.0 KiB
GDScript
135 lines
4.0 KiB
GDScript
extends Node
|
|
|
|
var signature
|
|
var u0
|
|
var xoffset
|
|
var yoffset
|
|
var minheight
|
|
var maxheight
|
|
var heightscale
|
|
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
|
|
|
|
var vertices = []
|
|
var triangles = []
|
|
|
|
|
|
func _fill():
|
|
# fill read values
|
|
# print("fill")
|
|
var p = 0
|
|
while p < xverticesnumber * yverticesnumber:
|
|
var b = file.get_u8()
|
|
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() * heightscale # height
|
|
#if -5000 > vertices[p][2] or vertices[p][2] > 5000:
|
|
# print("wtf vertice was at "+str(vertices[p][2]))
|
|
vertices[p][3] = file.get_u8() # triangulation
|
|
vertices[p][4] = file.get_u8() # R
|
|
vertices[p][5] = file.get_u8() # G
|
|
vertices[p][6] = file.get_u8() # B
|
|
else:
|
|
vertices[p][2] = file.get_float() * heightscale # height
|
|
#if -5000 > vertices[p][2] or vertices[p][2] > 5000:
|
|
# print("wtf vertice was at "+str(vertices[p][2]))
|
|
vertices[p][3] = file.get_u8() # triangulation
|
|
vertices[p][4] = file.get_u8() # R
|
|
vertices[p][5] = file.get_u8() # G
|
|
vertices[p][6] = file.get_u8() # B
|
|
var _unk = file.get_u8() # unk
|
|
p+=1
|
|
b = (b - 1) & 0xFF
|
|
# 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)+"]")
|
|
|
|
func _readgti(f: StreamPeerBuffer):
|
|
self.file = f
|
|
signature = file.get_u32()
|
|
u0 = file.get_u32()
|
|
xoffset = file.get_float()
|
|
yoffset = file.get_float()
|
|
minheight = file.get_float()
|
|
maxheight = file.get_float()
|
|
xverticesnumber = file.get_u32()
|
|
yverticesnumber = file.get_u32()
|
|
stretch = file.get_float()
|
|
stretch = 40.0
|
|
heightscale = stretch/40.0 # normal stretch
|
|
u1 = file.get_float()
|
|
u2 = file.get_float()
|
|
u3 = file.get_float()
|
|
u4 = file.get_float()
|
|
version = file.get_u16()
|
|
u6 = file.get_u16()
|
|
u7 = file.get_float()
|
|
u8 = file.get_float()
|
|
|
|
tex = file.get_string(32)
|
|
print("tex: "+tex)
|
|
|
|
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()
|
|
|
|
# sort triangles
|
|
# print("sort")
|
|
# 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)])
|