GiantsEditReloaded/terrain.gd

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)])