in lib/render/mesh.py [0:0]
def load_obj_mesh_mtl(mesh_file):
vertex_data = []
norm_data = []
uv_data = []
face_data = []
face_norm_data = []
face_uv_data = []
# face per material
face_data_mat = {}
face_norm_data_mat = {}
face_uv_data_mat = {}
# current material name
mtl_data = None
cur_mat = None
if isinstance(mesh_file, str):
f = open(mesh_file, "r")
else:
f = mesh_file
for line in f:
if isinstance(line, bytes):
line = line.decode("utf-8")
if line.startswith('#'):
continue
values = line.split()
if not values:
continue
if values[0] == 'v':
v = list(map(float, values[1:4]))
vertex_data.append(v)
elif values[0] == 'vn':
vn = list(map(float, values[1:4]))
norm_data.append(vn)
elif values[0] == 'vt':
vt = list(map(float, values[1:3]))
uv_data.append(vt)
elif values[0] == 'mtllib':
mtl_data = read_mtlfile(mesh_file.replace(mesh_file.split('/')[-1],values[1]))
elif values[0] == 'usemtl':
cur_mat = values[1]
elif values[0] == 'f':
# local triangle data
l_face_data = []
l_face_uv_data = []
l_face_norm_data = []
# quad mesh
if len(values) > 4:
f = list(map(lambda x: int(x.split('/')[0]) if int(x.split('/')[0]) < 0 else int(x.split('/')[0])-1, values[1:4]))
l_face_data.append(f)
f = list(map(lambda x: int(x.split('/')[0]) if int(x.split('/')[0]) < 0 else int(x.split('/')[0])-1, [values[3], values[4], values[1]]))
l_face_data.append(f)
# tri mesh
else:
f = list(map(lambda x: int(x.split('/')[0]) if int(x.split('/')[0]) < 0 else int(x.split('/')[0])-1, values[1:4]))
l_face_data.append(f)
# deal with texture
if len(values[1].split('/')) >= 2:
# quad mesh
if len(values) > 4:
f = list(map(lambda x: int(x.split('/')[1]) if int(x.split('/')[1]) < 0 else int(x.split('/')[1])-1, values[1:4]))
l_face_uv_data.append(f)
f = list(map(lambda x: int(x.split('/')[1]) if int(x.split('/')[1]) < 0 else int(x.split('/')[1])-1, [values[3], values[4], values[1]]))
l_face_uv_data.append(f)
# tri mesh
elif len(values[1].split('/')[1]) != 0:
f = list(map(lambda x: int(x.split('/')[1]) if int(x.split('/')[1]) < 0 else int(x.split('/')[1])-1, values[1:4]))
l_face_uv_data.append(f)
# deal with normal
if len(values[1].split('/')) == 3:
# quad mesh
if len(values) > 4:
f = list(map(lambda x: int(x.split('/')[2]) if int(x.split('/')[2]) < 0 else int(x.split('/')[2])-1, values[1:4]))
l_face_norm_data.append(f)
f = list(map(lambda x: int(x.split('/')[2]) if int(x.split('/')[2]) < 0 else int(x.split('/')[2])-1, [values[3], values[4], values[1]]))
l_face_norm_data.append(f)
# tri mesh
elif len(values[1].split('/')[2]) != 0:
f = list(map(lambda x: int(x.split('/')[2]) if int(x.split('/')[2]) < 0 else int(x.split('/')[2])-1, values[1:4]))
l_face_norm_data.append(f)
face_data += l_face_data
face_uv_data += l_face_uv_data
face_norm_data += l_face_norm_data
if cur_mat is not None:
if cur_mat not in face_data_mat.keys():
face_data_mat[cur_mat] = []
if cur_mat not in face_uv_data_mat.keys():
face_uv_data_mat[cur_mat] = []
if cur_mat not in face_norm_data_mat.keys():
face_norm_data_mat[cur_mat] = []
face_data_mat[cur_mat] += l_face_data
face_uv_data_mat[cur_mat] += l_face_uv_data
face_norm_data_mat[cur_mat] += l_face_norm_data
vertices = np.array(vertex_data)
faces = np.array(face_data)
norms = np.array(norm_data)
norms = normalize_v3(norms)
face_normals = np.array(face_norm_data)
uvs = np.array(uv_data)
face_uvs = np.array(face_uv_data)
out_tuple = (vertices, faces, norms, face_normals, uvs, face_uvs)
if cur_mat is not None and mtl_data is not None:
for key in face_data_mat:
face_data_mat[key] = np.array(face_data_mat[key])
face_uv_data_mat[key] = np.array(face_uv_data_mat[key])
face_norm_data_mat[key] = np.array(face_norm_data_mat[key])
out_tuple += (face_data_mat, face_norm_data_mat, face_uv_data_mat, mtl_data)
return out_tuple