material-maker/material_maker/tools/obj_loader/obj_loader.gd

164 lines
4.0 KiB
GDScript

extends Node
func _ready():
pass # Replace with function body.
func count(string, txt):
var num = 0
for i in range(0, string.length()):
if (txt == string[i]):
num += 1
return num
func load_obj_file(path : String) -> Mesh:
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
var mdlFile : File = File.new()
var error = mdlFile.open(path, File.READ)
if error != OK:
return null
var mdlVerts = []
var mdlNorm = []
var mdlUV = []
var mdlFaceIndex = []
var mdlUVIndex = []
var mdlNormIndex = []
while !mdlFile.eof_reached():
var mdlData = mdlFile.get_line()
if mdlData.begins_with("v "):
var vertData = mdlData.split(" ", false)
var vertex = Vector3(
float(vertData[1]),
float(vertData[2]),
float(vertData[3]))
mdlVerts.push_back(vertex)
elif mdlData.begins_with("vt"):
var uvData = mdlData.split(" ", false)
var uv = Vector2(
float(uvData[1]),
1.0 - float(uvData[2]))
mdlUV.push_back(uv)
elif mdlData.begins_with("vn"):
var normData = mdlData.split(" ", false)
var normal = Vector3(
float(normData[1]),
float(normData[2]),
float(normData[3]))
mdlNorm.push_back(normal)
elif mdlData.begins_with("f "):
var miscData = mdlData.split(" ", false)
var misc = []
var num = count(mdlData, "/")
if num == 6:
misc.push_back(miscData[1].split("/"))
misc.push_back(miscData[2].split("/"))
misc.push_back(miscData[3].split("/"))
var faceIndices = Vector3(
int(misc[2][0]) - 1,
int(misc[1][0]) - 1,
int(misc[0][0]) - 1)
var uvIndices = Vector3(
int(misc[2][1]) - 1,
int(misc[1][1]) - 1,
int(misc[0][1]) - 1)
var normIndices = Vector3(
int(misc[2][2]) - 1,
int(misc[1][2]) - 1,
int(misc[0][2]) - 1)
mdlFaceIndex.push_back(faceIndices)
mdlUVIndex.push_back(uvIndices)
mdlNormIndex.push_back(normIndices)
elif num == 3:
misc.push_back(miscData[1].split("/"))
misc.push_back(miscData[2].split("/"))
var faceIndices = Vector3(
int(misc[2][0]) - 1,
int(misc[1][0]) - 1,
int(misc[0][0]) - 1)
var uvIndices = Vector3(
int(misc[2][1]) - 1,
int(misc[1][1]) - 1,
int(misc[0][1]) - 1)
mdlFaceIndex.push_back(faceIndices)
mdlUVIndex.push_back(uvIndices)
elif num == 0:
var faceIndices = Vector3(
int(miscData[3]) - 1,
int(miscData[2]) - 1,
int(miscData[1]) - 1)
mdlFaceIndex.push_back(faceIndices)
elif num > 6:
for i in miscData.size() - 1:
misc.push_back(miscData[i + 1].split("/"))
var faceIndices = []
var uvIndices = []
var normIndices = []
for i in misc.size() - 2:
var intVar = i + 2
faceIndices.push_back(Vector3(
int(misc[intVar][0]) - 1,
int(misc[intVar-1][0]) - 1,
int(misc[0][0]) - 1))
uvIndices.push_back(Vector3(
int(misc[intVar][1]) - 1,
int(misc[intVar-1][1]) - 1,
int(misc[0][1]) - 1))
normIndices.push_back(Vector3(
int(misc[intVar][2]) - 1,
int(misc[intVar-1][2]) - 1,
int(misc[0][2]) - 1))
mdlFaceIndex.push_back(faceIndices[i])
mdlUVIndex.push_back(uvIndices[i])
mdlNormIndex.push_back(normIndices[i])
else:
print("MODEL NOT VALID!")
elif mdlData.begins_with("s "):
var smooth = mdlData.substr(2, mdlData.length()).strip_edges()
if smooth == "off":
st.add_smooth_group(false)
else:
st.add_smooth_group(true)
for i in mdlFaceIndex.size():
if mdlUV.size() > 0:
st.add_uv(mdlUV[mdlUVIndex[i][0]])
if mdlNorm.size() > 0:
st.add_normal(mdlNorm[mdlNormIndex[i][0]])
st.add_vertex(mdlVerts[mdlFaceIndex[i][0]])
if mdlUV.size() > 0:
st.add_uv(mdlUV[mdlUVIndex[i][1]])
if mdlNorm.size() > 0:
st.add_normal(mdlNorm[mdlNormIndex[i][1]])
st.add_vertex(mdlVerts[mdlFaceIndex[i][1]])
if mdlUV.size() > 0:
st.add_uv(mdlUV[mdlUVIndex[i][2]])
if mdlNorm.size() > 0:
st.add_normal(mdlNorm[mdlNormIndex[i][2]])
st.add_vertex(mdlVerts[mdlFaceIndex[i][2]])
if mdlNorm.size() == 0:
st.generate_normals()
st.generate_tangents()
var mdl = Mesh.new()
mdl = st.commit()
return mdl