generate meshes

This commit is contained in:
Holly Stubbs 2025-02-18 00:08:26 +00:00
parent 980dc66f94
commit 3682456169
Signed by: tgpholly
GPG key ID: B8583C4B7D18119E
3 changed files with 64 additions and 13 deletions

View file

@ -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

View file

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

View file

@ -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:
@ -207,13 +236,15 @@ 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