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 RoomScale = 0.010
|
||||
const RoomScale = 8.0 / 2048.0
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue