From 36824561698c7a4a6f07c5b3f0451f5273275d81 Mon Sep 17 00:00:00 2001 From: Holly Date: Tue, 18 Feb 2025 00:08:26 +0000 Subject: [PATCH] generate meshes --- src/Constants.gd | 1 - src/DynamicMap.gd | 3 +- src/file_parsers/X.gd | 73 ++++++++++++++++++++++++++++++++++++------- 3 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/Constants.gd b/src/Constants.gd index cf6d042..597f9ad 100644 --- a/src/Constants.gd +++ b/src/Constants.gd @@ -14,5 +14,4 @@ const ROOM4 = 5 const gridsz = 19 # Same size as the main map itself (better for the map creator) -#const RoomScale = 0.010 const RoomScale = 8.0 / 2048.0 diff --git a/src/DynamicMap.gd b/src/DynamicMap.gd index b0d6256..c3bc69a 100644 --- a/src/DynamicMap.gd +++ b/src/DynamicMap.gd @@ -5,7 +5,8 @@ func _ready() -> void: #B3D.Load("GFX\\npcs\\106_2.b3d") #add_child(B3D.Load("GFX\\apache.b3d")) - 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")) #DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) diff --git a/src/file_parsers/X.gd b/src/file_parsers/X.gd index 7204b01..43e8042 100644 --- a/src/file_parsers/X.gd +++ b/src/file_parsers/X.gd @@ -4,6 +4,7 @@ class_name X # 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 +var currentFilePath = "" var majorVersion = 0 var minorVersion = 0 var isBinaryFormat = false @@ -57,7 +58,7 @@ func GetStringBytes(start: int, end: int): func ReadUntilEndOfLine(): if isBinaryFormat: return - while p > end: + while p < end: var tmp = GetStringBytes(p, p + 1) if tmp == "\n": p += 1 @@ -92,6 +93,7 @@ static func LoadModel(filePath: String): file = FileAccess.open(Utils.GetCaseiFileName(sillyPath), FileAccess.READ) var x = X.new() + x.currentFilePath = Utils.StripFilename(sillyPath) x.majorVersion = 0 x.minorVersion = 0 @@ -144,6 +146,33 @@ static func LoadModel(filePath: String): x.ReadUntilEndOfLine() x.ParseFile() + + for mesh: XMesh in x.meshes: + var arr_mesh = ArrayMesh.new() + var arr = [] + arr.resize(Mesh.ARRAY_MAX) + + arr[Mesh.ARRAY_VERTEX]=mesh.verts + arr[Mesh.ARRAY_TEX_UV]=mesh.uvs + arr[Mesh.ARRAY_INDEX]=mesh.indices + + var meshInstance = MeshInstance3D.new() + arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr) + meshInstance.mesh = arr_mesh + var mat = StandardMaterial3D.new() + mat.albedo_color = Color(randi() % 255 / 255.0, randi() % 255 / 255.0, randi() % 255 / 255.0) + #mat.albedo_texture = texture + #mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS if activeAlbedoHasAlpha else BaseMaterial3D.TRANSPARENCY_DISABLED + meshInstance.set_surface_override_material(0, mat) + meshInstance.create_trimesh_collision() + meshInstance.name = str(filePath, "_", Time.get_unix_time_from_system()) + var meshSize = _CalcMinMaxPos(mesh.verts) + meshInstance.set_meta("meshWidth", meshSize.x) + meshInstance.set_meta("meshHeight", meshSize.y) + meshInstance.set_meta("meshDepth", meshSize.z) + + mesh.parent.add_child(meshInstance) + return x.scene func ReadBinWord() -> int: @@ -206,14 +235,16 @@ func CheckForSeparator(): func CheckForClosingBrace(): if isBinaryFormat: return - - assert(GetNextToken() == "}", "Closing brace expected.") + + var token = GetNextToken() + assert(token == "}", "Closing brace expected.") func CheckForSemicolon(): if isBinaryFormat: return - assert(GetNextToken() == ";", "Semicolon expected.") + var token = GetNextToken() + assert(token == ";", "Semicolon expected.") func ReadFloat(): if isBinaryFormat: @@ -285,7 +316,7 @@ func ReadVector2() -> Vector2: return Vector2(x, y) func ReadVector3() -> Vector3: - var x = ReadFloat() + var x = -ReadFloat() var y = ReadFloat() var z = ReadFloat() TestForSeparator() @@ -337,7 +368,7 @@ func ParseMesh(parent: Node): TestForSeparator() while true: - var objectName = GetNextToken() + var objectName = GetNextToken().replace("\r", "").replace("\n", "") print(str("\"",objectName,"\"")) if not objectName: assert(false, "Unexpected end of file while parsing mesh structure") @@ -435,7 +466,7 @@ func ParseFrame(parent: Node = null): scene.add_child(node) while true: - var objectName = GetNextToken() + var objectName = GetNextToken().replace("\r", "").replace("\n", "") print(str("\"",objectName,"\"")) if not objectName: assert(false, "Unexpected end of file reached while parsing frame") @@ -470,6 +501,14 @@ func ReadRGBA() -> Color: func ParseTextureFilename(): ReadHead() var name = GetNextToken() + CheckForClosingBrace() + if not name: + push_warning("Unexpected end of file while parsing unknown segment.") + # some exporers make weird paths, fix em. + while name.contains("\\\\"): + name = name.replace("\\\\", "\\") + + return name func ParseMaterial(): var material = StandardMaterial3D.new() @@ -482,17 +521,26 @@ func ParseMaterial(): var emissive = ReadRGB() while true: - var objectName = GetNextToken() + var objectName = GetNextToken().replace("\r", "").replace("\n", "") if not objectName: assert(false, "Unexpected end of file while parsing mesh material") elif objectName == "}": break elif objectName == "TextureFilename" or objectName == "TextureFileName": - + var fileName = ParseTextureFilename() + material.albedo_texture = Global.LoadTexture(str(currentFilePath.replace("\\", "/"), fileName)) + elif objectName == "NormalmapFilename" or objectName == "NormalmapFileName": + var fileName = ParseTextureFilename() + material.normal_texture = Global.LoadTexture(str(currentFilePath.replace("\\", "/"), fileName)) + else: + push_warning("Unknown data in material in DirectX file.") + ParseUnknownDataObject() + + return material func ParseFile(): while true: - var objectName = GetNextToken() + var objectName = GetNextToken().replace("\r", "").replace("\n", "") print(str("\"",objectName,"\"")) if not objectName: break @@ -506,8 +554,11 @@ func ParseFile(): ParseUnknownDataObject() elif objectName == "AnimationSet": ParseUnknownDataObject() + elif objectName == "Header": # 3D World Studio weird header + ParseUnknownDataObject() elif objectName == "Material": - materials.push_back(ParseMaterial()) + var material = ParseMaterial() + materials.push_back(material) else: break