X models load once again, and DOORS!

This commit is contained in:
Holly Stubbs 2025-02-23 02:20:22 +00:00
parent 3682456169
commit 42164dd611
Signed by: tgpholly
GPG key ID: B8583C4B7D18119E
5 changed files with 141 additions and 71 deletions

View file

@ -33,7 +33,7 @@ script = ExtResource("2_co6fy")
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
[node name="CSGBox3D" type="CSGBox3D" parent="."] [node name="CSGBox3D" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.97521, -1.86909, -3.06) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 100, -1.86909, -3.06)
visible = false visible = false
use_collision = true use_collision = true
size = Vector3(15.4238, 0.866943, 15.2599) size = Vector3(15.4238, 0.866943, 15.2599)
@ -41,4 +41,4 @@ size = Vector3(15.4238, 0.866943, 15.2599)
[node name="Label3D" type="Label3D" parent="."] [node name="Label3D" type="Label3D" parent="."]
[node name="Player" parent="." instance=ExtResource("3_58gow")] [node name="Player" parent="." instance=ExtResource("3_58gow")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.74637, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 100, 0, 0)

View file

@ -6,7 +6,11 @@ func _ready() -> void:
#add_child(B3D.Load("GFX\\apache.b3d")) #add_child(B3D.Load("GFX\\apache.b3d"))
#add_child(X.LoadModel("res://GFX/map/Door01.x")) #add_child(X.LoadModel("res://GFX/map/Door01.x"))
add_child(X.LoadModel("res://GFX/map/DoorFrame.x")) #var modl = X.LoadModel("res://GFX/map/DoorFrame.x")
#modl.scale.x = Constants.RoomScale
#modl.scale.y = Constants.RoomScale
#modl.scale.z = Constants.RoomScale
#add_child(modl)
#DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) #DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
@ -14,8 +18,8 @@ func _ready() -> void:
#CreateMap() #CreateMap()
IntroEnabled = true IntroEnabled = true
#LoadRoomTemplates("Data/rooms.ini") LoadRoomTemplates("Data/rooms.ini")
#CreateMap() CreateMap()
var IntroEnabled: bool var IntroEnabled: bool
var I_Zone: MapZones = MapZones.new() var I_Zone: MapZones = MapZones.new()
@ -120,12 +124,17 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
#entityType d\obj2, HIT_MAP #entityType d\obj2, HIT_MAP
#scaleentity(d\obj, 0.1, 0.1, 0.1) #scaleentity(d\obj, 0.1, 0.1, 0.1)
d.frameobj.position.x = x
d.frameobj.position.y = y
d.frameobj.position.z = z
d.frameobj.scale.x = Constants.RoomScale d.frameobj.scale.x = Constants.RoomScale
d.frameobj.scale.y = Constants.RoomScale d.frameobj.scale.y = Constants.RoomScale
d.frameobj.scale.z = Constants.RoomScale d.frameobj.scale.z = Constants.RoomScale
d.obj.name = str("doar ", doors.size() - 1)
parent.add_child(d.frameobj)
parent.add_child(d.obj)
d.frameobj.global_position.x = x
d.frameobj.global_position.y = y
d.frameobj.global_position.z = z
#EntityPickMode d\frameobj,2 #EntityPickMode d\frameobj,2
#EntityType d\obj, HIT_MAP #EntityType d\obj, HIT_MAP
#EntityType d\obj2, HIT_MAP #EntityType d\obj2, HIT_MAP
@ -156,48 +165,55 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
d.buttons[i].scale.y = 0.03 d.buttons[i].scale.y = 0.03
d.buttons[i].scale.z = 0.03 d.buttons[i].scale.z = 0.03
if big: if big > 0:
d.buttons[0].position.x = x - 432.0 * Constants.RoomScale d.buttons[0].global_position.x = x - 432.0 * Constants.RoomScale
d.buttons[0].position.y = y + 0.7 d.buttons[0].global_position.y = y + 0.7
d.buttons[0].position.z = z + 192.0 * Constants.RoomScale d.buttons[0].global_position.z = z + 192.0 * Constants.RoomScale
d.buttons[1].position.x = x + 432.0 * Constants.RoomScale d.buttons[1].global_position.x = x + 432.0 * Constants.RoomScale
d.buttons[1].position.y = y + 0.7 d.buttons[1].global_position.y = y + 0.7
d.buttons[1].position.z = z - 192.0 * Constants.RoomScale d.buttons[1].global_position.z = z - 192.0 * Constants.RoomScale
d.buttons[0].rotation.y = 90 d.buttons[0].rotation.y = 90
d.buttons[1].rotation.y = 270 d.buttons[1].rotation.y = 270
else: else:
d.buttons[0].position.x = x + 0.6 d.buttons[0].global_position.x = x + 0.6
d.buttons[0].position.y = y + 0.7 d.buttons[0].global_position.y = y + 0.7
d.buttons[0].position.z = z - 0.1 d.buttons[0].global_position.z = z - 0.1
d.buttons[1].position.x = x - 0.6 d.buttons[1].global_position.x = x - 0.6
d.buttons[1].position.y = y + 0.7 d.buttons[1].global_position.y = y + 0.7
d.buttons[1].position.z = z + 0.1 d.buttons[1].global_position.z = z + 0.1
d.buttons[1].rotation.y = 180 d.buttons[1].rotation.y = 180
#EntityPickMode(d\buttons[0], 2) #EntityPickMode(d\buttons[0], 2)
#EntityPickMode(d\buttons[1], 2) #EntityPickMode(d\buttons[1], 2)
d.obj.position.x = x d.obj.global_position.x = x
d.obj.position.y = y d.obj.global_position.y = y
d.obj.position.z = z d.obj.global_position.z = z
d.obj.rotation.y = angle d.obj.rotation.y = deg_to_rad(angle)
d.frameobj.rotation.y = angle d.frameobj.rotation.y = deg_to_rad(angle)
if d.obj2 != null: if d.obj2 != null:
d.obj2.position.x = x
d.obj2.position.y = y
d.obj2.position.z = z
if big:
d.obj2.rotation.y = angle
else:
d.obj2.rotation.y = angle + 180
parent.add_child(d.obj2) parent.add_child(d.obj2)
d.obj2.global_position.x = x
d.obj2.global_position.y = y
d.obj2.global_position.z = z
var text3 = Label3D.new()
text3.position.y = 10
text3.scale.x = 3
text3.scale.y = 3
text3.scale.z = 3
text3.billboard = BaseMaterial3D.BILLBOARD_ENABLED
text3.name = "Egg"
d.obj2.add_child(text3)
d.obj2.set_script(load("res://src/stinky.gd"))
if big > 0:
d.obj2.rotation.y = deg_to_rad(angle)
else:
d.obj2.rotation.y = deg_to_rad(angle + 180)
parent.add_child(d.frameobj)
parent.add_child(d.obj)
d.angle = angle d.angle = angle
d.open = dopen d.open = dopen
@ -2328,18 +2344,19 @@ func FillRoom(r:Room):
#r\Objects[1] = sc\ScrObj #r\Objects[1] = sc\ScrObj
# #
#;[End Block] #;[End Block]
#Case "endroom" elif rn == "endroom":
#;[Block] r.RoomDoors[0] = CreateDoor(r.zone, r.x, 0, r.z + 1136 * Constants.RoomScale, 0, r, false, true, 6)
#r\RoomDoors[0] = CreateDoor(r\zone, r\x, 0, r\z + 1136 * RoomScale, 0, r, False, True, 6) r.RoomDoors[0].AutoClose = false
#r\RoomDoors[0]\AutoClose = False : r\RoomDoors[0]\open = False r.RoomDoors[0].open = false
#FreeEntity r\RoomDoors[0]\buttons[0] : r\RoomDoors[0]\buttons[0]=0 r.RoomDoors[0].buttons[0].queue_free()
#FreeEntity r\RoomDoors[0]\buttons[1] : r\RoomDoors[0]\buttons[1]=0 r.RoomDoors[0].buttons[0] = null
#;[End Block] r.RoomDoors[0].buttons[1].queue_free()
#Case "endroomc" r.RoomDoors[0].buttons[1] = null
#;[Block] elif rn == "endroomc":
#d = CreateDoor(r\zone, r\x+1024*RoomScale, 0, r\z, 0, r, False, 2, False, "") var d = CreateDoor(r.zone, r.x + 1024 * Constants.RoomScale, 0, r.z, 0, r, false, 2, false, "")
#d\open = False : d\AutoClose = False : d\locked = True d.open = false
#;[End Block] d.AutoClose = false
d.locked = true
#Case "coffin" #Case "coffin"
#;[Block] #;[Block]
#d = CreateDoor(r\zone, r\x, 0, r\z - 448.0 * RoomScale, 0, r, False, True, 2) #d = CreateDoor(r\zone, r\x, 0, r\z - 448.0 * RoomScale, 0, r, False, True, 2)
@ -2498,14 +2515,14 @@ func FillRoom(r:Room):
r.Objects[i].scale.z = Constants.RoomScale r.Objects[i].scale.z = Constants.RoomScale
#EntityPickMode(r\Objects[i], 2) #EntityPickMode(r\Objects[i], 2)
r.Objects[0].position.x = r.x
r.Objects[0].position.y = r.y + 190.0 * Constants.RoomScale
r.Objects[0].position.z = r.z + 374.0 * Constants.RoomScale
r.Objects[1].position.x = r.x
r.Objects[1].position.y = r.y + 230.0 * Constants.RoomScale
r.Objects[1].position.z = r.z + 374.0 * Constants.RoomScale
r.obj.add_child(r.Objects[0]) r.obj.add_child(r.Objects[0])
r.obj.add_child(r.Objects[1]) r.obj.add_child(r.Objects[1])
r.Objects[0].global_position.x = r.x
r.Objects[0].global_position.y = r.y + 190.0 * Constants.RoomScale
r.Objects[0].global_position.z = r.z + 374.0 * Constants.RoomScale
r.Objects[1].global_position.x = r.x
r.Objects[1].global_position.y = r.y + 230.0 * Constants.RoomScale
r.Objects[1].global_position.z = r.z + 374.0 * Constants.RoomScale
#d = CreateDoor(r\zone, r\x - 624.0 * RoomScale, 0.0, r\z + 528.0 * RoomScale, 180, r, True) #d = CreateDoor(r\zone, r\x - 624.0 * RoomScale, 0.0, r\z + 528.0 * RoomScale, 180, r, True)
#FreeEntity (d\obj2) : d\obj2 = 0 #FreeEntity (d\obj2) : d\obj2 = 0

View file

@ -4,6 +4,8 @@ class_name X
# https://learn.microsoft.com/en-us/windows/win32/direct3d9/dx9-graphics-reference-x-file-interfaces # https://learn.microsoft.com/en-us/windows/win32/direct3d9/dx9-graphics-reference-x-file-interfaces
# NOTE: adaptation of https://github.com/oguna/Blender-XFileImporter/blob/master/xfile_parser.py # NOTE: adaptation of https://github.com/oguna/Blender-XFileImporter/blob/master/xfile_parser.py
static var loadCache: Dictionary
var currentFilePath = "" var currentFilePath = ""
var majorVersion = 0 var majorVersion = 0
var minorVersion = 0 var minorVersion = 0
@ -18,6 +20,7 @@ var file: PackedByteArray
var scene = Node3D.new() var scene = Node3D.new()
var meshes: Array var meshes: Array
var materials: Array var materials: Array
var finalMeshes: Array
const MAX_TEX_COORDS = 2 const MAX_TEX_COORDS = 2
@ -43,6 +46,31 @@ static func _CalcMinMaxPos(verts: PackedVector3Array) -> Vector3:
maxZ = vert.z maxZ = vert.z
return Vector3(abs(minX - maxX), abs(minY - maxY), abs(minZ - maxZ)) return Vector3(abs(minX - maxX), abs(minY - maxY), abs(minZ - maxZ))
static func _CalcMinMaxPosTotal(finalMeshes: Array) -> Vector3:
var minX: float = 0
var maxX: float = 0
var minY: float = 0
var maxY: float = 0
var minZ: float = 0
var maxZ: float = 0
for mesh in finalMeshes:
var meshX = mesh.get_meta("meshWidth")
var meshY = mesh.get_meta("meshHeight")
var meshZ = mesh.get_meta("meshDepth")
if meshX < minX:
minX = meshX
if meshX > maxX:
maxX = meshX
if meshY < minY:
minY = meshY
if meshY > maxY:
maxY = meshY
if meshZ < minZ:
minZ = meshZ
if meshZ > maxZ:
maxZ = meshZ
return Vector3(abs(minX - maxX), abs(minY - maxY), abs(minZ - maxZ))
static func MeshWidth(mesh: Node) -> float: static func MeshWidth(mesh: Node) -> float:
return mesh.get_meta("meshWidth") return mesh.get_meta("meshWidth")
@ -71,7 +99,7 @@ func FindNextNonWhiteSpace():
return return
while true: while true:
while p < end and (GetStringBytes(p, p + 1) == " " or GetStringBytes(p, p + 1) == "\r" or GetStringBytes(p, p + 1) == "\n"): while p < end and (GetStringBytes(p, p + 1) == " " or GetStringBytes(p, p + 1) == "\n"):
if GetStringBytes(p, p + 1) == "\n": if GetStringBytes(p, p + 1) == "\n":
lineNumber += 1 lineNumber += 1
p += 1 p += 1
@ -90,7 +118,12 @@ static func LoadModel(filePath: String):
# Do a case insensitive lookup only if we have to, it's more expensive. # Do a case insensitive lookup only if we have to, it's more expensive.
if file == null: if file == null:
file = FileAccess.open(Utils.GetCaseiFileName(sillyPath), FileAccess.READ) sillyPath = Utils.GetCaseiFileName(sillyPath)
file = FileAccess.open(sillyPath, FileAccess.READ)
if loadCache.has(sillyPath):
file.close()
return loadCache.get(sillyPath).duplicate()
var x = X.new() var x = X.new()
x.currentFilePath = Utils.StripFilename(sillyPath) x.currentFilePath = Utils.StripFilename(sillyPath)
@ -171,8 +204,15 @@ static func LoadModel(filePath: String):
meshInstance.set_meta("meshHeight", meshSize.y) meshInstance.set_meta("meshHeight", meshSize.y)
meshInstance.set_meta("meshDepth", meshSize.z) meshInstance.set_meta("meshDepth", meshSize.z)
x.finalMeshes.push_back(meshInstance)
mesh.parent.add_child(meshInstance) mesh.parent.add_child(meshInstance)
var meshSize = _CalcMinMaxPosTotal(x.finalMeshes)
x.scene.set_meta("meshWidth", meshSize.x)
x.scene.set_meta("meshHeight", meshSize.y)
x.scene.set_meta("meshDepth", meshSize.z)
loadCache[sillyPath] = x.scene.duplicate()
return x.scene return x.scene
func ReadBinWord() -> int: func ReadBinWord() -> int:
@ -215,8 +255,8 @@ func ReadHead():
func ParseTemplate(): func ParseTemplate():
var name = ReadHead() var name = ReadHead()
var guid = GetNextToken() var guid = GetNextToken()
print(name) #print(name)
print(guid) #print(guid)
while true: while true:
var s = GetNextToken() var s = GetNextToken()
if s == "}": if s == "}":
@ -315,8 +355,8 @@ func ReadVector2() -> Vector2:
TestForSeparator() TestForSeparator()
return Vector2(x, y) return Vector2(x, y)
func ReadVector3() -> Vector3: func ReadVector3(invertX:bool = false) -> Vector3:
var x = -ReadFloat() var x = -ReadFloat() if invertX else ReadFloat()
var y = ReadFloat() var y = ReadFloat()
var z = ReadFloat() var z = ReadFloat()
TestForSeparator() TestForSeparator()
@ -351,13 +391,15 @@ func ParseMesh(parent: Node):
var mesh = XMesh.new() var mesh = XMesh.new()
mesh.parent = parent mesh.parent = parent
meshes.push_back(mesh) meshes.push_back(mesh)
ReadHead() var name = ReadHead()
mesh.name = name
var vertCount = ReadInt() var vertCount = ReadInt()
for i in range(vertCount): for i in range(vertCount):
mesh.verts.push_back(ReadVector3()) mesh.verts.push_back(ReadVector3(true))
var faceCount = ReadInt() var faceCount = ReadInt()
mesh.indexCount = faceCount
for i in range(faceCount): for i in range(faceCount):
var numIndices = ReadInt() var numIndices = ReadInt()
if numIndices < 3: if numIndices < 3:
@ -369,7 +411,7 @@ func ParseMesh(parent: Node):
while true: while true:
var objectName = GetNextToken().replace("\r", "").replace("\n", "") var objectName = GetNextToken().replace("\r", "").replace("\n", "")
print(str("\"",objectName,"\"")) #print(str("\"",objectName,"\""))
if not objectName: if not objectName:
assert(false, "Unexpected end of file while parsing mesh structure") assert(false, "Unexpected end of file while parsing mesh structure")
elif objectName == "}": elif objectName == "}":
@ -426,7 +468,7 @@ func ParseMeshNormals(mesh: XMesh):
mesh.normals.push_back(ReadVector3()) mesh.normals.push_back(ReadVector3())
var faceCount = ReadInt() var faceCount = ReadInt()
if faceCount != mesh.indices.size() / 3: if faceCount != mesh.indexCount:
assert(false, "Normal face count does not match vertex face count.") assert(false, "Normal face count does not match vertex face count.")
for i in range(faceCount): for i in range(faceCount):
@ -467,7 +509,6 @@ func ParseFrame(parent: Node = null):
while true: while true:
var objectName = GetNextToken().replace("\r", "").replace("\n", "") var objectName = GetNextToken().replace("\r", "").replace("\n", "")
print(str("\"",objectName,"\""))
if not objectName: if not objectName:
assert(false, "Unexpected end of file reached while parsing frame") assert(false, "Unexpected end of file reached while parsing frame")
return return
@ -477,7 +518,8 @@ func ParseFrame(parent: Node = null):
ParseFrame(node) ParseFrame(node)
elif objectName == "FrameTransformMatrix": elif objectName == "FrameTransformMatrix":
# TODO: Do something with this? # TODO: Do something with this?
print(ParseTransformationMatrix()) ParseTransformationMatrix()
#print(ParseTransformationMatrix())
elif objectName == "Mesh": elif objectName == "Mesh":
ParseMesh(node) ParseMesh(node)
else: else:
@ -500,7 +542,8 @@ func ReadRGBA() -> Color:
func ParseTextureFilename(): func ParseTextureFilename():
ReadHead() ReadHead()
var name = GetNextToken() var name = GetNextToken().replace("\"", "")
CheckForSemicolon()
CheckForClosingBrace() CheckForClosingBrace()
if not name: if not name:
push_warning("Unexpected end of file while parsing unknown segment.") push_warning("Unexpected end of file while parsing unknown segment.")
@ -541,7 +584,7 @@ func ParseMaterial():
func ParseFile(): func ParseFile():
while true: while true:
var objectName = GetNextToken().replace("\r", "").replace("\n", "") var objectName = GetNextToken().replace("\r", "").replace("\n", "")
print(str("\"",objectName,"\"")) #print(str("\"",objectName,"\""))
if not objectName: if not objectName:
break break
if objectName == "template": if objectName == "template":

View file

@ -4,6 +4,7 @@ var parent: Node
var name: String var name: String
var verts: PackedVector3Array = PackedVector3Array() var verts: PackedVector3Array = PackedVector3Array()
var indices: PackedInt32Array = PackedInt32Array() var indices: PackedInt32Array = PackedInt32Array()
var indexCount: int = 0
var normals: PackedVector3Array = PackedVector3Array() var normals: PackedVector3Array = PackedVector3Array()
var normalIndices: PackedInt32Array = PackedInt32Array() var normalIndices: PackedInt32Array = PackedInt32Array()
var uvs: PackedVector2Array = PackedVector2Array() var uvs: PackedVector2Array = PackedVector2Array()

View file

@ -1,4 +1,13 @@
extends Node3D extends Node3D
# for when it just isn't.
func _process(delta: float): func _process(delta: float):
$Egg.text = str("ROT: ", rad_to_deg(rotation.y), "\n", get_meta("rmesh")) $Egg.position.y = X.MeshHeight(self) + 0.5
$Egg.scale.x = 15
$Egg.scale.y = 15
$Egg.scale.z = 15
$Egg.text = str(
"POS: ", position, "\n",
"ROT: ", rad_to_deg(rotation.y), "\n"
)