![]() |
Forum Index : Microcontroller and PC projects : CMM2 3D File Loader(s)
Author | Message | ||||
PeteCotton![]() Guru ![]() Joined: 13/08/2020 Location: CanadaPosts: 543 |
I thought I'd start a seperate thread where we can put any code for loading (or saving??) existing 3D file formats in to the new 3D engine. That way we won't be cluttering up the main thread. This .WRL one (code to convert .wrl files in to the new 3D objects) is definitely a work in progress. But I thought I'd share the latest update. I've rewritten it so that it now has a bunch of custom string handling functions that I think will be useful for all other file loaders (I'm starting to write a .obj one as well). I had to use "long strings" for the file load section (because of the 255 char limit on strings) and then I split it down in to smaller strings that I can parse. This code doesn't work with some of the larger .WRL files as I realised halfway through the project that there's a whole pile of different ways to store data, including having multiple objects in the one file. So when you upload a truck it might have seperate hood, wheels etc, all at different relative locations. That's the next task to solve. option explicit option default float dim integer camera_y = 0 dim integer viewplane = 700 dim integer camera_z = 0 dim integer camera_x = 0 dim integer c,t,s timer=0 dim q(4) dim yaw=rad(1),pitch=rad(2),roll=rad(0.5) ' Use GetWRLInfo to find out how many faces the model has 'GetWRLInfo("EliteShips\coriolis.wrl") ' This object has 14 faces, so put random colours on them dim integer bcol(13) for t=0 to 13 bcol(t)=rgb(rnd*255,100+rnd*155, rnd*255) next t dim integer faceCol(13) for t=0 to 13 facecol(t)=t next t LoadWRL(1,"EliteShips\coriolis.wrl", bcol(), faceCol(), faceCol()) draw3d camera 1,viewplane,camera_x,camera_y,camera_z page write 1 for c=0 to 7200 draw3d show 1,0,0,2000, 1 math q_euler yaw,pitch,roll,q() draw3d rotate q(),1 ' rotate this object # inc yaw,rad(1) inc pitch,rad(2) inc roll,rad(0.5) page copy 1 to 0,b next page write 0 print 720000/timer draw3d close all end sub GetWRLInfo(filename as string) local integer dummyArray(1) LoadWRL(-1, filename, dummyArray(), dummyArray(), dummyArray()) end sub sub LoadWRL(objNum as integer, filename as string, bcol%(), edgeCol%(), faceCol%()) local integer vertLS(10000), faceLS(10000) ' Long strings local integer vertLSCursor, faceLSCursor local string dataLine$, a$ local integer readingVertices=0 local integer readingFaces=0 local integer t,j,faceCount,vertCount, index1 ' Get the data out of the file and in to vert$ and face$ open filename for input as #1 do while not eof(1) line input #1,a$ a$=Trim$(a$) ' Get rid of any leading or trailing spaces ' strip all formatting out of input line dataLine$="" for t=1 to len(a$) if asc(mid$(a$,t,1))>=32 then dataLine$=dataLine$ + mid$(a$,t,1) next t if left$(dataLine$,10)="coordIndex" then readingVertices=0:readingFaces=1 if left$(dataLine$,16) = "coord Coordinate" then readingVertices=1:readingFaces=0 if left$(dataLine$,1)="-" or (asc(left$(dataLine$,1))>47 and asc(left$(dataLine$,1))<58) then ' This line starts with a number if readingVertices=1 then if vertLSCursor+len(dataLine$)>=80000 then page write 0:?"String to large for vertices":end longstring append vertLS(), dataLine$ inc vertLSCursor, len(dataLine$) end if if readingFaces=1 then if faceLSCursor+len(dataLine$)>=80000 then page write 0:?"String to large for faces":end longstring append faceLS(), dataLine$ inc faceLSCursor, len(dataLine$) end if endif if instr(dataLine$,"]")<>0 then readingVertices=0:readingFaces=0 loop close #1 'vert$ is 3 points seperated by spaces. Each 3 points are then seperated by a comma 'e.g. 160 0 160,0 160 160,... ' count the nuber of verts vertCount=CountDataPointsLS(vertLS(), vertLSCursor,",") ' face$ uses 4 or 5 numbers seperated by commas. -1 is used as the terminator ' Count the number of -1's to give us the face count faceCount=CountDataPointsLS(faceLS(), faceLSCursor, "-1") 'load the face$ and vert$ data in to these arrays to populate our 3D object local float v(2,vertCount-1) ' Vertice data local integer fc(faceCount-1) ' count of points on each face ' load vertices from vert$ ' These are in the form 160 0 160, 0 160 160, ' So first off split them up by commas to get each x,y,z point and load this in to vertData$() local string vertData$(vertCount-1) SplitLS(vertLS(), vertLSCursor, ",", vertData$()) ' Now work through each point and split the string "160 0 160" up by spaces and load in to v(,) local string singleVertPoint$(3) for t=0 to vertCount-1 Split(vertData$(t)," ", singleVertPoint$()) v(0,t)=val(singleVertPoint$(0)) v(1,t)=val(singleVertPoint$(1)) v(2,t)=val(singleVertPoint$(2)) next t ' face$ is in the form of 0, 1, 2, 3, -1, 0, 1, 5, -1, 0.. ' where -1 denotes the end of that face data ' Split face$ up by "-1" to get an array of faceData$() local string faceData$(faceCount-1) SplitLS(faceLS(), faceLSCursor,"-1",faceData$()) ' Now work through the array of faceData$() and count how many points we have for each face ' these are stored in fc() for t=0 to faceCount-1 fc(t)=CountDataPoints(faceData(t),",") next t ' finally calculate the faces array fv() local integer fv(math(sum fc())-1) index1=0 ' position in array fv() local string tempArray(20) ' assume a maxium of 20 points for any single face local integer count=0 for t=0 to faceCount-1 count=CountDataPoints(faceData(t),",") Split(faceData(t),",", tempArray()) for j=0 to count-1 fv(index1)=val(tempArray(j)) index1=index1+1 next j next t ' Is this a request for info from the developer if objNum=-1 then page write 0 print "File: ", filename$ print "Face Count: ", faceCount print "Vertice Count:", vertCount end end if draw3d create objNum, vertCount, faceCount, 1, v(), fc(), fv(),bcol%(),edgeCol%(),faceCol%() end sub ' ' =================STRING HELPER FUNCTIONS ====================== ' function LTrim$(a$) LTrim$=a$ do while instr(" ", left$(LTrim$,1)) LTrim$=Mid$(Ltrim$,2) loop end function function RTrim$(a$) RTrim$=a$ do while instr(" ", right$(RTrim$,1)) RTrim$=Mid$(Rtrim$,1,len(RTrim$)-1) loop end function function Trim$(a$) Trim$=RTrim$(LTrim$(a$)) end function ' In order to size our arrays properly for the Split function (below) we need to know how ' many data points to expect. The CountDataPoints takes in a tring source$ and the character(s) ' which will be used to split it up, and this function willreturn a count of the data points ' that would be returned by Split. Note, only data points with actual data are counted, this makes ' splitting large strings up much easier. So for example ",4,5,6," and "4,5,6" split on comma will ' both return the number 3 - as there are onyl 3 value between the commas. function CountDataPoints(source$, splitChar$) CountDataPoints=0 local string nextDataPoint="" for t=1 to len(source$)-len(splitChar$) if mid$(source$,t,len(splitChar$))=splitChar$ then ' we have found a split point if trim$(nextDataPoint)<>"" then CountDataPoints = CountDataPoints + 1:nextDataPoint="" t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters else nextDataPoint=nextDataPoint+mid$(source$,t,1) end if next t if trim$(nextDataPoint)<>"" then CountDataPoints=CountDataPoints+1 ' Catch last data point if it is there end function ' The Split function take in any string (source$) and breaks it down in to an array of smaller strings ' split upon the sub string (char$). These smaller strings are returned in array returnData$() ' Note: You need to know how many to expect so that you can size ReturnData$() appropriately. That ' is why we have te CountDataPoints function (above). ' The split is quite resiliant, and will only return strings that return actual data. Therefore the ' following strings ",1,2,3," and "1,2,3" and " 1,2 , 3," all return three elements (1,2,3). ' The split char can be more than one character, so we could split "0,1,2,3,-1,0,1,5,-1,0,3,4,-1" ' on -1 and yo would get three strings of "0,1,2,3," and ",0,1,5," and ",0,3,4," sub Split(source$, char$, returnData$()) local string nextSplit="" local integer index=0 for t=1 to len(source$)-len(char$)+1 if mid$(source$,t,len(char$))=char$ then if trim$(nextSplit)<>"" then returnData$(index)=nextSplit nextSplit="" index=index+1 endif t=t+len(char$)-1 ' if we are searching for a 2 char string, then skip over it else nextSplit=nextSplit+mid$(source$,t,1) end if next t if trim$(nextSplit)<>"" then ' make sure we catch the last split string returnData$(index)=nextSplit endif end sub ' LongString version of CountDataPoints where source$ is a long string function CountDataPointsLS(source() as integer, sourceLength%, splitChar$) CountDataPointsLS=0 local string nextDataPoint="" local integer tempLS(len(splitChar$)) local integer nextCharLS(1) for t=1 to sourceLength%-len(splitChar$) longstring mid tempLS(), source(),t,len(splitChar$) if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then ' we have found a split point if trim$(nextDataPoint)<>"" then CountDataPointsLS = CountDataPointsLS + 1:nextDataPoint="" t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters else longstring mid nextCharLS(), source(), t,1 nextDataPoint=nextDataPoint+lgetstr$(nextCharLS(),1,1) end if next t if trim$(nextDataPoint)<>"" then CountDataPointsLS=CountDataPointsLS+1 ' Catch last data point if it is there end function ' LongString version of Split, where source$ is now a longstring sub SplitLS(source() as integer, sourceLength%, splitChar$, returnData$()) local string nextSplit="" local integer index=0 local integer tempLS(len(splitChar$)) local integer nextCharLS(1) for t=1 to sourceLength%-len(splitChar$)+1 longstring mid tempLS(), source(),t,len(splitChar$) if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then ' we have found a split point if trim$(nextSplit)<>"" then returnData$(index)=nextSplit nextSplit="" index=index+1 endif t=t+len(splitChar$)-1 ' if we are searching for a 2 char string, then skip over it else longstring mid nextCharLS(), source(), t,1 nextSplit=nextSplit+lgetstr$(nextCharLS(),1,1) end if next t if trim$(nextSplit)<>"" then ' make sure we catch the last split string returnData$(index)=nextSplit endif end sub Edited 2020-12-05 09:43 by PeteCotton |
||||
PeteCotton![]() Guru ![]() Joined: 13/08/2020 Location: CanadaPosts: 543 |
I have the .OBJ loader "working". I use Quotes because there still appears to be some issue with the objects, but that might just be the order in which the primitives, that make it up, are loaded. In the crate object below you can see that some of the struts are missing. I'm not sure why that is, I'll try and investigate this weekend. They do re-appear as they rotate to the front of the object. ![]() It can handle quite large objects, however I have to pre-allocate the Long String arrays to handle the parsing in LoadOBJ(). I have defined these as 100,000 elements - which I believe translates in to a maximum string length of 800K. i.e. If the text to define either the vertexes or faces exceeds 800,000 characters you will need to increase this limit. The .OBJ file format is much easier to work with than .WRL. By default all faces are right hand/clockwise orientation. It is clearly defined here. http://paulbourke.net/dataformats/obj/ Currently I'm just throwing random colours at each face. But the .OBJ file format does contain definition for colours and/or textures, so I want to get that working. option explicit option default float dim integer camera_y = 0 dim integer viewplane = 700 dim integer camera_z = 0 dim integer camera_x = 0 dim integer finalObject=1 dim integer c,t,s timer=0 dim q(4) dim yaw=rad(1),pitch=rad(2),roll=rad(0.5) ' Generate 50 random colours to use on faces dim integer bcol(50) for t=0 to 50 bcol(t)=rgb(rnd()*255,rnd()*255, rnd()*255) next t ' Works for putting random colours on objects with up to 500 faces ' Increase for objects wth more faces dim integer faceCol(500) for t=0 to 500 facecol(t)=rnd()*50 next t LoadOBJ(1,"EliteShips\wooden crate.obj", bcol(), faceCol(), faceCol()) draw3d camera 1,viewplane,camera_x,camera_y,camera_z page write 1 for c=0 to 7200 draw3d show 1,0,0,10, 0 math q_euler yaw,pitch,roll,q() draw3d rotate q(),1 ' rotate this object # inc yaw,rad(0.1) inc pitch,rad(0.2) inc roll,rad(0.5) page copy 1 to 0,b next page write 0 print 720000/timer draw3d close all end sub LoadOBJ(objNum%, filename$, bcol%(), edgeCol%(), faceCol%()) local integer vertLS(100000), faceLS(100000) ' Long strings local integer vertLSCursor%, faceLSCursor% local string dataLine$, a$ ' Get the data out of the file and in to vert$ and face$ open filename$ for input as #1 do while not eof(1) line input #1,a$ a$=Trim$(a$) ' Get rid of any leading or trailing spaces ' strip all formatting out of input line dataLine$="" for t=1 to len(a$) if asc(mid$(a$,t,1))>=32 then dataLine$=dataLine$ + mid$(a$,t,1) next t ' Example vertice line "v -0.847 0.78 0.853" if left$(dataLine$,2)="v " then dataLine$=mid$(dataLine$,3)+"," if vertLSCursor%+len(dataLine$)>=800000 then page write 0:?"String to large for vertices":end longstring append vertLS(), dataLine$ inc vertLSCursor%, len(dataLine$) end if ' example face line "f 58/1/1/ 54/2/2 33/3/3 30/4/4" where values are v/vt/vn (vertext, texture, normal) if left$(dataLine$,2)="f " then dataLine$=mid$(dataLine$,3)+"," if faceLSCursor%+len(dataLine$)>=800000 then page write 0:?"String to large for faces":end longstring append faceLS(), dataLine$ inc faceLSCursor%, len(dataLine$) end if loop close #1 Make3DObjectOBJ(objNum%, vertLS(), vertLSCursor%, faceLS(), faceLSCursor%, bcol%(), edgeCol%(), faceCol%()) end sub sub Make3DObjectOBJ(objNum%, vertLS%(), vertLSCount%, faceLS%(), faceLSCount%, bcol%(), edgeCol%(), faceCol%()) local integer t,j,faceCount,vertCount, index1 'vert$ is 3 points seperated by spaces. Each 3 points are then seperated by a comma 'e.g. 160 0 160,0 160 160,... ' count the nuber of verts vertCount=CountDataPointsLS(vertLS%(), vertLSCount%,",") ' face$ uses groups of 3 numbers seperated by /, these groups are ' in turn seperated by spaces. Comma is used as the terminator ' Count the number of commas to give us the face count faceCount=CountDataPointsLS(faceLS%(), faceLSCount%, ",") 'load the face$ and vert$ data in to these arrays to populate our 3D object local float v(2,vertCount-1) ' Vertice data local integer fc(faceCount-1) ' count of points on each face ' load vertices from vert$ ' These are in the form 160 0 160, 0 160 160, ' So first off split them up by commas to get each x,y,z point and load this in to vertData$() local string vertData$(vertCount-1) SplitLS(vertLS%(), vertLSCount%, ",", vertData$()) ' Now work through each point and split the string "160 0 160" up by spaces and load in to v(,) local string singleVertPoint$(3) for t=0 to vertCount-1 Split(vertData$(t)," ", singleVertPoint$()) v(0,t)=val(singleVertPoint$(0)) v(1,t)=val(singleVertPoint$(1)) v(2,t)=val(singleVertPoint$(2)) next t ' face$ i in the form "58/1/1/ 54/2/2 33/3/3 30/4/4," where values are v/vt/vn (vertext, texture, normal) ' where comma denotes the end of that face data ' Split face$ up by "," to get an array of faceData$() local string faceData$(faceCount-1) SplitLS(faceLS%(), faceLSCount%,",",faceData$()) ' Now work through the array of faceData$() and count how many points we have for each face ' these are stored in fc() for t=0 to faceCount-1 fc(t)=CountDataPoints(faceData$(t)," ") next t ' finally calculate the faces array fv() local integer fv(math(sum fc())-1) index1=0 ' position in array fv() local string tempArray1$(20) ' assume a maxium of 20 points for any single face local string tempArray2$(3) local integer count%=0 for t=0 to faceCount-1 count%=CountDataPoints(faceData$(t)," ") Split(faceData$(t)," ", tempArray1$()) for j=0 to count%-1 ' Now spit up "12/53/6" and use the first number (the vertex) Split(tempArray1$(j),"/",tempArray2$()) fv(index1)=val(tempArray2$(0))-1 index1=index1+1 next j next t ' Is this a request for info from the developer if objNum%=-1 then page write 0 print "Face Count: ", faceCount print "Vertice Count:", vertCount end end if draw3d create objNum%, vertCount, faceCount, 1, v(), fc(), fv(),bcol%(),edgeCol%(),faceCol%() end sub ' ' =================STRING HELPER FUNCTIONS ====================== ' function LTrim$(a$) LTrim$=a$ do while instr(" ", left$(LTrim$,1)) LTrim$=Mid$(Ltrim$,2) loop end function function RTrim$(a$) RTrim$=a$ do while instr(" ", right$(RTrim$,1)) RTrim$=Mid$(Rtrim$,1,len(RTrim$)-1) loop end function function Trim$(a$) Trim$=RTrim$(LTrim$(a$)) end function ' In order to size our arrays properly for the Split function (below) we need to know how ' many data points to expect. The CountDataPoints takes in a tring source$ and the character(s) ' which will be used to split it up, and this function willreturn a count of the data points ' that would be returned by Split. Note, only data points with actual data are counted, this makes ' splitting large strings up much easier. So for example ",4,5,6," and "4,5,6" split on comma will ' both return the number 3 - as there are onyl 3 value between the commas. function CountDataPoints(source$, splitChar$) CountDataPoints=0 local string nextDataPoint="" for t=1 to len(source$)-len(splitChar$) if mid$(source$,t,len(splitChar$))=splitChar$ then ' we have found a split point if trim$(nextDataPoint)<>"" then CountDataPoints = CountDataPoints + 1:nextDataPoint="" t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters else nextDataPoint=nextDataPoint+mid$(source$,t,1) end if next t if trim$(nextDataPoint)<>"" then CountDataPoints=CountDataPoints+1 ' Catch last data point if it is there end function ' The Split function take in any string (source$) and breaks it down in to an array of smaller strings ' split upon the sub string (char$). These smaller strings are returned in array returnData$() ' Note: You need to know how many to expect so that you can size ReturnData$() appropriately. That ' is why we have te CountDataPoints function (above). ' The split is quite resiliant, and will only return strings that return actual data. Therefore the ' following strings ",1,2,3," and "1,2,3" and " 1,2 , 3," all return three elements (1,2,3). ' The split char can be more than one character, so we could split "0,1,2,3,-1,0,1,5,-1,0,3,4,-1" ' on -1 and yo would get three strings of "0,1,2,3," and ",0,1,5," and ",0,3,4," sub Split(source$, char$, returnData$()) local string nextSplit="" local integer index=0 for t=1 to len(source$)-len(char$)+1 if mid$(source$,t,len(char$))=char$ then if trim$(nextSplit)<>"" then returnData$(index)=nextSplit nextSplit="" index=index+1 endif t=t+len(char$)-1 ' if we are searching for a 2 char string, then skip over it else nextSplit=nextSplit+mid$(source$,t,1) end if next t if trim$(nextSplit)<>"" then ' make sure we catch the last split string returnData$(index)=nextSplit endif end sub ' LongString version of CountDataPoints where source$ is a long string function CountDataPointsLS(source() as integer, sourceLength%, splitChar$) CountDataPointsLS=0 local string nextDataPoint="" local integer tempLS(len(splitChar$)) local integer nextCharLS(1) for t=1 to sourceLength%-len(splitChar$) longstring mid tempLS(), source(),t,len(splitChar$) if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then ' we have found a split point if trim$(nextDataPoint)<>"" then CountDataPointsLS = CountDataPointsLS + 1:nextDataPoint="" t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters else longstring mid nextCharLS(), source(), t,1 nextDataPoint=nextDataPoint+lgetstr$(nextCharLS(),1,1) end if next t if trim$(nextDataPoint)<>"" then CountDataPointsLS=CountDataPointsLS+1 ' Catch last data point if it is there end function ' Lognstring version of Split, where source$ is now a longstring sub SplitLS(source() as integer, sourceLength%, splitChar$, returnData$()) local string nextSplit="" local integer index=0 local integer tempLS(len(splitChar$)) local integer nextCharLS(1) for t=1 to sourceLength%-len(splitChar$)+1 longstring mid tempLS(), source(),t,len(splitChar$) if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then ' we have found a split point if trim$(nextSplit)<>"" then returnData$(index)=nextSplit nextSplit="" index=index+1 endif t=t+len(splitChar$)-1 ' if we are searching for a 2 char string, then skip over it else longstring mid nextCharLS(), source(), t,1 nextSplit=nextSplit+lgetstr$(nextCharLS(),1,1) end if next t if trim$(nextSplit)<>"" then ' make sure we catch the last split string returnData$(index)=nextSplit endif end sub And the source .OBJ file is here # Blender v2.90.0 OBJ File: 'wooden crate.blend' # www.blender.org mtllib wooden crate.mtl o crate_Cube.004 v -0.847977 0.734659 0.853419 v -0.847977 -0.850017 -0.731258 v -0.847977 0.850017 0.738061 v -0.847977 -0.734659 -0.846616 v -0.847977 0.005373 0.124132 v -0.847977 -0.120731 -0.001971 v -0.847977 -0.005373 -0.117329 v -0.847977 0.120731 0.008774 v -0.847977 0.852453 -0.722949 v -0.847977 0.726350 -0.849052 v -0.847977 -0.852453 0.729751 v -0.847977 -0.726350 0.855855 v -0.985375 0.747635 0.840443 v -0.967024 0.734659 0.853419 v -0.982916 0.741147 0.846931 v -0.976199 0.736398 0.851680 v -0.967024 -0.850017 -0.731258 v -0.985375 -0.837042 -0.744234 v -0.976199 -0.848279 -0.732996 v -0.982916 -0.843530 -0.737746 v -0.967024 0.850017 0.738061 v -0.985375 0.837042 0.751036 v -0.976199 0.848279 0.739799 v -0.982916 0.843530 0.744548 v -0.985375 -0.747635 -0.833640 v -0.967024 -0.734659 -0.846616 v -0.982916 -0.741147 -0.840128 v -0.976199 -0.736398 -0.844878 v -0.967024 0.726350 -0.849052 v -0.985375 0.745322 -0.830080 v -0.976199 0.728892 -0.846510 v -0.982916 0.735836 -0.839566 v -0.985375 0.833482 -0.741920 v -0.967024 0.852453 -0.722949 v -0.982916 0.842968 -0.732434 v -0.976199 0.849912 -0.725490 v -0.967024 -0.726350 0.855855 v -0.985375 -0.745322 0.836883 v -0.976199 -0.728892 0.853313 v -0.982916 -0.735836 0.846369 v -0.985375 -0.833482 0.748723 v -0.967024 -0.852453 0.729751 v -0.982916 -0.842968 0.739237 v -0.976199 -0.849912 0.732293 v -0.967024 -0.120731 -0.001971 v -0.985375 -0.088783 0.004025 v -0.976199 -0.116451 -0.001168 v -0.982916 -0.104757 0.001027 v -0.967024 0.005373 0.124132 v -0.985375 -0.000623 0.092185 v -0.976199 0.004569 0.119852 v -0.982916 0.002375 0.108158 v -0.967024 0.120731 0.008774 v -0.985375 0.088783 0.002778 v -0.976199 0.116451 0.007971 v -0.982916 0.104757 0.005776 v -0.967024 -0.005373 -0.117329 v -0.985375 0.000623 -0.085382 v -0.976199 -0.004569 -0.113049 v -0.982916 -0.002375 -0.101356 v 0.777772 0.777772 -1.000000 v 1.000000 0.777772 -0.777772 v 0.969135 0.984547 -0.995877 v 0.984547 0.969135 -0.995877 v 0.983895 0.983895 -0.991871 v 0.984547 0.995877 -0.969135 v 0.969135 0.995877 -0.984547 v 0.983895 0.991871 -0.983895 v 0.995877 0.969135 -0.984547 v 0.995877 0.984547 -0.969135 v 0.991871 0.983895 -0.983895 v 0.777772 -1.000000 -0.777772 v 0.777772 -0.777772 -1.000000 v 1.000000 -0.777772 -0.777772 v 0.969135 -0.995877 -0.984547 v 0.984547 -0.995877 -0.969135 v 0.983895 -0.991871 -0.983895 v 0.984547 -0.969135 -0.995877 v 0.969135 -0.984547 -0.995877 v 0.983895 -0.983895 -0.991871 v 0.995877 -0.984547 -0.969135 v 0.995877 -0.969135 -0.984547 v 0.991871 -0.983895 -0.983895 v 1.000000 0.777772 0.777772 v 0.777772 0.777772 1.000000 v 0.995877 0.984547 0.969135 v 0.995877 0.969135 0.984547 v 0.991871 0.983895 0.983895 v 0.969135 0.995877 0.984547 v 0.984547 0.995877 0.969135 v 0.983895 0.991871 0.983895 v 0.984547 0.969135 0.995877 v 0.969135 0.984547 0.995877 v 0.983895 0.983895 0.991871 v 1.000000 -0.777772 0.777772 v 0.777772 -0.777772 1.000000 v 0.777772 -1.000000 0.777772 v 0.995877 -0.969135 0.984547 v 0.995877 -0.984547 0.969135 v 0.991871 -0.983895 0.983895 v 0.969135 -0.984547 0.995877 v 0.984547 -0.969135 0.995877 v 0.983895 -0.983895 0.991871 v 0.984547 -0.995877 0.969135 v 0.969135 -0.995877 0.984547 v 0.983895 -0.991871 0.983895 v -0.777772 0.777772 -1.000000 v -1.000000 0.777772 -0.777772 v -0.984547 0.969135 -0.995877 v -0.969135 0.984547 -0.995877 v -0.983895 0.983895 -0.991871 v -0.995877 0.984547 -0.969135 v -0.995877 0.969135 -0.984547 v -0.991871 0.983895 -0.983895 v -0.969135 0.995877 -0.984547 v -0.984547 0.995877 -0.969135 v -0.983895 0.991871 -0.983895 v -1.000000 -0.777772 -0.777772 v -0.777772 -0.777772 -1.000000 v -0.777772 -1.000000 -0.777772 v -0.995877 -0.969135 -0.984547 v -0.995877 -0.984547 -0.969135 v -0.991871 -0.983895 -0.983895 v -0.969135 -0.984547 -0.995877 v -0.984547 -0.969135 -0.995877 v -0.983895 -0.983895 -0.991871 v -0.984547 -0.995877 -0.969135 v -0.969135 -0.995877 -0.984547 v -0.983895 -0.991871 -0.983895 v -1.000000 0.777772 0.777772 v -0.777772 0.777772 1.000000 v -0.995877 0.969135 0.984547 v -0.995877 0.984547 0.969135 v -0.991871 0.983895 0.983895 v -0.969135 0.984547 0.995877 v -0.984547 0.969135 0.995877 v -0.983895 0.983895 0.991871 v -0.984547 0.995877 0.969135 v -0.969135 0.995877 0.984547 v -0.983895 0.991871 0.983895 v -0.777772 -1.000000 0.777772 v -0.777772 -0.777772 1.000000 v -1.000000 -0.777772 0.777772 v -0.969135 -0.995877 0.984547 v -0.984547 -0.995877 0.969135 v -0.983895 -0.991871 0.983895 v -0.984547 -0.969135 0.995877 v -0.969135 -0.984547 0.995877 v -0.983895 -0.983895 0.991871 v -0.995877 -0.984547 0.969135 v -0.995877 -0.969135 0.984547 v -0.991871 -0.983895 0.983895 v -0.969135 -1.000000 -0.969135 v -0.969135 -1.000000 0.969135 v -1.000000 -0.969135 0.969135 v -1.000000 -0.969135 -0.969135 v 0.969135 -1.000000 -0.969135 v -0.969135 -0.969135 -1.000000 v 0.969135 -0.969135 -1.000000 v 1.000000 0.969135 -0.969135 v 1.000000 -0.969135 -0.969135 v 0.969135 0.969135 -1.000000 v -0.969135 -0.969135 1.000000 v -0.969135 0.969135 1.000000 v -1.000000 0.969135 0.969135 v 0.969135 0.969135 1.000000 v 0.969135 -0.969135 1.000000 v 1.000000 -0.969135 0.969135 v 1.000000 0.969135 0.969135 v -0.969135 0.969135 -1.000000 v -1.000000 0.969135 -0.969135 v 0.969135 1.000000 0.969135 v -0.969135 1.000000 0.969135 v 0.969135 1.000000 -0.969135 v 0.969135 -1.000000 0.969135 v -0.969135 1.000000 -0.969135 v -0.777772 -0.860564 -0.777772 v -0.777772 -0.860564 0.777772 v -0.860564 -0.777772 0.777772 v -0.860564 -0.777772 -0.777772 v 0.777772 -0.860564 -0.777772 v -0.777772 -0.777772 -0.860564 v 0.777772 -0.777772 -0.860564 v 0.860564 0.777772 -0.777772 v 0.860564 -0.777772 -0.777772 v 0.777772 0.777772 -0.860564 v -0.777772 -0.777772 0.860564 v -0.777772 0.777772 0.860564 v -0.860564 0.777772 0.777772 v 0.777772 0.777772 0.860564 v 0.777772 -0.777772 0.860564 v 0.860564 -0.777772 0.777772 v 0.860564 0.777772 0.777772 v -0.777772 0.777772 -0.860564 v -0.860564 0.777772 -0.777772 v 0.777772 0.860564 0.777772 v -0.777772 0.860564 0.777772 v 0.777772 0.860564 -0.777772 v 0.777772 -0.860564 0.777772 v -0.777772 0.860564 -0.777772 v 0.830168 1.000000 -0.830168 v 0.777772 0.947605 -0.777772 v 0.830168 1.000000 0.830168 v 0.777772 0.947605 0.777772 v -0.777772 0.947605 -0.777772 v -0.830168 1.000000 -0.830168 v -0.777772 0.947605 0.777772 v -0.830168 1.000000 0.830168 v 0.850017 0.734659 0.851379 v -0.734659 -0.850017 0.851379 v 0.734659 0.850017 0.851379 v -0.850017 -0.734659 0.851379 v 0.120731 0.005373 0.851379 v -0.005373 -0.120731 0.851379 v -0.120731 -0.005373 0.851379 v 0.005373 0.120731 0.851379 v -0.726350 0.852453 0.851379 v -0.852453 0.726350 0.851379 v 0.726350 -0.852453 0.851379 v 0.852453 -0.726350 0.851379 v 0.837042 0.747635 0.988776 v 0.850017 0.734659 0.970425 v 0.843530 0.741147 0.986317 v 0.848279 0.736398 0.979601 v -0.734659 -0.850017 0.970425 v -0.747635 -0.837042 0.988776 v -0.736398 -0.848279 0.979601 v -0.741147 -0.843530 0.986317 v 0.734659 0.850017 0.970425 v 0.747635 0.837042 0.988776 v 0.736398 0.848279 0.979601 v 0.741147 0.843530 0.986317 v -0.837042 -0.747635 0.988776 v -0.850017 -0.734659 0.970425 v -0.843530 -0.741147 0.986317 v -0.848279 -0.736398 0.979601 v -0.852453 0.726350 0.970425 v -0.833482 0.745322 0.988776 v -0.849912 0.728892 0.979601 v -0.842968 0.735836 0.986317 v -0.745322 0.833482 0.988776 v -0.726350 0.852453 0.970425 v -0.735836 0.842968 0.986317 v -0.728892 0.849912 0.979601 v 0.852453 -0.726350 0.970425 v 0.833482 -0.745322 0.988776 v 0.849912 -0.728892 0.979601 v 0.842968 -0.735836 0.986317 v 0.745322 -0.833482 0.988776 v 0.726350 -0.852453 0.970425 v 0.735836 -0.842968 0.986317 v 0.728892 -0.849912 0.979601 v -0.005373 -0.120731 0.970425 v 0.000623 -0.088783 0.988776 v -0.004569 -0.116451 0.979601 v -0.002375 -0.104757 0.986317 v 0.120731 0.005373 0.970425 v 0.088783 -0.000623 0.988776 v 0.116451 0.004569 0.979601 v 0.104757 0.002375 0.986317 v 0.005373 0.120731 0.970425 v -0.000623 0.088783 0.988776 v 0.004569 0.116451 0.979601 v 0.002375 0.104757 0.986317 v -0.120731 -0.005373 0.970425 v -0.088783 0.000623 0.988776 v -0.116451 -0.004569 0.979601 v -0.104757 -0.002375 0.986317 v -0.850017 0.734659 -0.844576 v 0.734659 -0.850017 -0.844576 v -0.734659 0.850017 -0.844576 v 0.850017 -0.734659 -0.844576 v -0.120731 0.005373 -0.844576 v 0.005373 -0.120731 -0.844576 v 0.120731 -0.005373 -0.844576 v -0.005373 0.120731 -0.844576 v 0.726350 0.852453 -0.844576 v 0.852453 0.726350 -0.844576 v -0.726350 -0.852453 -0.844576 v -0.852453 -0.726350 -0.844576 v -0.837042 0.747635 -0.981973 v -0.850017 0.734659 -0.963623 v -0.843530 0.741147 -0.979515 v -0.848279 0.736398 -0.972798 v 0.734659 -0.850017 -0.963623 v 0.747635 -0.837042 -0.981973 v 0.736398 -0.848279 -0.972798 v 0.741147 -0.843530 -0.979515 v -0.734659 0.850017 -0.963623 v -0.747635 0.837042 -0.981973 v -0.736398 0.848279 -0.972798 v -0.741147 0.843530 -0.979515 v 0.837042 -0.747635 -0.981973 v 0.850017 -0.734659 -0.963623 v 0.843529 -0.741147 -0.979515 v 0.848279 -0.736398 -0.972798 v 0.852453 0.726350 -0.963623 v 0.833482 0.745322 -0.981973 v 0.849912 0.728892 -0.972798 v 0.842967 0.735836 -0.979515 v 0.745322 0.833482 -0.981973 v 0.726350 0.852453 -0.963623 v 0.735836 0.842968 -0.979515 v 0.728892 0.849912 -0.972798 v -0.852453 -0.726350 -0.963623 v -0.833482 -0.745322 -0.981973 v -0.849912 -0.728892 -0.972798 v -0.842968 -0.735836 -0.979515 v -0.745322 -0.833482 -0.981973 v -0.726350 -0.852453 -0.963623 v -0.735836 -0.842968 -0.979515 v -0.728892 -0.849912 -0.972798 v 0.005373 -0.120731 -0.963623 v -0.000623 -0.088783 -0.981973 v 0.004569 -0.116451 -0.972798 v 0.002375 -0.104757 -0.979515 v -0.120731 0.005373 -0.963623 v -0.088783 -0.000623 -0.981973 v -0.116451 0.004569 -0.972798 v -0.104757 0.002375 -0.979515 v -0.005373 0.120731 -0.963623 v 0.000623 0.088783 -0.981973 v -0.004569 0.116451 -0.972798 v -0.002375 0.104757 -0.979515 v 0.120731 -0.005373 -0.963623 v 0.088783 0.000623 -0.981973 v 0.116451 -0.004569 -0.972798 v 0.104757 -0.002375 -0.979515 v 0.847977 0.734659 -0.846616 v 0.847978 -0.850017 0.738061 v 0.847977 0.850017 -0.731258 v 0.847978 -0.734659 0.853419 v 0.847977 0.005373 -0.117329 v 0.847977 -0.120731 0.008774 v 0.847977 -0.005373 0.124132 v 0.847977 0.120731 -0.001971 v 0.847978 0.852453 0.729751 v 0.847978 0.726350 0.855855 v 0.847977 -0.852453 -0.722949 v 0.847977 -0.726350 -0.849052 v 0.985375 0.747635 -0.833640 v 0.967024 0.734659 -0.846616 v 0.982916 0.741147 -0.840128 v 0.976199 0.736398 -0.844878 v 0.967024 -0.850017 0.738061 v 0.985375 -0.837042 0.751036 v 0.976199 -0.848279 0.739799 v 0.982916 -0.843530 0.744548 v 0.967024 0.850017 -0.731258 v 0.985375 0.837042 -0.744234 v 0.976199 0.848279 -0.732996 v 0.982916 0.843530 -0.737746 v 0.985375 -0.747635 0.840443 v 0.967024 -0.734659 0.853419 v 0.982916 -0.741147 0.846931 v 0.976199 -0.736398 0.851680 v 0.967024 0.726350 0.855855 v 0.985375 0.745322 0.836883 v 0.976199 0.728892 0.853313 v 0.982916 0.735836 0.846369 v 0.985375 0.833482 0.748723 v 0.967024 0.852453 0.729751 v 0.982916 0.842968 0.739237 v 0.976199 0.849912 0.732293 v 0.967024 -0.726350 -0.849052 v 0.985375 -0.745322 -0.830080 v 0.976199 -0.728892 -0.846510 v 0.982916 -0.735836 -0.839566 v 0.985375 -0.833482 -0.741920 v 0.967024 -0.852453 -0.722949 v 0.982916 -0.842968 -0.732435 v 0.976199 -0.849912 -0.725490 v 0.967024 -0.120731 0.008774 v 0.985375 -0.088783 0.002778 v 0.976199 -0.116451 0.007971 v 0.982916 -0.104757 0.005776 v 0.967024 0.005373 -0.117329 v 0.985375 -0.000623 -0.085382 v 0.976199 0.004569 -0.113049 v 0.982916 0.002375 -0.101356 v 0.967024 0.120731 -0.001971 v 0.985375 0.088783 0.004025 v 0.976199 0.116451 -0.001168 v 0.982916 0.104757 0.001027 v 0.967024 -0.005373 0.124132 v 0.985375 0.000623 0.092185 v 0.976199 -0.004569 0.119852 v 0.982916 -0.002375 0.108158 vt 0.833223 0.865227 vt 0.844621 0.853837 vt 0.939705 0.948983 vt 0.928307 0.960373 vt 0.613492 0.083074 vt 0.613541 0.204766 vt 0.599495 0.204772 vt 0.599445 0.083080 vt 0.833070 0.842279 vt 0.928154 0.747257 vt 0.939705 0.758815 vt 0.676892 0.444810 vt 0.676892 0.322771 vt 0.690978 0.322771 vt 0.690978 0.444810 vt 0.132582 0.452615 vt 0.118535 0.452621 vt 0.118486 0.330929 vt 0.132532 0.330923 vt 0.196224 0.085336 vt 0.210637 0.085336 vt 0.210637 0.210625 vt 0.196224 0.210625 vt 0.821672 0.853669 vt 0.726589 0.758523 vt 0.737986 0.747133 vt 0.726589 0.948691 vt 0.738140 0.960249 vt 0.167092 0.210398 vt 0.152696 0.210398 vt 0.152696 0.085258 vt 0.167092 0.085258 vt 0.189017 0.210568 vt 0.174620 0.210568 vt 0.174620 0.085429 vt 0.189017 0.085429 vt 0.833166 0.083843 vt 0.847579 0.083843 vt 0.847579 0.209132 vt 0.833166 0.209132 vt 0.168010 0.213851 vt 0.168028 0.085461 vt 0.170243 0.085453 vt 0.170231 0.212356 vt 0.172436 0.085442 vt 0.172432 0.211114 vt 0.146085 0.213680 vt 0.146103 0.085290 vt 0.148318 0.085282 vt 0.148307 0.212186 vt 0.150512 0.085271 vt 0.150507 0.210944 vt 0.139020 0.324777 vt 0.139020 0.452573 vt 0.136843 0.452587 vt 0.136818 0.327887 vt 0.134706 0.452601 vt 0.134662 0.330116 vt 0.627383 0.080140 vt 0.627383 0.202178 vt 0.625253 0.202161 vt 0.625253 0.079701 vt 0.623116 0.202143 vt 0.623116 0.078527 vt 0.620958 0.202125 vt 0.620958 0.076928 vt 0.615622 0.082267 vt 0.615665 0.204752 vt 0.617777 0.080038 vt 0.617803 0.204738 vt 0.619979 0.076928 vt 0.619979 0.204723 vt 0.674762 0.444793 vt 0.674762 0.322333 vt 0.672625 0.444775 vt 0.672624 0.321159 vt 0.670467 0.444757 vt 0.670467 0.319561 vt 0.189639 0.210585 vt 0.189639 0.083082 vt 0.191845 0.084201 vt 0.191845 0.210595 vt 0.194037 0.085025 vt 0.194037 0.210608 vt 0.830979 0.209114 vt 0.830979 0.083532 vt 0.828787 0.209101 vt 0.828787 0.082707 vt 0.826581 0.209092 vt 0.826581 0.081588 vt 0.641469 0.080140 vt 0.641469 0.202178 vt 0.705452 0.485803 vt 0.705508 0.294512 vt 0.721616 0.278452 vt 0.721512 0.501911 vt 0.744483 0.510744 vt 0.944106 0.510744 vt 0.944106 0.528638 vt 0.744483 0.528638 vt 0.266133 0.512454 vt 0.465756 0.512454 vt 0.465756 0.530348 vt 0.266133 0.530348 vt 0.961999 0.528638 vt 0.961999 0.728261 vt 0.944106 0.728261 vt 0.756434 0.262151 vt 0.756090 0.266389 vt 0.751900 0.266003 vt 0.752366 0.262050 vt 0.497532 0.270494 vt 0.497992 0.274446 vt 0.494273 0.274526 vt 0.493655 0.271718 vt 0.498158 0.278348 vt 0.494279 0.278249 vt 0.490199 0.277767 vt 0.491497 0.273878 vt 0.744275 0.262179 vt 0.748327 0.262051 vt 0.748807 0.266043 vt 0.744610 0.266405 vt 0.011101 0.278513 vt 0.007141 0.278411 vt 0.007135 0.274610 vt 0.010932 0.274529 vt 0.002976 0.277919 vt 0.004301 0.273949 vt 0.756633 0.030316 vt 0.752574 0.030461 vt 0.752074 0.026471 vt 0.756266 0.026085 vt 0.748535 0.030476 vt 0.748982 0.026524 vt 0.744474 0.030391 vt 0.744788 0.026160 vt 0.010462 0.270494 vt 0.006504 0.271743 vt 0.508189 0.261781 vt 0.507871 0.266012 vt 0.503675 0.265644 vt 0.504128 0.261692 vt 0.490199 0.502432 vt 0.494152 0.501972 vt 0.494231 0.505691 vt 0.491423 0.506309 vt 0.498053 0.501806 vt 0.497954 0.505686 vt 0.497472 0.509765 vt 0.493584 0.508467 vt 0.496042 0.261831 vt 0.500093 0.261699 vt 0.500580 0.265691 vt 0.496380 0.266059 vt 0.508382 0.030083 vt 0.504330 0.030215 vt 0.503843 0.026223 vt 0.508043 0.025855 vt 0.500295 0.030222 vt 0.500749 0.026270 vt 0.496235 0.030134 vt 0.496553 0.025902 vt 0.247261 0.277980 vt 0.243225 0.278450 vt 0.243144 0.274653 vt 0.246011 0.274022 vt 0.239242 0.278619 vt 0.239343 0.274659 vt 0.239835 0.270494 vt 0.243805 0.271819 vt 0.993548 0.265355 vt 0.997725 0.265460 vt 0.997681 0.269504 vt 0.993636 0.269515 vt 0.002976 0.262878 vt 0.007113 0.262654 vt 0.006903 0.266628 vt 0.003898 0.266882 vt 0.011229 0.262624 vt 0.011032 0.266824 vt 0.729470 0.277827 vt 0.725518 0.278287 vt 0.725438 0.274567 vt 0.728246 0.273950 vt 0.721715 0.274573 vt 0.722197 0.270494 vt 0.726086 0.271792 vt 0.011781 0.027827 vt 0.007689 0.027834 vt 0.007443 0.023856 vt 0.011560 0.023646 vt 0.003515 0.027610 vt 0.004443 0.023634 vt 0.993565 0.027491 vt 0.993617 0.023319 vt 0.997658 0.023308 vt 0.997725 0.027350 vt 0.002976 0.507292 vt 0.007011 0.506822 vt 0.007092 0.510620 vt 0.004225 0.511250 vt 0.010995 0.506653 vt 0.010893 0.510614 vt 0.010401 0.514779 vt 0.006431 0.513454 vt 0.247800 0.261559 vt 0.251855 0.261421 vt 0.252348 0.265414 vt 0.248151 0.265789 vt 0.255892 0.261412 vt 0.255442 0.265363 vt 0.259953 0.261498 vt 0.259637 0.265730 vt 0.722137 0.509765 vt 0.721677 0.505812 vt 0.725397 0.505733 vt 0.726014 0.508541 vt 0.725391 0.502010 vt 0.729470 0.502492 vt 0.728172 0.506380 vt 0.239135 0.506760 vt 0.243096 0.506861 vt 0.243102 0.510662 vt 0.239304 0.510743 vt 0.247261 0.507353 vt 0.245936 0.511323 vt 0.260155 0.029757 vt 0.256103 0.029887 vt 0.255620 0.025896 vt 0.259818 0.025530 vt 0.252067 0.029890 vt 0.252527 0.025940 vt 0.248004 0.029795 vt 0.248337 0.025564 vt 0.239774 0.514779 vt 0.243732 0.513529 vt 0.490199 0.964650 vt 0.490199 0.765027 vt 0.508093 0.765027 vt 0.508093 0.964650 vt 0.033626 0.484078 vt 0.216560 0.484128 vt 0.224848 0.052796 vt 0.035041 0.051391 vt 0.033677 0.301145 vt 0.970002 0.051301 vt 0.779729 0.053343 vt 0.721186 0.238894 vt 0.721325 0.053562 vt 0.779615 0.239231 vt 0.283240 0.053037 vt 0.283099 0.238332 vt 0.224714 0.238390 vt 0.472959 0.238556 vt 0.473092 0.053293 vt 0.531464 0.053356 vt 0.531332 0.238623 vt 0.969999 0.241497 vt 0.034624 0.239152 vt 0.468542 0.501966 vt 0.268918 0.501966 vt 0.268918 0.490796 vt 0.468542 0.490796 vt 0.268918 0.280003 vt 0.468541 0.280003 vt 0.468541 0.291173 vt 0.268918 0.291173 vt 0.216610 0.301195 vt 0.479711 0.291173 vt 0.479712 0.490796 vt 0.514161 0.485747 vt 0.707716 0.728261 vt 0.508093 0.728261 vt 0.508093 0.528638 vt 0.707716 0.528638 vt 0.744483 0.728261 vt 0.020870 0.733274 vt 0.020870 0.533651 vt 0.220493 0.533651 vt 0.220493 0.733274 vt 0.465756 0.729971 vt 0.266133 0.729971 vt 0.707716 0.765027 vt 0.707716 0.964650 vt 0.707716 0.982544 vt 0.508093 0.982544 vt 0.514217 0.294456 vt 0.020870 0.515757 vt 0.220493 0.515757 vt 0.238387 0.533651 vt 0.238387 0.733274 vt 0.725610 0.765027 vt 0.725610 0.964650 vt 0.726589 0.728261 vt 0.726589 0.528638 vt 0.490199 0.728261 vt 0.490199 0.528638 vt 0.725610 0.528638 vt 0.725610 0.728261 vt 0.483650 0.530348 vt 0.483650 0.729971 vt 0.002976 0.733274 vt 0.002976 0.533651 vt 0.248239 0.729971 vt 0.248239 0.530348 vt 0.944106 0.746154 vt 0.744483 0.746154 vt 0.508093 0.510744 vt 0.707716 0.510744 vt 0.465756 0.747865 vt 0.266133 0.747864 vt 0.707716 0.746154 vt 0.508093 0.746154 vt 0.220493 0.751168 vt 0.020870 0.751168 vt 0.508093 0.747133 vt 0.707716 0.747133 vt 0.475265 0.511475 vt 0.262195 0.511475 vt 0.257748 0.291173 vt 0.257748 0.490796 vt 0.248239 0.497520 vt 0.248239 0.284449 vt 0.489220 0.284449 vt 0.489220 0.497520 vt 0.262194 0.270494 vt 0.475265 0.270494 vt 0.837084 0.388588 vt 0.848481 0.377198 vt 0.943565 0.472343 vt 0.932168 0.483733 vt 0.663000 0.325707 vt 0.663050 0.447400 vt 0.649004 0.447405 vt 0.648954 0.325713 vt 0.836930 0.365639 vt 0.932014 0.270617 vt 0.943565 0.282175 vt 0.648873 0.202176 vt 0.648872 0.080138 vt 0.662959 0.080138 vt 0.662959 0.202176 vt 0.383291 0.211565 vt 0.369245 0.211571 vt 0.369195 0.089879 vt 0.383241 0.089873 vt 0.590058 0.319249 vt 0.604472 0.319249 vt 0.604472 0.444538 vt 0.590058 0.444538 vt 0.825533 0.377029 vt 0.730449 0.281884 vt 0.741846 0.270494 vt 0.730449 0.472051 vt 0.742000 0.483610 vt 0.081527 0.216715 vt 0.067131 0.216715 vt 0.067131 0.091575 vt 0.081527 0.091575 vt 0.073153 0.451489 vt 0.058757 0.451489 vt 0.058757 0.326349 vt 0.073153 0.326349 vt 0.110922 0.450066 vt 0.096509 0.450066 vt 0.096509 0.324777 vt 0.110922 0.324777 vt 0.052146 0.454771 vt 0.052164 0.326382 vt 0.054379 0.326373 vt 0.054368 0.453277 vt 0.056573 0.326363 vt 0.056569 0.452035 vt 0.060520 0.219997 vt 0.060538 0.091607 vt 0.062753 0.091599 vt 0.062742 0.218503 vt 0.064947 0.091588 vt 0.064943 0.217261 vt 0.389729 0.083727 vt 0.389729 0.211523 vt 0.387553 0.211537 vt 0.387527 0.086837 vt 0.385415 0.211551 vt 0.385371 0.089066 vt 0.919985 0.084800 vt 0.919985 0.206838 vt 0.917855 0.206821 vt 0.917855 0.084361 vt 0.915718 0.206803 vt 0.915718 0.083188 vt 0.913561 0.206785 vt 0.913561 0.081588 vt 0.665130 0.324900 vt 0.665174 0.447386 vt 0.667286 0.322671 vt 0.667312 0.447371 vt 0.669488 0.319561 vt 0.669488 0.447357 vt 0.646743 0.202159 vt 0.646743 0.079699 vt 0.644606 0.202141 vt 0.644605 0.078526 vt 0.642448 0.202123 vt 0.642448 0.076928 vt 0.583474 0.444498 vt 0.583474 0.316995 vt 0.585680 0.318115 vt 0.585680 0.444508 vt 0.587872 0.318938 vt 0.587872 0.444521 vt 0.113109 0.324794 vt 0.113109 0.450377 vt 0.115301 0.324807 vt 0.115301 0.451202 vt 0.117507 0.324817 vt 0.117507 0.452320 vt 0.934072 0.084800 vt 0.934072 0.206838 vt 0.354874 0.866937 vt 0.366272 0.855547 vt 0.461355 0.950693 vt 0.449958 0.962083 vt 0.154045 0.330923 vt 0.154095 0.452616 vt 0.140048 0.452621 vt 0.139999 0.330929 vt 0.354721 0.843989 vt 0.449804 0.748966 vt 0.461355 0.760525 vt 0.418646 0.208977 vt 0.418646 0.086938 vt 0.432732 0.086938 vt 0.432732 0.208977 vt 0.641537 0.447400 vt 0.627491 0.447405 vt 0.627441 0.325713 vt 0.641488 0.325707 vt 0.855142 0.083842 vt 0.869556 0.083842 vt 0.869556 0.209131 vt 0.855142 0.209131 vt 0.343323 0.855379 vt 0.248239 0.760233 vt 0.259637 0.748843 vt 0.248239 0.950401 vt 0.259790 0.961959 vt 0.582463 0.444364 vt 0.568066 0.444364 vt 0.568066 0.319224 vt 0.582463 0.319224 vt 0.125009 0.213488 vt 0.110613 0.213488 vt 0.110613 0.088348 vt 0.125009 0.088348 vt 0.361632 0.208715 vt 0.347218 0.208715 vt 0.347218 0.083426 vt 0.361632 0.083426 vt 0.104002 0.216770 vt 0.104020 0.088380 vt 0.106235 0.088372 vt 0.106224 0.215276 vt 0.108429 0.088361 vt 0.108424 0.214034 vt 0.561456 0.447646 vt 0.561474 0.319257 vt 0.563689 0.319248 vt 0.563677 0.446152 vt 0.565882 0.319238 vt 0.565878 0.444910 vt 0.647975 0.319561 vt 0.647975 0.447357 vt 0.645799 0.447371 vt 0.645773 0.322671 vt 0.643661 0.447385 vt 0.643618 0.324900 vt 0.397156 0.086938 vt 0.397156 0.208977 vt 0.395026 0.208959 vt 0.395026 0.086499 vt 0.392889 0.208941 vt 0.392889 0.085325 vt 0.390732 0.208923 vt 0.390731 0.083727 vt 0.156175 0.330116 vt 0.156219 0.452601 vt 0.158331 0.327887 vt 0.158356 0.452587 vt 0.160533 0.324777 vt 0.160533 0.452573 vt 0.416516 0.208960 vt 0.416516 0.086500 vt 0.414379 0.208942 vt 0.414378 0.085326 vt 0.412221 0.208924 vt 0.412221 0.083727 vt 0.848558 0.209091 vt 0.848558 0.081588 vt 0.850764 0.082707 vt 0.850764 0.209101 vt 0.852956 0.083531 vt 0.852956 0.209114 vt 0.363818 0.083443 vt 0.363818 0.209026 vt 0.366010 0.083456 vt 0.366010 0.209850 vt 0.368216 0.083466 vt 0.368216 0.210969 vt 0.411242 0.086938 vt 0.411242 0.208977 vt 0.109611 0.870241 vt 0.121008 0.858851 vt 0.216092 0.953996 vt 0.204694 0.965386 vt 0.906094 0.087735 vt 0.906144 0.209427 vt 0.892097 0.209433 vt 0.892048 0.087741 vt 0.109457 0.847292 vt 0.204541 0.752270 vt 0.216092 0.763828 vt 0.175598 0.324777 vt 0.175598 0.446816 vt 0.161512 0.446816 vt 0.161512 0.324777 vt 0.884631 0.209427 vt 0.870584 0.209433 vt 0.870535 0.087741 vt 0.884581 0.087735 vt 0.619878 0.444850 vt 0.605464 0.444850 vt 0.605464 0.319561 vt 0.619878 0.319561 vt 0.098060 0.858682 vt 0.002976 0.763537 vt 0.014373 0.752147 vt 0.002976 0.953704 vt 0.014527 0.965263 vt 0.103023 0.213488 vt 0.088627 0.213488 vt 0.088627 0.088348 vt 0.103023 0.088348 vt 0.095530 0.449917 vt 0.081134 0.449917 vt 0.081133 0.324777 vt 0.095530 0.324777 vt 0.331817 0.086559 vt 0.346230 0.086559 vt 0.346230 0.211847 vt 0.331817 0.211847 vt 0.074523 0.453199 vt 0.074541 0.324809 vt 0.076756 0.324801 vt 0.076745 0.451705 vt 0.078949 0.324790 vt 0.078945 0.450463 vt 0.082016 0.216770 vt 0.082034 0.088380 vt 0.084249 0.088372 vt 0.084238 0.215276 vt 0.086443 0.088361 vt 0.086439 0.214034 vt 0.891069 0.081588 vt 0.891069 0.209384 vt 0.888893 0.209399 vt 0.888867 0.084699 vt 0.886755 0.209413 vt 0.886711 0.086928 vt 0.131710 0.091551 vt 0.131710 0.213590 vt 0.129580 0.213573 vt 0.129580 0.091113 vt 0.127443 0.213555 vt 0.127443 0.089939 vt 0.125286 0.213537 vt 0.125285 0.088341 vt 0.908224 0.086928 vt 0.908268 0.209413 vt 0.910380 0.084699 vt 0.910405 0.209399 vt 0.912582 0.081588 vt 0.912582 0.209384 vt 0.177728 0.324795 vt 0.177728 0.447254 vt 0.179865 0.324812 vt 0.179865 0.448428 vt 0.182023 0.324830 vt 0.182023 0.450027 vt 0.626462 0.319601 vt 0.626462 0.447104 vt 0.624256 0.445984 vt 0.624256 0.319591 vt 0.622064 0.445161 vt 0.622064 0.319578 vt 0.329630 0.211830 vt 0.329630 0.086248 vt 0.327438 0.211817 vt 0.327439 0.085423 vt 0.325232 0.211807 vt 0.325232 0.084305 vt 0.145796 0.091551 vt 0.145796 0.213590 vn -0.9993 -0.0019 -0.0378 vn -0.9993 0.0378 0.0019 vn -0.9959 0.0640 0.0640 vn -0.9959 -0.0640 -0.0640 vn -0.1440 0.6997 -0.6997 vn -0.1305 0.7011 -0.7011 vn 0.0000 0.7071 -0.7071 vn -0.9993 0.0019 0.0378 vn -0.9914 -0.0923 0.0923 vn -0.9914 0.0923 -0.0923 vn -0.1305 -0.7011 0.7011 vn 0.0000 -0.7071 0.7071 vn -0.1440 -0.6997 0.6997 vn -0.1990 0.6930 0.6930 vn 0.0000 0.7071 0.7071 vn -0.1856 0.6948 0.6948 vn -0.9993 -0.0378 -0.0019 vn 0.0000 -0.7071 -0.7071 vn -0.1990 -0.6930 -0.6930 vn -0.1856 -0.6948 -0.6948 vn -0.9247 -0.2692 -0.2692 vn -0.9771 -0.0423 -0.2083 vn -0.8254 -0.3992 -0.3992 vn -0.3648 -0.6584 -0.6584 vn -0.9247 0.2692 0.2692 vn -0.9771 0.0423 0.2083 vn -0.8254 0.3992 0.3992 vn -0.3648 0.6584 0.6584 vn -0.9659 -0.1830 0.1830 vn -0.9771 -0.2083 -0.0423 vn -0.7071 -0.5000 0.5000 vn -0.5000 -0.6124 0.6124 vn -0.5732 -0.5794 0.5794 vn -0.2588 -0.6830 0.6830 vn -0.2588 0.6830 -0.6830 vn -0.7071 0.5000 -0.5000 vn -0.9659 0.1830 -0.1830 vn -0.9771 0.2083 0.0423 vn -0.5000 0.6124 -0.6124 vn -0.5732 0.5794 -0.5794 vn 0.0000 1.0000 0.0000 vn -0.1296 0.9831 -0.1296 vn -0.1296 0.9831 0.1296 vn 0.0000 -1.0000 0.0000 vn 0.0000 0.0000 1.0000 vn 0.1296 0.1296 -0.9831 vn 0.1216 0.4915 -0.8623 vn 0.4473 0.4474 -0.7744 vn 0.4915 0.1216 -0.8623 vn 0.1216 0.8623 -0.4915 vn 0.4474 0.7744 -0.4473 vn 0.1296 0.9831 -0.1296 vn 0.4915 0.8623 -0.1216 vn 0.8623 0.4915 -0.1216 vn 0.7744 0.4473 -0.4474 vn 0.9831 0.1296 -0.1296 vn 0.8623 0.1216 -0.4915 vn 0.1296 -0.9831 -0.1296 vn 0.1216 -0.8623 -0.4915 vn 0.4474 -0.7744 -0.4473 vn 0.4915 -0.8623 -0.1216 vn 0.1216 -0.4915 -0.8623 vn 0.4473 -0.4474 -0.7744 vn 0.1296 -0.1296 -0.9831 vn 0.4915 -0.1216 -0.8623 vn 0.8623 -0.1216 -0.4915 vn 0.7744 -0.4473 -0.4474 vn 0.9831 -0.1296 -0.1296 vn 0.8623 -0.4915 -0.1216 vn 0.9831 0.1296 0.1296 vn 0.8623 0.4915 0.1216 vn 0.7744 0.4473 0.4474 vn 0.8623 0.1216 0.4915 vn 0.4915 0.8623 0.1216 vn 0.4474 0.7744 0.4473 vn 0.1296 0.9831 0.1296 vn 0.1216 0.8623 0.4915 vn 0.1216 0.4915 0.8623 vn 0.4473 0.4474 0.7744 vn 0.1296 0.1296 0.9831 vn 0.4915 0.1216 0.8623 vn 0.9831 -0.1296 0.1296 vn 0.8623 -0.1216 0.4915 vn 0.7744 -0.4473 0.4474 vn 0.8623 -0.4915 0.1216 vn 0.4915 -0.1216 0.8623 vn 0.4473 -0.4474 0.7744 vn 0.1296 -0.1296 0.9831 vn 0.1216 -0.4915 0.8623 vn 0.1216 -0.8623 0.4915 vn 0.4474 -0.7744 0.4473 vn 0.1296 -0.9831 0.1296 vn 0.4915 -0.8623 0.1216 vn -0.1296 0.1296 -0.9831 vn -0.4915 0.1216 -0.8623 vn -0.4473 0.4474 -0.7744 vn -0.1216 0.4915 -0.8623 vn -0.8623 0.1216 -0.4915 vn -0.7744 0.4473 -0.4474 vn -0.9831 0.1296 -0.1296 vn -0.8623 0.4915 -0.1216 vn -0.4915 0.8623 -0.1216 vn -0.4474 0.7744 -0.4473 vn -0.1216 0.8623 -0.4915 vn -0.9831 -0.1296 -0.1296 vn -0.8623 -0.1216 -0.4915 vn -0.7744 -0.4473 -0.4474 vn -0.8623 -0.4915 -0.1216 vn -0.4915 -0.1216 -0.8623 vn -0.4473 -0.4474 -0.7744 vn -0.1296 -0.1296 -0.9831 vn -0.1216 -0.4915 -0.8623 vn -0.1216 -0.8623 -0.4915 vn -0.4474 -0.7744 -0.4473 vn -0.1296 -0.9831 -0.1296 vn -0.4915 -0.8623 -0.1216 vn -0.9831 0.1296 0.1296 vn -0.8623 0.1216 0.4915 vn -0.7744 0.4473 0.4474 vn -0.8623 0.4915 0.1216 vn -0.4915 0.1216 0.8623 vn -0.4473 0.4474 0.7744 vn -0.1296 0.1296 0.9831 vn -0.1216 0.4915 0.8623 vn -0.1216 0.8623 0.4915 vn -0.4474 0.7744 0.4473 vn -0.4915 0.8623 0.1216 vn -0.1296 -0.9831 0.1296 vn -0.1216 -0.8623 0.4915 vn -0.4474 -0.7744 0.4473 vn -0.4915 -0.8623 0.1216 vn -0.1216 -0.4915 0.8623 vn -0.4473 -0.4474 0.7744 vn -0.1296 -0.1296 0.9831 vn -0.4915 -0.1216 0.8623 vn -0.8623 -0.1216 0.4915 vn -0.7744 -0.4473 0.4474 vn -0.9831 -0.1296 0.1296 vn -0.8623 -0.4915 0.1216 vn -1.0000 0.0000 0.0000 vn 0.0000 0.0000 -1.0000 vn 1.0000 0.0000 0.0000 vn -0.7071 0.7071 0.0000 vn 0.7071 0.7071 0.0000 vn -0.0379 -0.0019 0.9993 vn 0.0019 0.0379 0.9993 vn 0.0640 0.0640 0.9959 vn -0.0640 -0.0640 0.9959 vn -0.6997 0.6997 0.1440 vn -0.7011 0.7011 0.1305 vn 0.0379 0.0019 0.9993 vn 0.0923 -0.0923 0.9914 vn -0.0923 0.0923 0.9914 vn 0.7011 -0.7011 0.1305 vn 0.7071 -0.7071 0.0000 vn 0.6997 -0.6997 0.1440 vn 0.6930 0.6930 0.1990 vn 0.6948 0.6948 0.1856 vn -0.0019 -0.0379 0.9993 vn -0.7071 -0.7071 0.0000 vn -0.6930 -0.6930 0.1990 vn -0.6948 -0.6948 0.1856 vn -0.2692 -0.2692 0.9247 vn -0.2498 0.0241 0.9680 vn -0.3992 -0.3992 0.8254 vn -0.6584 -0.6584 0.3648 vn 0.2692 0.2692 0.9247 vn 0.2498 -0.0241 0.9680 vn 0.3992 0.3992 0.8254 vn 0.6584 0.6584 0.3648 vn 0.3536 -0.3536 0.8660 vn 0.0241 -0.2498 0.9680 vn 0.5000 -0.5000 0.7071 vn 0.6830 -0.6830 0.2588 vn -0.5794 0.5794 0.5732 vn -0.6124 0.6124 0.5000 vn -0.5000 0.5000 0.7071 vn -0.1830 0.1830 0.9659 vn 0.0423 0.2083 0.9771 vn -0.6830 0.6830 0.2588 vn -0.3536 0.3536 0.8660 vn 0.0378 -0.0019 -0.9993 vn -0.0019 0.0378 -0.9993 vn -0.0640 0.0640 -0.9959 vn 0.0640 -0.0640 -0.9959 vn 0.6997 0.6997 -0.1440 vn 0.7011 0.7011 -0.1305 vn -0.0379 0.0019 -0.9993 vn -0.0923 -0.0923 -0.9914 vn 0.0923 0.0923 -0.9914 vn -0.7011 -0.7011 -0.1305 vn -0.6997 -0.6997 -0.1440 vn -0.6930 0.6930 -0.1990 vn -0.6948 0.6948 -0.1856 vn 0.0019 -0.0378 -0.9993 vn 0.6930 -0.6930 -0.1990 vn 0.6948 -0.6948 -0.1856 vn 0.2692 -0.2692 -0.9247 vn 0.2083 -0.0423 -0.9771 vn 0.3992 -0.3992 -0.8254 vn 0.6584 -0.6584 -0.3648 vn -0.2692 0.2692 -0.9247 vn -0.2498 -0.0241 -0.9680 vn -0.3992 0.3992 -0.8254 vn -0.6584 0.6584 -0.3648 vn -0.1830 -0.1830 -0.9659 vn 0.0423 -0.2083 -0.9771 vn -0.5000 -0.5000 -0.7071 vn -0.6830 -0.6830 -0.2588 vn -0.3535 -0.3536 -0.8660 vn 0.5794 0.5794 -0.5732 vn 0.6124 0.6124 -0.5000 vn 0.5000 0.5000 -0.7071 vn 0.1830 0.1830 -0.9659 vn -0.0423 0.2083 -0.9771 vn 0.9993 -0.0019 0.0378 vn 0.9993 0.0378 -0.0019 vn 0.9959 0.0640 -0.0640 vn 0.9959 -0.0640 0.0640 vn 0.1440 0.6997 0.6997 vn 0.1305 0.7011 0.7011 vn 0.9993 0.0019 -0.0378 vn 0.9914 -0.0923 -0.0923 vn 0.9914 0.0923 0.0923 vn 0.1305 -0.7011 -0.7011 vn 0.1440 -0.6997 -0.6997 vn 0.1990 0.6930 -0.6930 vn 0.1856 0.6948 -0.6948 vn 0.9993 -0.0378 0.0019 vn 0.1990 -0.6930 0.6930 vn 0.1856 -0.6948 0.6948 vn 0.9247 -0.2692 0.2692 vn 0.9771 -0.0423 0.2083 vn 0.8254 -0.3992 0.3992 vn 0.3648 -0.6584 0.6584 vn 0.9247 0.2692 -0.2692 vn 0.9771 0.0423 -0.2083 vn 0.8254 0.3992 -0.3992 vn 0.3648 0.6584 -0.6584 vn 0.9659 -0.1830 -0.1830 vn 0.9771 -0.2083 0.0423 vn 0.7071 -0.5000 -0.5000 vn 0.5000 -0.6124 -0.6124 vn 0.5732 -0.5794 -0.5794 vn 0.2588 -0.6830 -0.6830 vn 0.2588 0.6830 0.6830 vn 0.7071 0.5000 0.5000 vn 0.9659 0.1830 0.1830 vn 0.9771 0.2083 -0.0423 usemtl crate s 1 f 58/1/1 54/2/2 33/3/3 30/4/4 f 53/5/5 21/6/6 3/7/7 8/8/7 f 50/9/8 13/10/9 22/11/10 54/2/2 f 26/12/6 57/13/5 7/14/7 4/15/7 f 17/16/11 2/17/12 6/18/12 45/19/13 f 53/20/14 8/21/15 9/22/15 34/23/16 f 50/9/8 46/24/17 41/25/4 38/26/3 f 18/27/9 46/24/17 58/1/1 25/28/10 f 5/29/15 49/30/14 37/31/16 12/32/15 f 7/33/18 57/34/19 29/35/20 10/36/18 f 45/37/19 6/38/18 11/39/18 42/40/20 f 50/9/8 54/2/2 58/1/1 46/24/17 f 58/41/1 30/42/4 32/43/21 60/44/22 f 60/44/22 32/43/21 31/45/23 59/46/23 f 59/46/24 31/45/24 29/35/20 57/34/19 f 50/47/8 38/48/3 40/49/25 52/50/26 f 52/50/26 40/49/25 39/51/27 51/52/27 f 51/52/28 39/51/28 37/31/16 49/30/14 f 46/53/17 18/54/9 20/55/29 48/56/30 f 48/56/31 20/55/31 19/57/32 47/58/33 f 47/58/33 19/57/32 17/16/11 45/19/13 f 49/59/13 14/60/11 16/61/34 51/62/34 f 51/62/31 16/61/31 15/63/31 52/64/31 f 52/64/26 15/63/29 13/65/9 50/66/8 f 21/6/6 53/5/5 55/67/35 23/68/35 f 23/68/36 55/67/36 56/69/36 24/70/36 f 24/70/37 56/69/38 54/71/2 22/72/10 f 57/13/5 26/12/6 28/73/39 59/74/40 f 59/74/40 28/73/39 27/75/36 60/76/36 f 60/76/22 27/75/37 25/77/10 58/78/1 f 33/79/3 54/80/2 56/81/38 35/82/25 f 35/82/25 56/81/38 55/83/27 36/84/27 f 36/84/28 55/83/28 53/20/14 34/23/16 f 45/37/19 42/40/20 44/85/24 47/86/24 f 47/86/23 44/85/23 43/87/21 48/88/30 f 48/88/30 43/87/21 41/89/4 46/90/17 f 49/59/13 5/91/12 1/92/12 14/60/11 f 208/93/41 206/94/41 176/95/42 173/96/43 f 130/97/44 108/98/44 195/99/44 189/100/44 f 74/101/45 62/102/45 184/103/45 185/104/45 f 108/105/45 118/106/45 180/107/45 195/99/45 f 162/108/46 63/109/47 65/110/48 64/111/49 f 63/112/47 67/113/50 68/114/51 65/115/48 f 174/116/52 66/117/53 68/114/51 67/113/50 f 66/117/53 70/118/54 71/119/55 68/114/51 f 160/120/56 69/121/57 71/122/55 70/123/54 f 69/121/57 64/111/49 65/110/48 71/122/55 f 65/115/48 68/114/51 71/119/55 f 157/124/58 75/125/59 77/126/60 76/127/61 f 75/125/59 79/128/62 80/129/63 77/126/60 f 159/130/64 78/131/65 80/132/63 79/133/62 f 78/131/65 82/134/66 83/135/67 80/132/63 f 161/136/68 81/137/69 83/135/67 82/134/66 f 81/138/69 76/127/61 77/126/60 83/139/67 f 77/126/60 80/129/63 83/139/67 f 169/140/70 86/141/71 88/142/72 87/143/73 f 86/144/71 90/145/74 91/146/75 88/147/72 f 172/148/76 89/149/77 91/146/75 90/145/74 f 89/149/77 93/150/78 94/151/79 91/146/75 f 166/152/80 92/153/81 94/154/79 93/155/78 f 92/153/81 87/143/73 88/142/72 94/154/79 f 88/147/72 91/146/75 94/151/79 f 168/156/82 98/157/83 100/158/84 99/159/85 f 98/157/83 102/160/86 103/161/87 100/158/84 f 167/162/88 101/163/89 103/161/87 102/160/86 f 101/164/89 105/165/90 106/166/91 103/167/87 f 175/168/92 104/169/93 106/166/91 105/165/90 f 104/169/93 99/170/85 100/171/84 106/166/91 f 100/171/84 103/167/87 106/166/91 f 170/172/94 109/173/95 111/174/96 110/175/97 f 109/176/95 113/177/98 114/178/99 111/179/96 f 171/180/100 112/181/101 114/178/99 113/177/98 f 112/182/101 116/183/102 117/184/103 114/185/99 f 176/95/42 115/186/104 117/184/103 116/183/102 f 115/186/104 110/187/97 111/188/96 117/184/103 f 111/188/96 114/185/99 117/184/103 f 156/189/105 121/190/106 123/191/107 122/192/108 f 121/190/106 125/193/109 126/194/110 123/191/107 f 158/195/111 124/196/112 126/197/110 125/198/109 f 124/199/112 128/200/113 129/201/114 126/202/110 f 153/203/115 127/204/116 129/201/114 128/200/113 f 127/204/116 122/205/108 123/206/107 129/201/114 f 123/206/107 126/202/110 129/201/114 f 165/207/117 132/208/118 134/209/119 133/210/120 f 132/208/118 136/211/121 137/212/122 134/209/119 f 164/213/123 135/214/124 137/212/122 136/211/121 f 135/215/124 139/216/125 140/217/126 137/218/122 f 173/96/43 138/219/127 140/217/126 139/216/125 f 138/219/127 133/220/120 134/221/119 140/217/126 f 134/221/119 137/218/122 140/217/126 f 154/222/128 144/223/129 146/224/130 145/225/131 f 144/223/129 148/226/132 149/227/133 146/224/130 f 163/228/134 147/229/135 149/230/133 148/231/132 f 147/229/135 151/232/136 152/233/137 149/230/133 f 155/234/138 150/235/139 152/233/137 151/232/136 f 150/236/139 145/225/131 146/224/130 152/237/137 f 146/224/130 149/227/133 152/237/137 f 153/203/115 154/222/128 145/225/131 127/204/116 f 127/204/116 145/225/131 150/236/139 122/205/108 f 122/192/108 150/235/139 155/234/138 156/189/105 f 157/124/58 153/203/115 128/200/113 75/125/59 f 75/125/59 128/200/113 124/199/112 79/128/62 f 79/133/62 124/196/112 158/195/111 159/130/64 f 160/120/56 161/136/68 82/134/66 69/121/57 f 69/121/57 82/134/66 78/131/65 64/111/49 f 64/111/49 78/131/65 159/130/64 162/108/46 f 163/228/134 164/213/123 136/211/121 147/229/135 f 147/229/135 136/211/121 132/208/118 151/232/136 f 151/232/136 132/208/118 165/207/117 155/234/138 f 166/152/80 167/162/88 102/160/86 92/153/81 f 92/153/81 102/160/86 98/157/83 87/143/73 f 87/143/73 98/157/83 168/156/82 169/140/70 f 170/172/94 158/195/111 125/198/109 109/173/95 f 109/176/95 125/193/109 121/190/106 113/177/98 f 113/177/98 121/190/106 156/189/105 171/180/100 f 172/148/76 173/96/43 139/216/125 89/149/77 f 89/149/77 139/216/125 135/215/124 93/150/78 f 93/155/78 135/214/124 164/213/123 166/152/80 f 174/116/52 172/148/76 90/145/74 66/117/53 f 66/117/53 90/145/74 86/144/71 70/118/54 f 70/123/54 86/141/71 169/140/70 160/120/56 f 154/222/128 175/168/92 105/165/90 144/223/129 f 144/223/129 105/165/90 101/164/89 148/226/132 f 148/231/132 101/163/89 167/162/88 163/228/134 f 173/96/43 176/95/42 116/183/102 138/219/127 f 138/219/127 116/183/102 112/182/101 133/220/120 f 133/210/120 112/181/101 171/180/100 165/207/117 f 176/95/42 174/116/52 67/113/50 115/186/104 f 115/186/104 67/113/50 63/112/47 110/187/97 f 110/175/97 63/109/47 162/108/46 170/172/94 f 175/168/92 157/124/58 76/127/61 104/169/93 f 104/169/93 76/127/61 81/138/69 99/170/85 f 99/159/85 81/137/69 161/136/68 168/156/82 f 73/238/41 119/239/41 182/240/41 183/241/41 f 120/242/44 141/243/44 154/222/128 153/203/115 f 143/244/140 118/245/140 156/189/105 155/234/138 f 72/246/44 120/242/44 153/203/115 157/124/58 f 119/247/141 73/248/141 159/130/64 158/195/111 f 62/249/142 74/250/142 161/136/68 160/120/56 f 73/248/141 61/251/141 162/108/46 159/130/64 f 142/252/45 131/253/45 164/213/123 163/228/134 f 130/254/140 143/244/140 155/234/138 165/207/117 f 85/255/45 96/256/45 167/162/88 166/152/80 f 95/257/142 84/258/142 169/140/70 168/156/82 f 107/259/141 119/247/141 158/195/111 170/172/94 f 118/245/140 108/260/140 171/180/100 156/189/105 f 207/261/141 204/262/141 196/263/141 197/264/141 f 131/253/45 85/255/45 166/152/80 164/213/123 f 202/265/45 205/266/45 200/267/45 198/268/45 f 84/258/142 62/249/142 160/120/56 169/140/70 f 141/243/44 97/269/44 175/168/92 154/222/128 f 96/256/45 142/252/45 163/228/134 167/162/88 f 205/270/142 207/271/142 197/264/142 200/267/142 f 108/260/140 130/254/140 165/207/117 171/180/100 f 203/272/41 208/93/41 173/96/43 172/148/76 f 61/251/141 107/259/141 170/172/94 162/108/46 f 97/269/44 72/246/44 157/124/58 175/168/92 f 74/250/142 95/257/142 168/156/82 161/136/68 f 177/273/44 181/274/44 199/275/44 178/276/44 f 179/277/140 189/100/140 195/99/140 180/107/140 f 191/278/45 190/279/45 188/280/45 187/281/45 f 198/268/41 200/267/41 197/264/41 196/263/41 f 185/104/142 184/103/142 193/282/142 192/283/142 f 182/240/141 194/284/141 186/285/141 183/241/141 f 61/286/140 73/287/140 183/241/140 186/285/140 f 206/94/41 201/288/41 174/116/52 176/95/42 f 85/289/44 131/290/44 188/280/44 190/279/44 f 131/291/142 142/292/142 187/281/142 188/280/142 f 107/293/44 61/294/44 186/285/44 194/284/44 f 201/288/41 203/272/41 172/148/76 174/116/52 f 143/295/141 130/296/141 189/100/141 179/277/141 f 72/297/140 97/298/140 199/275/140 181/274/140 f 141/299/142 120/300/142 177/273/142 178/276/142 f 62/301/44 84/302/44 193/282/44 184/103/44 f 96/303/140 85/304/140 190/279/140 191/278/140 f 95/305/41 74/306/41 185/104/41 192/283/41 f 118/307/41 143/308/41 179/277/41 180/107/41 f 97/309/141 141/310/141 178/276/141 199/275/141 f 84/311/141 95/312/141 192/283/141 193/282/141 f 120/313/45 72/314/45 181/274/45 177/273/45 f 142/315/41 96/316/41 191/278/41 187/281/41 f 119/317/142 107/318/142 194/284/142 182/240/142 f 204/262/7 207/261/7 208/319/7 203/320/7 f 202/321/143 204/322/143 203/323/143 201/324/143 f 207/271/144 205/270/144 206/325/144 208/326/144 f 205/266/15 202/265/15 201/327/15 206/328/15 f 204/322/140 202/321/140 198/268/140 196/263/140 f 266/329/145 262/330/146 241/331/147 238/332/148 f 261/333/149 229/334/150 211/335/143 216/336/143 f 258/337/151 221/338/152 230/339/153 262/330/146 f 234/340/150 265/341/149 215/342/143 212/343/143 f 225/344/154 210/345/155 214/346/155 253/347/156 f 261/348/157 216/349/144 217/350/144 242/351/158 f 258/337/151 254/352/159 249/353/148 246/354/147 f 226/355/152 254/352/159 266/329/145 233/356/153 f 213/357/144 257/358/157 245/359/158 220/360/144 f 215/361/160 265/362/161 237/363/162 218/364/160 f 253/365/161 214/366/160 219/367/160 250/368/162 f 258/337/151 262/330/146 266/329/145 254/352/159 f 266/369/145 238/370/148 240/371/163 268/372/164 f 268/372/164 240/371/163 239/373/165 267/374/165 f 267/374/166 239/373/166 237/363/162 265/362/161 f 258/375/151 246/376/147 248/377/167 260/378/168 f 260/378/168 248/377/167 247/379/169 259/380/169 f 259/380/170 247/379/170 245/359/158 257/358/157 f 254/381/159 226/382/152 228/383/171 256/384/172 f 256/384/172 228/383/171 227/385/173 255/386/173 f 255/386/174 227/385/174 225/344/154 253/347/156 f 257/387/156 222/388/154 224/389/174 259/390/174 f 259/390/173 224/389/173 223/391/171 260/392/168 f 260/392/168 223/391/171 221/393/152 258/394/151 f 229/334/150 261/333/149 263/395/175 231/396/176 f 231/396/176 263/395/175 264/397/177 232/398/177 f 232/398/178 264/397/179 262/399/146 230/400/153 f 265/341/149 234/340/150 236/401/180 267/402/180 f 267/402/177 236/401/177 235/403/181 268/404/164 f 268/404/164 235/403/181 233/405/153 266/406/145 f 241/407/147 262/408/146 264/409/179 243/410/167 f 243/410/167 264/409/179 263/411/169 244/412/169 f 244/412/170 263/411/170 261/348/157 242/351/158 f 253/365/161 250/368/162 252/413/166 255/414/166 f 255/414/165 252/413/165 251/415/163 256/416/172 f 256/416/172 251/415/163 249/417/148 254/418/159 f 257/387/156 213/419/155 209/420/155 222/388/154 f 326/421/182 322/422/183 301/423/184 298/424/185 f 321/425/186 289/426/187 271/427/144 276/428/144 f 318/429/188 281/430/189 290/431/190 322/422/183 f 294/432/187 325/433/186 275/434/144 272/435/144 f 285/436/191 270/437/160 274/438/160 313/439/192 f 321/440/193 276/441/143 277/442/143 302/443/194 f 318/429/188 314/444/195 309/445/185 306/446/184 f 286/447/189 314/444/195 326/421/182 293/448/190 f 273/449/143 317/450/193 305/451/194 280/452/143 f 275/453/155 325/454/196 297/455/197 278/456/155 f 313/457/196 274/458/155 279/459/155 310/460/197 f 318/429/188 322/422/183 326/421/182 314/444/195 f 326/461/182 298/462/185 300/463/198 328/464/199 f 328/464/199 300/463/198 299/465/200 327/466/200 f 327/466/201 299/465/201 297/455/197 325/454/196 f 318/467/188 306/468/184 308/469/202 320/470/203 f 320/470/203 308/469/202 307/471/204 319/472/204 f 319/472/205 307/471/205 305/451/194 317/450/193 f 314/473/195 286/474/189 288/475/206 316/476/207 f 316/476/208 288/475/208 287/477/208 315/478/208 f 315/478/209 287/477/209 285/436/191 313/439/192 f 317/479/192 282/480/191 284/481/209 319/482/209 f 319/482/208 284/481/208 283/483/210 320/484/203 f 320/484/203 283/483/210 281/485/189 318/486/188 f 289/426/187 321/425/186 323/487/211 291/488/212 f 291/488/212 323/487/211 324/489/213 292/490/213 f 292/490/214 324/489/215 322/491/183 290/492/190 f 325/433/186 294/432/187 296/493/212 327/494/211 f 327/494/211 296/493/212 295/495/213 328/496/213 f 328/496/199 295/495/214 293/497/190 326/498/182 f 301/499/184 322/500/183 324/501/215 303/502/202 f 303/502/202 324/501/215 323/503/204 304/504/204 f 304/504/205 323/503/205 321/440/193 302/443/194 f 313/457/196 310/460/197 312/505/201 315/506/201 f 315/506/200 312/505/200 311/507/198 316/508/207 f 316/508/207 311/507/198 309/509/185 314/510/195 f 317/479/192 273/511/160 269/512/160 282/480/191 f 386/513/216 382/514/217 361/515/218 358/516/219 f 381/517/220 349/518/221 331/519/15 336/520/15 f 378/521/222 341/522/223 350/523/224 382/514/217 f 354/524/221 385/525/220 335/526/15 332/527/15 f 345/528/225 330/529/18 334/530/18 373/531/226 f 381/532/227 336/533/7 337/534/7 362/535/228 f 378/521/222 374/536/229 369/537/219 366/538/218 f 346/539/223 374/536/229 386/513/216 353/540/224 f 333/541/7 377/542/227 365/543/228 340/544/7 f 335/545/12 385/546/230 357/547/231 338/548/12 f 373/549/230 334/550/12 339/551/12 370/552/231 f 378/521/222 382/514/217 386/513/216 374/536/229 f 386/553/216 358/554/219 360/555/232 388/556/233 f 388/556/233 360/555/232 359/557/234 387/558/234 f 387/558/235 359/557/235 357/547/231 385/546/230 f 378/559/222 366/560/218 368/561/236 380/562/237 f 380/562/237 368/561/236 367/563/238 379/564/238 f 379/564/239 367/563/239 365/543/228 377/542/227 f 374/565/229 346/566/223 348/567/240 376/568/241 f 376/568/242 348/567/242 347/569/243 375/570/244 f 375/570/244 347/569/243 345/528/225 373/531/226 f 377/571/226 342/572/225 344/573/245 379/574/245 f 379/574/242 344/573/242 343/575/242 380/576/242 f 380/576/237 343/575/240 341/577/223 378/578/222 f 349/518/221 381/517/220 383/579/246 351/580/246 f 351/580/247 383/579/247 384/581/247 352/582/247 f 352/582/248 384/581/249 382/583/217 350/584/224 f 385/525/220 354/524/221 356/585/246 387/586/246 f 387/586/247 356/585/247 355/587/247 388/588/247 f 388/588/233 355/587/248 353/589/224 386/590/216 f 361/591/218 382/592/217 384/593/249 363/594/236 f 363/594/236 384/593/249 383/595/238 364/596/238 f 364/596/239 383/595/239 381/532/227 362/535/228 f 373/549/230 370/552/231 372/597/235 375/598/235 f 375/598/234 372/597/234 371/599/232 376/600/241 f 376/600/241 371/599/232 369/601/219 374/602/229 f 377/571/226 333/603/18 329/604/18 342/572/225 Edited 2020-12-10 07:21 by PeteCotton |
||||
JohnS Guru ![]() Joined: 18/11/2011 Location: United KingdomPosts: 4044 |
Someone has redefined what .OBJ means? Seriously? WHY???? There are so many other names which could have been chosen. John |
||||
PeteCotton![]() Guru ![]() Joined: 13/08/2020 Location: CanadaPosts: 543 |
It appears to have been around since 1995. It is weird though that the programmers who wrote the original software (Lightwave) didn't notice the conflict (unless they compiled to .o object files?). I guess it's up to the user to be aware as to whether you are compiling code or trying to do 3D modelling. |
||||
vegipete![]() Guru ![]() Joined: 29/01/2013 Location: CanadaPosts: 1132 |
I think this is just the nature of the beast. The painter's algorithm draws faces from farthest to nearest. But it is possible for a large face to have a nearer centroid than a smaller face that should cover part of the larger one. Consider this: ![]() The two visible green faces should cover (part of) the red face. However, the centroid (black dot) of the red face is closer than the centroids of both green faces and therefore is drawn after the green faces, hiding (or mostly hiding) them. Breaking large faces into smaller ones might be the only solution. Visit Vegipete's *Mite Library for cool programs. |
||||
qwerty823 Newbie ![]() Joined: 30/07/2020 Location: United StatesPosts: 30 |
https://en.wikipedia.org/wiki/Painter%27s_algorithm#Limitations You describe the overlapping case (though not cyclical). There is also an issue of "piercing" faces (where faces intersect). Seems we need a z-buffer, and let the renders do a z-buffer depth test. :) Although another option would be to split faces on overlaps and intersections and generate new vertices and faces as needed to make painters algo work. |
||||
PeteCotton![]() Guru ![]() Joined: 13/08/2020 Location: CanadaPosts: 543 |
Ah, thank you. I think you have hit the nail on the head (and thanks for the nice and clear diagram). Breaking large faces into smaller ones might be the only solution. Yes. I think this is probably the easiest solution. For most objects which just have an outer skin (like the Elite ships), this isn't going to be an issue. It looks like Blender and MeshLab both have the ability to generate the outer skin mesh and not include any hidden surfaces. https://blenderartists.org/t/creating-an-outer-shell-on-a-mesh/670239 |
||||
mkopack73 Senior Member ![]() Joined: 03/07/2020 Location: United StatesPosts: 261 |
VERY useful! Great that you're doing this! I gotta say, the ecosystem for this machine is really starting to flesh out nicely! |
||||
![]() |
![]() |
The Back Shed's forum code is written, and hosted, in Australia. | © JAQ Software 2025 |