Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions scripts/util/OBJParser.gd
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ static func load_obj(obj_path: String, mtl_path: String = "") -> Mesh:
var obj_str: String = _read_file_str(obj_path)
if (mtl_path == ""):
var mtl_filename: String = _get_mtl_filename(obj_str)
if (mtl_filename == ""):
var implicit_mtl_path: String = "%s/%s.mtl" % [obj_path.get_base_dir(), obj_path.get_file().get_basename()]
if (FileAccess.file_exists(implicit_mtl_path)):
mtl_filename = implicit_mtl_path.get_file()
mtl_path = "%s/%s" % [obj_path.get_base_dir(), mtl_filename]
var mats: Dictionary = {}
if (mtl_path != ""):
Expand All @@ -35,7 +39,7 @@ static func load_obj_from_buffer(obj_data: String, materials: Dictionary) -> Mes
# Create materials
static func load_mtl_from_buffer(mtl_data: String, textures: Dictionary) -> Dictionary:
return _create_mtl(mtl_data,textures)

# Get data from file path
static func _read_file_str(path: String) -> String:
if (path == ""):
Expand All @@ -60,7 +64,7 @@ static func _get_mtl_tex_paths(mtl_path: String) -> Array[String]:
var file: FileAccess = FileAccess.open(mtl_path, FileAccess.READ)
if (file == null):
return []

var paths: Array[String] = []
var lines: PackedStringArray = file.get_as_text().split("\n", false)
for line in lines:
Expand Down Expand Up @@ -125,7 +129,7 @@ static func _get_image(mtl_filepath: String, tex_filename: String) -> Image:
var file_type: String = tex_filepath.get_extension()
if debug:
prints("Debug: texture file path:", tex_filepath, "of type", file_type)

var img: Image = Image.new()
img.load(tex_filepath)
return img
Expand All @@ -151,7 +155,7 @@ static func _create_obj(obj: String, mats: Dictionary) -> Mesh:

var mat_name: String = "default"
var count_mtl: int = 0

# Parse
var lines: PackedStringArray = obj.split("\n", false)
for line in lines:
Expand Down Expand Up @@ -232,12 +236,12 @@ static func _create_obj(obj: String, mats: Dictionary) -> Mesh:
if (point1.size() > 2):
face["vn"].append(point1[2])
faces[mat_name].append(face)

# Make tri
for matgroup in faces.keys():
if debug:
prints("Creating surface for matgroup", matgroup, "with", str(faces[matgroup].size()), "faces")

# Mesh Assembler
var st: SurfaceTool = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
Expand All @@ -251,14 +255,14 @@ static func _create_obj(obj: String, mats: Dictionary) -> Mesh:
fan_v.append(vertices[face["v"][0]])
fan_v.append(vertices[face["v"][2]])
fan_v.append(vertices[face["v"][1]])

# Normals
var fan_vn: PackedVector3Array = PackedVector3Array()
if (face["vn"].size() > 0):
fan_vn.append(normals[face["vn"][0]])
fan_vn.append(normals[face["vn"][2]])
fan_vn.append(normals[face["vn"][1]])

# Textures
var fan_vt: PackedVector2Array = PackedVector2Array()
if (face["vt"].size() > 0):
Expand All @@ -269,14 +273,14 @@ static func _create_obj(obj: String, mats: Dictionary) -> Mesh:
fan_vt.append(uv)
st.add_triangle_fan(fan_v, fan_vt, PackedColorArray(), PackedVector2Array(), fan_vn, [])
mesh = st.commit(mesh)

for k in mesh.get_surface_count():
var mat: Material = mesh.surface_get_material(k)
mat_name = ""
for m in mats:
if (mats[m] == mat):
mat_name = m
mesh.surface_set_name(k, mat_name)

# Finish
return mesh
Loading