GiantsEditReloaded/ImmediateGeometry.gd

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