@@ -62,6 +62,9 @@ def consume_vertices(self):
6262 )
6363
6464 self .next_line ()
65+ if not self .values :
66+ break
67+
6568 if self .values [0 ] != "v" :
6669 break
6770
@@ -70,7 +73,7 @@ def parse_vn(self):
7073
7174 # Since list() also consumes StopIteration we need to sanity check the line
7275 # to make sure the parser advances
73- if self .values [0 ] == "vn" :
76+ if self .values and self . values [0 ] == "vn" :
7477 self .next_line ()
7578
7679 def consume_normals (self ):
@@ -85,6 +88,9 @@ def consume_normals(self):
8588 )
8689
8790 self .next_line ()
91+ if not self .values :
92+ break
93+
8894 if self .values [0 ] != "vn" :
8995 break
9096
@@ -107,6 +113,9 @@ def consume_texture_coordinates(self):
107113 )
108114
109115 self .next_line ()
116+ if not self .values :
117+ break
118+
110119 if self .values [0 ] != "vt" :
111120 break
112121
@@ -154,7 +163,7 @@ def parse_f(self):
154163
155164 # Since list() also consumes StopIteration we need to sanity check the line
156165 # to make sure the parser advances
157- if self .values [0 ] == "f" :
166+ if self .values and self . values [0 ] == "f" :
158167 self .next_line ()
159168
160169 def consume_faces (self ):
@@ -178,9 +187,6 @@ def consume_faces(self):
178187 has_vn = False
179188 has_colors = False
180189
181- # If the face contains elements
182- triangulate = len (self .values ) - 1 >= 4
183-
184190 parts = self .values [1 ].split ('/' )
185191 # We assume texture coordinates are present
186192 if len (parts ) == 2 :
@@ -194,7 +200,7 @@ def consume_faces(self):
194200 has_vn = True
195201
196202 # Are we referencing vertex with color info?
197- vertex = self .vertices [int (parts [0 ])]
203+ vertex = self .vertices [int (parts [0 ]) - 1 ]
198204 has_colors = len (vertex ) == 6
199205
200206 # Prepare vertex format string
@@ -216,6 +222,9 @@ def consume_faces(self):
216222 while True :
217223 v1 , vlast = None , None
218224
225+ # Do we need to triangulate? Each line may contain a varying amount of elements
226+ triangulate = (len (self .values ) - 1 ) > 3
227+
219228 for i , v in enumerate (self .values [1 :]):
220229 parts = v .split ('/' )
221230 v_index = (int (parts [0 ]) - 1 )
@@ -269,5 +278,8 @@ def consume_faces(self):
269278
270279 # Break out of the loop when there are no more f statements
271280 self .next_line ()
281+ if not self .values :
282+ break
283+
272284 if self .values [0 ] != "f" :
273285 break
0 commit comments