2022-11-20 04:45:58 +07:00
|
|
|
class_name ColFile
|
|
|
|
extends RefCounted
|
|
|
|
|
|
|
|
var fourcc: String
|
|
|
|
var file_size: int
|
|
|
|
var model_name: String
|
|
|
|
var model_id: int
|
|
|
|
var tbounds: TBounds
|
2022-11-20 05:55:40 +07:00
|
|
|
var collisions: Array[TBase]
|
2022-11-20 06:40:40 +07:00
|
|
|
var vertices: PackedVector3Array
|
2022-11-20 04:45:58 +07:00
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
fourcc = file.get_buffer(4).get_string_from_ascii()
|
2022-11-20 07:31:12 +07:00
|
|
|
assert(fourcc == "COLL")
|
2022-11-20 04:45:58 +07:00
|
|
|
file_size = file.get_32()
|
|
|
|
model_name = file.get_buffer(22).get_string_from_ascii()
|
|
|
|
model_id = file.get_16()
|
|
|
|
tbounds = TBounds.new(file)
|
|
|
|
for i in file.get_32():
|
2022-11-20 05:55:40 +07:00
|
|
|
collisions.append(TSphere.new(file))
|
2022-11-20 04:58:53 +07:00
|
|
|
file.get_32()
|
|
|
|
for i in file.get_32():
|
2022-11-20 05:55:40 +07:00
|
|
|
collisions.append(TBox.new(file))
|
2022-11-20 06:40:40 +07:00
|
|
|
var unsorted := PackedVector3Array()
|
|
|
|
for i in file.get_32():
|
|
|
|
unsorted.append(TVertex.new(file).position)
|
|
|
|
for i in file.get_32():
|
|
|
|
var face := TFace.new(file)
|
|
|
|
vertices.append(unsorted[face.a])
|
|
|
|
vertices.append(unsorted[face.b])
|
|
|
|
vertices.append(unsorted[face.c])
|
2022-11-20 04:45:58 +07:00
|
|
|
|
2022-11-20 04:55:03 +07:00
|
|
|
class TBase:
|
|
|
|
func read_vector3(file: FileAccess) -> Vector3:
|
2025-03-04 14:25:47 +07:00
|
|
|
# GTA3 uses a different coordinate system, so we need to convert
|
|
|
|
# the coordinates to Godot's coordinate system.
|
|
|
|
var x := file.get_float()
|
|
|
|
var y := file.get_float()
|
|
|
|
var z := file.get_float()
|
|
|
|
return Vector3(x, z, -y)
|
2022-11-20 04:55:03 +07:00
|
|
|
|
|
|
|
class TBounds extends TBase:
|
2022-11-20 04:45:58 +07:00
|
|
|
var radius: float
|
|
|
|
var center: Vector3
|
|
|
|
var min: Vector3
|
|
|
|
var max: Vector3
|
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
radius = file.get_float()
|
|
|
|
|
2022-11-20 04:55:03 +07:00
|
|
|
center = read_vector3(file)
|
|
|
|
min = read_vector3(file)
|
|
|
|
max = read_vector3(file)
|
2022-11-20 04:45:58 +07:00
|
|
|
|
2022-11-20 04:55:03 +07:00
|
|
|
class TSurface extends TBase:
|
2022-11-20 04:45:58 +07:00
|
|
|
var material: int
|
|
|
|
var flag: int
|
|
|
|
var brightness: int
|
|
|
|
var light: int
|
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
material = file.get_8()
|
|
|
|
flag = file.get_8()
|
|
|
|
brightness = file.get_8()
|
|
|
|
light = file.get_8()
|
|
|
|
|
2022-11-20 04:55:03 +07:00
|
|
|
class TSphere extends TBase:
|
2022-11-20 04:45:58 +07:00
|
|
|
var radius: float
|
|
|
|
var center: Vector3
|
|
|
|
var surface: TSurface
|
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
radius = file.get_float()
|
2022-11-20 04:55:03 +07:00
|
|
|
center = read_vector3(file)
|
2022-11-20 04:45:58 +07:00
|
|
|
surface = TSurface.new(file)
|
2022-11-20 04:58:53 +07:00
|
|
|
|
|
|
|
class TBox extends TBase:
|
|
|
|
var min: Vector3
|
|
|
|
var max: Vector3
|
|
|
|
var surface: TSurface
|
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
min = read_vector3(file)
|
|
|
|
max = read_vector3(file)
|
|
|
|
surface = TSurface.new(file)
|
2022-11-20 06:40:40 +07:00
|
|
|
|
|
|
|
class TVertex extends TBase:
|
|
|
|
var position: Vector3
|
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
position = read_vector3(file)
|
|
|
|
|
|
|
|
class TFace extends TBase:
|
|
|
|
var a: int
|
|
|
|
var b: int
|
|
|
|
var c: int
|
|
|
|
var surface: TSurface
|
|
|
|
|
|
|
|
func _init(file: FileAccess):
|
|
|
|
a = file.get_32()
|
|
|
|
b = file.get_32()
|
|
|
|
c = file.get_32()
|
|
|
|
surface = TSurface.new(file)
|