generate meshes
This commit is contained in:
parent
980dc66f94
commit
3682456169
3 changed files with 64 additions and 13 deletions
|
@ -14,5 +14,4 @@ const ROOM4 = 5
|
||||||
|
|
||||||
const gridsz = 19 # Same size as the main map itself (better for the map creator)
|
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
|
const RoomScale = 8.0 / 2048.0
|
||||||
|
|
|
@ -5,7 +5,8 @@ func _ready() -> void:
|
||||||
#B3D.Load("GFX\\npcs\\106_2.b3d")
|
#B3D.Load("GFX\\npcs\\106_2.b3d")
|
||||||
#add_child(B3D.Load("GFX\\apache.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)
|
#DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ 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
|
||||||
|
|
||||||
|
var currentFilePath = ""
|
||||||
var majorVersion = 0
|
var majorVersion = 0
|
||||||
var minorVersion = 0
|
var minorVersion = 0
|
||||||
var isBinaryFormat = false
|
var isBinaryFormat = false
|
||||||
|
@ -57,7 +58,7 @@ func GetStringBytes(start: int, end: int):
|
||||||
func ReadUntilEndOfLine():
|
func ReadUntilEndOfLine():
|
||||||
if isBinaryFormat:
|
if isBinaryFormat:
|
||||||
return
|
return
|
||||||
while p > end:
|
while p < end:
|
||||||
var tmp = GetStringBytes(p, p + 1)
|
var tmp = GetStringBytes(p, p + 1)
|
||||||
if tmp == "\n":
|
if tmp == "\n":
|
||||||
p += 1
|
p += 1
|
||||||
|
@ -92,6 +93,7 @@ static func LoadModel(filePath: String):
|
||||||
file = FileAccess.open(Utils.GetCaseiFileName(sillyPath), FileAccess.READ)
|
file = FileAccess.open(Utils.GetCaseiFileName(sillyPath), FileAccess.READ)
|
||||||
|
|
||||||
var x = X.new()
|
var x = X.new()
|
||||||
|
x.currentFilePath = Utils.StripFilename(sillyPath)
|
||||||
|
|
||||||
x.majorVersion = 0
|
x.majorVersion = 0
|
||||||
x.minorVersion = 0
|
x.minorVersion = 0
|
||||||
|
@ -144,6 +146,33 @@ static func LoadModel(filePath: String):
|
||||||
x.ReadUntilEndOfLine()
|
x.ReadUntilEndOfLine()
|
||||||
|
|
||||||
x.ParseFile()
|
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
|
return x.scene
|
||||||
|
|
||||||
func ReadBinWord() -> int:
|
func ReadBinWord() -> int:
|
||||||
|
@ -207,13 +236,15 @@ func CheckForClosingBrace():
|
||||||
if isBinaryFormat:
|
if isBinaryFormat:
|
||||||
return
|
return
|
||||||
|
|
||||||
assert(GetNextToken() == "}", "Closing brace expected.")
|
var token = GetNextToken()
|
||||||
|
assert(token == "}", "Closing brace expected.")
|
||||||
|
|
||||||
func CheckForSemicolon():
|
func CheckForSemicolon():
|
||||||
if isBinaryFormat:
|
if isBinaryFormat:
|
||||||
return
|
return
|
||||||
|
|
||||||
assert(GetNextToken() == ";", "Semicolon expected.")
|
var token = GetNextToken()
|
||||||
|
assert(token == ";", "Semicolon expected.")
|
||||||
|
|
||||||
func ReadFloat():
|
func ReadFloat():
|
||||||
if isBinaryFormat:
|
if isBinaryFormat:
|
||||||
|
@ -285,7 +316,7 @@ func ReadVector2() -> Vector2:
|
||||||
return Vector2(x, y)
|
return Vector2(x, y)
|
||||||
|
|
||||||
func ReadVector3() -> Vector3:
|
func ReadVector3() -> Vector3:
|
||||||
var x = ReadFloat()
|
var x = -ReadFloat()
|
||||||
var y = ReadFloat()
|
var y = ReadFloat()
|
||||||
var z = ReadFloat()
|
var z = ReadFloat()
|
||||||
TestForSeparator()
|
TestForSeparator()
|
||||||
|
@ -337,7 +368,7 @@ func ParseMesh(parent: Node):
|
||||||
TestForSeparator()
|
TestForSeparator()
|
||||||
|
|
||||||
while true:
|
while true:
|
||||||
var objectName = GetNextToken()
|
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")
|
||||||
|
@ -435,7 +466,7 @@ func ParseFrame(parent: Node = null):
|
||||||
scene.add_child(node)
|
scene.add_child(node)
|
||||||
|
|
||||||
while true:
|
while true:
|
||||||
var objectName = GetNextToken()
|
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 reached while parsing frame")
|
assert(false, "Unexpected end of file reached while parsing frame")
|
||||||
|
@ -470,6 +501,14 @@ func ReadRGBA() -> Color:
|
||||||
func ParseTextureFilename():
|
func ParseTextureFilename():
|
||||||
ReadHead()
|
ReadHead()
|
||||||
var name = GetNextToken()
|
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():
|
func ParseMaterial():
|
||||||
var material = StandardMaterial3D.new()
|
var material = StandardMaterial3D.new()
|
||||||
|
@ -482,17 +521,26 @@ func ParseMaterial():
|
||||||
var emissive = ReadRGB()
|
var emissive = ReadRGB()
|
||||||
|
|
||||||
while true:
|
while true:
|
||||||
var objectName = GetNextToken()
|
var objectName = GetNextToken().replace("\r", "").replace("\n", "")
|
||||||
if not objectName:
|
if not objectName:
|
||||||
assert(false, "Unexpected end of file while parsing mesh material")
|
assert(false, "Unexpected end of file while parsing mesh material")
|
||||||
elif objectName == "}":
|
elif objectName == "}":
|
||||||
break
|
break
|
||||||
elif objectName == "TextureFilename" or objectName == "TextureFileName":
|
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():
|
func ParseFile():
|
||||||
while true:
|
while true:
|
||||||
var objectName = GetNextToken()
|
var objectName = GetNextToken().replace("\r", "").replace("\n", "")
|
||||||
print(str("\"",objectName,"\""))
|
print(str("\"",objectName,"\""))
|
||||||
if not objectName:
|
if not objectName:
|
||||||
break
|
break
|
||||||
|
@ -506,8 +554,11 @@ func ParseFile():
|
||||||
ParseUnknownDataObject()
|
ParseUnknownDataObject()
|
||||||
elif objectName == "AnimationSet":
|
elif objectName == "AnimationSet":
|
||||||
ParseUnknownDataObject()
|
ParseUnknownDataObject()
|
||||||
|
elif objectName == "Header": # 3D World Studio weird header
|
||||||
|
ParseUnknownDataObject()
|
||||||
elif objectName == "Material":
|
elif objectName == "Material":
|
||||||
materials.push_back(ParseMaterial())
|
var material = ParseMaterial()
|
||||||
|
materials.push_back(material)
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue