Skip to content

Commit 9b1754a

Browse files
committed
UV field might be blank/undefined
Some files have missing uv fields '1//1' instead of '1/1/1/'. We fall back to using uv 0 in this case.
1 parent 39ee518 commit 9b1754a

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

pywavefront/obj.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,11 @@ def emit_vertex(vertex):
378378
for i, v in enumerate(self.values[1:]):
379379
parts = v.split('/')
380380
v_index = (int(parts[0]) - 1)
381-
t_index = (int(parts[1]) - 1) if has_vt else None
381+
# uv field might be blank
382+
try:
383+
t_index = (int(parts[1]) - 1) if has_vt else None
384+
except ValueError:
385+
t_index = 0
382386
n_index = (int(parts[2]) - 1) if has_vn else None
383387

384388
# Resolve negative index lookups
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Comment
2+
mtllib simple.mtl
3+
o Simple
4+
v 0.01 0.02 0.03
5+
v 0.04 0.05 0.06
6+
v 0.07 0.08 0.09
7+
v 0.11 0.12 0.13
8+
vt 10 11
9+
vt 12 13
10+
vt 14 15
11+
vt 16 17
12+
vn 20 21 22
13+
usemtl Material.simple
14+
f 2/3/1 1/2/1 3/1/1
15+
o SimpleB
16+
v 1.0 0.0 1.0
17+
v -1.0 0.0 1.0
18+
v 1.0 0.0 -1.0
19+
v -1.0 0.0 -1.0
20+
vt 0.0 1.0
21+
vt 0.0 0.0
22+
vt 1.0 0.0
23+
vt 1.0 1.0
24+
vn 0.0 1.0 0.0
25+
usemtl Material2.simple
26+
f 6/7/2 5/6/2 7/5/2
27+
f 6//2 5//2 7//2
28+
f 6/7/2 5/6/2 7/5/2

tests/test_parser.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99

1010

1111
class TestParsers(unittest.TestCase):
12+
1213
def setUp(self):
1314
# Append current path to locate files
1415
meshes = pywavefront.Wavefront(fixture('simple.obj'))
1516
self.mesh1 = meshes.mesh_list[0]
1617
self.mesh2 = meshes.mesh_list[1]
18+
self.maxDiff = None
1719

1820
def testObjName(self):
1921
"""Parsing an obj file with known names should set those names."""
@@ -43,6 +45,7 @@ def testObjMaterials(self):
4345
self.assertEqual(material1.name, 'Material.simple')
4446
self.assertEqual(material2.name, 'Material2.simple')
4547

48+
4649
class TestParserCollectFaces(unittest.TestCase):
4750
"""Test collecting (possibly triangulated) faces"""
4851
def setUp(self):
@@ -102,6 +105,7 @@ def test_missing_material_create(self):
102105

103106

104107
class TestParserVertexVariants(unittest.TestCase):
108+
maxDiff = None
105109

106110
def testObjNoNormals(self):
107111
"""Parse obj without normals"""
@@ -174,6 +178,27 @@ def testObjColors(self):
174178

175179
self.assertEqual(self.mesh2.materials[0].vertex_format, "T2F_C3F_N3F_V3F")
176180

181+
def test_undefined_uvs(self):
182+
"""obj file were some uv entries are undefiend"""
183+
meshes = pywavefront.Wavefront(fixture('simple_missing_uv.obj'))
184+
self.mesh2 = meshes.mesh_list[1]
185+
186+
self.assertEqual(self.mesh2.materials[0].vertices, [
187+
1.0, 0.0, 0.0, 1.0, -0.0, -1.0, 0.0, 1.0,
188+
0.0, 0.0, 0.0, 1.0, -0.0, 1.0, 0.0, 1.0,
189+
0.0, 1.0, 0.0, 1.0, -0.0, 1.0, 0.0, -1.0,
190+
191+
10.0, 11.0, 0.0, 1.0, -0.0, -1.0, 0.0, 1.0,
192+
10.0, 11.0, 0.0, 1.0, -0.0, 1.0, 0.0, 1.0,
193+
10.0, 11.0, 0.0, 1.0, -0.0, 1.0, 0.0, -1.0,
194+
195+
1.0, 0.0, 0.0, 1.0, -0.0, -1.0, 0.0, 1.0,
196+
0.0, 0.0, 0.0, 1.0, -0.0, 1.0, 0.0, 1.0,
197+
0.0, 1.0, 0.0, 1.0, -0.0, 1.0, 0.0, -1.0,
198+
])
199+
200+
self.assertEqual(self.mesh2.materials[0].vertex_format, "T2F_N3F_V3F")
201+
177202

178203
class TestMtlParser(unittest.TestCase):
179204
def setUp(self):

0 commit comments

Comments
 (0)