rawanessam commited on
Commit
16682ee
·
verified ·
1 Parent(s): f97a44c

Upload 49 files

Browse files
Files changed (49) hide show
  1. rendering/data/bathroom_wall.jpg +3 -0
  2. rendering/data/bathtub.egg +3 -0
  3. rendering/data/bathtub.mtl +24 -0
  4. rendering/data/bathtub.obj +0 -0
  5. rendering/data/bedroom_wall.jpg +0 -0
  6. rendering/data/ceiling.jpg +0 -0
  7. rendering/data/cooking_counter.egg +3 -0
  8. rendering/data/cooking_counter.mtl +59 -0
  9. rendering/data/cooking_counter.obj +0 -0
  10. rendering/data/cooking_counter/Amoora.jpg +0 -0
  11. rendering/data/cooking_counter/Amoora_2.jpg +0 -0
  12. rendering/data/cooking_counter/Brushed_Metal_Silver_Texture_by_SweetSoulSister.jpg +3 -0
  13. rendering/data/cooking_counter/M_6_White_Marble_Texture_01.jpg +0 -0
  14. rendering/data/cooking_counter/Translucent_Glass_Block_Dark.jpg +0 -0
  15. rendering/data/cooking_counter/_Translucent_Glass_Block_Dark_1.jpg +0 -0
  16. rendering/data/cooking_counter/dark_sketch_stone.jpg +0 -0
  17. rendering/data/cooking_counter/patterns_wavy_background_texture_metal_silver_18405_1920x1200.jpg +3 -0
  18. rendering/data/dining_wall.jpg +0 -0
  19. rendering/data/door.jpg +0 -0
  20. rendering/data/door2.jpg +0 -0
  21. rendering/data/floor.jpg +0 -0
  22. rendering/data/floorplan_1.png +0 -0
  23. rendering/data/kitchen_wall.jpg +0 -0
  24. rendering/data/obj2egg.py +554 -0
  25. rendering/data/obj2egg.py~ +554 -0
  26. rendering/data/stairs.mtl +10 -0
  27. rendering/data/stairs.obj +411 -0
  28. rendering/data/stairs/_auto_38.jpg +0 -0
  29. rendering/data/toilet.egg +0 -0
  30. rendering/data/toilet.mtl +32 -0
  31. rendering/data/toilet.obj +0 -0
  32. rendering/data/toilet/_auto_34.jpg +0 -0
  33. rendering/data/toilet/_auto_35.jpg +0 -0
  34. rendering/data/wall.jpg +0 -0
  35. rendering/data/washing_basin.egg +0 -0
  36. rendering/data/washing_basin.mtl +50 -0
  37. rendering/data/washing_basin.obj +4334 -0
  38. rendering/data/washing_basin/_auto_12.jpg +0 -0
  39. rendering/data/washing_basin/_auto_20.jpg +0 -0
  40. rendering/data/washing_basin/_auto_24.jpg +0 -0
  41. rendering/data/washing_basin/_auto_3.jpg +0 -0
  42. rendering/data/washing_basin/_auto_8.jpg +0 -0
  43. rendering/data/washing_basin2.mtl +14 -0
  44. rendering/data/washing_basin2.obj +0 -0
  45. rendering/data/window.jpg +0 -0
  46. rendering/floorplan.py +987 -0
  47. rendering/obj2egg.py +554 -0
  48. rendering/renderer.py +203 -0
  49. rendering/viewer.py +261 -0
rendering/data/bathroom_wall.jpg ADDED

Git LFS Details

  • SHA256: 0895f12c367d7a5b17a350159d741e7999b91daa99d6c87732fcdc8349f8b4af
  • Pointer size: 131 Bytes
  • Size of remote file: 171 kB
rendering/data/bathtub.egg ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:68f84e9f406273123b83b1b90a9efd45241eebaf6699b13fc97ca11cf14962a3
3
+ size 12700362
rendering/data/bathtub.mtl ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ ## Alias OBJ Material File
3
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
4
+
5
+ newmtl _auto_30
6
+ Ka 0.000000 0.000000 0.000000
7
+ Kd 0.466667 0.466667 0.466667
8
+ Ks 0.330000 0.330000 0.330000
9
+
10
+ newmtl _auto_31
11
+ Ka 0.000000 0.000000 0.000000
12
+ Kd 0.917647 0.905882 0.854902
13
+ Ks 0.330000 0.330000 0.330000
14
+
15
+ newmtl _auto_32
16
+ Ka 0.000000 0.000000 0.000000
17
+ Kd 0.352941 0.352941 0.352941
18
+ Ks 0.330000 0.330000 0.330000
19
+
20
+ newmtl _auto_33
21
+ Ka 0.000000 0.000000 0.000000
22
+ Kd 0.117647 0.117647 0.117647
23
+ Ks 0.330000 0.330000 0.330000
24
+
rendering/data/bathtub.obj ADDED
The diff for this file is too large to render. See raw diff
 
rendering/data/bedroom_wall.jpg ADDED
rendering/data/ceiling.jpg ADDED
rendering/data/cooking_counter.egg ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c0f74198034460e402e5bb28ca9b6f8fbb2c3862a4a599e098128c4e218af6d2
3
+ size 20058669
rendering/data/cooking_counter.mtl ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ ## Alias OBJ Material File
3
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
4
+
5
+ newmtl M_6_White_Marble_Texture_01
6
+ Ka 0.000000 0.000000 0.000000
7
+ Kd 0.800000 0.811765 0.862745
8
+ Ks 0.330000 0.330000 0.330000
9
+ map_Kd cooking_counter/M_6_White_Marble_Texture_01.jpg
10
+
11
+ newmtl Brushed_Metal_Silver_Texture_by_SweetSoulSister
12
+ Ka 0.000000 0.000000 0.000000
13
+ Kd 0.666667 0.686275 0.701961
14
+ Ks 0.330000 0.330000 0.330000
15
+ map_Kd cooking_counter/Brushed_Metal_Silver_Texture_by_SweetSoulSister.jpg
16
+
17
+ newmtl Amoora_2
18
+ Ka 0.000000 0.000000 0.000000
19
+ Kd 0.674510 0.439216 0.364706
20
+ Ks 0.330000 0.330000 0.330000
21
+ map_Kd cooking_counter/Amoora_2.jpg
22
+
23
+ newmtl FrontColor
24
+ Ka 0.000000 0.000000 0.000000
25
+ Kd 1.000000 1.000000 1.000000
26
+ Ks 0.330000 0.330000 0.330000
27
+
28
+ newmtl dark_sketch_stone
29
+ Ka 0.000000 0.000000 0.000000
30
+ Kd 0.294118 0.294118 0.294118
31
+ Ks 0.330000 0.330000 0.330000
32
+ map_Kd cooking_counter/dark_sketch_stone.jpg
33
+
34
+ newmtl Amoora
35
+ Ka 0.000000 0.000000 0.000000
36
+ Kd 0.674510 0.439216 0.364706
37
+ Ks 0.330000 0.330000 0.330000
38
+ map_Kd cooking_counter/Amoora.jpg
39
+
40
+ newmtl patterns_wavy_background_texture_metal_silver_18405_1920x1200
41
+ Ka 0.000000 0.000000 0.000000
42
+ Kd 0.501961 0.494118 0.482353
43
+ Ks 0.330000 0.330000 0.330000
44
+ map_Kd cooking_counter/patterns_wavy_background_texture_metal_silver_18405_1920x1200.jpg
45
+
46
+ newmtl Translucent_Glass_Block_Dark
47
+ Ka 0.000000 0.000000 0.000000
48
+ Kd 0.478431 0.486275 0.466667
49
+ Ks 0.330000 0.330000 0.330000
50
+ d 0.800000
51
+ map_Kd cooking_counter/Translucent_Glass_Block_Dark.jpg
52
+
53
+ newmtl _Translucent_Glass_Block_Dark_1
54
+ Ka 0.000000 0.000000 0.000000
55
+ Kd 0.478431 0.486275 0.466667
56
+ Ks 0.330000 0.330000 0.330000
57
+ d 0.800000
58
+ map_Kd cooking_counter/_Translucent_Glass_Block_Dark_1.jpg
59
+
rendering/data/cooking_counter.obj ADDED
The diff for this file is too large to render. See raw diff
 
rendering/data/cooking_counter/Amoora.jpg ADDED
rendering/data/cooking_counter/Amoora_2.jpg ADDED
rendering/data/cooking_counter/Brushed_Metal_Silver_Texture_by_SweetSoulSister.jpg ADDED

Git LFS Details

  • SHA256: 3e632da81920f896e6ef08a766a892d1594a5d837768ad915d0fdcfd81a1d835
  • Pointer size: 131 Bytes
  • Size of remote file: 739 kB
rendering/data/cooking_counter/M_6_White_Marble_Texture_01.jpg ADDED
rendering/data/cooking_counter/Translucent_Glass_Block_Dark.jpg ADDED
rendering/data/cooking_counter/_Translucent_Glass_Block_Dark_1.jpg ADDED
rendering/data/cooking_counter/dark_sketch_stone.jpg ADDED
rendering/data/cooking_counter/patterns_wavy_background_texture_metal_silver_18405_1920x1200.jpg ADDED

Git LFS Details

  • SHA256: 50c2ac7bff7c5f699fc2a54fe03befdcb728ab7ec38ddaf7b9b8bea4b2681bbf
  • Pointer size: 132 Bytes
  • Size of remote file: 2.48 MB
rendering/data/dining_wall.jpg ADDED
rendering/data/door.jpg ADDED
rendering/data/door2.jpg ADDED
rendering/data/floor.jpg ADDED
rendering/data/floorplan_1.png ADDED
rendering/data/kitchen_wall.jpg ADDED
rendering/data/obj2egg.py ADDED
@@ -0,0 +1,554 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/python
2
+ """
3
+ This Version: $Id: obj2egg.py,v 1.7 2008/05/26 17:42:53 andyp Exp $
4
+ Info: info >at< pfastergames.com
5
+
6
+ Extended from: http://panda3d.org/phpbb2/viewtopic.php?t=3378
7
+ .___..__ .___.___.___.__..__ . .
8
+ | [__)[__ [__ [__ | |[__)|\/|
9
+ | | \[___[___| |__|| \| |
10
+ obj2egg.py [n##][b][t][s] filename1.obj ...
11
+ -n regenerate normals with # degree smoothing
12
+ exaple -n30 (normals at less 30 degrees will be smoothed)
13
+ -b make binarmals
14
+ -t make tangents
15
+ -s show in pview
16
+
17
+ licensed under WTFPL (http://sam.zoy.org/wtfpl/)
18
+ """
19
+
20
+ from pandac.PandaModules import *
21
+ import math
22
+ import string
23
+ import getopt
24
+ import sys, os
25
+
26
+
27
+ def floats(float_list):
28
+ """coerce a list of strings that represent floats into a list of floats"""
29
+ return [ float(number) for number in float_list ]
30
+
31
+ def ints(int_list):
32
+ """coerce a list of strings that represent integers into a list of integers"""
33
+ return [ int(number) for number in int_list ]
34
+
35
+
36
+ class ObjMaterial:
37
+ """a wavefront material"""
38
+ def __init__(self):
39
+ self.filename = None
40
+ self.name = "default"
41
+ self.eggdiffusetexture = None
42
+ self.eggmaterial = None
43
+ self.attrib = {}
44
+ self.attrib["Ns"] = 100.0
45
+ self.attrib["d"] = 1.0
46
+ self.attrib["illum"] = 2
47
+ # "magenta"
48
+ self.attrib["Kd"] = [1.0, 0.0, 1.0]
49
+ self.attrib["Ka"] = [0.0, 0.0, 0.0]
50
+ self.attrib["Ks"] = [0.0, 0.0, 0.0]
51
+ self.attrib["Ke"] = [0.0, 0.0, 0.0]
52
+
53
+ def put(self, key, value):
54
+ self.attrib[key] = value
55
+ return self
56
+
57
+ def get(self, key):
58
+ if self.attrib.has_key(key):
59
+ return self.attrib[key]
60
+ return None
61
+
62
+ def has_key(self, key):
63
+ return self.attrib.has_key(key)
64
+
65
+ def isTextured(self):
66
+ # for k in ("map_Kd", "map_Bump", "map_Ks"): <-- NOT YET
67
+ if self.attrib.has_key("map_Kd"):
68
+ return True;
69
+ return False;
70
+
71
+ def getEggTexture(self):
72
+ if self.eggdiffusetexture:
73
+ return self.eggdiffusetexture
74
+ if not self.isTextured():
75
+ return None
76
+ m = EggTexture(self.name + "_diffuse", self.get("map_Kd"))
77
+ m.setFormat(EggTexture.FRgb)
78
+ m.setMagfilter(EggTexture.FTLinearMipmapLinear)
79
+ m.setMinfilter(EggTexture.FTLinearMipmapLinear)
80
+ m.setWrapU(EggTexture.WMRepeat)
81
+ m.setWrapV(EggTexture.WMRepeat)
82
+ self.eggdiffusetexture = m
83
+ return self.eggdiffusetexture
84
+
85
+ def getEggMaterial(self):
86
+ if self.eggmaterial:
87
+ return self.eggmaterial
88
+ m = EggMaterial(self.name + "_mat")
89
+ # XXX TODO: add support for specular, and obey illum setting
90
+ # XXX as best as we can
91
+ rgb = self.get("Kd")
92
+ if rgb is not None:
93
+ m.setDiff(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
94
+ rgb = self.get("Ka")
95
+ if rgb is not None:
96
+ m.setAmb(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
97
+ rgb = self.get("Ks")
98
+ if rgb is not None:
99
+ m.setSpec(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
100
+ ns = self.get("Ns")
101
+ if ns is not None:
102
+ m.setShininess(ns)
103
+ self.eggmaterial = m
104
+ return self.eggmaterial
105
+
106
+ class MtlFile:
107
+ """an object representing all Wavefront materials in a .mtl file"""
108
+ def __init__(self, filename=None):
109
+ self.filename = None
110
+ self.materials = {}
111
+ self.comments = {}
112
+ if filename is not None:
113
+ self.read(filename)
114
+
115
+ def read(self, filename, verbose=False):
116
+ self.filename = filename
117
+ self.materials = {}
118
+ self.comments = {}
119
+ try:
120
+ file = open(filename)
121
+ except:
122
+ return self
123
+ linenumber = 0
124
+ mat = None
125
+ for line in file.readlines():
126
+ line = line.strip()
127
+ linenumber = linenumber + 1
128
+ if not line:
129
+ continue
130
+ if line[0] == '#':
131
+ self.comments[linenumber] = line
132
+ print line
133
+ continue
134
+ tokens = line.split()
135
+ if not tokens:
136
+ continue
137
+ if verbose: print "tokens[0]:", tokens
138
+ if tokens[0] == "newmtl":
139
+ mat = ObjMaterial()
140
+ mat.filename = filename
141
+ mat.name = tokens[1]
142
+ self.materials[mat.name] = mat
143
+ if verbose: print "newmtl:", mat.name
144
+ continue
145
+ if tokens[0] in ("Ns", "d", "Tr"):
146
+ # "d factor" - specifies the dissovle for the current material,
147
+ # 1.0 is full opaque
148
+ # "Ns exponent" - specifies the specular exponent. A high exponent
149
+ # results in a tight, concentrated highlight.
150
+ mat.put(tokens[0], float(tokens[1]))
151
+ continue
152
+ if tokens[0] in ("illum"):
153
+ # according to http://www.fileformat.info/format/material/
154
+ # 0 = Color on and Ambient off
155
+ # 1 = Color on and Ambient on
156
+ # 2 = Highlight on
157
+ # 3 = Reflection on and Ray trace on
158
+ # 4 = Transparency: Glass on, Reflection: Ray trace on
159
+ # 5 = Reflection: Fesnel on and Ray trace on
160
+ # 6 = Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
161
+ # 7 = Transparency: Refraction on, Refelction: Fresnel on and Ray Trace on
162
+ # 8 = Reflection on and Ray trace off
163
+ # 9 = Transparency: Glass on, Reflection: Ray trace off
164
+ # 10 = Casts shadows onto invisible surfaces
165
+ mat.put(tokens[0], int(tokens[1]))
166
+ continue
167
+ if tokens[0] in ("Kd", "Ka", "Ks", "Ke"):
168
+ mat.put(tokens[0], floats(tokens[1:]))
169
+ continue
170
+ if tokens[0] in ("map_Kd", "map_Bump", "map_Ks", "map_bump", "bump"):
171
+ # Ultimate Unwrap 3D Pro emits these:
172
+ # map_Kd == diffuse
173
+ # map_Bump == bump
174
+ # map_Ks == specular
175
+ mat.put(tokens[0], pathify(tokens[1]))
176
+ if verbose: print "map:", mat.name, tokens[0], mat.get(tokens[0])
177
+ continue
178
+ if tokens[0] in ("Ni"):
179
+ # blender's .obj exporter can emit this "Ni 1.000000"
180
+ mat.put(tokens[0], float(tokens[1]))
181
+ continue
182
+ print "file \"%s\": line %d: unrecognized:" % (filename, linenumber), tokens
183
+ file.close()
184
+ if verbose: print "%d materials" % len(self.materials), "loaded from", filename
185
+ return self
186
+
187
+ class ObjFile:
188
+ """a representation of a wavefront .obj file"""
189
+ def __init__(self, filename=None):
190
+ self.filename = None
191
+ self.objects = ["defaultobject"]
192
+ self.groups = ["defaultgroup"]
193
+ self.points = []
194
+ self.uvs = []
195
+ self.normals = []
196
+ self.faces = []
197
+ self.polylines = []
198
+ self.matlibs = []
199
+ self.materialsbyname = {}
200
+ self.comments = {}
201
+ self.currentobject = self.objects[0]
202
+ self.currentgroup = self.groups[0]
203
+ self.currentmaterial = None
204
+ if filename is not None:
205
+ self.read(filename)
206
+
207
+ def read(self, filename, verbose=False):
208
+ if verbose: print "ObjFile.read:", "filename:", filename
209
+ self.filename = filename
210
+ self.objects = ["defaultobject"]
211
+ self.groups = ["defaultgroup"]
212
+ self.points = []
213
+ self.uvs = []
214
+ self.normals = []
215
+ self.faces = []
216
+ self.polylines = []
217
+ self.matlibs = []
218
+ self.materialsbyname = {}
219
+ self.comments = {}
220
+ self.currentobject = self.objects[0]
221
+ self.currentgroup = self.groups[0]
222
+ self.currentmaterial = None
223
+ try:
224
+ file = open(filename)
225
+ except:
226
+ return self
227
+ linenumber = 0
228
+ for line in file.readlines():
229
+ line = line.strip()
230
+ linenumber = linenumber + 1
231
+ if not line:
232
+ continue
233
+ if line[0] == '#':
234
+ self.comments[linenumber] = line
235
+ print line
236
+ continue
237
+ tokens = line.split()
238
+ if not tokens:
239
+ continue
240
+ if tokens[0] == "mtllib":
241
+ if verbose: print "mtllib:", tokens[1:]
242
+ mtllib = MtlFile(tokens[1])
243
+ # if verbose: print mtllib
244
+ self.matlibs.append(mtllib)
245
+ self.indexmaterials(mtllib)
246
+ continue
247
+ if tokens[0] == "g":
248
+ if verbose: print "g:", tokens[1:]
249
+ self.__newgroup("".join(tokens[1:]))
250
+ continue
251
+ if tokens[0] == "o":
252
+ if verbose: print "o:", tokens[1:]
253
+ self.__newobject("".join(tokens[1:]))
254
+ continue
255
+ if tokens[0] == "usemtl":
256
+ if verbose: print "usemtl:", tokens[1:]
257
+ self.__usematerial(tokens[1])
258
+ continue
259
+ if tokens[0] == "v":
260
+ if verbose: print "v:", tokens[1:]
261
+ self.__newv(tokens[1:])
262
+ continue
263
+ if tokens[0] == "vn":
264
+ if verbose: print "vn:", tokens[1:]
265
+ self.__newnormal(tokens[1:])
266
+ continue
267
+ if tokens[0] == "vt":
268
+ if verbose: print "vt:", tokens[1:]
269
+ self.__newuv(tokens[1:])
270
+ continue
271
+ if tokens[0] == "f":
272
+ if verbose: print "f:", tokens[1:]
273
+ self.__newface(tokens[1:])
274
+ continue
275
+ if tokens[0] == "s":
276
+ # apparently, this enables/disables smoothing
277
+ print "%s:%d:" % (filename, linenumber), "ignoring:", tokens
278
+ continue
279
+ if tokens[0] == "l":
280
+ if verbose: print "l:", tokens[1:]
281
+ self.__newpolyline(tokens[1:])
282
+ continue
283
+ print "%s:%d:" % (filename, linenumber), "unknown:", tokens
284
+ file.close()
285
+ return self
286
+
287
+ def __vertlist(self, lst):
288
+ res = []
289
+ for vert in lst:
290
+ vinfo = vert.split("/")
291
+ vlen = len(vinfo)
292
+ vertex = {'v':None, 'vt':None, 'vn':None}
293
+ if vlen == 1:
294
+ vertex['v'] = int(vinfo[0])
295
+ elif vlen == 2:
296
+ if vinfo[0] != '':
297
+ vertex['v'] = int(vinfo[0])
298
+ if vinfo[1] != '':
299
+ vertex['vt'] = int(vinfo[1])
300
+ elif vlen == 3:
301
+ if vinfo[0] != '':
302
+ vertex['v'] = int(vinfo[0])
303
+ if vinfo[1] != '':
304
+ vertex['vt'] = int(vinfo[1])
305
+ if vinfo[2] != '':
306
+ vertex['vn'] = int(vinfo[2])
307
+ else:
308
+ print "aborting..."
309
+ raise UNKNOWN, res
310
+ res.append(vertex)
311
+ if False: print res
312
+ return res
313
+
314
+ def __enclose(self, lst):
315
+ mdata = (self.currentobject, self.currentgroup, self.currentmaterial)
316
+ return (lst, mdata)
317
+
318
+ def __newpolyline(self, l):
319
+ polyline = self.__vertlist(l)
320
+ if False: print "__newline:", polyline
321
+ self.polylines.append(self.__enclose(polyline))
322
+ return self
323
+
324
+ def __newface(self, f):
325
+ face = self.__vertlist(f)
326
+ if False: print face
327
+ self.faces.append(self.__enclose(face))
328
+ return self
329
+
330
+ def __newuv(self, uv):
331
+ self.uvs.append(floats(uv))
332
+ return self
333
+
334
+ def __newnormal(self, normal):
335
+ self.normals.append(floats(normal))
336
+ return self
337
+
338
+ def __newv(self, v):
339
+ # capture the current metadata with vertices
340
+ vdata = floats(v)
341
+ mdata = (self.currentobject, self.currentgroup, self.currentmaterial)
342
+ vinfo = (vdata, mdata)
343
+ self.points.append(vinfo)
344
+ return self
345
+
346
+ def indexmaterials(self, mtllib, verbose=False):
347
+ # traverse the materials defined in mtllib, indexing
348
+ # them by name.
349
+ for mname in mtllib.materials:
350
+ mobj = mtllib.materials[mname]
351
+ self.materialsbyname[mobj.name] = mobj
352
+ if verbose:
353
+ print "indexmaterials:", mtllib.filename, "materials:", self.materialsbyname.keys()
354
+ return self
355
+
356
+ def __closeobject(self):
357
+ self.currentobject = "defaultobject"
358
+ return self
359
+
360
+ def __newobject(self, object):
361
+ self.__closeobject()
362
+ if False: print "__newobject:", "object:", object
363
+ self.currentobject = object
364
+ self.objects.append(object)
365
+ return self
366
+
367
+ def __closegroup(self):
368
+ self.currentgroup = "defaultgroup"
369
+ return self
370
+
371
+ def __newgroup(self, group):
372
+ self.__closegroup()
373
+ if False: print "__newgroup:", "group:", group
374
+ self.currentgroup = group
375
+ self.groups.append(group)
376
+ return self
377
+
378
+ def __usematerial(self, material):
379
+ if False: print "__usematerial:", "material:", material
380
+ if self.materialsbyname.has_key(material):
381
+ self.currentmaterial = material
382
+ else:
383
+ print "warning:", "__usematerial:", "unknown material:", material
384
+ return self
385
+
386
+ def __itemsby(self, itemlist, objname, groupname):
387
+ res = []
388
+ for item in itemlist:
389
+ vlist, mdata = item
390
+ wobj, wgrp, wmat = mdata
391
+ if (wobj == objname) and (wgrp == groupname):
392
+ res.append(item)
393
+ return res
394
+
395
+ def __facesby(self, objname, groupname):
396
+ return self.__itemsby(self.faces, objname, groupname)
397
+
398
+ def __linesby(self, objname, groupname):
399
+ return self.__itemsby(self.polylines, objname, groupname)
400
+
401
+ def __eggifyverts(self, eprim, evpool, vlist):
402
+ for vertex in vlist:
403
+ ixyz = vertex['v']
404
+ vinfo = self.points[ixyz-1]
405
+ vxyz, vmeta = vinfo
406
+ ev = EggVertex()
407
+ ev.setPos(Point3D(vxyz[0], vxyz[1], vxyz[2]))
408
+ iuv = vertex['vt']
409
+ if iuv is not None:
410
+ vuv = self.uvs[iuv-1]
411
+ ev.setUv(Point2D(vuv[0], vuv[1]))
412
+ inormal = vertex['vn']
413
+ if inormal is not None:
414
+ vn = self.normals[inormal-1]
415
+ ev.setNormal(Vec3D(vn[0], vn[1], vn[2]))
416
+ evpool.addVertex(ev)
417
+ eprim.addVertex(ev)
418
+ return self
419
+
420
+ def __eggifymats(self, eprim, wmat):
421
+ if self.materialsbyname.has_key(wmat):
422
+ mtl = self.materialsbyname[wmat]
423
+ if mtl.isTextured():
424
+ eprim.setTexture(mtl.getEggTexture())
425
+ # NOTE: it looks like you almost always want to setMaterial()
426
+ # for textured polys.... [continued below...]
427
+ eprim.setMaterial(mtl.getEggMaterial())
428
+ rgb = mtl.get("Kd")
429
+ if rgb is not None:
430
+ # ... and some untextured .obj's store the color of the
431
+ # material # in the Kd settings...
432
+ eprim.setColor(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
433
+ # [continued...] but you may *not* always want to assign
434
+ # materials to untextured polys... hmmmm.
435
+ if False:
436
+ eprim.setMaterial(mtl.getEggMaterial())
437
+ return self
438
+
439
+ def __facestoegg(self, egg, objname, groupname):
440
+ selectedfaces = self.__facesby(objname, groupname)
441
+ if len(selectedfaces) == 0:
442
+ return self
443
+ eobj = EggGroup(objname)
444
+ egg.addChild(eobj)
445
+ egrp = EggGroup(groupname)
446
+ eobj.addChild(egrp)
447
+ evpool = EggVertexPool(groupname)
448
+ egrp.addChild(evpool)
449
+ for face in selectedfaces:
450
+ vlist, mdata = face
451
+ wobj, wgrp, wmat = mdata
452
+ epoly = EggPolygon()
453
+ egrp.addChild(epoly)
454
+ self.__eggifymats(epoly, wmat)
455
+ self.__eggifyverts(epoly, evpool, vlist)
456
+ #; each matching face
457
+ return self
458
+
459
+ def __polylinestoegg(self, egg, objname, groupname):
460
+ selectedlines = self.__linesby(objname, groupname)
461
+ if len(selectedlines) == 0:
462
+ return self
463
+ eobj = EggGroup(objname)
464
+ egg.addChild(eobj)
465
+ egrp = EggGroup(groupname)
466
+ eobj.addChild(egrp)
467
+ evpool = EggVertexPool(groupname)
468
+ egrp.addChild(evpool)
469
+ for line in selectedlines:
470
+ vlist, mdata = line
471
+ wobj, wgrp, wmat = mdata
472
+ eline = EggLine()
473
+ egrp.addChild(eline)
474
+ self.__eggifymats(eline, wmat)
475
+ self.__eggifyverts(eline, evpool, vlist)
476
+ #; each matching line
477
+ return self
478
+
479
+ def toEgg(self, verbose=True):
480
+ if verbose: print "converting..."
481
+ # make a new egg
482
+ egg = EggData()
483
+ # convert polygon faces
484
+ if len(self.faces) > 0:
485
+ for objname in self.objects:
486
+ for groupname in self.groups:
487
+ self.__facestoegg(egg, objname, groupname)
488
+ # convert polylines
489
+ if len(self.polylines) > 0:
490
+ for objname in self.objects:
491
+ for groupname in self.groups:
492
+ self.__polylinestoegg(egg, objname, groupname)
493
+ return egg
494
+
495
+ def pathify(path):
496
+ if os.path.isfile(path):
497
+ return path
498
+ # if it was written on win32, it may have \'s in it, and
499
+ # also a full rather than relative pathname (Hexagon does this... ick)
500
+ orig = path
501
+ path = path.lower()
502
+ path = path.replace("\\", "/")
503
+ h, t = os.path.split(path)
504
+ if os.path.isfile(t):
505
+ return t
506
+ print "warning: can't make sense of this map file name:", orig
507
+ return t
508
+
509
+ def main(argv=None):
510
+ if argv is None:
511
+ argv = sys.argv
512
+ try:
513
+ opts, args = getopt.getopt(argv[1:], "hn:bs", ["help", "normals", "binormals", "show"])
514
+ except getopt.error, msg:
515
+ print msg
516
+ print __doc__
517
+ return 2
518
+ show = False
519
+ for o, a in opts:
520
+ if o in ("-h", "--help"):
521
+ print __doc__
522
+ return 0
523
+ elif o in ("-s", "--show"):
524
+ show = True
525
+ for infile in args:
526
+ try:
527
+ if ".obj" not in infile:
528
+ print "WARNING", finfile, "does not look like a valid obj file"
529
+ continue
530
+ obj = ObjFile(infile)
531
+ egg = obj.toEgg()
532
+ f, e = os.path.splitext(infile)
533
+ outfile = f + ".egg"
534
+ for o, a in opts:
535
+ if o in ("-n", "--normals"):
536
+ egg.recomputeVertexNormals(float(a))
537
+ elif o in ("-b", "--binormals"):
538
+ egg.recomputeTangentBinormal(GlobPattern(""))
539
+ egg.removeUnusedVertices(GlobPattern(""))
540
+ if True:
541
+ egg.triangulatePolygons(EggData.TConvex & EggData.TPolygon)
542
+ if True:
543
+ egg.recomputePolygonNormals()
544
+ egg.writeEgg(Filename(outfile))
545
+ if show:
546
+ os.system("pview " + outfile)
547
+ except Exception,e:
548
+ print e
549
+ return 0
550
+
551
+ if __name__ == "__main__":
552
+ sys.exit(main())
553
+
554
+
rendering/data/obj2egg.py~ ADDED
@@ -0,0 +1,554 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/python
2
+ """
3
+ This Version: $Id: obj2egg.py,v 1.7 2008/05/26 17:42:53 andyp Exp $
4
+ Info: info >at< pfastergames.com
5
+
6
+ Extended from: http://panda3d.org/phpbb2/viewtopic.php?t=3378
7
+ .___..__ .___.___.___.__..__ . .
8
+ | [__)[__ [__ [__ | |[__)|\/|
9
+ | | \[___[___| |__|| \| |
10
+ obj2egg.py [n##][b][t][s] filename1.obj ...
11
+ -n regenerate normals with # degree smoothing
12
+ exaple -n30 (normals at less 30 degrees will be smoothed)
13
+ -b make binarmals
14
+ -t make tangents
15
+ -s show in pview
16
+
17
+ licensed under WTFPL (http://sam.zoy.org/wtfpl/)
18
+ """
19
+
20
+ from pandac.PandaModules import *
21
+ import math
22
+ import string
23
+ import getopt
24
+ import sys, os
25
+
26
+
27
+ def floats(float_list):
28
+ """coerce a list of strings that represent floats into a list of floats"""
29
+ return [ float(number) for number in float_list ]
30
+
31
+ def ints(int_list):
32
+ """coerce a list of strings that represent integers into a list of integers"""
33
+ return [ int(number) for number in int_list ]
34
+
35
+
36
+ class ObjMaterial:
37
+ """a wavefront material"""
38
+ def __init__(self):
39
+ self.filename = None
40
+ self.name = "default"
41
+ self.eggdiffusetexture = None
42
+ self.eggmaterial = None
43
+ self.attrib = {}
44
+ self.attrib["Ns"] = 100.0
45
+ self.attrib["d"] = 1.0
46
+ self.attrib["illum"] = 2
47
+ # "magenta"
48
+ self.attrib["Kd"] = [1.0, 0.0, 1.0]
49
+ self.attrib["Ka"] = [0.0, 0.0, 0.0]
50
+ self.attrib["Ks"] = [0.0, 0.0, 0.0]
51
+ self.attrib["Ke"] = [0.0, 0.0, 0.0]
52
+
53
+ def put(self, key, value):
54
+ self.attrib[key] = value
55
+ return self
56
+
57
+ def get(self, key):
58
+ if self.attrib.has_key(key):
59
+ return self.attrib[key]
60
+ return None
61
+
62
+ def has_key(self, key):
63
+ return self.attrib.has_key(key)
64
+
65
+ def isTextured(self):
66
+ # for k in ("map_Kd", "map_Bump", "map_Ks"): <-- NOT YET
67
+ if self.attrib.has_key("map_Kd"):
68
+ return True;
69
+ return False;
70
+
71
+ def getEggTexture(self):
72
+ if self.eggdiffusetexture:
73
+ return self.eggdiffusetexture
74
+ if not self.isTextured():
75
+ return None
76
+ m = EggTexture(self.name + "_diffuse", self.get("map_Kd"))
77
+ m.setFormat(EggTexture.FRgb)
78
+ m.setMagfilter(EggTexture.FTLinearMipmapLinear)
79
+ m.setMinfilter(EggTexture.FTLinearMipmapLinear)
80
+ m.setWrapU(EggTexture.WMRepeat)
81
+ m.setWrapV(EggTexture.WMRepeat)
82
+ self.eggdiffusetexture = m
83
+ return self.eggdiffusetexture
84
+
85
+ def getEggMaterial(self):
86
+ if self.eggmaterial:
87
+ return self.eggmaterial
88
+ m = EggMaterial(self.name + "_mat")
89
+ # XXX TODO: add support for specular, and obey illum setting
90
+ # XXX as best as we can
91
+ rgb = self.get("Kd")
92
+ if rgb is not None:
93
+ m.setDiff(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
94
+ rgb = self.get("Ka")
95
+ if rgb is not None:
96
+ m.setAmb(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
97
+ rgb = self.get("Ks")
98
+ if rgb is not None:
99
+ m.setSpec(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
100
+ ns = self.get("Ns")
101
+ if ns is not None:
102
+ m.setShininess(ns)
103
+ self.eggmaterial = m
104
+ return self.eggmaterial
105
+
106
+ class MtlFile:
107
+ """an object representing all Wavefront materials in a .mtl file"""
108
+ def __init__(self, filename=None):
109
+ self.filename = None
110
+ self.materials = {}
111
+ self.comments = {}
112
+ if filename is not None:
113
+ self.read(filename)
114
+
115
+ def read(self, filename, verbose=False):
116
+ self.filename = filename
117
+ self.materials = {}
118
+ self.comments = {}
119
+ try:
120
+ file = open(filename)
121
+ except:
122
+ return self
123
+ linenumber = 0
124
+ mat = None
125
+ for line in file.readlines():
126
+ line = line.strip()
127
+ linenumber = linenumber + 1
128
+ if not line:
129
+ continue
130
+ if line[0] == '#':
131
+ self.comments[linenumber] = line
132
+ print line
133
+ continue
134
+ tokens = line.split()
135
+ if not tokens:
136
+ continue
137
+ if verbose: print "tokens[0]:", tokens
138
+ if tokens[0] == "newmtl":
139
+ mat = ObjMaterial()
140
+ mat.filename = filename
141
+ mat.name = tokens[1]
142
+ self.materials[mat.name] = mat
143
+ if verbose: print "newmtl:", mat.name
144
+ continue
145
+ if tokens[0] in ("Ns", "d", "Tr"):
146
+ # "d factor" - specifies the dissovle for the current material,
147
+ # 1.0 is full opaque
148
+ # "Ns exponent" - specifies the specular exponent. A high exponent
149
+ # results in a tight, concentrated highlight.
150
+ mat.put(tokens[0], float(tokens[1]))
151
+ continue
152
+ if tokens[0] in ("illum"):
153
+ # according to http://www.fileformat.info/format/material/
154
+ # 0 = Color on and Ambient off
155
+ # 1 = Color on and Ambient on
156
+ # 2 = Highlight on
157
+ # 3 = Reflection on and Ray trace on
158
+ # 4 = Transparency: Glass on, Reflection: Ray trace on
159
+ # 5 = Reflection: Fesnel on and Ray trace on
160
+ # 6 = Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
161
+ # 7 = Transparency: Refraction on, Refelction: Fresnel on and Ray Trace on
162
+ # 8 = Reflection on and Ray trace off
163
+ # 9 = Transparency: Glass on, Reflection: Ray trace off
164
+ # 10 = Casts shadows onto invisible surfaces
165
+ mat.put(tokens[0], int(tokens[1]))
166
+ continue
167
+ if tokens[0] in ("Kd", "Ka", "Ks", "Ke"):
168
+ mat.put(tokens[0], floats(tokens[1:]))
169
+ continue
170
+ if tokens[0] in ("map_Kd", "map_Bump", "map_Ks", "map_bump", "bump"):
171
+ # Ultimate Unwrap 3D Pro emits these:
172
+ # map_Kd == diffuse
173
+ # map_Bump == bump
174
+ # map_Ks == specular
175
+ mat.put(tokens[0], pathify(tokens[1]))
176
+ if verbose: print "map:", mat.name, tokens[0], mat.get(tokens[0])
177
+ continue
178
+ if tokens[0] in ("Ni"):
179
+ # blender's .obj exporter can emit this "Ni 1.000000"
180
+ mat.put(tokens[0], float(tokens[1]))
181
+ continue
182
+ print "file \"%s\": line %d: unrecognized:" % (filename, linenumber), tokens
183
+ file.close()
184
+ if verbose: print "%d materials" % len(self.materials), "loaded from", filename
185
+ return self
186
+
187
+ class ObjFile:
188
+ """a representation of a wavefront .obj file"""
189
+ def __init__(self, filename=None):
190
+ self.filename = None
191
+ self.objects = ["defaultobject"]
192
+ self.groups = ["defaultgroup"]
193
+ self.points = []
194
+ self.uvs = []
195
+ self.normals = []
196
+ self.faces = []
197
+ self.polylines = []
198
+ self.matlibs = []
199
+ self.materialsbyname = {}
200
+ self.comments = {}
201
+ self.currentobject = self.objects[0]
202
+ self.currentgroup = self.groups[0]
203
+ self.currentmaterial = None
204
+ if filename is not None:
205
+ self.read(filename)
206
+
207
+ def read(self, filename, verbose=False):
208
+ if verbose: print "ObjFile.read:", "filename:", filename
209
+ self.filename = filename
210
+ self.objects = ["defaultobject"]
211
+ self.groups = ["defaultgroup"]
212
+ self.points = []
213
+ self.uvs = []
214
+ self.normals = []
215
+ self.faces = []
216
+ self.polylines = []
217
+ self.matlibs = []
218
+ self.materialsbyname = {}
219
+ self.comments = {}
220
+ self.currentobject = self.objects[0]
221
+ self.currentgroup = self.groups[0]
222
+ self.currentmaterial = None
223
+ try:
224
+ file = open(filename)
225
+ except:
226
+ return self
227
+ linenumber = 0
228
+ for line in file.readlines():
229
+ line = line.strip()
230
+ linenumber = linenumber + 1
231
+ if not line:
232
+ continue
233
+ if line[0] == '#':
234
+ self.comments[linenumber] = line
235
+ print line
236
+ continue
237
+ tokens = line.split()
238
+ if not tokens:
239
+ continue
240
+ if tokens[0] == "mtllib":
241
+ if verbose: print "mtllib:", tokens[1:]
242
+ mtllib = MtlFile(tokens[1])
243
+ # if verbose: print mtllib
244
+ self.matlibs.append(mtllib)
245
+ self.indexmaterials(mtllib)
246
+ continue
247
+ if tokens[0] == "g":
248
+ if verbose: print "g:", tokens[1:]
249
+ self.__newgroup("".join(tokens[1:]))
250
+ continue
251
+ if tokens[0] == "o":
252
+ if verbose: print "o:", tokens[1:]
253
+ self.__newobject("".join(tokens[1:]))
254
+ continue
255
+ if tokens[0] == "usemtl":
256
+ if verbose: print "usemtl:", tokens[1:]
257
+ self.__usematerial(tokens[1])
258
+ continue
259
+ if tokens[0] == "v":
260
+ if verbose: print "v:", tokens[1:]
261
+ self.__newv(tokens[1:])
262
+ continue
263
+ if tokens[0] == "vn":
264
+ if verbose: print "vn:", tokens[1:]
265
+ self.__newnormal(tokens[1:])
266
+ continue
267
+ if tokens[0] == "vt":
268
+ if verbose: print "vt:", tokens[1:]
269
+ self.__newuv(tokens[1:])
270
+ continue
271
+ if tokens[0] == "f":
272
+ if verbose: print "f:", tokens[1:]
273
+ self.__newface(tokens[1:])
274
+ continue
275
+ if tokens[0] == "s":
276
+ # apparently, this enables/disables smoothing
277
+ print "%s:%d:" % (filename, linenumber), "ignoring:", tokens
278
+ continue
279
+ if tokens[0] == "l":
280
+ if verbose: print "l:", tokens[1:]
281
+ self.__newpolyline(tokens[1:])
282
+ continue
283
+ print "%s:%d:" % (filename, linenumber), "unknown:", tokens
284
+ file.close()
285
+ return self
286
+
287
+ def __vertlist(self, lst):
288
+ res = []
289
+ for vert in lst:
290
+ vinfo = vert.split("/")
291
+ vlen = len(vinfo)
292
+ vertex = {'v':None, 'vt':None, 'vn':None}
293
+ if vlen == 1:
294
+ vertex['v'] = int(vinfo[0])
295
+ elif vlen == 2:
296
+ if vinfo[0] != '':
297
+ vertex['v'] = int(vinfo[0])
298
+ if vinfo[1] != '':
299
+ vertex['vt'] = int(vinfo[1])
300
+ elif vlen == 3:
301
+ if vinfo[0] != '':
302
+ vertex['v'] = int(vinfo[0])
303
+ if vinfo[1] != '':
304
+ vertex['vt'] = int(vinfo[1])
305
+ if vinfo[2] != '':
306
+ vertex['vn'] = int(vinfo[2])
307
+ else:
308
+ print "aborting..."
309
+ raise UNKNOWN, res
310
+ res.append(vertex)
311
+ if False: print res
312
+ return res
313
+
314
+ def __enclose(self, lst):
315
+ mdata = (self.currentobject, self.currentgroup, self.currentmaterial)
316
+ return (lst, mdata)
317
+
318
+ def __newpolyline(self, l):
319
+ polyline = self.__vertlist(l)
320
+ if False: print "__newline:", polyline
321
+ self.polylines.append(self.__enclose(polyline))
322
+ return self
323
+
324
+ def __newface(self, f):
325
+ face = self.__vertlist(f)
326
+ if False: print face
327
+ self.faces.append(self.__enclose(face))
328
+ return self
329
+
330
+ def __newuv(self, uv):
331
+ self.uvs.append(floats(uv))
332
+ return self
333
+
334
+ def __newnormal(self, normal):
335
+ self.normals.append(floats(normal))
336
+ return self
337
+
338
+ def __newv(self, v):
339
+ # capture the current metadata with vertices
340
+ vdata = floats(v)
341
+ mdata = (self.currentobject, self.currentgroup, self.currentmaterial)
342
+ vinfo = (vdata, mdata)
343
+ self.points.append(vinfo)
344
+ return self
345
+
346
+ def indexmaterials(self, mtllib, verbose=False):
347
+ # traverse the materials defined in mtllib, indexing
348
+ # them by name.
349
+ for mname in mtllib.materials:
350
+ mobj = mtllib.materials[mname]
351
+ self.materialsbyname[mobj.name] = mobj
352
+ if verbose:
353
+ print "indexmaterials:", mtllib.filename, "materials:", self.materialsbyname.keys()
354
+ return self
355
+
356
+ def __closeobject(self):
357
+ self.currentobject = "defaultobject"
358
+ return self
359
+
360
+ def __newobject(self, object):
361
+ self.__closeobject()
362
+ if False: print "__newobject:", "object:", object
363
+ self.currentobject = object
364
+ self.objects.append(object)
365
+ return self
366
+
367
+ def __closegroup(self):
368
+ self.currentgroup = "defaultgroup"
369
+ return self
370
+
371
+ def __newgroup(self, group):
372
+ self.__closegroup()
373
+ if False: print "__newgroup:", "group:", group
374
+ self.currentgroup = group
375
+ self.groups.append(group)
376
+ return self
377
+
378
+ def __usematerial(self, material):
379
+ if False: print "__usematerial:", "material:", material
380
+ if self.materialsbyname.has_key(material):
381
+ self.currentmaterial = material
382
+ else:
383
+ print "warning:", "__usematerial:", "unknown material:", material
384
+ return self
385
+
386
+ def __itemsby(self, itemlist, objname, groupname):
387
+ res = []
388
+ for item in itemlist:
389
+ vlist, mdata = item
390
+ wobj, wgrp, wmat = mdata
391
+ if (wobj == objname) and (wgrp == groupname):
392
+ res.append(item)
393
+ return res
394
+
395
+ def __facesby(self, objname, groupname):
396
+ return self.__itemsby(self.faces, objname, groupname)
397
+
398
+ def __linesby(self, objname, groupname):
399
+ return self.__itemsby(self.polylines, objname, groupname)
400
+
401
+ def __eggifyverts(self, eprim, evpool, vlist):
402
+ for vertex in vlist:
403
+ ixyz = vertex['v']
404
+ vinfo = self.points[ixyz-1]
405
+ vxyz, vmeta = vinfo
406
+ ev = EggVertex()
407
+ ev.setPos(Point3D(vxyz[0], vxyz[1], vxyz[2]))
408
+ iuv = vertex['vt']
409
+ if iuv is not None:
410
+ vuv = self.uvs[iuv-1]
411
+ ev.setUv(Point2D(vuv[0], vuv[1]))
412
+ inormal = vertex['vn']
413
+ if inormal is not None:
414
+ vn = self.normals[inormal-1]
415
+ ev.setNormal(Vec3D(vn[0], vn[1], vn[2]))
416
+ evpool.addVertex(ev)
417
+ eprim.addVertex(ev)
418
+ return self
419
+
420
+ def __eggifymats(self, eprim, wmat):
421
+ if self.materialsbyname.has_key(wmat):
422
+ mtl = self.materialsbyname[wmat]
423
+ if mtl.isTextured():
424
+ eprim.setTexture(mtl.getEggTexture())
425
+ # NOTE: it looks like you almost always want to setMaterial()
426
+ # for textured polys.... [continued below...]
427
+ eprim.setMaterial(mtl.getEggMaterial())
428
+ rgb = mtl.get("Kd")
429
+ if rgb is not None:
430
+ # ... and some untextured .obj's store the color of the
431
+ # material # in the Kd settings...
432
+ eprim.setColor(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
433
+ # [continued...] but you may *not* always want to assign
434
+ # materials to untextured polys... hmmmm.
435
+ if False:
436
+ eprim.setMaterial(mtl.getEggMaterial())
437
+ return self
438
+
439
+ def __facestoegg(self, egg, objname, groupname):
440
+ selectedfaces = self.__facesby(objname, groupname)
441
+ if len(selectedfaces) == 0:
442
+ return self
443
+ eobj = EggGroup(objname)
444
+ egg.addChild(eobj)
445
+ egrp = EggGroup(groupname)
446
+ eobj.addChild(egrp)
447
+ evpool = EggVertexPool(groupname)
448
+ egrp.addChild(evpool)
449
+ for face in selectedfaces:
450
+ vlist, mdata = face
451
+ wobj, wgrp, wmat = mdata
452
+ epoly = EggPolygon()
453
+ egrp.addChild(epoly)
454
+ self.__eggifymats(epoly, wmat)
455
+ self.__eggifyverts(epoly, evpool, vlist)
456
+ #; each matching face
457
+ return self
458
+
459
+ def __polylinestoegg(self, egg, objname, groupname):
460
+ selectedlines = self.__linesby(objname, groupname)
461
+ if len(selectedlines) == 0:
462
+ return self
463
+ eobj = EggGroup(objname)
464
+ egg.addChild(eobj)
465
+ egrp = EggGroup(groupname)
466
+ eobj.addChild(egrp)
467
+ evpool = EggVertexPool(groupname)
468
+ egrp.addChild(evpool)
469
+ for line in selectedlines:
470
+ vlist, mdata = line
471
+ wobj, wgrp, wmat = mdata
472
+ eline = EggLine()
473
+ egrp.addChild(eline)
474
+ self.__eggifymats(eline, wmat)
475
+ self.__eggifyverts(eline, evpool, vlist)
476
+ #; each matching line
477
+ return self
478
+
479
+ def toEgg(self, verbose=True):
480
+ if verbose: print "converting..."
481
+ # make a new egg
482
+ egg = EggData()
483
+ # convert polygon faces
484
+ if len(self.faces) > 0:
485
+ for objname in self.objects:
486
+ for groupname in self.groups:
487
+ self.__facestoegg(egg, objname, groupname)
488
+ # convert polylines
489
+ if len(self.polylines) > 0:
490
+ for objname in self.objects:
491
+ for groupname in self.groups:
492
+ self.__polylinestoegg(egg, objname, groupname)
493
+ return egg
494
+
495
+ def pathify(path):
496
+ if os.path.isfile(path):
497
+ return path
498
+ # if it was written on win32, it may have \'s in it, and
499
+ # also a full rather than relative pathname (Hexagon does this... ick)
500
+ orig = path
501
+ path = path.lower()
502
+ path = path.replace("\\", "/")
503
+ h, t = os.path.split(path)
504
+ if os.path.isfile(t):
505
+ return t
506
+ print "warning: can't make sense of this map file name:", orig
507
+ return t
508
+
509
+ def main(argv=None):
510
+ if argv is None:
511
+ argv = sys.argv
512
+ try:
513
+ opts, args = getopt.getopt(argv[1:], "hn:bs", ["help", "normals", "binormals", "show"])
514
+ except getopt.error, msg:
515
+ print msg
516
+ print __doc__
517
+ return 2
518
+ show = False
519
+ for o, a in opts:
520
+ if o in ("-h", "--help"):
521
+ print __doc__
522
+ return 0
523
+ elif o in ("-s", "--show"):
524
+ show = True
525
+ for infile in args:
526
+ try:
527
+ if ".obj" not in infile:
528
+ print "WARNING", finfile, "does not look like a valid obj file"
529
+ continue
530
+ obj = ObjFile(infile)
531
+ egg = obj.toEgg()
532
+ f, e = os.path.splitext(infile)
533
+ outfile = f + ".egg"
534
+ for o, a in opts:
535
+ if o in ("-n", "--normals"):
536
+ egg.recomputeVertexNormals(float(a))
537
+ elif o in ("-b", "--binormals"):
538
+ egg.recomputeTangentBinormal(GlobPattern(""))
539
+ egg.removeUnusedVertices(GlobPattern(""))
540
+ if True:
541
+ egg.triangulatePolygons(EggData.TConvex & EggData.TPolygon)
542
+ if True:
543
+ egg.recomputePolygonNormals()
544
+ egg.writeEgg(Filename(outfile))
545
+ if show:
546
+ os.system("pview " + outfile)
547
+ except Exception,e:
548
+ print e
549
+ return 0
550
+
551
+ if __name__ == "__main__":
552
+ sys.exit(main())
553
+
554
+
rendering/data/stairs.mtl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ ## Alias OBJ Material File
3
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
4
+
5
+ newmtl _auto_38
6
+ Ka 0.000000 0.000000 0.000000
7
+ Kd 0.721569 0.709804 0.686275
8
+ Ks 0.330000 0.330000 0.330000
9
+ map_Kd stairs/_auto_38.jpg
10
+
rendering/data/stairs.obj ADDED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Alias OBJ Model File
2
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
3
+ # File units = meters
4
+
5
+ mtllib stairs.mtl
6
+
7
+ g Mesh1 Model
8
+
9
+ usemtl _auto_38
10
+ v 3.97303 0.777476 0.599186
11
+ vt 2.45833 2
12
+ vn -1 7.82076e-14 -2.07782e-15
13
+ v 3.97303 0.510776 0.564515
14
+ vt 3.33333 1.875
15
+ v 3.97303 0.510776 0.599186
16
+ vt 3.33333 2
17
+ f 1/1/1 2/2/1 3/3/1
18
+
19
+ v 3.97303 0.523476 0.564515
20
+ vt 3.29167 1.875
21
+ f 2/2/1 1/1/1 4/4/1
22
+
23
+ v 3.97303 0.523476 0.414274
24
+ vt 3.29167 1.33333
25
+ f 4/4/1 1/1/1 5/5/1
26
+
27
+ v 3.97303 1.52678 -1.778e-09
28
+ vt 1.06581e-14 -0.160256
29
+ vn -1 7.82094e-14 -1.28658e-16
30
+ f 6/6/2 5/5/2 1/1/2
31
+
32
+ v 3.97303 0.269476 0.229362
33
+ vt 4.125 0.666667
34
+ f 6/6/2 7/7/2 5/5/2
35
+
36
+ v 3.97303 0.0154759 -1.778e-09
37
+ vt 4.95833 -0.160257
38
+ f 8/8/2 7/7/2 6/6/2
39
+
40
+ v 3.97303 0.0154759 0.194691
41
+ vt 4.95833 0.541667
42
+ f 9/9/2 7/7/2 8/8/2
43
+
44
+ v 3.97303 0.00277587 0.194691
45
+ vt 5 0.541667
46
+ f 10/10/2 7/7/2 9/9/2
47
+
48
+ v 3.97303 0.00277587 0.229362
49
+ vt 5 0.666667
50
+ f 7/7/2 10/10/2 11/11/2
51
+
52
+ vt 0.5 0.541667
53
+ vn -7.81597e-14 -1 -1.05893e-42
54
+ v 5.19223 0.00277587 0.229362
55
+ vt 4.5 0.666667
56
+ vt 0.5 0.666667
57
+ f 10/12/3 12/13/3 11/14/3
58
+
59
+ v 5.19223 0.00277587 0.194691
60
+ vt 4.5 0.541667
61
+ f 12/13/3 10/12/3 13/15/3
62
+
63
+ vt -4.95833 0.5
64
+ vn 0 0 -1
65
+ vt -5 4.5
66
+ vt -5 0.5
67
+ f 9/16/4 13/17/4 10/18/4
68
+
69
+ v 5.19223 0.0154759 0.194691
70
+ vt -4.95833 4.5
71
+ f 13/17/4 9/16/4 14/19/4
72
+
73
+ vt 0.5 -0.160256
74
+ vn -7.81597e-14 -1 -1.67911e-44
75
+ f 8/20/5 14/15/5 9/12/5
76
+
77
+ v 5.19223 0.0154759 -1.778e-09
78
+ vt 4.5 -0.160256
79
+ f 14/15/5 8/20/5 15/21/5
80
+
81
+ vt -1.24345e-14 0.5
82
+ f 6/22/4 15/19/4 8/16/4
83
+
84
+ v 5.19223 1.52678 -1.778e-09
85
+ vt -8.88178e-16 4.5
86
+ f 15/19/4 6/22/4 16/23/4
87
+
88
+ v 3.97303 1.52678 1.15392
89
+ vt -0.5 4
90
+ vn 7.51991e-14 1 0
91
+ vt -4.5 -0.160256
92
+ vt -0.5 -0.160256
93
+ f 17/24/6 16/25/6 6/26/6
94
+
95
+ v 5.19223 1.52678 1.15392
96
+ vt -4.5 4
97
+ f 16/25/6 17/24/6 18/27/6
98
+
99
+ vt 1.06581e-14 0.5
100
+ vn 0 0 1
101
+ v 5.19223 1.27278 1.15392
102
+ vt 0.833333 4.5
103
+ vt -1.77636e-15 4.5
104
+ f 17/28/7 19/29/7 18/30/7
105
+
106
+ v 3.97303 1.27278 1.15392
107
+ vt 0.833333 0.5
108
+ f 19/29/7 17/28/7 20/31/7
109
+
110
+ vt 1.06581e-14 4
111
+ v 3.97303 1.27278 1.11925
112
+ vt 0.833333 3.875
113
+ vt 0.833333 4
114
+ f 17/32/2 21/33/2 20/34/2
115
+
116
+ v 3.97303 1.28548 1.11925
117
+ vt 0.791667 3.875
118
+ f 21/33/2 17/32/2 22/35/2
119
+
120
+ v 3.97303 1.28548 0.96901
121
+ vt 0.791667 3.33333
122
+ f 22/35/2 17/32/2 23/36/2
123
+
124
+ f 6/6/2 23/36/2 17/32/2
125
+
126
+ v 3.97303 1.03148 0.784098
127
+ vt 1.625 2.66667
128
+ f 6/6/2 24/37/2 23/36/2
129
+
130
+ f 6/6/2 1/1/2 24/37/2
131
+
132
+ v 3.97303 0.777476 0.749427
133
+ vt 2.45833 2.54167
134
+ vn -1 7.59476e-14 1.11882e-15
135
+ f 25/38/8 24/37/8 1/1/8
136
+
137
+ v 3.97303 0.764776 0.749427
138
+ vt 2.5 2.54167
139
+ f 26/39/8 24/37/8 25/38/8
140
+
141
+ v 3.97303 0.764776 0.784098
142
+ vt 2.5 2.66667
143
+ f 24/37/8 26/39/8 27/40/8
144
+
145
+ vt 0.5 2.54167
146
+ vn -7.81597e-14 -1 0
147
+ v 5.19223 0.764776 0.784098
148
+ vt 4.5 2.66667
149
+ vt 0.5 2.66667
150
+ f 26/41/9 28/42/9 27/43/9
151
+
152
+ v 5.19223 0.764776 0.749427
153
+ vt 4.5 2.54167
154
+ f 28/42/9 26/41/9 29/44/9
155
+
156
+ vt -2.45833 0.5
157
+ vt -2.5 4.5
158
+ vt -2.5 0.5
159
+ f 25/45/4 29/46/4 26/47/4
160
+
161
+ v 5.19223 0.777476 0.749427
162
+ vt -2.45833 4.5
163
+ f 29/46/4 25/45/4 30/48/4
164
+
165
+ vt 0.5 2
166
+ f 1/49/9 30/44/9 25/41/9
167
+
168
+ v 5.19223 0.777476 0.599186
169
+ vt 4.5 2
170
+ f 30/44/9 1/49/9 31/50/9
171
+
172
+ vt 2.45833 0.5
173
+ v 5.19223 0.510776 0.599186
174
+ vt 3.33333 4.5
175
+ vt 2.45833 4.5
176
+ f 1/51/7 32/52/7 31/53/7
177
+
178
+ vt 3.33333 0.5
179
+ f 32/52/7 1/51/7 3/54/7
180
+
181
+ vt 0.5 1.875
182
+ vn -7.81597e-14 -1 4.23573e-42
183
+ f 2/55/10 32/50/10 3/49/10
184
+
185
+ v 5.19223 0.510776 0.564515
186
+ vt 4.5 1.875
187
+ f 32/50/10 2/55/10 33/56/10
188
+
189
+ vt -3.29167 0.5
190
+ vt -3.33333 4.5
191
+ vt -3.33333 0.5
192
+ f 4/57/4 33/58/4 2/59/4
193
+
194
+ v 5.19223 0.523476 0.564515
195
+ vt -3.29167 4.5
196
+ f 33/58/4 4/57/4 34/60/4
197
+
198
+ vt 0.5 1.33333
199
+ f 5/61/9 34/56/9 4/55/9
200
+
201
+ v 5.19223 0.523476 0.414274
202
+ vt 4.5 1.33333
203
+ f 34/56/9 5/61/9 35/62/9
204
+
205
+ vt 3.29167 0.5
206
+ v 5.19223 0.256776 0.414274
207
+ vt 4.16667 4.5
208
+ vt 3.29167 4.5
209
+ f 5/63/7 36/64/7 35/65/7
210
+
211
+ v 3.97303 0.256776 0.414274
212
+ vt 4.16667 0.5
213
+ f 36/64/7 5/63/7 37/66/7
214
+
215
+ vn -1 8.09368e-14 -1.91798e-15
216
+ v 3.97303 0.256776 0.379603
217
+ vt 4.16667 1.20833
218
+ vt 4.16667 1.33333
219
+ f 5/5/11 38/67/11 37/68/11
220
+
221
+ v 3.97303 0.269476 0.379603
222
+ vt 4.125 1.20833
223
+ f 38/67/11 5/5/11 39/69/11
224
+
225
+ f 39/69/11 5/5/11 7/7/11
226
+
227
+ v 5.19223 0.269476 0.379603
228
+ vt 4.5 1.20833
229
+ vt 0.5 1.20833
230
+ f 7/14/9 40/70/9 39/71/9
231
+
232
+ v 5.19223 0.269476 0.229362
233
+ f 40/70/9 7/14/9 41/13/9
234
+
235
+ vt 4.125 0.5
236
+ vt 5 4.5
237
+ vt 4.125 4.5
238
+ f 7/72/7 12/73/7 41/74/7
239
+
240
+ vt 5 0.5
241
+ f 12/73/7 7/72/7 11/75/7
242
+
243
+ vt -5 0.666667
244
+ vn 1 -7.82301e-14 8.06225e-17
245
+ vt -4.95833 0.541667
246
+ vt -4.125 0.666667
247
+ f 12/76/12 14/77/12 41/78/12
248
+
249
+ vt -5 0.541667
250
+ f 14/77/12 12/76/12 13/79/12
251
+
252
+ vt 0 -0.160256
253
+ f 14/77/12 16/80/12 41/78/12
254
+
255
+ vt -4.95833 -0.160256
256
+ f 16/80/12 14/77/12 15/81/12
257
+
258
+ vt -3.29167 1.33333
259
+ f 41/78/12 16/80/12 35/82/12
260
+
261
+ vt -2.45833 2
262
+ f 35/82/12 16/80/12 31/83/12
263
+
264
+ v 5.19223 1.03148 0.784098
265
+ vt -1.625 2.66667
266
+ f 31/83/12 16/80/12 42/84/12
267
+
268
+ v 5.19223 1.03148 0.934339
269
+ vt -1.625 3.20833
270
+ f 42/84/12 16/80/12 43/85/12
271
+
272
+ v 5.19223 1.28548 0.96901
273
+ vt -0.791667 3.33333
274
+ f 43/85/12 16/80/12 44/86/12
275
+
276
+ v 5.19223 1.28548 1.11925
277
+ vt -0.791667 3.875
278
+ f 44/86/12 16/80/12 45/87/12
279
+
280
+ vt -1.03071e-07 4
281
+ f 18/88/12 45/87/12 16/80/12
282
+
283
+ vt -0.833333 4
284
+ f 19/89/12 45/87/12 18/88/12
285
+
286
+ v 5.19223 1.27278 1.11925
287
+ vt -0.833333 3.875
288
+ f 45/87/12 19/89/12 46/90/12
289
+
290
+ vt 4.5 4
291
+ vn -7.81597e-14 -1 -8.47145e-42
292
+ vt 0.5 3.875
293
+ vt 4.5 3.875
294
+ f 19/91/13 21/92/13 46/93/13
295
+
296
+ vt 0.5 4
297
+ f 21/92/13 19/91/13 20/94/13
298
+
299
+ vt -0.791667 0.5
300
+ vt -0.833333 4.5
301
+ vt -0.833333 0.5
302
+ f 22/95/4 46/96/4 21/97/4
303
+
304
+ vt -0.791667 4.5
305
+ f 46/96/4 22/95/4 45/98/4
306
+
307
+ vt 0.5 3.33333
308
+ f 23/99/9 45/93/9 22/92/9
309
+
310
+ vt 4.5 3.33333
311
+ f 45/93/9 23/99/9 44/100/9
312
+
313
+ vt 0.791667 0.5
314
+ v 5.19223 1.01878 0.96901
315
+ vt 1.66667 4.5
316
+ vt 0.791667 4.5
317
+ f 23/101/7 47/102/7 44/103/7
318
+
319
+ v 3.97303 1.01878 0.96901
320
+ vt 1.66667 0.5
321
+ f 47/102/7 23/101/7 48/104/7
322
+
323
+ v 3.97303 1.01878 0.934339
324
+ vt 1.66667 3.20833
325
+ vt 1.66667 3.33333
326
+ f 23/36/2 49/105/2 48/106/2
327
+
328
+ v 3.97303 1.03148 0.934339
329
+ vt 1.625 3.20833
330
+ f 49/105/2 23/36/2 50/107/2
331
+
332
+ f 50/107/2 23/36/2 24/37/2
333
+
334
+ vn -7.81597e-14 -1 2.25571e-43
335
+ vt 4.5 3.20833
336
+ vt 0.5 3.20833
337
+ f 24/43/14 43/108/14 50/109/14
338
+
339
+ f 43/108/14 24/43/14 42/42/14
340
+
341
+ vt 1.625 0.5
342
+ vt 2.5 4.5
343
+ vt 1.625 4.5
344
+ f 24/110/7 28/111/7 42/112/7
345
+
346
+ vt 2.5 0.5
347
+ f 28/111/7 24/110/7 27/113/7
348
+
349
+ vt -2.5 2.66667
350
+ vn 1 -7.86768e-14 -1.27866e-15
351
+ vt -2.45833 2.54167
352
+ f 28/114/15 30/115/15 42/84/15
353
+
354
+ vt -2.5 2.54167
355
+ f 30/115/15 28/114/15 29/116/15
356
+
357
+ f 42/84/15 30/115/15 31/83/15
358
+
359
+ v 5.19223 1.01878 0.934339
360
+ vt -1.66667 4.5
361
+ vt -1.625 0.5
362
+ vt -1.625 4.5
363
+ f 51/117/4 50/118/4 43/119/4
364
+
365
+ vt -1.66667 0.5
366
+ f 50/118/4 51/117/4 49/120/4
367
+
368
+ vn -7.81597e-14 -1 8.47145e-42
369
+ f 47/100/16 49/109/16 51/108/16
370
+
371
+ f 49/109/16 47/100/16 48/99/16
372
+
373
+ vt -1.66667 3.33333
374
+ vt -1.66667 3.20833
375
+ f 43/85/12 47/121/12 51/122/12
376
+
377
+ f 47/121/12 43/85/12 44/86/12
378
+
379
+ vn 1 -7.59476e-14 -1.11882e-15
380
+ vt -3.29167 1.875
381
+ f 31/83/17 34/123/17 35/82/17
382
+
383
+ vt -3.33333 2
384
+ f 32/124/17 34/123/17 31/83/17
385
+
386
+ vt -3.33333 1.875
387
+ f 34/123/17 32/124/17 33/125/17
388
+
389
+ vn 1 -7.82076e-14 2.07782e-15
390
+ vt -4.125 1.20833
391
+ f 35/82/18 40/126/18 41/78/18
392
+
393
+ vt -4.16667 1.33333
394
+ f 36/127/18 40/126/18 35/82/18
395
+
396
+ v 5.19223 0.256776 0.379603
397
+ vt -4.16667 1.20833
398
+ f 40/126/18 36/127/18 52/128/18
399
+
400
+ f 36/62/9 38/71/9 52/70/9
401
+
402
+ f 38/71/9 36/62/9 37/61/9
403
+
404
+ vt -4.125 0.5
405
+ vt -4.16667 4.5
406
+ vt -4.16667 0.5
407
+ f 39/129/4 52/130/4 38/131/4
408
+
409
+ vt -4.125 4.5
410
+ f 52/130/4 39/129/4 40/132/4
411
+
rendering/data/stairs/_auto_38.jpg ADDED
rendering/data/toilet.egg ADDED
The diff for this file is too large to render. See raw diff
 
rendering/data/toilet.mtl ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ ## Alias OBJ Material File
3
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
4
+
5
+ newmtl _auto_17
6
+ Ka 0.000000 0.000000 0.000000
7
+ Kd 1.000000 1.000000 1.000000
8
+ Ks 0.330000 0.330000 0.330000
9
+
10
+ newmtl _auto_36
11
+ Ka 0.000000 0.000000 0.000000
12
+ Kd 0.666667 0.666667 0.666667
13
+ Ks 0.330000 0.330000 0.330000
14
+
15
+ newmtl _auto_37
16
+ Ka 0.000000 0.000000 0.000000
17
+ Kd 1.000000 0.992157 0.952941
18
+ Ks 0.330000 0.330000 0.330000
19
+
20
+ newmtl _auto_34
21
+ Ka 0.000000 0.000000 0.000000
22
+ Kd 0.752941 0.752941 0.752941
23
+ Ks 0.330000 0.330000 0.330000
24
+ map_Kd toilet/_auto_34.jpg
25
+
26
+ newmtl _auto_35
27
+ Ka 0.000000 0.000000 0.000000
28
+ Kd 0.254902 0.635294 0.713725
29
+ Ks 0.330000 0.330000 0.330000
30
+ d 0.160000
31
+ map_Kd toilet/_auto_35.jpg
32
+
rendering/data/toilet.obj ADDED
The diff for this file is too large to render. See raw diff
 
rendering/data/toilet/_auto_34.jpg ADDED
rendering/data/toilet/_auto_35.jpg ADDED
rendering/data/wall.jpg ADDED
rendering/data/washing_basin.egg ADDED
The diff for this file is too large to render. See raw diff
 
rendering/data/washing_basin.mtl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ ## Alias OBJ Material File
3
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
4
+
5
+ newmtl _auto_3
6
+ Ka 0.000000 0.000000 0.000000
7
+ Kd 0.784314 0.819608 0.854902
8
+ Ks 0.330000 0.330000 0.330000
9
+ map_Kd washing_basin/_auto_3.jpg
10
+
11
+ newmtl _auto_8
12
+ Ka 0.000000 0.000000 0.000000
13
+ Kd 0.690196 0.407843 0.164706
14
+ Ks 0.330000 0.330000 0.330000
15
+ map_Kd washing_basin/_auto_8.jpg
16
+
17
+ newmtl _auto_17
18
+ Ka 0.000000 0.000000 0.000000
19
+ Kd 1.000000 1.000000 1.000000
20
+ Ks 0.330000 0.330000 0.330000
21
+
22
+ newmtl _auto_12
23
+ Ka 0.000000 0.000000 0.000000
24
+ Kd 0.717647 0.717647 0.717647
25
+ Ks 0.330000 0.330000 0.330000
26
+ d 0.800000
27
+ map_Kd washing_basin/_auto_12.jpg
28
+
29
+ newmtl _auto_20
30
+ Ka 0.000000 0.000000 0.000000
31
+ Kd 0.164706 0.184314 0.223529
32
+ Ks 0.330000 0.330000 0.330000
33
+ map_Kd washing_basin/_auto_20.jpg
34
+
35
+ newmtl _auto_22
36
+ Ka 0.000000 0.000000 0.000000
37
+ Kd 0.023529 0.400000 0.690196
38
+ Ks 0.330000 0.330000 0.330000
39
+
40
+ newmtl _auto_23
41
+ Ka 0.000000 0.000000 0.000000
42
+ Kd 1.000000 0.941176 0.956863
43
+ Ks 0.330000 0.330000 0.330000
44
+
45
+ newmtl _auto_24
46
+ Ka 0.000000 0.000000 0.000000
47
+ Kd 0.831373 0.807843 0.800000
48
+ Ks 0.330000 0.330000 0.330000
49
+ map_Kd washing_basin/_auto_24.jpg
50
+
rendering/data/washing_basin.obj ADDED
@@ -0,0 +1,4334 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Alias OBJ Model File
2
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
3
+ # File units = meters
4
+
5
+ mtllib washing_basin.mtl
6
+
7
+ g Mesh1 skp6ygIAs1 Model
8
+
9
+ usemtl _auto_3
10
+ v -0.490316 1.80975 0.192384
11
+ vt -1.00867 -4.0291
12
+ vn 3.75475e-18 0.608756 0.793358
13
+ v -0.528416 1.81435 0.188853
14
+ vt -0.980887 -4.03333
15
+ v -0.528416 1.80975 0.192384
16
+ vt -0.980887 -4.0291
17
+ f 1/1/1 2/2/1 3/3/1
18
+
19
+ v -0.490316 1.81435 0.188853
20
+ vt -1.00867 -4.03333
21
+ f 2/2/1 1/1/1 4/4/1
22
+
23
+ usemtl _auto_8
24
+ vt -11.6689 0.315591
25
+ vn -1 -2.11635e-33 -1.67106e-33
26
+ v -0.490316 2.25954 0.274474
27
+ vt -12.4068 0.450253
28
+ vt -11.6765 0.309798
29
+ f 1/5/2 5/6/2 4/7/2
30
+
31
+ v -0.490316 1.80439 0.194605
32
+ vt -11.6602 0.319234
33
+ f 6/8/2 5/6/2 1/5/2
34
+
35
+ v -0.490316 1.79864 0.195362
36
+ vt -11.6507 0.320476
37
+ f 7/9/2 5/6/2 6/8/2
38
+
39
+ v -0.490316 1.79289 0.194605
40
+ vt -11.6413 0.319234
41
+ f 8/10/2 5/6/2 7/9/2
42
+
43
+ v -0.490316 1.2512 0.274474
44
+ vt -10.7527 0.450253
45
+ f 8/10/2 9/11/2 5/6/2
46
+
47
+ v -0.490316 1.2512 0.0664481
48
+ vt -10.7527 0.109003
49
+ f 9/11/2 8/10/2 10/12/2
50
+
51
+ v -0.490316 1.78753 0.192384
52
+ vt -11.6325 0.315591
53
+ f 10/12/2 8/10/2 11/13/2
54
+
55
+ usemtl _auto_3
56
+ v -0.528416 1.79289 0.194605
57
+ vt 0.980887 4.83436
58
+ vn -1.4246e-18 -0.382689 0.923877
59
+ vt 1.00867 4.83013
60
+ vt 1.00867 4.83436
61
+ f 12/14/3 11/15/3 8/16/3
62
+
63
+ v -0.528416 1.78753 0.192384
64
+ vt 0.980887 4.83013
65
+ f 11/15/3 12/14/3 13/17/3
66
+
67
+ v -0.528416 1.78753 0.15389
68
+ vt -5.16999 0.112197
69
+ vn -1 0 0
70
+ vt -5.16999 0.140263
71
+ vt -5.1739 0.141882
72
+ f 14/18/4 13/19/4 12/20/4
73
+
74
+ v -0.528416 1.78292 0.157422
75
+ vt -5.16664 0.114772
76
+ f 15/21/4 13/19/4 14/18/4
77
+
78
+ v -0.528416 1.78292 0.188853
79
+ vt -5.16664 0.137688
80
+ f 15/21/4 16/22/4 13/19/4
81
+
82
+ v -0.528416 1.77939 0.162025
83
+ vt -5.16406 0.118128
84
+ f 17/23/4 16/22/4 15/21/4
85
+
86
+ v -0.528416 1.77939 0.18425
87
+ vt -5.16406 0.134332
88
+ f 17/23/4 18/24/4 16/22/4
89
+
90
+ v -0.528416 1.77717 0.167385
91
+ vt -5.16244 0.122036
92
+ f 19/25/4 18/24/4 17/23/4
93
+
94
+ v -0.528416 1.77717 0.178889
95
+ vt -5.16244 0.130424
96
+ f 19/25/4 20/26/4 18/24/4
97
+
98
+ v -0.528416 1.77641 0.173137
99
+ vt -5.16189 0.12623
100
+ f 20/26/4 19/25/4 21/27/4
101
+
102
+ vt 0.980887 -0.552842
103
+ vn 8.16417e-20 -0.991442 -0.130549
104
+ v -0.490316 1.77641 0.173137
105
+ vt 1.00867 -0.548612
106
+ vt 0.980887 -0.548612
107
+ f 19/28/5 22/29/5 21/30/5
108
+
109
+ v -0.490316 1.77717 0.167385
110
+ vt 1.00867 -0.552842
111
+ f 22/29/5 19/28/5 23/31/5
112
+
113
+ vt 0.980887 -1.86706
114
+ vn 1.87135e-18 -0.923884 -0.382672
115
+ vt 1.00867 -1.86283
116
+ vt 0.980887 -1.86283
117
+ f 17/32/6 23/33/6 19/34/6
118
+
119
+ v -0.490316 1.77939 0.162025
120
+ vt 1.00867 -1.86706
121
+ f 23/33/6 17/32/6 24/35/6
122
+
123
+ vt 0.980887 -3.05419
124
+ vn -1.13865e-18 -0.793361 -0.608752
125
+ vt 1.00867 -3.04996
126
+ vt 0.980887 -3.04996
127
+ f 15/36/7 24/37/7 17/38/7
128
+
129
+ v -0.490316 1.78292 0.157422
130
+ vt 1.00867 -3.05419
131
+ f 24/37/7 15/36/7 25/39/7
132
+
133
+ vt 0.980887 -4.0291
134
+ vn -6.20144e-18 -0.608759 -0.793355
135
+ v -0.490316 1.78753 0.15389
136
+ vt 1.00867 -4.03333
137
+ vt 1.00867 -4.0291
138
+ f 15/40/8 26/41/8 25/42/8
139
+
140
+ vt 0.980887 -4.03333
141
+ f 26/41/8 15/40/8 14/43/8
142
+
143
+ v -0.528416 1.78628 0.127022
144
+ vt -5.16909 0.0926086
145
+ vt -5.17 0.112197
146
+ f 27/44/4 15/21/4 14/45/4
147
+
148
+ vt -5.16407 0.118128
149
+ f 27/44/4 17/46/4 15/21/4
150
+
151
+ vt -5.16245 0.122036
152
+ f 27/44/4 19/47/4 17/46/4
153
+
154
+ v -0.528416 1.77477 0.131791
155
+ vt -5.16069 0.0960859
156
+ f 28/48/4 19/47/4 27/44/4
157
+
158
+ f 19/47/4 28/48/4 21/27/4
159
+
160
+ v -0.528416 1.77477 0.214483
161
+ vt -5.16069 0.156374
162
+ f 28/48/4 29/49/4 21/27/4
163
+
164
+ v -0.528416 1.76488 0.139378
165
+ vt -5.15348 0.101617
166
+ f 30/50/4 29/49/4 28/48/4
167
+
168
+ v -0.528416 1.76488 0.206896
169
+ vt -5.15348 0.150843
170
+ f 30/50/4 31/51/4 29/49/4
171
+
172
+ v -0.528416 1.75729 0.149266
173
+ vt -5.14795 0.108826
174
+ f 32/52/4 31/51/4 30/50/4
175
+
176
+ v -0.528416 1.75729 0.197008
177
+ vt -5.14795 0.143634
178
+ f 32/52/4 33/53/4 31/51/4
179
+
180
+ v -0.528416 1.75252 0.160781
181
+ vt -5.14447 0.117221
182
+ f 34/54/4 33/53/4 32/52/4
183
+
184
+ v -0.528416 1.75252 0.185494
185
+ vt -5.14447 0.135239
186
+ f 34/54/4 35/55/4 33/53/4
187
+
188
+ v -0.528416 1.7509 0.173137
189
+ vt -5.14329 0.12623
190
+ f 35/55/4 34/54/4 36/56/4
191
+
192
+ vt 0.980887 -0.55527
193
+ vn 6.72333e-31 -0.991446 -0.130514
194
+ v -0.509366 1.7509 0.173137
195
+ vt 0.994776 -0.546184
196
+ vt 0.980887 -0.546184
197
+ f 34/57/9 37/58/9 36/59/9
198
+
199
+ v -0.509366 1.75252 0.160781
200
+ vt 0.994776 -0.55527
201
+ f 37/58/9 34/57/9 38/60/9
202
+
203
+ vt 0.980887 -1.86949
204
+ vn -6.4783e-31 -0.923875 -0.382694
205
+ vt 0.994776 -1.86041
206
+ vt 0.980887 -1.86041
207
+ f 32/61/10 38/62/10 34/63/10
208
+
209
+ v -0.509366 1.75729 0.149266
210
+ vt 0.994776 -1.86949
211
+ f 38/62/10 32/61/10 39/64/10
212
+
213
+ vt 0.980887 -3.05662
214
+ vn 5.56311e-31 -0.793359 -0.608754
215
+ vt 0.994776 -3.04754
216
+ vt 0.980887 -3.04754
217
+ f 30/65/11 39/66/11 32/67/11
218
+
219
+ v -0.509366 1.76488 0.139378
220
+ vt 0.994776 -3.05662
221
+ f 39/66/11 30/65/11 40/68/11
222
+
223
+ vt 0.980887 -4.02667
224
+ vn 0 -0.608761 -0.793353
225
+ v -0.509366 1.77477 0.131791
226
+ vt 0.994776 -4.03576
227
+ vt 0.994776 -4.02667
228
+ f 30/69/12 41/70/12 40/71/12
229
+
230
+ vt 0.980887 -4.03576
231
+ f 41/70/12 30/69/12 28/72/12
232
+
233
+ vt 0.980887 -4.73109
234
+ vn 0 -0.382681 -0.923881
235
+ v -0.509366 1.78628 0.127022
236
+ vt 0.994776 -4.74017
237
+ vt 0.994776 -4.73109
238
+ f 28/73/13 42/74/13 41/75/13
239
+
240
+ vt 0.980887 -4.74017
241
+ f 42/74/13 28/73/13 27/76/13
242
+
243
+ vt 0.980887 -5.11278
244
+ vn 1.73803e-31 -0.130528 -0.991445
245
+ v -0.509366 1.79864 0.125395
246
+ vt 0.994776 -5.12186
247
+ vt 0.994776 -5.11278
248
+ f 27/77/14 43/78/14 42/79/14
249
+
250
+ v -0.528416 1.79864 0.125395
251
+ vt 0.980887 -5.12186
252
+ f 43/78/14 27/77/14 44/80/14
253
+
254
+ vt -5.1781 0.0914227
255
+ f 27/44/4 14/45/4 44/81/4
256
+
257
+ v -0.528416 1.79289 0.151669
258
+ vt -5.17391 0.110579
259
+ f 44/81/4 14/45/4 45/82/4
260
+
261
+ vt -5.1739 0.110579
262
+ f 14/18/4 12/20/4 45/83/4
263
+
264
+ v -0.528416 1.79864 0.195362
265
+ vt -5.1781 0.142434
266
+ f 45/83/4 12/20/4 46/84/4
267
+
268
+ vt 1.00867 5.14816
269
+ vn 1.43986e-31 -0.130525 0.991445
270
+ vt 0.980887 5.15239
271
+ vt 0.980887 5.14816
272
+ f 8/85/15 46/86/15 12/87/15
273
+
274
+ vt 1.00867 5.15239
275
+ f 46/86/15 8/85/15 7/88/15
276
+
277
+ vt -1.00866 -5.1152
278
+ vn 7.64392e-19 0.130525 0.991445
279
+ v -0.528416 1.80439 0.194605
280
+ vt -0.980887 -5.11943
281
+ vt -0.980887 -5.1152
282
+ f 7/89/16 47/90/16 46/91/16
283
+
284
+ vt -1.00866 -5.11943
285
+ f 47/90/16 7/89/16 6/92/16
286
+
287
+ vt -1.00866 -4.73351
288
+ vn -2.84919e-18 0.382689 0.923877
289
+ vt -0.980887 -4.73774
290
+ vt -0.980887 -4.73351
291
+ f 6/93/17 3/94/17 47/95/17
292
+
293
+ vt -1.00866 -4.73774
294
+ f 3/94/17 6/93/17 1/96/17
295
+
296
+ v -0.528416 1.80439 0.151669
297
+ vt -5.18229 0.110579
298
+ vt -5.18229 0.141882
299
+ vt -5.1862 0.140263
300
+ f 48/97/4 47/98/4 3/99/4
301
+
302
+ v -0.528416 1.79864 0.150912
303
+ vt -5.1781 0.110027
304
+ f 49/100/4 47/98/4 48/97/4
305
+
306
+ f 49/100/4 46/84/4 47/98/4
307
+
308
+ f 45/83/4 46/84/4 49/100/4
309
+
310
+ v -0.490316 1.79864 0.150912
311
+ vt 1.00867 -5.11943
312
+ vn -7.64392e-19 -0.130525 -0.991445
313
+ vt 0.980887 -5.1152
314
+ vt 0.980887 -5.11943
315
+ f 50/101/18 45/102/18 49/103/18
316
+
317
+ v -0.490316 1.79289 0.151669
318
+ vt 1.00867 -5.1152
319
+ f 45/102/18 50/101/18 51/104/18
320
+
321
+ usemtl _auto_8
322
+ v -0.490316 2.25954 0.0664481
323
+ vt -12.4068 0.109003
324
+ vt -11.6413 0.248802
325
+ vt -11.6507 0.247559
326
+ f 52/105/2 51/106/2 50/107/2
327
+
328
+ f 10/12/2 51/106/2 52/105/2
329
+
330
+ vt -11.6325 0.252444
331
+ f 51/106/2 10/12/2 26/108/2
332
+
333
+ vt -11.6249 0.258238
334
+ f 26/108/2 10/12/2 25/109/2
335
+
336
+ vt -11.6191 0.265788
337
+ f 25/109/2 10/12/2 24/110/2
338
+
339
+ vt -11.6155 0.274581
340
+ f 24/110/2 10/12/2 23/111/2
341
+
342
+ vt -11.6143 0.284018
343
+ f 23/111/2 10/12/2 22/112/2
344
+
345
+ v -0.490316 1.77717 0.178889
346
+ vt -11.6155 0.293454
347
+ f 10/12/2 53/113/2 22/112/2
348
+
349
+ v -0.490316 1.77939 0.18425
350
+ vt -11.6191 0.302247
351
+ f 10/12/2 54/114/2 53/113/2
352
+
353
+ v -0.490316 1.78292 0.188853
354
+ vt -11.6249 0.309798
355
+ f 10/12/2 55/115/2 54/114/2
356
+
357
+ f 10/12/2 11/13/2 55/115/2
358
+
359
+ usemtl _auto_3
360
+ vt 0.980887 4.18702
361
+ vn 6.20143e-18 -0.608756 0.793358
362
+ vt 1.00867 4.18279
363
+ vt 1.00867 4.18702
364
+ f 13/116/19 55/117/19 11/118/19
365
+
366
+ vt 0.980887 4.18279
367
+ f 55/117/19 13/116/19 16/119/19
368
+
369
+ v -0.528416 1.78628 0.219252
370
+ vt -5.16909 0.159852
371
+ vt -5.17 0.140263
372
+ f 16/22/4 56/120/4 13/121/4
373
+
374
+ vt -5.16407 0.134332
375
+ f 18/122/4 56/120/4 16/22/4
376
+
377
+ vt -5.16245 0.130424
378
+ f 20/123/4 56/120/4 18/122/4
379
+
380
+ f 20/123/4 29/49/4 56/120/4
381
+
382
+ f 21/27/4 29/49/4 20/123/4
383
+
384
+ vt 0.980887 0.798912
385
+ vn -8.16346e-20 -0.991442 0.130548
386
+ vt 1.00867 0.803142
387
+ vt 0.980887 0.803142
388
+ f 21/124/20 53/125/20 20/126/20
389
+
390
+ vt 1.00867 0.798912
391
+ f 53/125/20 21/124/20 22/127/20
392
+
393
+ vt 1.00867 2.10031
394
+ vn -1.87137e-18 -0.923884 0.382673
395
+ vt 0.980887 2.09608
396
+ vt 1.00867 2.09608
397
+ f 54/128/21 20/129/21 53/130/21
398
+
399
+ vt 0.980887 2.10031
400
+ f 20/129/21 54/128/21 18/131/21
401
+
402
+ vt 1.00867 3.25448
403
+ vn 6.2014e-18 -0.793362 0.60875
404
+ vt 0.980887 3.25025
405
+ vt 1.00867 3.25025
406
+ f 55/132/22 18/133/22 54/134/22
407
+
408
+ vt 0.980887 3.25448
409
+ f 18/133/22 55/132/22 16/135/22
410
+
411
+ v -0.509366 1.77477 0.214483
412
+ vt 0.994776 4.8277
413
+ vn 0 -0.382681 0.923881
414
+ vt 0.980887 4.83679
415
+ vt 0.980887 4.8277
416
+ f 57/136/23 56/137/23 29/138/23
417
+
418
+ v -0.509366 1.78628 0.219252
419
+ vt 0.994776 4.83679
420
+ f 56/137/23 57/136/23 58/139/23
421
+
422
+ vt 5.16069 0.156374
423
+ vn 1 0 0
424
+ v -0.509366 1.77717 0.178889
425
+ vt 5.16245 0.130424
426
+ vt 5.16909 0.159851
427
+ f 57/140/24 59/141/24 58/142/24
428
+
429
+ v -0.509366 1.77641 0.173137
430
+ vt 5.16189 0.12623
431
+ f 59/141/24 57/140/24 60/143/24
432
+
433
+ vt 5.16069 0.0960856
434
+ f 57/140/24 41/144/24 60/143/24
435
+
436
+ v -0.509366 1.76488 0.206896
437
+ vt 5.15348 0.150843
438
+ f 61/145/24 41/144/24 57/140/24
439
+
440
+ vt 5.15348 0.101617
441
+ f 61/145/24 40/146/24 41/144/24
442
+
443
+ v -0.509366 1.75729 0.197008
444
+ vt 5.14795 0.143634
445
+ f 62/147/24 40/146/24 61/145/24
446
+
447
+ vt 5.14795 0.108826
448
+ f 62/147/24 39/148/24 40/146/24
449
+
450
+ v -0.509366 1.75252 0.185494
451
+ vt 5.14447 0.135239
452
+ f 63/149/24 39/148/24 62/147/24
453
+
454
+ vt 5.14447 0.117221
455
+ f 63/149/24 38/150/24 39/148/24
456
+
457
+ vt 5.14329 0.12623
458
+ f 38/150/24 63/149/24 37/151/24
459
+
460
+ vt 0.994776 0.80557
461
+ vn 7.18091e-31 -0.991447 0.130514
462
+ vt 0.980887 0.796484
463
+ vt 0.994776 0.796484
464
+ f 63/152/25 36/153/25 37/154/25
465
+
466
+ vt 0.980887 0.80557
467
+ f 36/153/25 63/152/25 35/155/25
468
+
469
+ vt 0.994776 2.10274
470
+ vn 6.4783e-31 -0.923875 0.382694
471
+ vt 0.980887 2.09365
472
+ vt 0.994776 2.09365
473
+ f 62/156/26 35/157/26 63/158/26
474
+
475
+ vt 0.980887 2.10274
476
+ f 35/157/26 62/156/26 33/159/26
477
+
478
+ vt 0.994776 3.25691
479
+ vn -6.63027e-31 -0.793358 0.608755
480
+ vt 0.980887 3.24783
481
+ vt 0.994776 3.24783
482
+ f 61/160/27 33/161/27 62/162/27
483
+
484
+ vt 0.980887 3.25691
485
+ f 33/161/27 61/160/27 31/163/27
486
+
487
+ vt 0.994776 4.18036
488
+ vn 0 -0.608763 0.793352
489
+ vt 0.980887 4.18945
490
+ vt 0.980887 4.18036
491
+ f 61/164/28 29/165/28 31/166/28
492
+
493
+ vt 0.994776 4.18945
494
+ f 29/165/28 61/164/28 57/167/28
495
+
496
+ v -0.509366 1.77717 0.167385
497
+ vt 5.16245 0.122036
498
+ f 60/143/24 41/144/24 64/168/24
499
+
500
+ vt 5.16909 0.0926082
501
+ f 64/168/24 41/144/24 42/169/24
502
+
503
+ v -0.509366 1.77939 0.162025
504
+ vt 5.16407 0.118128
505
+ f 64/168/24 42/169/24 65/170/24
506
+
507
+ v -0.509366 1.78292 0.157422
508
+ vt 5.16664 0.114772
509
+ f 65/170/24 42/169/24 66/171/24
510
+
511
+ v -0.509366 1.78753 0.15389
512
+ vt 5.17 0.112197
513
+ f 66/171/24 42/169/24 67/172/24
514
+
515
+ vt 5.1781 0.0914221
516
+ f 67/172/24 42/169/24 43/173/24
517
+
518
+ v -0.509366 1.79289 0.151669
519
+ vt 5.17391 0.110578
520
+ f 67/172/24 43/173/24 68/174/24
521
+
522
+ v -0.509366 1.79864 0.150912
523
+ vt 5.1781 0.110026
524
+ f 68/174/24 43/173/24 69/175/24
525
+
526
+ v -0.509366 1.81099 0.127022
527
+ vt 5.18711 0.0926081
528
+ f 69/175/24 43/173/24 70/176/24
529
+
530
+ vt -0.980887 5.14573
531
+ vn 2.6533e-31 0.130528 -0.991445
532
+ vt -0.994776 5.15482
533
+ vt -0.994776 5.14573
534
+ f 44/177/29 70/178/29 43/179/29
535
+
536
+ v -0.528416 1.81099 0.127022
537
+ vt -0.980887 5.15482
538
+ f 70/178/29 44/177/29 71/180/29
539
+
540
+ vt -5.18711 0.0926088
541
+ f 44/81/4 48/97/4 71/181/4
542
+
543
+ f 44/81/4 49/100/4 48/97/4
544
+
545
+ f 44/81/4 45/82/4 49/100/4
546
+
547
+ v -0.490316 1.80439 0.151669
548
+ vt -1.00867 5.15239
549
+ vn 7.64392e-19 0.130525 -0.991445
550
+ vt -0.980887 5.14816
551
+ vt -0.980887 5.15239
552
+ f 72/182/30 49/183/30 48/184/30
553
+
554
+ vt -1.00867 5.14816
555
+ f 49/183/30 72/182/30 50/185/30
556
+
557
+ usemtl _auto_8
558
+ vt -11.6602 0.248802
559
+ f 52/105/2 50/107/2 72/186/2
560
+
561
+ v -0.490316 1.80975 0.15389
562
+ vt -11.6689 0.252444
563
+ f 52/105/2 72/186/2 73/187/2
564
+
565
+ usemtl _auto_3
566
+ vt -1.00867 4.83013
567
+ vn 0 0.382689 -0.923877
568
+ v -0.509366 1.80975 0.15389
569
+ vt -0.994776 4.83436
570
+ vt -1.00867 4.83436
571
+ f 72/188/31 74/189/31 73/190/31
572
+
573
+ vt -0.980887 4.83013
574
+ f 48/191/31 74/189/31 72/188/31
575
+
576
+ v -0.528416 1.80975 0.15389
577
+ vt -0.980887 4.83436
578
+ f 74/189/31 48/191/31 75/192/31
579
+
580
+ vt -5.1862 0.112198
581
+ f 48/97/4 3/99/4 75/193/4
582
+
583
+ vt -5.18956 0.137688
584
+ f 75/193/4 3/99/4 2/194/4
585
+
586
+ v -0.528416 1.81099 0.219252
587
+ vt -5.18711 0.159852
588
+ f 3/99/4 76/195/4 2/194/4
589
+
590
+ f 47/98/4 76/195/4 3/99/4
591
+
592
+ f 46/84/4 76/195/4 47/98/4
593
+
594
+ v -0.528416 1.79864 0.220879
595
+ vt -5.1781 0.161038
596
+ f 46/84/4 77/196/4 76/195/4
597
+
598
+ vt -5.17391 0.141882
599
+ f 12/197/4 77/196/4 46/84/4
600
+
601
+ f 13/121/4 77/196/4 12/197/4
602
+
603
+ f 13/121/4 56/120/4 77/196/4
604
+
605
+ vt 0.994776 5.14573
606
+ vn -3.47605e-31 -0.130526 0.991445
607
+ vt 0.980887 5.15482
608
+ vt 0.980887 5.14573
609
+ f 58/198/32 77/199/32 56/200/32
610
+
611
+ v -0.509366 1.79864 0.220879
612
+ vt 0.994776 5.15482
613
+ f 77/199/32 58/198/32 78/201/32
614
+
615
+ v -0.509366 1.78753 0.192384
616
+ vt 5.17 0.140263
617
+ vt 5.1781 0.161037
618
+ f 58/142/24 79/202/24 78/203/24
619
+
620
+ v -0.509366 1.78292 0.188853
621
+ vt 5.16664 0.137688
622
+ f 58/142/24 80/204/24 79/202/24
623
+
624
+ v -0.509366 1.77939 0.18425
625
+ vt 5.16407 0.134332
626
+ f 58/142/24 81/205/24 80/204/24
627
+
628
+ f 58/142/24 59/141/24 81/205/24
629
+
630
+ v -0.509366 1.79289 0.194605
631
+ vt 5.17391 0.141881
632
+ f 78/203/24 79/202/24 82/206/24
633
+
634
+ v -0.509366 1.79864 0.195362
635
+ vt 5.1781 0.142433
636
+ f 78/203/24 82/206/24 83/207/24
637
+
638
+ v -0.509366 1.80439 0.194605
639
+ vt 5.18229 0.141881
640
+ f 78/203/24 83/207/24 84/208/24
641
+
642
+ v -0.509366 1.81099 0.219252
643
+ vt 5.18711 0.159851
644
+ f 78/203/24 84/208/24 85/209/24
645
+
646
+ v -0.509366 1.80975 0.192384
647
+ vt 5.1862 0.140262
648
+ f 85/209/24 84/208/24 86/210/24
649
+
650
+ v -0.509366 1.81435 0.188853
651
+ vt 5.18956 0.137687
652
+ f 85/209/24 86/210/24 87/211/24
653
+
654
+ v -0.509366 1.82251 0.214483
655
+ vt 5.19551 0.156374
656
+ f 85/209/24 87/211/24 88/212/24
657
+
658
+ v -0.509366 1.81789 0.18425
659
+ vt 5.19214 0.134331
660
+ f 88/212/24 87/211/24 89/213/24
661
+
662
+ v -0.509366 1.82011 0.178889
663
+ vt 5.19375 0.130423
664
+ f 88/212/24 89/213/24 90/214/24
665
+
666
+ v -0.509366 1.82086 0.173137
667
+ vt 5.19431 0.12623
668
+ f 88/212/24 90/214/24 91/215/24
669
+
670
+ v -0.509366 1.82251 0.131791
671
+ vt 5.19551 0.0960853
672
+ f 88/212/24 91/215/24 92/216/24
673
+
674
+ v -0.509366 1.82011 0.167385
675
+ vt 5.19375 0.122036
676
+ f 93/217/24 92/216/24 91/215/24
677
+
678
+ v -0.509366 1.81789 0.162025
679
+ vt 5.19214 0.118128
680
+ f 94/218/24 92/216/24 93/217/24
681
+
682
+ v -0.509366 1.81435 0.157422
683
+ vt 5.18956 0.114772
684
+ f 95/219/24 92/216/24 94/218/24
685
+
686
+ f 95/219/24 70/176/24 92/216/24
687
+
688
+ vt 5.1862 0.112197
689
+ f 74/220/24 70/176/24 95/219/24
690
+
691
+ v -0.509366 1.80439 0.151669
692
+ vt 5.18229 0.110578
693
+ f 96/221/24 70/176/24 74/220/24
694
+
695
+ f 69/175/24 70/176/24 96/221/24
696
+
697
+ v -0.490316 1.81435 0.157422
698
+ vt -1.00866 4.18702
699
+ vn 1.70747e-30 0.608759 -0.793355
700
+ vt -0.994776 4.18279
701
+ vt -0.994776 4.18702
702
+ f 97/222/33 74/223/33 95/224/33
703
+
704
+ vt -1.00866 4.18279
705
+ f 74/223/33 97/222/33 73/225/33
706
+
707
+ usemtl _auto_8
708
+ vt -11.6765 0.258238
709
+ f 52/105/2 73/187/2 97/226/2
710
+
711
+ v -0.490316 1.81789 0.162025
712
+ vt -11.6823 0.265788
713
+ f 52/105/2 97/226/2 98/227/2
714
+
715
+ usemtl _auto_3
716
+ vt -1.00866 3.25025
717
+ vn 0 0.793361 -0.608752
718
+ vt -0.994776 3.25448
719
+ vt -1.00866 3.25448
720
+ f 97/228/34 94/229/34 98/230/34
721
+
722
+ vt -0.994776 3.25025
723
+ f 94/229/34 97/228/34 95/231/34
724
+
725
+ vt 0.994776 3.25448
726
+ vn -1.06716e-31 -0.793361 0.608752
727
+ v -0.528416 1.81435 0.157422
728
+ vt 0.994776 3.25025
729
+ f 94/232/35 99/133/35 95/233/35
730
+
731
+ v -0.528416 1.81789 0.162025
732
+ f 99/133/35 94/232/35 100/135/35
733
+
734
+ v -0.528416 1.82011 0.167385
735
+ vt -0.980887 2.10031
736
+ vn 2.03258e-30 0.923869 -0.382709
737
+ vt -0.994776 2.09608
738
+ vt -0.980887 2.09608
739
+ f 101/234/36 94/235/36 100/236/36
740
+
741
+ vt -1.00867 2.09608
742
+ f 94/235/36 101/234/36 98/237/36
743
+
744
+ v -0.490316 1.82011 0.167385
745
+ vt -1.00867 2.10031
746
+ f 98/237/36 101/234/36 102/238/36
747
+
748
+ v -0.528416 1.82086 0.173137
749
+ vt -0.980887 0.803142
750
+ vn 1.13655e-30 0.991448 -0.130505
751
+ vt -1.00867 0.798912
752
+ vt -0.980887 0.798912
753
+ f 103/239/37 102/240/37 101/241/37
754
+
755
+ v -0.490316 1.82086 0.173137
756
+ vt -1.00867 0.803142
757
+ f 102/240/37 103/239/37 104/242/37
758
+
759
+ v -0.528416 1.82011 0.178889
760
+ vt -0.980887 -0.548612
761
+ vn 7.64394e-19 0.991448 0.130505
762
+ vt -1.00866 -0.552842
763
+ vt -0.980887 -0.552842
764
+ f 105/243/38 104/244/38 103/245/38
765
+
766
+ v -0.490316 1.82011 0.178889
767
+ vt -1.00866 -0.548612
768
+ f 104/244/38 105/243/38 106/246/38
769
+
770
+ v -0.528416 1.81789 0.18425
771
+ vt -0.980887 -1.86283
772
+ vn -1.42458e-18 0.923868 0.382711
773
+ vt -1.00866 -1.86707
774
+ vt -0.980887 -1.86707
775
+ f 107/247/39 106/248/39 105/249/39
776
+
777
+ v -0.490316 1.81789 0.18425
778
+ vt -1.00866 -1.86283
779
+ f 106/248/39 107/247/39 108/250/39
780
+
781
+ vt -0.980887 -3.04996
782
+ vn 6.2014e-18 0.793362 0.60875
783
+ vt -1.00866 -3.05419
784
+ vt -0.980887 -3.05419
785
+ f 2/251/40 108/252/40 107/253/40
786
+
787
+ vt -1.00866 -3.04996
788
+ f 108/252/40 2/251/40 4/254/40
789
+
790
+ usemtl _auto_8
791
+ vt -11.6823 0.302247
792
+ f 4/7/2 5/6/2 108/255/2
793
+
794
+ vt -11.6859 0.293454
795
+ f 108/255/2 5/6/2 106/256/2
796
+
797
+ vt -11.6872 0.284018
798
+ f 106/256/2 5/6/2 104/257/2
799
+
800
+ f 52/105/2 104/257/2 5/6/2
801
+
802
+ vt -11.6859 0.274581
803
+ f 52/105/2 102/258/2 104/257/2
804
+
805
+ f 52/105/2 98/227/2 102/258/2
806
+
807
+ vt -2.2695 0.450253
808
+ vn 0 1 0
809
+ v -0.464916 2.25954 0.0664481
810
+ vt -2.31116 0.109003
811
+ vt -2.2695 0.109003
812
+ f 5/259/41 109/260/41 52/261/41
813
+
814
+ v -0.464916 2.25954 0.274474
815
+ vt -2.31116 0.450253
816
+ f 109/260/41 5/259/41 110/262/41
817
+
818
+ vt 2.2695 12.4068
819
+ vn 0 0 1
820
+ v -0.464916 1.2512 0.274474
821
+ vt 2.31116 10.7527
822
+ vt 2.31116 12.4068
823
+ f 5/263/42 111/264/42 110/265/42
824
+
825
+ vt 2.2695 10.7527
826
+ f 111/264/42 5/263/42 9/266/42
827
+
828
+ vt 2.2695 0.109003
829
+ vn 0 -1 0
830
+ vt 2.31116 0.450253
831
+ vt 2.2695 0.450253
832
+ f 10/267/43 111/268/43 9/269/43
833
+
834
+ v -0.464916 1.2512 0.0664481
835
+ vt 2.31116 0.109003
836
+ f 111/268/43 10/267/43 112/270/43
837
+
838
+ vt -2.2695 10.7527
839
+ vn 0 0 -1
840
+ vt -2.31116 12.4068
841
+ vt -2.31116 10.7527
842
+ f 10/271/44 109/272/44 112/273/44
843
+
844
+ vt -2.2695 12.4068
845
+ f 109/272/44 10/271/44 52/274/44
846
+
847
+ v -0.490316 2.30941 0.0561611
848
+ vt -12.4886 2.13811
849
+ vn -0.375382 -1.08845e-19 0.92687
850
+ vt -10.7527 2.18307
851
+ vt -12.4068 2.18307
852
+ f 113/275/45 112/276/45 109/277/45
853
+
854
+ v -0.490316 1.20133 0.0561611
855
+ vt -10.6709 2.13811
856
+ f 112/276/45 113/275/45 114/278/45
857
+
858
+ v -0.490316 2.48276 3.60956e-16
859
+ vt -12.773 1.97964e-06
860
+ vt -10.6709 0.0921281
861
+ vt -12.4886 0.0921296
862
+ f 115/279/4 114/280/4 113/281/4
863
+
864
+ v -0.490316 1.01591 3.60956e-16
865
+ vt -10.3667 3.62058e-15
866
+ f 116/282/4 114/280/4 115/279/4
867
+
868
+ v -0.490316 1.20133 0.284761
869
+ vt -10.6709 0.467128
870
+ f 114/280/4 116/282/4 117/283/4
871
+
872
+ v -0.490316 1.38639 0.852119
873
+ vt -10.9744 1.39783
874
+ f 116/282/4 118/284/4 117/283/4
875
+
876
+ v -0.490316 1.01591 0.9525
877
+ vt -10.3667 1.5625
878
+ f 119/285/4 118/284/4 116/282/4
879
+
880
+ v -0.490316 2.48276 0.9525
881
+ vt -12.773 1.5625
882
+ f 118/284/4 119/285/4 120/286/4
883
+
884
+ usemtl _auto_20
885
+ vt 4.53899 27.6445
886
+ v -0.451383 1.83324 0.9525
887
+ vt 4.66673 31.22
888
+ vt 4.53899 34.0612
889
+ f 119/287/42 121/288/42 120/289/42
890
+
891
+ v -0.441051 1.70964 0.9525
892
+ vt 4.70062 30.6793
893
+ f 121/288/42 119/287/42 122/290/42
894
+
895
+ v -0.41076 1.59446 0.9525
896
+ vt 4.8 30.1754
897
+ f 122/290/42 119/287/42 123/291/42
898
+
899
+ v -0.362574 1.49556 0.9525
900
+ vt 4.95809 29.7428
901
+ f 123/291/42 119/287/42 124/292/42
902
+
903
+ v -0.299777 1.41966 0.9525
904
+ vt 5.16412 29.4108
905
+ f 124/292/42 119/287/42 125/293/42
906
+
907
+ v -0.226648 1.37196 0.9525
908
+ vt 5.40404 29.2021
909
+ f 125/293/42 119/287/42 126/294/42
910
+
911
+ v 0.19032 1.14007 0.9525
912
+ vt 6.77204 28.1877
913
+ f 126/294/42 119/287/42 127/295/42
914
+
915
+ v 0.489171 1.01591 0.9525
916
+ vt 7.75252 27.6446
917
+ f 127/295/42 119/287/42 128/296/42
918
+
919
+ usemtl _auto_8
920
+ vt 2.2695 9.86076e-32
921
+ vt 3.87627 1.5625
922
+ vt 2.2695 1.5625
923
+ f 116/297/43 128/298/43 119/299/43
924
+
925
+ v 0.489171 1.01591 3.60956e-16
926
+ vt 3.87627 9.86076e-32
927
+ f 128/298/43 116/297/43 129/300/43
928
+
929
+ vt -2.2695 10.3667
930
+ vn 2.30203e-16 -7.96393e-17 -1
931
+ v -0.166873 1.81046 0
932
+ vt -2.80008 11.6701
933
+ vt -3.87627 10.3667
934
+ f 116/301/46 130/302/46 129/303/46
935
+
936
+ v -0.171415 1.81638 0
937
+ vt -2.79263 11.6798
938
+ f 130/302/46 116/301/46 131/304/46
939
+
940
+ v -0.174269 1.82327 0
941
+ vt -2.78795 11.6911
942
+ f 131/304/46 116/301/46 132/305/46
943
+
944
+ v -0.175243 1.83066 0
945
+ vt -2.78635 11.7032
946
+ f 132/305/46 116/301/46 133/306/46
947
+
948
+ v -0.174269 1.83806 0
949
+ vt -2.78795 11.7154
950
+ f 116/301/46 134/307/46 133/306/46
951
+
952
+ vt -2.2695 12.7729
953
+ f 115/308/46 134/307/46 116/301/46
954
+
955
+ v -0.171415 1.84495 0
956
+ vt -2.79263 11.7267
957
+ f 134/307/46 115/308/46 135/309/46
958
+
959
+ v -0.166873 1.85087 0
960
+ vt -2.80008 11.7364
961
+ f 135/309/46 115/308/46 136/310/46
962
+
963
+ v 0.489171 2.48276 3.60956e-16
964
+ vt -3.87627 12.7729
965
+ f 136/310/46 115/308/46 137/311/46
966
+
967
+ vt -2.2695 1.5625
968
+ vt -3.87627 9.86076e-32
969
+ vt -2.2695 9.86076e-32
970
+ f 120/312/41 137/313/41 115/314/41
971
+
972
+ v 0.489171 2.48276 0.9525
973
+ vt -3.87627 1.5625
974
+ f 137/313/41 120/312/41 138/315/41
975
+
976
+ usemtl _auto_20
977
+ v -0.226648 2.29453 0.9525
978
+ vt 5.40404 33.2378
979
+ vt 7.75252 34.0612
980
+ f 120/289/42 139/316/42 138/317/42
981
+
982
+ v -0.299777 2.24682 0.9525
983
+ vt 5.16412 33.0291
984
+ f 139/316/42 120/289/42 140/318/42
985
+
986
+ v -0.362574 2.17093 0.9525
987
+ vt 4.95809 32.6971
988
+ f 140/318/42 120/289/42 141/319/42
989
+
990
+ v -0.41076 2.07202 0.9525
991
+ vt 4.8 32.2645
992
+ f 141/319/42 120/289/42 142/320/42
993
+
994
+ v -0.441051 1.95684 0.9525
995
+ vt 4.70062 31.7606
996
+ f 142/320/42 120/289/42 143/321/42
997
+
998
+ f 143/321/42 120/289/42 121/288/42
999
+
1000
+ usemtl _auto_23
1001
+ vt 37.2234 34.0102
1002
+ vn 0.910182 -0.0760811 0.407161
1003
+ vt 32.3402 34.0102
1004
+ v -0.353187 1.89504 0.744538
1005
+ vt 35.0869 25.046
1006
+ f 143/322/47 121/323/47 144/324/47
1007
+
1008
+ vt 35.208 25.6588
1009
+ vn 0.910968 -0.106606 0.398462
1010
+ vt 32.3421 34.5855
1011
+ v -0.360419 1.83324 0.744538
1012
+ vt 32.7583 25.6588
1013
+ f 144/325/48 121/326/48 145/327/48
1014
+
1015
+ vt 31.7933 31.9981
1016
+ vn 0.913514 0.0763595 0.399575
1017
+ vt 26.9102 31.9981
1018
+ vt 31.495 23.0666
1019
+ f 121/328/49 122/329/49 145/330/49
1020
+
1021
+ vt 31.1627 22.3229
1022
+ vn 0.904322 0.105827 0.413525
1023
+ vt 26.6985 31.3153
1024
+ v -0.353187 1.77144 0.744538
1025
+ vt 28.713 22.3229
1026
+ f 145/331/50 122/332/50 146/333/50
1027
+
1028
+ vt 26.949 20.0726
1029
+ vn 0.870448 0.228921 0.435794
1030
+ vt 25.4758 29.1694
1031
+ vt 20.787 29.1694
1032
+ f 146/334/51 122/335/51 123/336/51
1033
+
1034
+ vt 25.4436 17.4129
1035
+ vn 0.820921 0.302255 0.48449
1036
+ vt 19.6882 26.7722
1037
+ v -0.331983 1.71385 0.744538
1038
+ vt 23.0275 17.4129
1039
+ f 146/337/52 123/338/52 147/339/52
1040
+
1041
+ vt 21.2059 15.4373
1042
+ vn 0.773598 0.37689 0.509412
1043
+ vt 18.3387 24.9518
1044
+ vt 14.0072 24.9518
1045
+ f 147/340/53 123/341/53 124/342/53
1046
+
1047
+ vt 18.202 11.0493
1048
+ vn 0.672659 0.458801 0.580544
1049
+ vt 11.7806 21.1048
1050
+ v -0.298253 1.6644 0.744538
1051
+ vt 15.8453 11.0493
1052
+ f 147/343/54 124/344/54 148/345/54
1053
+
1054
+ vt 13.7344 9.24343
1055
+ vn 0.61462 0.508564 0.602996
1056
+ vt 10.2273 19.5067
1057
+ vt 6.34913 19.5067
1058
+ f 148/346/55 124/347/55 125/348/55
1059
+
1060
+ v -0.254295 1.62645 0.744538
1061
+ vt 7.34854 4.88224
1062
+ vn 0.486765 0.56388 0.667157
1063
+ vt 9.63481 4.88224
1064
+ vt 3.38405 15.8734
1065
+ f 149/349/56 148/350/56 125/351/56
1066
+
1067
+ v -0.298253 2.00209 0.744538
1068
+ vt 9.31155 38.826
1069
+ vn -3.01263e-32 1.19018e-31 1
1070
+ vt 9.31155 25.5313
1071
+ vt 11.0422 24.0373
1072
+ f 150/352/57 148/353/57 149/354/57
1073
+
1074
+ v -0.331983 1.95263 0.744538
1075
+ vt 7.98359 36.879
1076
+ f 151/355/57 148/353/57 150/352/57
1077
+
1078
+ vt 7.98359 27.4782
1079
+ f 151/355/57 147/356/57 148/353/57
1080
+
1081
+ vt 7.1488 34.6117
1082
+ f 144/357/57 147/356/57 151/355/57
1083
+
1084
+ vt 7.1488 29.7455
1085
+ f 144/357/57 146/358/57 147/356/57
1086
+
1087
+ vt 6.86406 32.1786
1088
+ f 146/358/57 144/357/57 145/359/57
1089
+
1090
+ vt 36.0382 37.7224
1091
+ vn 0.839625 -0.309141 0.44661
1092
+ vt 34.9501 28.5716
1093
+ vt 37.3662 28.5716
1094
+ f 143/360/58 144/361/58 151/362/58
1095
+
1096
+ vt 41.4538 36.0437
1097
+ vn 0.860715 -0.226362 0.455994
1098
+ vt 36.765 36.0437
1099
+ vt 37.6968 26.8441
1100
+ f 142/363/59 143/364/59 151/365/59
1101
+
1102
+ vt 37.101 42.0503
1103
+ vn 0.696953 -0.475371 0.536916
1104
+ vt 34.9655 32.3453
1105
+ vt 37.3222 32.3453
1106
+ f 142/366/60 151/367/60 150/368/60
1107
+
1108
+ vt 43.849 39.0743
1109
+ vn 0.759375 -0.369961 0.535237
1110
+ vt 39.5175 39.0743
1111
+ vt 38.9822 29.3816
1112
+ f 141/369/61 142/370/61 150/371/61
1113
+
1114
+ v -0.254295 2.04003 0.744538
1115
+ vt 34.7056 37.445
1116
+ vn 0.506113 -0.586293 0.632543
1117
+ vt 34.8462 48.016
1118
+ vt 32.4194 37.445
1119
+ f 152/372/62 141/373/62 150/374/62
1120
+
1121
+ vt 38.1038 33.6247
1122
+ vn 0.600913 -0.497222 0.625839
1123
+ vt 43.2348 44.1221
1124
+ vt 39.3566 44.1221
1125
+ f 152/375/63 140/376/63 141/377/63
1126
+
1127
+ vt 37.6649 51.6605
1128
+ vn 0.395679 -0.606511 0.689626
1129
+ vt 34.2273 51.6605
1130
+ vt 31.2786 40.3544
1131
+ f 139/378/64 140/379/64 152/380/64
1132
+
1133
+ v -0.203104 2.06389 0.744538
1134
+ vt 29.2627 43.3041
1135
+ vn 0.290848 -0.624151 0.72515
1136
+ vt 32.2579 55.1943
1137
+ vt 27.0392 43.3041
1138
+ f 153/381/65 139/382/65 152/383/65
1139
+
1140
+ v -0.148171 2.3108 0.9525
1141
+ vt 25.254 59.8899
1142
+ vn 0.135969 -0.655736 0.742646
1143
+ vt 22.0987 59.8899
1144
+ vt 21.1626 47.6639
1145
+ f 154/384/66 139/385/66 153/386/66
1146
+
1147
+ usemtl _auto_20
1148
+ vt 5.66151 33.309
1149
+ f 138/317/42 139/316/42 154/387/42
1150
+
1151
+ v -0.0696932 2.29453 0.9525
1152
+ vt 5.91899 33.2378
1153
+ f 138/317/42 154/387/42 155/388/42
1154
+
1155
+ usemtl _auto_23
1156
+ vt 7.70796 64.5304
1157
+ vn -0.134937 -0.650761 0.747196
1158
+ vt 4.55258 64.5304
1159
+ v -0.148171 2.07202 0.744538
1160
+ vt 6.46126 52.2111
1161
+ f 155/389/67 154/390/67 156/391/67
1162
+
1163
+ vt 22.5254 60.9571
1164
+ vn 0.0968185 -0.653683 0.75055
1165
+ vt 18.9617 48.567
1166
+ vt 21.148 48.567
1167
+ f 154/392/68 153/393/68 156/394/68
1168
+
1169
+ v -0.175243 1.83066 0.744538
1170
+ vt 14.1545 32.0771
1171
+ vt 15.2203 41.5794
1172
+ vt 13.0576 41.2591
1173
+ f 157/395/57 156/396/57 153/397/57
1174
+
1175
+ v -0.174269 1.83806 0.744538
1176
+ vt 14.1928 32.3682
1177
+ f 156/396/57 157/395/57 158/398/57
1178
+
1179
+ usemtl _auto_17
1180
+ vt 33.6501 29.3125
1181
+ vn 0.991446 -0.130515 0
1182
+ vt 33.9437 0
1183
+ vt 33.9437 29.3125
1184
+ f 157/399/69 134/400/69 158/401/69
1185
+
1186
+ vt 33.6501 0
1187
+ f 134/400/69 157/399/69 133/402/69
1188
+
1189
+ v -0.174269 1.82327 0.744538
1190
+ vt 29.6617 29.3125
1191
+ vn 0.991447 0.130511 0
1192
+ vt 29.9554 0
1193
+ vt 29.9554 29.3125
1194
+ f 159/403/70 133/404/70 157/405/70
1195
+
1196
+ vt 29.6617 0
1197
+ f 133/404/70 159/403/70 132/406/70
1198
+
1199
+ v -0.171415 1.81638 0.744538
1200
+ vt 23.6409 29.3125
1201
+ vn 0.923873 0.3827 0
1202
+ vt 23.9345 0
1203
+ vt 23.9345 29.3125
1204
+ f 160/407/71 132/408/71 159/409/71
1205
+
1206
+ vt 23.6409 0
1207
+ f 132/408/71 160/407/71 131/410/71
1208
+
1209
+ v -0.166873 1.81046 0.744538
1210
+ vt 15.9998 29.3125
1211
+ vn 0.793349 0.608767 0
1212
+ vt 16.2935 0
1213
+ vt 16.2935 29.3125
1214
+ f 161/411/72 131/412/72 160/413/72
1215
+
1216
+ vt 15.9998 0
1217
+ f 131/412/72 161/411/72 130/414/72
1218
+
1219
+ vt 7.55214 29.3125
1220
+ vn 0.608762 0.793353 0
1221
+ v -0.160955 1.80592 0
1222
+ vt 7.25846 0
1223
+ vt 7.55214 0
1224
+ f 161/415/73 162/416/73 130/417/73
1225
+
1226
+ v -0.160955 1.80592 0.744538
1227
+ vt 7.25846 29.3125
1228
+ f 162/416/73 161/415/73 163/418/73
1229
+
1230
+ usemtl _auto_23
1231
+ vt 14.484 31.2816
1232
+ v -0.148171 1.59446 0.744538
1233
+ vt 15.2203 22.7778
1234
+ vt 14.717 31.1028
1235
+ f 161/419/57 164/420/57 163/421/57
1236
+
1237
+ vt 14.3052 31.5146
1238
+ f 160/422/57 164/420/57 161/419/57
1239
+
1240
+ vt 14.1928 31.7859
1241
+ f 159/423/57 164/420/57 160/422/57
1242
+
1243
+ f 157/395/57 164/420/57 159/423/57
1244
+
1245
+ f 153/397/57 164/420/57 157/395/57
1246
+
1247
+ v -0.203104 1.6026 0.744538
1248
+ vt 13.0576 23.0982
1249
+ f 153/397/57 165/424/57 164/420/57
1250
+
1251
+ vt 11.0422 40.3199
1252
+ f 152/425/57 165/424/57 153/397/57
1253
+
1254
+ f 152/425/57 149/354/57 165/424/57
1255
+
1256
+ f 150/352/57 149/354/57 152/425/57
1257
+
1258
+ vt -2.07939 2.14773
1259
+ vn 0.299613 0.642963 0.704862
1260
+ vt 0.144052 2.14773
1261
+ vt -1.67163 13.6901
1262
+ f 165/426/74 149/427/74 125/428/74
1263
+
1264
+ vt 1.68456 2.1866
1265
+ vn 0.388152 0.594974 0.703807
1266
+ vt 0.936978 13.7119
1267
+ vt -2.50063 13.7119
1268
+ f 165/429/75 125/430/75 126/431/75
1269
+
1270
+ vt -11.7188 1.1595
1271
+ vn 0.0978875 0.6609 0.744062
1272
+ vt -9.53245 1.1595
1273
+ vt -9.94596 13.4142
1274
+ f 164/432/76 165/433/76 126/434/76
1275
+
1276
+ vt -10.2786 0.507178
1277
+ vn 0.134938 0.650761 0.747196
1278
+ vt -9.03192 12.8265
1279
+ v -0.148171 1.35568 0.9525
1280
+ vt -12.1873 12.8265
1281
+ f 164/435/77 126/436/77 166/437/77
1282
+
1283
+ usemtl _auto_20
1284
+ vt 5.66151 29.1309
1285
+ f 126/294/42 127/295/42 166/438/42
1286
+
1287
+ v -0.0696932 1.37196 0.9525
1288
+ vt 5.91899 29.2021
1289
+ f 166/438/42 127/295/42 167/439/42
1290
+
1291
+ v 0.00343574 1.41966 0.9525
1292
+ vt 6.15891 29.4108
1293
+ f 167/439/42 127/295/42 168/440/42
1294
+
1295
+ v 0.0662332 1.49556 0.9525
1296
+ vt 6.36494 29.7428
1297
+ f 168/440/42 127/295/42 169/441/42
1298
+
1299
+ v 0.114419 1.59446 0.9525
1300
+ vt 6.52303 30.1754
1301
+ f 169/441/42 127/295/42 170/442/42
1302
+
1303
+ v 0.14471 1.70964 0.9525
1304
+ vt 6.62241 30.6793
1305
+ f 170/442/42 127/295/42 171/443/42
1306
+
1307
+ v 0.155042 1.83324 0.9525
1308
+ vt 6.6563 31.22
1309
+ f 171/443/42 127/295/42 172/444/42
1310
+
1311
+ v 0.173707 2.25418 0.9525
1312
+ vt 6.71754 33.0613
1313
+ f 172/444/42 127/295/42 173/445/42
1314
+
1315
+ v 0.177547 2.22078 0.9525
1316
+ vt 6.73014 32.9152
1317
+ f 173/445/42 127/295/42 174/446/42
1318
+
1319
+ v 0.188807 2.18966 0.9525
1320
+ vt 6.76708 32.7791
1321
+ f 174/446/42 127/295/42 175/447/42
1322
+
1323
+ v 0.19032 1.44329 0.9525
1324
+ vt 6.77204 29.5141
1325
+ f 176/448/42 175/447/42 127/295/42
1326
+
1327
+ v 0.206719 2.16293 0.9525
1328
+ vt 6.82585 32.6622
1329
+ f 175/447/42 176/448/42 177/449/42
1330
+
1331
+ v 0.218424 1.84602 0.9525
1332
+ vt 6.86425 31.2759
1333
+ f 177/449/42 176/448/42 178/450/42
1334
+
1335
+ v 0.221665 1.827 0.9525
1336
+ vt 6.87488 31.1927
1337
+ f 178/450/42 176/448/42 179/451/42
1338
+
1339
+ v 0.347482 1.44329 0.9525
1340
+ vt 7.28766 29.5141
1341
+ f 179/451/42 176/448/42 180/452/42
1342
+
1343
+ usemtl _auto_24
1344
+ v 0.19032 1.44329 0.9398
1345
+ vt 6.77205 3.46875
1346
+ vt 7.28768 3.51562
1347
+ vt 6.77205 3.51562
1348
+ f 181/453/43 180/454/43 176/455/43
1349
+
1350
+ v 0.347482 1.44329 0.9398
1351
+ vt 7.28768 3.46875
1352
+ f 180/454/43 181/453/43 182/456/43
1353
+
1354
+ vt 6.77205 24.9025
1355
+ v 0.347482 1.14007 0.9398
1356
+ vt 7.28768 23.7834
1357
+ vt 7.28768 24.9025
1358
+ f 181/457/42 183/458/42 182/459/42
1359
+
1360
+ v 0.19032 1.14007 0.9398
1361
+ vt 6.77205 23.7834
1362
+ f 183/458/42 181/457/42 184/460/42
1363
+
1364
+ vt 22.1356 3.46875
1365
+ vt 21.1408 3.51562
1366
+ vt 21.1408 3.46875
1367
+ f 181/461/24 127/462/24 184/463/24
1368
+
1369
+ vt 22.1356 3.51562
1370
+ f 127/462/24 181/461/24 176/464/24
1371
+
1372
+ vt -6.77205 3.51562
1373
+ vt -7.28768 3.46875
1374
+ vt -6.77205 3.46875
1375
+ f 127/465/41 183/466/41 184/467/41
1376
+
1377
+ v 0.347482 1.14007 0.9525
1378
+ vt -7.28768 3.51562
1379
+ f 183/466/41 127/465/41 185/468/41
1380
+
1381
+ usemtl _auto_20
1382
+ vt 7.28766 28.1878
1383
+ f 127/295/42 128/296/42 185/469/42
1384
+
1385
+ f 185/469/42 128/296/42 180/452/42
1386
+
1387
+ v 0.35764 1.81432 0.9525
1388
+ vt 7.32099 31.1372
1389
+ f 180/452/42 128/296/42 186/470/42
1390
+
1391
+ v 0.364343 1.83241 0.9525
1392
+ vt 7.34298 31.2163
1393
+ f 186/470/42 128/296/42 187/471/42
1394
+
1395
+ v 0.366135 1.85162 0.9525
1396
+ vt 7.34886 31.3004
1397
+ f 187/471/42 128/296/42 188/472/42
1398
+
1399
+ v 0.384031 2.18966 0.9525
1400
+ vt 7.40758 32.7791
1401
+ f 188/472/42 128/296/42 189/473/42
1402
+
1403
+ v 0.395291 2.22078 0.9525
1404
+ vt 7.44452 32.9153
1405
+ f 189/473/42 128/296/42 190/474/42
1406
+
1407
+ v 0.399132 2.25418 0.9525
1408
+ vt 7.45712 33.0614
1409
+ f 190/474/42 128/296/42 191/475/42
1410
+
1411
+ f 138/317/42 191/475/42 128/296/42
1412
+
1413
+ v 0.395291 2.28758 0.9525
1414
+ vt 7.44452 33.2075
1415
+ f 138/317/42 192/476/42 191/475/42
1416
+
1417
+ v 0.384031 2.3187 0.9525
1418
+ vt 7.40758 33.3436
1419
+ f 138/317/42 193/477/42 192/476/42
1420
+
1421
+ v 0.366119 2.34543 0.9525
1422
+ vt 7.34881 33.4605
1423
+ f 138/317/42 194/478/42 193/477/42
1424
+
1425
+ v 0.342775 2.36594 0.9525
1426
+ vt 7.27222 33.5502
1427
+ f 138/317/42 195/479/42 194/478/42
1428
+
1429
+ v 0.315591 2.37883 0.9525
1430
+ vt 7.18304 33.6066
1431
+ f 138/317/42 196/480/42 195/479/42
1432
+
1433
+ v 0.286419 2.38323 0.9525
1434
+ vt 7.08733 33.6258
1435
+ f 138/317/42 197/481/42 196/480/42
1436
+
1437
+ v 0.257247 2.37883 0.9525
1438
+ vt 6.99162 33.6066
1439
+ f 138/317/42 198/482/42 197/481/42
1440
+
1441
+ f 138/317/42 155/388/42 198/482/42
1442
+
1443
+ v 0.230063 2.36594 0.9525
1444
+ vt 6.90243 33.5502
1445
+ f 198/482/42 155/388/42 199/483/42
1446
+
1447
+ v 0.00343574 2.24682 0.9525
1448
+ vt 6.15891 33.0291
1449
+ f 199/483/42 155/388/42 200/484/42
1450
+
1451
+ usemtl _auto_23
1452
+ vt -8.73243 63.3539
1453
+ vn -0.388153 -0.594974 0.703806
1454
+ vt -12.17 63.3539
1455
+ v -0.0932364 2.06389 0.744538
1456
+ vt -7.98483 51.8286
1457
+ f 200/485/78 155/486/78 201/487/78
1458
+
1459
+ vt 10.737 64.1017
1460
+ vn -0.0978871 -0.6609 0.744062
1461
+ vt 8.96413 51.847
1462
+ vt 11.1505 51.847
1463
+ f 155/488/79 156/489/79 201/490/79
1464
+
1465
+ v -0.146668 1.85924 0.744538
1466
+ vt 15.2795 33.2021
1467
+ vt 17.3831 41.2591
1468
+ f 156/396/57 202/491/57 201/492/57
1469
+
1470
+ v -0.154064 1.85826 0.744538
1471
+ vt 14.9883 33.1637
1472
+ f 156/396/57 203/493/57 202/491/57
1473
+
1474
+ v -0.160955 1.85541 0.744538
1475
+ vt 14.717 33.0513
1476
+ f 156/396/57 204/494/57 203/493/57
1477
+
1478
+ v -0.166873 1.85087 0.744538
1479
+ vt 14.484 32.8726
1480
+ f 156/396/57 205/495/57 204/494/57
1481
+
1482
+ v -0.171415 1.84495 0.744538
1483
+ vt 14.3052 32.6396
1484
+ f 156/396/57 206/496/57 205/495/57
1485
+
1486
+ f 156/396/57 158/398/57 206/496/57
1487
+
1488
+ usemtl _auto_17
1489
+ vt 35.3357 29.3125
1490
+ vn 0.923878 -0.382688 0
1491
+ vt 35.6294 0
1492
+ vt 35.6294 29.3125
1493
+ f 158/497/80 135/498/80 206/499/80
1494
+
1495
+ vt 35.3357 0
1496
+ f 135/498/80 158/497/80 134/500/80
1497
+
1498
+ vt 34.8966 0
1499
+ vn 0.793336 -0.608784 0
1500
+ vt 34.6029 29.3125
1501
+ vt 34.6029 0
1502
+ f 136/501/81 206/502/81 135/503/81
1503
+
1504
+ vt 34.8966 29.3125
1505
+ f 206/502/81 136/501/81 205/504/81
1506
+
1507
+ vt 31.5025 0
1508
+ vn 0.608762 -0.793353 0
1509
+ vt 31.7962 29.3125
1510
+ vt 31.5025 29.3125
1511
+ f 136/505/82 204/506/82 205/507/82
1512
+
1513
+ v -0.160955 1.85541 0
1514
+ vt 31.7962 0
1515
+ f 204/506/82 136/505/82 207/508/82
1516
+
1517
+ usemtl _auto_8
1518
+ vt -2.80979 11.7438
1519
+ f 136/310/46 137/311/46 207/509/46
1520
+
1521
+ v -0.154064 1.85826 0
1522
+ vt -2.82109 11.7485
1523
+ f 207/509/46 137/311/46 208/510/46
1524
+
1525
+ v -0.146668 1.85924 0
1526
+ vt -2.83322 11.7501
1527
+ f 208/510/46 137/311/46 209/511/46
1528
+
1529
+ v -0.139272 1.85826 0
1530
+ vt -2.84536 11.7485
1531
+ f 209/511/46 137/311/46 210/512/46
1532
+
1533
+ v -0.13238 1.85541 0
1534
+ vt -2.85666 11.7438
1535
+ f 210/512/46 137/311/46 211/513/46
1536
+
1537
+ v -0.126462 1.85087 0
1538
+ vt -2.86637 11.7364
1539
+ f 211/513/46 137/311/46 212/514/46
1540
+
1541
+ v -0.121921 1.84495 0
1542
+ vt -2.87382 11.7267
1543
+ f 212/514/46 137/311/46 213/515/46
1544
+
1545
+ v -0.119066 1.83806 0
1546
+ vt -2.8785 11.7154
1547
+ f 213/515/46 137/311/46 214/516/46
1548
+
1549
+ v -0.118093 1.83066 0
1550
+ vt -2.8801 11.7032
1551
+ f 214/516/46 137/311/46 215/517/46
1552
+
1553
+ f 129/303/46 215/517/46 137/311/46
1554
+
1555
+ v -0.119066 1.82327 0
1556
+ vt -2.8785 11.6911
1557
+ f 129/303/46 216/518/46 215/517/46
1558
+
1559
+ v -0.121921 1.81638 0
1560
+ vt -2.87382 11.6798
1561
+ f 129/303/46 217/519/46 216/518/46
1562
+
1563
+ v -0.126462 1.81046 0
1564
+ vt -2.86637 11.6701
1565
+ f 129/303/46 218/520/46 217/519/46
1566
+
1567
+ v -0.13238 1.80592 0
1568
+ vt -2.85666 11.6626
1569
+ f 129/303/46 219/521/46 218/520/46
1570
+
1571
+ v -0.139272 1.80306 0
1572
+ vt -2.84536 11.658
1573
+ f 129/303/46 220/522/46 219/521/46
1574
+
1575
+ v -0.146668 1.80209 0
1576
+ vt -2.83322 11.6564
1577
+ f 129/303/46 221/523/46 220/522/46
1578
+
1579
+ v -0.154064 1.80306 0
1580
+ vt -2.82109 11.658
1581
+ f 129/303/46 222/524/46 221/523/46
1582
+
1583
+ vt -2.80979 11.6626
1584
+ f 129/303/46 162/525/46 222/524/46
1585
+
1586
+ f 129/303/46 130/302/46 162/525/46
1587
+
1588
+ usemtl _auto_17
1589
+ vt -1.69403 29.3125
1590
+ vn 0.382688 0.923878 0
1591
+ vt -1.98772 0
1592
+ vt -1.69403 0
1593
+ f 163/526/83 222/527/83 162/528/83
1594
+
1595
+ v -0.154064 1.80306 0.744538
1596
+ vt -1.98772 29.3125
1597
+ f 222/527/83 163/526/83 223/529/83
1598
+
1599
+ usemtl _auto_23
1600
+ vt 14.9883 30.9904
1601
+ f 163/421/57 164/420/57 223/530/57
1602
+
1603
+ v -0.146668 1.80209 0.744538
1604
+ vt 15.2795 30.9521
1605
+ f 223/530/57 164/420/57 224/531/57
1606
+
1607
+ v -0.0932364 1.6026 0.744538
1608
+ vt 17.3831 23.0982
1609
+ f 224/531/57 164/420/57 225/532/57
1610
+
1611
+ vt -20.5797 4.1324
1612
+ vn -0.096818 0.653683 0.75055
1613
+ vt -18.3933 4.1324
1614
+ vt -17.016 16.5224
1615
+ f 225/533/84 164/534/84 166/535/84
1616
+
1617
+ vt -20.7747 17.6806
1618
+ vn -0.135969 0.655736 0.742646
1619
+ vt -21.7107 5.45471
1620
+ vt -17.6193 17.6806
1621
+ f 167/536/85 225/537/85 166/538/85
1622
+
1623
+ v -0.042046 1.62645 0.744538
1624
+ vt -27.736 10.3264
1625
+ vn -0.290848 0.624151 0.72515
1626
+ vt -25.5126 10.3264
1627
+ vt -22.5173 22.2166
1628
+ f 226/539/86 225/540/86 167/541/86
1629
+
1630
+ vt 19.3984 24.0373
1631
+ f 201/492/57 225/532/57 226/542/57
1632
+
1633
+ v -0.118093 1.83066 0.744538
1634
+ vt 16.4045 32.0771
1635
+ f 201/492/57 227/543/57 225/532/57
1636
+
1637
+ v -0.119066 1.83806 0.744538
1638
+ vt 16.3661 32.3682
1639
+ f 201/492/57 228/544/57 227/543/57
1640
+
1641
+ v -0.121921 1.84495 0.744538
1642
+ vt 16.2538 32.6396
1643
+ f 201/492/57 229/545/57 228/544/57
1644
+
1645
+ v -0.126462 1.85087 0.744538
1646
+ vt 16.075 32.8726
1647
+ f 201/492/57 230/546/57 229/545/57
1648
+
1649
+ v -0.13238 1.85541 0.744538
1650
+ vt 15.842 33.0513
1651
+ f 201/492/57 231/547/57 230/546/57
1652
+
1653
+ v -0.139272 1.85826 0.744538
1654
+ vt 15.5706 33.1637
1655
+ f 201/492/57 232/548/57 231/547/57
1656
+
1657
+ f 201/492/57 202/491/57 232/548/57
1658
+
1659
+ usemtl _auto_17
1660
+ vt 10.8142 0
1661
+ vn -0.130549 -0.991442 0
1662
+ vt 11.1079 29.3125
1663
+ vt 10.8142 29.3125
1664
+ f 209/549/87 232/550/87 202/551/87
1665
+
1666
+ vt 11.1079 0
1667
+ f 232/550/87 209/549/87 210/552/87
1668
+
1669
+ vt 1.69402 0
1670
+ vn -0.382688 -0.923878 0
1671
+ vt 1.98771 29.3125
1672
+ vt 1.69402 29.3125
1673
+ f 210/553/88 231/554/88 232/555/88
1674
+
1675
+ vt 1.98771 0
1676
+ f 231/554/88 210/553/88 211/556/88
1677
+
1678
+ vt -7.5514 0
1679
+ vn -0.608746 -0.793365 0
1680
+ vt -7.25771 29.3125
1681
+ vt -7.5514 29.3125
1682
+ f 211/557/89 230/558/89 231/559/89
1683
+
1684
+ vt -7.25771 0
1685
+ f 230/558/89 211/557/89 212/560/89
1686
+
1687
+ vt -16 0
1688
+ vn -0.793353 -0.608762 0
1689
+ vt -16.2937 29.3125
1690
+ vt -16.2937 0
1691
+ f 213/561/90 230/562/90 212/563/90
1692
+
1693
+ vt -16 29.3125
1694
+ f 230/562/90 213/561/90 229/564/90
1695
+
1696
+ vt -23.6412 0
1697
+ vn -0.923878 -0.382688 0
1698
+ vt -23.9349 29.3125
1699
+ vt -23.9349 0
1700
+ f 214/565/91 229/566/91 213/567/91
1701
+
1702
+ vt -23.6412 29.3125
1703
+ f 229/566/91 214/565/91 228/568/91
1704
+
1705
+ vt -29.6616 0
1706
+ vn -0.991446 -0.130515 0
1707
+ vt -29.9553 29.3125
1708
+ vt -29.9553 0
1709
+ f 215/569/92 228/570/92 214/571/92
1710
+
1711
+ vt -29.6616 29.3125
1712
+ f 228/570/92 215/569/92 227/572/92
1713
+
1714
+ vt -33.65 0
1715
+ vn -0.991447 0.130511 0
1716
+ vt -33.9437 29.3125
1717
+ vt -33.9437 0
1718
+ f 216/573/93 227/574/93 215/575/93
1719
+
1720
+ v -0.119066 1.82327 0.744538
1721
+ vt -33.65 29.3125
1722
+ f 227/574/93 216/573/93 233/576/93
1723
+
1724
+ vt -35.3357 0
1725
+ vn -0.923873 0.3827 0
1726
+ vt -35.6294 29.3125
1727
+ vt -35.6294 0
1728
+ f 217/577/94 233/578/94 216/579/94
1729
+
1730
+ v -0.121921 1.81638 0.744538
1731
+ vt -35.3357 29.3125
1732
+ f 233/578/94 217/577/94 234/580/94
1733
+
1734
+ vt -34.6033 0
1735
+ vn -0.793365 0.608746 0
1736
+ vt -34.897 29.3125
1737
+ vt -34.897 0
1738
+ f 218/581/95 234/582/95 217/583/95
1739
+
1740
+ v -0.126462 1.81046 0.744538
1741
+ vt -34.6033 29.3125
1742
+ f 234/582/95 218/581/95 235/584/95
1743
+
1744
+ vt -31.7958 0
1745
+ vn -0.608746 0.793365 0
1746
+ v -0.13238 1.80592 0.744538
1747
+ vt -31.5022 29.3125
1748
+ vt -31.7958 29.3125
1749
+ f 218/585/96 236/586/96 235/587/96
1750
+
1751
+ vt -31.5022 0
1752
+ f 236/586/96 218/585/96 219/588/96
1753
+
1754
+ vt -26.5387 0
1755
+ vn -0.382688 0.923878 0
1756
+ v -0.139272 1.80306 0.744538
1757
+ vt -26.245 29.3125
1758
+ vt -26.5387 29.3125
1759
+ f 219/589/97 237/590/97 236/591/97
1760
+
1761
+ vt -26.245 0
1762
+ f 237/590/97 219/589/97 220/592/97
1763
+
1764
+ vt -19.4822 0
1765
+ vn -0.130515 0.991446 0
1766
+ vt -19.1885 29.3125
1767
+ vt -19.4822 29.3125
1768
+ f 220/593/98 224/594/98 237/595/98
1769
+
1770
+ vt -19.1885 0
1771
+ f 224/594/98 220/593/98 221/596/98
1772
+
1773
+ vt -11.1091 0
1774
+ vn 0.130515 0.991446 0
1775
+ vt -10.8154 29.3125
1776
+ vt -11.1091 29.3125
1777
+ f 221/597/99 223/598/99 224/599/99
1778
+
1779
+ vt -10.8154 0
1780
+ f 223/598/99 221/597/99 222/600/99
1781
+
1782
+ usemtl _auto_23
1783
+ vt 15.5706 30.9904
1784
+ f 224/531/57 225/532/57 237/601/57
1785
+
1786
+ vt 15.842 31.1028
1787
+ f 237/601/57 225/532/57 236/602/57
1788
+
1789
+ vt 16.075 31.2816
1790
+ f 236/602/57 225/532/57 235/603/57
1791
+
1792
+ vt 16.2538 31.5146
1793
+ f 235/603/57 225/532/57 234/604/57
1794
+
1795
+ vt 16.3661 31.7859
1796
+ f 234/604/57 225/532/57 233/605/57
1797
+
1798
+ f 233/605/57 225/532/57 227/543/57
1799
+
1800
+ usemtl _auto_17
1801
+ vt 19.4832 29.3125
1802
+ vn 0.130549 -0.991442 0
1803
+ vt 19.1895 0
1804
+ vt 19.4832 0
1805
+ f 202/606/100 208/607/100 209/608/100
1806
+
1807
+ vt 19.1895 29.3125
1808
+ f 208/607/100 202/606/100 203/609/100
1809
+
1810
+ vt 26.5387 29.3125
1811
+ vn 0.382688 -0.923878 0
1812
+ vt 26.245 0
1813
+ vt 26.5387 0
1814
+ f 203/610/101 207/611/101 208/612/101
1815
+
1816
+ vt 26.245 29.3125
1817
+ f 207/611/101 203/610/101 204/613/101
1818
+
1819
+ usemtl _auto_23
1820
+ v -0.042046 2.04003 0.744538
1821
+ vt 19.3984 40.3199
1822
+ f 201/492/57 226/542/57 238/614/57
1823
+
1824
+ v 0.00191199 1.6644 0.744538
1825
+ vt 21.1291 25.5313
1826
+ f 238/614/57 226/542/57 239/615/57
1827
+
1828
+ vt -30.2506 29.7829
1829
+ vn -0.506114 0.586292 0.632543
1830
+ vt -32.6775 19.2119
1831
+ vt -30.3912 19.2119
1832
+ f 169/616/102 239/617/102 226/618/102
1833
+
1834
+ vt -32.2063 28.9419
1835
+ vn -0.759375 0.369961 0.535237
1836
+ vt -27.3395 38.6347
1837
+ vt -31.671 38.6347
1838
+ f 239/619/103 169/620/103 170/621/103
1839
+
1840
+ v 0.0356424 1.71385 0.744538
1841
+ vt -35.3547 26.3768
1842
+ vn -0.696952 0.475373 0.536916
1843
+ vt -32.9979 26.3768
1844
+ vt -33.2191 36.0819
1845
+ f 240/622/104 239/623/104 170/624/104
1846
+
1847
+ v 0.00191199 2.00209 0.744538
1848
+ vt 21.1291 38.826
1849
+ vt 22.457 27.4782
1850
+ f 241/625/57 239/615/57 240/626/57
1851
+
1852
+ f 238/614/57 239/615/57 241/625/57
1853
+
1854
+ vt -15.6276 61.6456
1855
+ vn -0.486767 -0.56388 0.667156
1856
+ vt -11.6631 50.6545
1857
+ vt -9.37681 50.6545
1858
+ f 200/627/105 238/628/105 241/629/105
1859
+
1860
+ vt -1.26295 63.8707
1861
+ vn -0.299613 -0.642963 0.704862
1862
+ vt -1.67071 52.3284
1863
+ vt 0.552735 52.3284
1864
+ f 200/630/106 201/631/106 238/632/106
1865
+
1866
+ vt -23.8288 58.3884
1867
+ vn -0.61462 -0.508564 0.602996
1868
+ vt -16.4435 48.1251
1869
+ v 0.0662332 2.17093 0.9525
1870
+ vt -19.9506 58.3884
1871
+ f 200/633/107 241/634/107 242/635/107
1872
+
1873
+ vt -24.2341 56.7572
1874
+ vn -0.672658 -0.458802 0.580545
1875
+ vt -20.1694 46.7017
1876
+ v 0.0356424 1.95263 0.744538
1877
+ vt -17.8127 46.7017
1878
+ f 242/636/108 241/637/108 243/638/108
1879
+
1880
+ vt 22.457 36.879
1881
+ f 241/625/57 240/626/57 243/639/57
1882
+
1883
+ v 0.0568461 1.77144 0.744538
1884
+ vt 23.2918 29.7455
1885
+ f 243/639/57 240/626/57 244/640/57
1886
+
1887
+ vt -35.9612 31.3984
1888
+ vn -0.839626 0.309141 0.44661
1889
+ vt -33.5451 31.3984
1890
+ vt -34.8732 40.5493
1891
+ f 244/641/109 240/642/109 171/643/109
1892
+
1893
+ vt -32.2864 32.8042
1894
+ vn -0.860715 0.226361 0.455994
1895
+ vt -28.5294 42.0039
1896
+ vt -33.2182 42.0039
1897
+ f 240/644/110 170/645/110 171/646/110
1898
+
1899
+ vt -34.329 44.1787
1900
+ vn -0.910182 0.0760809 0.407161
1901
+ vt -31.5823 35.2145
1902
+ vt -29.4458 44.1787
1903
+ f 172/647/111 244/648/111 171/649/111
1904
+
1905
+ v 0.0640782 1.83324 0.744538
1906
+ vt -34.7008 34.7254
1907
+ vn -0.910969 0.106604 0.398462
1908
+ vt -32.2511 34.7254
1909
+ vt -35.1171 43.6521
1910
+ f 245/650/112 244/651/112 172/652/112
1911
+
1912
+ v 0.0568461 1.89504 0.744538
1913
+ vt 23.2918 34.6117
1914
+ vt 23.5766 32.1786
1915
+ f 246/653/57 244/640/57 245/654/57
1916
+
1917
+ f 243/639/57 244/640/57 246/653/57
1918
+
1919
+ v 0.114419 2.07202 0.9525
1920
+ vt -30.1879 51.3854
1921
+ vn -0.820922 -0.302254 0.48449
1922
+ vt -26.8486 42.0261
1923
+ vt -24.4325 42.0261
1924
+ f 247/655/113 243/656/113 246/657/113
1925
+
1926
+ vt -30.5167 53.251
1927
+ vn -0.773598 -0.37689 0.509411
1928
+ vt -23.318 43.7365
1929
+ vt -26.1852 53.251
1930
+ f 242/658/114 243/659/114 247/660/114
1931
+
1932
+ usemtl _auto_20
1933
+ v 0.177547 2.28758 0.9525
1934
+ vt 6.73014 33.2074
1935
+ vt 6.36494 32.6972
1936
+ vt 6.52303 32.2645
1937
+ f 248/661/42 242/662/42 247/663/42
1938
+
1939
+ v 0.188807 2.3187 0.9525
1940
+ vt 6.76708 33.3436
1941
+ f 249/664/42 242/662/42 248/661/42
1942
+
1943
+ v 0.206719 2.34543 0.9525
1944
+ vt 6.82585 33.4605
1945
+ f 250/665/42 242/662/42 249/664/42
1946
+
1947
+ f 250/665/42 200/484/42 242/662/42
1948
+
1949
+ f 199/483/42 200/484/42 250/665/42
1950
+
1951
+ usemtl _auto_12
1952
+ v 0.206719 2.34543 1.02394
1953
+ vt -21.6909 3.35937
1954
+ vn -0.659994 0.751271 -6.90126e-30
1955
+ vt -21.7929 3.125
1956
+ vt -21.6909 3.125
1957
+ f 251/666/115 199/667/115 250/668/115
1958
+
1959
+ v 0.230063 2.36594 1.02394
1960
+ vt -21.7929 3.35937
1961
+ f 199/667/115 251/666/115 252/669/115
1962
+
1963
+ usemtl _auto_22
1964
+ v 0.206719 2.34543 1.17951
1965
+ vt -56.4777 46.4375
1966
+ vn -0.659994 0.751271 0
1967
+ vt -57.701 40.3125
1968
+ vt -56.4777 40.3125
1969
+ f 253/670/116 252/671/116 251/672/116
1970
+
1971
+ v 0.230063 2.36594 1.17951
1972
+ vt -57.701 46.4375
1973
+ f 252/671/116 253/670/116 254/673/116
1974
+
1975
+ usemtl _auto_12
1976
+ v 0.206719 2.34543 1.28429
1977
+ vt -21.6909 4.21354
1978
+ vt -21.7929 3.86979
1979
+ vt -21.6909 3.86979
1980
+ f 255/674/116 254/675/116 253/676/116
1981
+
1982
+ v 0.230063 2.36594 1.28429
1983
+ vt -21.7929 4.21354
1984
+ f 254/675/116 255/674/116 256/677/116
1985
+
1986
+ vt 6.82586 25.0954
1987
+ v 0.230063 2.14243 1.28429
1988
+ vt 6.90244 24.4293
1989
+ vt 6.90244 25.1626
1990
+ f 255/678/42 257/679/42 256/680/42
1991
+
1992
+ v 0.206719 2.16293 1.28429
1993
+ vt 6.82586 24.4966
1994
+ f 255/678/42 258/681/42 257/679/42
1995
+
1996
+ v 0.188807 2.3187 1.28429
1997
+ vt 6.76709 25.0077
1998
+ f 259/682/42 258/681/42 255/678/42
1999
+
2000
+ v 0.188807 2.18966 1.28429
2001
+ vt 6.76709 24.5843
2002
+ f 259/682/42 260/683/42 258/681/42
2003
+
2004
+ v 0.177547 2.28758 1.28429
2005
+ vt 6.73015 24.9056
2006
+ f 261/684/42 260/683/42 259/682/42
2007
+
2008
+ v 0.177547 2.22078 1.28429
2009
+ vt 6.73015 24.6864
2010
+ f 261/684/42 262/685/42 260/683/42
2011
+
2012
+ v 0.173707 2.25418 1.28429
2013
+ vt 6.71755 24.796
2014
+ f 262/685/42 261/684/42 263/686/42
2015
+
2016
+ vt -25.5114 4.21354
2017
+ vn -0.993454 0.114234 0
2018
+ v 0.173707 2.25418 1.17951
2019
+ vt -25.4011 3.86979
2020
+ vt -25.4011 4.21354
2021
+ f 261/687/117 264/688/117 263/689/117
2022
+
2023
+ v 0.177547 2.28758 1.17951
2024
+ vt -25.5114 3.86979
2025
+ f 264/688/117 261/687/117 265/690/117
2026
+
2027
+ vt -25.8182 4.21354
2028
+ vn -0.940349 0.34021 0
2029
+ vt -25.7096 3.86979
2030
+ vt -25.7096 4.21354
2031
+ f 259/691/118 265/692/118 261/693/118
2032
+
2033
+ v 0.188807 2.3187 1.17951
2034
+ vt -25.8182 3.86979
2035
+ f 265/692/118 259/691/118 266/694/118
2036
+
2037
+ vt -24.6466 4.21354
2038
+ vn -0.83069 0.556735 0
2039
+ vt -24.5411 3.86979
2040
+ vt -24.5411 4.21354
2041
+ f 255/695/119 266/696/119 259/697/119
2042
+
2043
+ vt -24.6466 3.86979
2044
+ f 266/696/119 255/695/119 253/698/119
2045
+
2046
+ usemtl _auto_22
2047
+ vt -59.7336 46.4375
2048
+ v 0.188807 2.3187 1.02394
2049
+ vt -58.4669 40.3125
2050
+ vt -58.4669 46.4375
2051
+ f 253/699/119 267/700/119 266/701/119
2052
+
2053
+ vt -59.7336 40.3125
2054
+ f 267/700/119 253/699/119 251/702/119
2055
+
2056
+ usemtl _auto_12
2057
+ vt -24.6466 3.35938
2058
+ vn -0.83069 0.556735 -9.02434e-31
2059
+ vt -24.5411 3.125
2060
+ vt -24.5411 3.35938
2061
+ f 251/703/120 249/704/120 267/705/120
2062
+
2063
+ vt -24.6466 3.125
2064
+ f 249/704/120 251/703/120 250/706/120
2065
+
2066
+ vt -25.7096 3.125
2067
+ vn -0.940349 0.34021 8.29507e-31
2068
+ vt -25.8182 3.35937
2069
+ vt -25.8182 3.125
2070
+ f 248/707/121 267/708/121 249/709/121
2071
+
2072
+ v 0.177547 2.28758 1.02394
2073
+ vt -25.7096 3.35937
2074
+ f 267/708/121 248/707/121 268/710/121
2075
+
2076
+ vt -25.4011 3.125
2077
+ vn -0.993454 0.114234 -7.29109e-31
2078
+ vt -25.5114 3.35938
2079
+ vt -25.5114 3.125
2080
+ f 173/711/122 268/712/122 248/713/122
2081
+
2082
+ v 0.173707 2.25418 1.02394
2083
+ vt -25.4011 3.35938
2084
+ f 268/712/122 173/711/122 269/714/122
2085
+
2086
+ vt -23.756 3.125
2087
+ vn -0.993454 -0.114235 0
2088
+ vt -23.8663 3.35938
2089
+ vt -23.8663 3.125
2090
+ f 174/715/123 269/716/123 173/717/123
2091
+
2092
+ v 0.177547 2.22078 1.02394
2093
+ vt -23.756 3.35938
2094
+ f 269/716/123 174/715/123 270/718/123
2095
+
2096
+ vt -20.8156 3.125
2097
+ vn -0.940349 -0.34021 8.29507e-31
2098
+ vt -20.9242 3.35938
2099
+ vt -20.9242 3.125
2100
+ f 175/719/124 270/720/124 174/721/124
2101
+
2102
+ v 0.188807 2.18966 1.02394
2103
+ vt -20.8156 3.35938
2104
+ f 270/720/124 175/719/124 271/722/124
2105
+
2106
+ vt -16.5488 3.125
2107
+ vn -0.83069 -0.556735 6.20437e-30
2108
+ vt -16.6544 3.35937
2109
+ vt -16.6544 3.125
2110
+ f 177/723/125 271/724/125 175/725/125
2111
+
2112
+ v 0.206719 2.16293 1.02394
2113
+ vt -16.5488 3.35937
2114
+ f 271/724/125 177/723/125 272/726/125
2115
+
2116
+ vt -11.0397 3.125
2117
+ vn -0.659994 -0.751271 6.90126e-30
2118
+ v 0.230063 2.14243 1.02394
2119
+ vt -10.9377 3.35938
2120
+ vt -11.0397 3.35938
2121
+ f 177/727/126 273/728/126 272/729/126
2122
+
2123
+ v 0.230063 2.14243 0.9525
2124
+ vt -10.9377 3.125
2125
+ f 273/728/126 177/727/126 274/730/126
2126
+
2127
+ usemtl _auto_20
2128
+ vt 6.90243 32.5725
2129
+ f 178/450/42 274/731/42 177/449/42
2130
+
2131
+ v 0.220216 1.86523 0.9525
2132
+ vt 6.87013 31.3599
2133
+ f 274/731/42 178/450/42 275/732/42
2134
+
2135
+ usemtl _auto_3
2136
+ vt -5.33179 0.694444
2137
+ vn -0.995678 0.0928774 1.33051e-31
2138
+ v 0.220216 1.86523 1.44621
2139
+ vt -5.34585 1.0544
2140
+ vt -5.34585 0.694444
2141
+ f 178/733/127 276/734/127 275/735/127
2142
+
2143
+ v 0.218424 1.84602 1.44621
2144
+ vt -5.33179 1.0544
2145
+ f 276/734/127 178/733/127 277/736/127
2146
+
2147
+ vt -4.86826 0.694444
2148
+ vn -0.98579 -0.167982 -1.97448e-19
2149
+ vt -4.88233 1.0544
2150
+ vt -4.88233 0.694444
2151
+ f 179/737/128 277/738/128 178/739/128
2152
+
2153
+ v 0.221665 1.827 1.44621
2154
+ vt -4.86826 1.0544
2155
+ f 277/738/128 179/737/128 278/740/128
2156
+
2157
+ v 0.229718 1.80947 0.9525
2158
+ vt -4.07249 0.694444
2159
+ vn -0.908722 -0.417401 0
2160
+ vt -4.08656 1.0544
2161
+ vt -4.08656 0.694444
2162
+ f 279/741/129 278/742/129 179/743/129
2163
+
2164
+ v 0.229718 1.80947 1.44621
2165
+ vt -4.07249 1.0544
2166
+ f 278/742/129 279/741/129 280/744/129
2167
+
2168
+ v 0.237749 1.79979 0.9525
2169
+ vt -3.0036 0.694444
2170
+ vn -0.769725 -0.638375 1.7061e-31
2171
+ vt -3.01277 1.0544
2172
+ vt -3.01277 0.694444
2173
+ f 281/745/130 280/746/130 279/747/130
2174
+
2175
+ v 0.237749 1.79979 1.44621
2176
+ vt -3.0036 1.0544
2177
+ f 280/746/130 281/745/130 282/748/130
2178
+
2179
+ v 0.237749 1.79825 0.9525
2180
+ vt -5.17781 0.694444
2181
+ vt -5.17893 1.0544
2182
+ vt -5.17893 0.694444
2183
+ f 283/749/4 282/750/4 281/751/4
2184
+
2185
+ v 0.237749 1.79825 1.44621
2186
+ vt -5.17781 1.0544
2187
+ f 282/750/4 283/749/4 284/752/4
2188
+
2189
+ vt 1.53948 0.694444
2190
+ v 0.239024 1.79825 1.44621
2191
+ vt 1.54041 1.0544
2192
+ vt 1.53948 1.0544
2193
+ f 283/753/43 285/754/43 284/755/43
2194
+
2195
+ v 0.239024 1.79825 0.9525
2196
+ vt 1.54041 0.694444
2197
+ f 285/754/43 283/753/43 286/756/43
2198
+
2199
+ usemtl _auto_20
2200
+ vt 6.92765 31.0669
2201
+ vt 6.93183 31.0669
2202
+ f 283/757/42 180/452/42 286/758/42
2203
+
2204
+ vt 6.9013 31.116
2205
+ f 279/759/42 180/452/42 283/757/42
2206
+
2207
+ f 179/451/42 180/452/42 279/759/42
2208
+
2209
+ vt 6.92765 31.0736
2210
+ f 281/760/42 279/759/42 283/757/42
2211
+
2212
+ v 0.242035 1.79462 0.9525
2213
+ vt 6.94171 31.051
2214
+ f 286/758/42 180/452/42 287/761/42
2215
+
2216
+ v 0.257776 1.78346 0.9525
2217
+ vt 6.99336 31.0022
2218
+ f 287/761/42 180/452/42 288/762/42
2219
+
2220
+ v 0.275868 1.77676 0.9525
2221
+ vt 7.05271 30.9729
2222
+ f 288/762/42 180/452/42 289/763/42
2223
+
2224
+ v 0.295079 1.77497 0.9525
2225
+ vt 7.11574 30.965
2226
+ f 289/763/42 180/452/42 290/764/42
2227
+
2228
+ v 0.314099 1.77821 0.9525
2229
+ vt 7.17814 30.9792
2230
+ f 290/764/42 180/452/42 291/765/42
2231
+
2232
+ v 0.331631 1.78626 0.9525
2233
+ vt 7.23566 31.0145
2234
+ f 291/765/42 180/452/42 292/766/42
2235
+
2236
+ v 0.346483 1.79858 0.9525
2237
+ vt 7.28439 31.0683
2238
+ f 292/766/42 180/452/42 293/767/42
2239
+
2240
+ f 293/767/42 180/452/42 186/470/42
2241
+
2242
+ usemtl _auto_3
2243
+ vt 0.102183 -1.11022e-15
2244
+ vn 0.815839 -0.578279 0
2245
+ v 0.346483 1.79858 1.44621
2246
+ vt 0.0880759 0.359954
2247
+ vt 0.0880759 -1.11022e-15
2248
+ f 186/768/131 294/769/131 293/770/131
2249
+
2250
+ v 0.35764 1.81432 1.44621
2251
+ vt 0.102183 0.359954
2252
+ f 294/769/131 186/768/131 295/771/131
2253
+
2254
+ vt 0.11629 0
2255
+ vn 0.937711 -0.347417 0
2256
+ vt 0.102183 0
2257
+ f 187/772/132 295/771/132 186/773/132
2258
+
2259
+ v 0.364343 1.83241 1.44621
2260
+ vt 0.11629 0.359954
2261
+ f 295/771/132 187/772/132 296/774/132
2262
+
2263
+ vt 0.130397 1.11022e-16
2264
+ vn 0.995678 -0.0928774 0
2265
+ vt 0.11629 1.11022e-16
2266
+ f 188/775/133 296/774/133 187/776/133
2267
+
2268
+ v 0.366135 1.85162 1.44621
2269
+ vt 0.130397 0.359954
2270
+ f 296/774/133 188/775/133 297/777/133
2271
+
2272
+ v 0.362894 1.87064 0.9525
2273
+ vt 0.144504 1.11022e-16
2274
+ vn 0.98579 0.167982 0
2275
+ f 298/778/134 297/777/134 188/775/134
2276
+
2277
+ v 0.362894 1.87064 1.44621
2278
+ vt 0.144504 0.359954
2279
+ f 297/777/134 298/778/134 299/779/134
2280
+
2281
+ v 0.35484 1.88817 0.9525
2282
+ vt 0.158611 -3.33067e-16
2283
+ vn 0.908722 0.417401 0
2284
+ vt 0.144504 -3.33067e-16
2285
+ f 300/780/135 299/779/135 298/781/135
2286
+
2287
+ v 0.35484 1.88817 1.44621
2288
+ vt 0.158611 0.359954
2289
+ f 299/779/135 300/780/135 301/782/135
2290
+
2291
+ v 0.342524 1.90302 0.9525
2292
+ vt 0.172718 0
2293
+ vn 0.769729 0.638371 0
2294
+ vt 0.158611 0
2295
+ f 302/783/136 301/782/136 300/784/136
2296
+
2297
+ v 0.342524 1.90302 1.44621
2298
+ vt 0.172718 0.359954
2299
+ f 301/782/136 302/783/136 303/785/136
2300
+
2301
+ usemtl _auto_17
2302
+ v 0.342524 1.79825 0.9525
2303
+ vt -30.8009 37.5
2304
+ vt -34.9259 56.9375
2305
+ vt -34.9259 37.5
2306
+ f 304/786/4 303/787/4 302/788/4
2307
+
2308
+ v 0.342524 1.79825 1.44621
2309
+ vt -30.8009 56.9375
2310
+ f 303/787/4 304/786/4 305/789/4
2311
+
2312
+ vt 34.539 56.9375
2313
+ vt 30.4642 37.5
2314
+ vt 34.539 37.5
2315
+ f 305/790/43 286/791/43 304/792/43
2316
+
2317
+ vt 30.4642 56.9375
2318
+ f 286/791/43 305/790/43 285/793/43
2319
+
2320
+ v 0.342524 1.79825 1.49701
2321
+ vt 34.539 58.9375
2322
+ f 285/793/43 305/790/43 306/794/43
2323
+
2324
+ usemtl _auto_3
2325
+ v 0.242035 1.79462 1.44621
2326
+ vt 1.5426 5.17517
2327
+ vt 1.61587 5.17781
2328
+ vt 1.54041 5.17781
2329
+ f 307/795/42 305/796/42 285/797/42
2330
+
2331
+ v 0.257776 1.78346 1.44621
2332
+ vt 1.55408 5.16703
2333
+ f 305/796/42 307/795/42 308/798/42
2334
+
2335
+ vt 0.00343389 0
2336
+ vn -0.578282 -0.815837 -1.86294e-31
2337
+ vt 0.0175409 0.359954
2338
+ vt 0.00343389 0.359954
2339
+ f 287/799/137 308/800/137 307/801/137
2340
+
2341
+ vt 0.0175409 0
2342
+ f 308/800/137 287/799/137 288/802/137
2343
+
2344
+ vt 0.0175409 -3.33067e-16
2345
+ vn -0.347406 -0.937715 -5.511e-19
2346
+ v 0.275868 1.77676 1.44621
2347
+ vt 0.0316479 0.359954
2348
+ f 288/803/138 309/804/138 308/800/138
2349
+
2350
+ vt 0.0316479 -3.33067e-16
2351
+ f 309/804/138 288/803/138 289/805/138
2352
+
2353
+ vt 0.0316479 -2.22045e-16
2354
+ vn -0.0928905 -0.995676 1.09184e-19
2355
+ v 0.295079 1.77497 1.44621
2356
+ vt 0.0457549 0.359954
2357
+ f 289/806/139 310/807/139 309/804/139
2358
+
2359
+ vt 0.0457549 -2.22045e-16
2360
+ f 310/807/139 289/806/139 290/808/139
2361
+
2362
+ vt 0.0457549 -5.55112e-16
2363
+ vn 0.167982 -0.98579 1.97448e-19
2364
+ v 0.314099 1.77821 1.44621
2365
+ vt 0.0598619 0.359954
2366
+ f 290/809/140 311/810/140 310/807/140
2367
+
2368
+ vt 0.0598619 -5.55112e-16
2369
+ f 311/810/140 290/809/140 291/811/140
2370
+
2371
+ vt 0.0598619 2.22045e-16
2372
+ vn 0.417401 -0.908722 -1.21431e-31
2373
+ v 0.331631 1.78626 1.44621
2374
+ vt 0.0739689 0.359954
2375
+ f 291/812/141 312/813/141 311/810/141
2376
+
2377
+ vt 0.0739689 2.22045e-16
2378
+ f 312/813/141 291/812/141 292/814/141
2379
+
2380
+ vt 0.0739689 4.44089e-16
2381
+ vn 0.638379 -0.769722 -1.6551e-18
2382
+ f 292/815/142 294/769/142 312/813/142
2383
+
2384
+ vt 0.0880759 4.44089e-16
2385
+ f 294/769/142 292/815/142 293/816/142
2386
+
2387
+ vt 1.60793 5.16907
2388
+ vt 1.61875 5.17805
2389
+ f 305/796/42 312/817/42 294/818/42
2390
+
2391
+ vt 1.59514 5.1632
2392
+ f 305/796/42 311/819/42 312/817/42
2393
+
2394
+ vt 1.58128 5.16084
2395
+ f 305/796/42 310/820/42 311/819/42
2396
+
2397
+ vt 1.56727 5.16214
2398
+ f 305/796/42 309/821/42 310/820/42
2399
+
2400
+ f 305/796/42 308/798/42 309/821/42
2401
+
2402
+ vt 1.61587 5.2542
2403
+ f 305/796/42 294/818/42 303/822/42
2404
+
2405
+ vt 1.62485 5.24338
2406
+ f 303/822/42 294/818/42 301/823/42
2407
+
2408
+ vt 1.62689 5.18953
2409
+ f 301/823/42 294/818/42 295/824/42
2410
+
2411
+ vt 1.63072 5.23059
2412
+ f 301/823/42 295/824/42 299/825/42
2413
+
2414
+ vt 1.63178 5.20272
2415
+ f 299/825/42 295/824/42 296/826/42
2416
+
2417
+ vt 1.63308 5.21673
2418
+ f 299/825/42 296/826/42 297/827/42
2419
+
2420
+ vt 5.2542 1.0544
2421
+ vt 5.17781 1.09144
2422
+ vt 5.17781 1.0544
2423
+ f 303/828/24 306/829/24 305/830/24
2424
+
2425
+ v 0.342524 1.90302 1.49701
2426
+ vt 5.2542 1.09144
2427
+ f 306/829/24 303/828/24 313/831/24
2428
+
2429
+ vt -1.61587 1.0544
2430
+ v 0.24285 1.90302 1.49701
2431
+ vt -1.5432 1.09143
2432
+ vt -1.61587 1.09143
2433
+ f 303/832/41 314/833/41 313/834/41
2434
+
2435
+ v 0.24285 1.90302 1.44621
2436
+ vt -1.5432 1.0544
2437
+ f 314/833/41 303/832/41 315/835/41
2438
+
2439
+ usemtl _auto_17
2440
+ v 0.24285 1.90302 0.9525
2441
+ vt 30.6148 37.5
2442
+ vt 30.6148 56.9375
2443
+ f 316/836/43 303/790/43 315/837/43
2444
+
2445
+ f 303/790/43 316/836/43 302/792/43
2446
+
2447
+ usemtl _auto_3
2448
+ v 0.24285 1.90302 0.928688
2449
+ vt 1.5432 0.677083
2450
+ vt 1.61587 0.694444
2451
+ vt 1.5432 0.694444
2452
+ f 317/838/43 302/839/43 316/840/43
2453
+
2454
+ v 0.342524 1.90302 0.928688
2455
+ vt 1.61587 0.677083
2456
+ f 302/839/43 317/838/43 318/841/43
2457
+
2458
+ usemtl _auto_17
2459
+ v 0.252927 1.91138 0.928688
2460
+ vt -31.0116 35.255
2461
+ vt -34.539 34.9259
2462
+ vt -30.6148 34.9259
2463
+ f 319/842/44 318/843/44 317/844/44
2464
+
2465
+ v 0.27046 1.91944 0.928688
2466
+ vt -31.7018 35.572
2467
+ f 318/843/44 319/842/44 320/845/44
2468
+
2469
+ usemtl _auto_3
2470
+ v 0.252927 1.91138 1.44621
2471
+ vt -3.60467 1.0544
2472
+ vn -0.417401 0.908722 5.0762e-32
2473
+ vt -3.61874 0.677083
2474
+ vt -3.60467 0.677083
2475
+ f 321/846/143 320/847/143 319/848/143
2476
+
2477
+ v 0.27046 1.91944 1.44621
2478
+ vt -3.61874 1.0544
2479
+ f 320/847/143 321/846/143 322/849/143
2480
+
2481
+ vt 1.55055 5.26029
2482
+ vt 1.56333 5.26617
2483
+ f 321/850/42 303/822/42 322/851/42
2484
+
2485
+ vt 1.5432 5.2542
2486
+ f 303/822/42 321/850/42 315/852/42
2487
+
2488
+ vt -4.55153 1.0544
2489
+ vn -0.63837 0.76973 -2.3952e-19
2490
+ vt -4.54198 0.694444
2491
+ vt -4.54198 1.0544
2492
+ f 321/853/144 316/854/144 315/855/144
2493
+
2494
+ vt -4.55153 0.677083
2495
+ f 319/856/144 316/854/144 321/853/144
2496
+
2497
+ vt -4.54198 0.677083
2498
+ f 316/854/144 319/856/144 317/857/144
2499
+
2500
+ vt -1.5432 0.694444
2501
+ v 0.237749 1.90302 1.44621
2502
+ vt -1.53948 1.0544
2503
+ f 316/858/41 323/859/41 315/835/41
2504
+
2505
+ v 0.237749 1.90302 0.9525
2506
+ vt -1.53948 0.694445
2507
+ f 323/859/41 316/858/41 324/860/41
2508
+
2509
+ v 0.237749 1.8986 0.9525
2510
+ vt -5.25098 0.694444
2511
+ vt -5.2542 1.0544
2512
+ vt -5.2542 0.694444
2513
+ f 325/861/4 323/862/4 324/863/4
2514
+
2515
+ v 0.237749 1.8986 1.44621
2516
+ vt -5.25098 1.0544
2517
+ f 323/862/4 325/861/4 326/864/4
2518
+
2519
+ f 281/751/4 326/864/4 325/861/4
2520
+
2521
+ f 326/864/4 281/751/4 282/750/4
2522
+
2523
+ vt 5.25098 0.694444
2524
+ vt 5.17893 1.0544
2525
+ vt 5.17893 0.694444
2526
+ f 325/865/24 282/866/24 281/867/24
2527
+
2528
+ vt 5.25098 1.0544
2529
+ f 282/866/24 325/865/24 326/868/24
2530
+
2531
+ v 0.226919 1.88333 0.9525
2532
+ vt -5.16055 0.694444
2533
+ vn -0.815843 0.578273 9.5895e-19
2534
+ vt -5.17421 1.0544
2535
+ vt -5.17421 0.694444
2536
+ f 327/869/145 326/870/145 325/871/145
2537
+
2538
+ v 0.226919 1.88333 1.44621
2539
+ vt -5.16055 1.0544
2540
+ f 326/870/145 327/869/145 328/872/145
2541
+
2542
+ vt -5.43149 0.694444
2543
+ vn -0.937711 0.347417 -9.28498e-32
2544
+ vt -5.44555 1.0544
2545
+ vt -5.44555 0.694444
2546
+ f 275/873/146 328/874/146 327/875/146
2547
+
2548
+ vt -5.43149 1.0544
2549
+ f 328/874/146 275/873/146 276/876/146
2550
+
2551
+ usemtl _auto_20
2552
+ vt 6.89212 31.4391
2553
+ f 274/731/42 275/732/42 327/877/42
2554
+
2555
+ vt 6.92765 31.5059
2556
+ f 274/731/42 327/877/42 325/878/42
2557
+
2558
+ vt 6.92765 31.5252
2559
+ f 274/731/42 325/878/42 324/879/42
2560
+
2561
+ v 0.257247 2.12953 0.9525
2562
+ vt 6.99162 32.5161
2563
+ f 274/731/42 324/879/42 329/880/42
2564
+
2565
+ vt 7.2714 31.5252
2566
+ f 329/880/42 324/879/42 302/881/42
2567
+
2568
+ v 0.286419 2.12514 0.9525
2569
+ vt 7.08733 32.4969
2570
+ f 329/880/42 302/881/42 330/882/42
2571
+
2572
+ v 0.315591 2.12953 0.9525
2573
+ vt 7.18304 32.5161
2574
+ f 330/882/42 302/881/42 331/883/42
2575
+
2576
+ v 0.342775 2.14243 0.9525
2577
+ vt 7.27222 32.5725
2578
+ f 331/883/42 302/881/42 332/884/42
2579
+
2580
+ vt 7.31181 31.4603
2581
+ f 332/884/42 302/881/42 300/885/42
2582
+
2583
+ v 0.366119 2.16293 0.9525
2584
+ vt 7.34881 32.6622
2585
+ f 332/884/42 300/885/42 333/886/42
2586
+
2587
+ vt 7.33823 31.3836
2588
+ f 333/886/42 300/885/42 298/887/42
2589
+
2590
+ f 333/886/42 298/887/42 188/472/42
2591
+
2592
+ f 333/886/42 188/472/42 189/473/42
2593
+
2594
+ usemtl _auto_12
2595
+ vt 24.546 3.125
2596
+ vn 0.830686 -0.556741 1.74847e-30
2597
+ v 0.366119 2.16293 1.02394
2598
+ vt 24.4404 3.35937
2599
+ vt 24.4404 3.125
2600
+ f 189/888/147 334/889/147 333/890/147
2601
+
2602
+ v 0.384031 2.18966 1.02394
2603
+ vt 24.546 3.35937
2604
+ f 334/889/147 189/888/147 335/891/147
2605
+
2606
+ vt 25.7466 3.125
2607
+ vn 0.940352 -0.340203 -3.83049e-30
2608
+ vt 25.638 3.35937
2609
+ vt 25.638 3.125
2610
+ f 190/892/148 335/893/148 189/894/148
2611
+
2612
+ v 0.395291 2.22078 1.02394
2613
+ vt 25.7466 3.35937
2614
+ f 335/893/148 190/892/148 336/895/148
2615
+
2616
+ vt 25.4855 3.125
2617
+ vn 0.993453 -0.114243 6.34078e-30
2618
+ vt 25.3752 3.35937
2619
+ vt 25.3752 3.125
2620
+ f 191/896/149 336/897/149 190/898/149
2621
+
2622
+ v 0.399132 2.25418 1.02394
2623
+ vt 25.4855 3.35937
2624
+ f 336/897/149 191/896/149 337/899/149
2625
+
2626
+ vt 23.8921 3.125
2627
+ vn 0.993453 0.114242 7.06994e-30
2628
+ vt 23.7818 3.35938
2629
+ vt 23.7818 3.125
2630
+ f 192/900/150 337/901/150 191/902/150
2631
+
2632
+ v 0.395291 2.28758 1.02394
2633
+ vt 23.8921 3.35938
2634
+ f 337/901/150 192/900/150 338/903/150
2635
+
2636
+ vt 20.9958 3.125
2637
+ vn 0.940352 0.340203 -3.83049e-30
2638
+ vt 20.8873 3.35938
2639
+ vt 20.8873 3.125
2640
+ f 193/904/151 338/905/151 192/906/151
2641
+
2642
+ v 0.384031 2.3187 1.02394
2643
+ vt 20.9958 3.35938
2644
+ f 338/905/151 193/904/151 339/907/151
2645
+
2646
+ vt 16.7551 3.125
2647
+ vn 0.830686 0.556741 8.85535e-30
2648
+ vt 16.6495 3.35938
2649
+ vt 16.6495 3.125
2650
+ f 194/908/152 339/909/152 193/910/152
2651
+
2652
+ v 0.366119 2.34543 1.02394
2653
+ vt 16.7551 3.35938
2654
+ f 339/909/152 194/908/152 340/911/152
2655
+
2656
+ vt 11.042 3.125
2657
+ vn 0.659998 0.751267 5.82531e-31
2658
+ v 0.342775 2.36594 1.02394
2659
+ vt 11.1439 3.35937
2660
+ vt 11.042 3.35937
2661
+ f 194/912/153 341/913/153 340/914/153
2662
+
2663
+ vt 11.1439 3.125
2664
+ f 341/913/153 194/912/153 195/915/153
2665
+
2666
+ vt 4.21118 3.125
2667
+ vn 0.428489 0.903547 -5.76695e-30
2668
+ v 0.315591 2.37883 1.02394
2669
+ vt 4.30989 3.35937
2670
+ vt 4.21118 3.35937
2671
+ f 195/916/154 342/917/154 341/918/154
2672
+
2673
+ vt 4.30989 3.125
2674
+ f 342/917/154 195/916/154 196/919/154
2675
+
2676
+ vt -3.34614 3.125
2677
+ vn 0.149051 0.98883 6.31127e-30
2678
+ v 0.286419 2.38323 1.02394
2679
+ vt -3.24934 3.35937
2680
+ vt -3.34614 3.35937
2681
+ f 196/920/155 343/921/155 342/922/155
2682
+
2683
+ vt -3.24934 3.125
2684
+ f 343/921/155 196/920/155 197/923/155
2685
+
2686
+ vt -10.767 3.125
2687
+ vn -0.149051 0.98883 6.31127e-30
2688
+ v 0.257247 2.37883 1.02394
2689
+ vt -10.6702 3.35938
2690
+ vt -10.767 3.35938
2691
+ f 197/924/156 344/925/156 343/926/156
2692
+
2693
+ vt -10.6702 3.125
2694
+ f 344/925/156 197/924/156 198/927/156
2695
+
2696
+ vt -17.1174 3.125
2697
+ vn -0.428489 0.903547 5.76695e-30
2698
+ vt -17.0187 3.35937
2699
+ vt -17.1174 3.35937
2700
+ f 198/928/157 252/929/157 344/930/157
2701
+
2702
+ vt -17.0187 3.125
2703
+ f 252/929/157 198/928/157 199/931/157
2704
+
2705
+ usemtl _auto_22
2706
+ vt -49.9816 46.4375
2707
+ vn -0.428489 0.903547 0
2708
+ vt -51.1661 40.3125
2709
+ vt -49.9816 40.3125
2710
+ f 254/932/158 344/933/158 252/934/158
2711
+
2712
+ v 0.257247 2.37883 1.17951
2713
+ vt -51.1661 46.4375
2714
+ f 344/933/158 254/932/158 345/935/158
2715
+
2716
+ usemtl _auto_12
2717
+ vt -17.0187 4.21354
2718
+ vt -17.1174 3.86979
2719
+ vt -17.0187 3.86979
2720
+ f 256/936/158 345/937/158 254/938/158
2721
+
2722
+ v 0.257247 2.37883 1.28429
2723
+ vt -17.1174 4.21354
2724
+ f 345/937/158 256/936/158 346/939/158
2725
+
2726
+ v 0.257247 2.12953 1.28429
2727
+ vt 6.99163 24.387
2728
+ vt 6.99163 25.2049
2729
+ f 256/680/42 347/940/42 346/941/42
2730
+
2731
+ f 256/680/42 257/679/42 347/940/42
2732
+
2733
+ v 0.230063 2.14243 1.17951
2734
+ vt -4.23109 3.86979
2735
+ vn -0.428496 -0.903544 0
2736
+ vt -4.13238 4.21354
2737
+ vt -4.23109 4.21354
2738
+ f 348/942/159 347/943/159 257/944/159
2739
+
2740
+ v 0.257247 2.12953 1.17951
2741
+ vt -4.13238 3.86979
2742
+ f 347/943/159 348/942/159 349/945/159
2743
+
2744
+ usemtl _auto_22
2745
+ vt 8.20267 40.3125
2746
+ vt 9.38716 46.4375
2747
+ vt 8.20267 46.4375
2748
+ f 273/946/159 349/947/159 348/948/159
2749
+
2750
+ v 0.257247 2.12953 1.02394
2751
+ vt 9.38716 40.3125
2752
+ f 349/947/159 273/946/159 350/949/159
2753
+
2754
+ usemtl _auto_12
2755
+ vt -4.23109 3.125
2756
+ vn -0.428496 -0.903544 -5.76693e-30
2757
+ vt -4.13238 3.35937
2758
+ vt -4.23109 3.35937
2759
+ f 274/950/160 350/951/160 273/952/160
2760
+
2761
+ vt -4.13238 3.125
2762
+ f 350/951/160 274/950/160 329/953/160
2763
+
2764
+ vt 3.27876 3.125
2765
+ vn -0.149042 -0.988831 -6.31128e-30
2766
+ v 0.286419 2.12514 1.02394
2767
+ vt 3.37555 3.35938
2768
+ vt 3.27876 3.35938
2769
+ f 329/954/161 351/955/161 350/956/161
2770
+
2771
+ vt 3.37555 3.125
2772
+ f 351/955/161 329/954/161 330/957/161
2773
+
2774
+ vt 10.6408 3.125
2775
+ vn 0.149042 -0.988831 6.31128e-30
2776
+ v 0.315591 2.12953 1.02394
2777
+ vt 10.7376 3.35938
2778
+ vt 10.6408 3.35938
2779
+ f 330/958/162 352/959/162 351/960/162
2780
+
2781
+ vt 10.7376 3.125
2782
+ f 352/959/162 330/958/162 331/961/162
2783
+
2784
+ vt 16.9398 3.125
2785
+ vn 0.428496 -0.903544 5.76693e-30
2786
+ v 0.342775 2.14243 1.02394
2787
+ vt 17.0386 3.35937
2788
+ vt 16.9398 3.35937
2789
+ f 331/962/163 353/963/163 352/964/163
2790
+
2791
+ vt 17.0386 3.125
2792
+ f 353/963/163 331/962/163 332/965/163
2793
+
2794
+ vt 21.5867 3.125
2795
+ vn 0.659998 -0.751267 -5.82531e-31
2796
+ vt 21.6887 3.35938
2797
+ vt 21.5867 3.35938
2798
+ f 332/966/164 334/967/164 353/968/164
2799
+
2800
+ vt 21.6887 3.125
2801
+ f 334/967/164 332/966/164 333/969/164
2802
+
2803
+ usemtl _auto_22
2804
+ v 0.366119 2.16293 1.17951
2805
+ vt 56.4504 46.4375
2806
+ vn 0.659998 -0.751267 0
2807
+ vt 55.2271 40.3125
2808
+ vt 56.4504 40.3125
2809
+ f 354/970/165 353/971/165 334/972/165
2810
+
2811
+ v 0.342775 2.14243 1.17951
2812
+ vt 55.2271 46.4375
2813
+ f 353/971/165 354/970/165 355/973/165
2814
+
2815
+ usemtl _auto_12
2816
+ v 0.366119 2.16293 1.28429
2817
+ vt 21.6887 4.21354
2818
+ vt 21.5867 3.86979
2819
+ vt 21.6887 3.86979
2820
+ f 356/974/165 355/975/165 354/976/165
2821
+
2822
+ v 0.342775 2.14243 1.28429
2823
+ vt 21.5867 4.21354
2824
+ f 355/975/165 356/974/165 357/977/165
2825
+
2826
+ v 0.342775 2.36594 1.28429
2827
+ vt 7.27224 25.1626
2828
+ vt 7.27224 24.4293
2829
+ vt 7.34883 24.4966
2830
+ f 358/978/42 357/979/42 356/980/42
2831
+
2832
+ v 0.315591 2.37883 1.28429
2833
+ vt 7.18305 25.2049
2834
+ f 359/981/42 357/979/42 358/978/42
2835
+
2836
+ v 0.315591 2.12953 1.28429
2837
+ vt 7.18305 24.387
2838
+ f 359/981/42 360/982/42 357/979/42
2839
+
2840
+ v 0.302688 2.25418 1.28429
2841
+ vt 7.14072 24.796
2842
+ f 359/981/42 361/983/42 360/982/42
2843
+
2844
+ v 0.301385 2.26551 1.28429
2845
+ vt 7.13644 24.8332
2846
+ f 359/981/42 362/984/42 361/983/42
2847
+
2848
+ v 0.297919 2.27509 1.28429
2849
+ vt 7.12507 24.8646
2850
+ f 359/981/42 363/985/42 362/984/42
2851
+
2852
+ v 0.29349 2.2817 1.28429
2853
+ vt 7.11054 24.8863
2854
+ f 359/981/42 364/986/42 363/985/42
2855
+
2856
+ v 0.289609 2.28511 1.28429
2857
+ vt 7.09781 24.8975
2858
+ f 359/981/42 365/987/42 364/986/42
2859
+
2860
+ v 0.28732 2.2862 1.28429
2861
+ vt 7.0903 24.901
2862
+ f 359/981/42 366/988/42 365/987/42
2863
+
2864
+ v 0.286419 2.38323 1.28429
2865
+ vt 7.08734 25.2194
2866
+ f 367/989/42 366/988/42 359/981/42
2867
+
2868
+ v 0.286419 2.28633 1.28429
2869
+ vt 7.08734 24.9015
2870
+ f 367/989/42 368/990/42 366/988/42
2871
+
2872
+ v 0.285518 2.2862 1.28429
2873
+ vt 7.08439 24.901
2874
+ f 367/989/42 369/991/42 368/990/42
2875
+
2876
+ v 0.283229 2.28511 1.28429
2877
+ vt 7.07688 24.8975
2878
+ f 367/989/42 370/992/42 369/991/42
2879
+
2880
+ v 0.279349 2.2817 1.28429
2881
+ vt 7.06414 24.8863
2882
+ f 367/989/42 371/993/42 370/992/42
2883
+
2884
+ v 0.274919 2.27509 1.28429
2885
+ vt 7.04961 24.8646
2886
+ f 367/989/42 372/994/42 371/993/42
2887
+
2888
+ v 0.271453 2.26551 1.28429
2889
+ vt 7.03824 24.8332
2890
+ f 367/989/42 373/995/42 372/994/42
2891
+
2892
+ f 346/941/42 373/995/42 367/989/42
2893
+
2894
+ v 0.27015 2.25418 1.28429
2895
+ vt 7.03397 24.796
2896
+ f 373/995/42 346/941/42 374/996/42
2897
+
2898
+ f 346/941/42 347/940/42 374/996/42
2899
+
2900
+ v 0.271453 2.24285 1.28429
2901
+ vt 7.03824 24.7588
2902
+ f 374/996/42 347/940/42 375/997/42
2903
+
2904
+ v 0.286419 2.12514 1.28429
2905
+ vt 7.08734 24.3726
2906
+ f 375/997/42 347/940/42 376/998/42
2907
+
2908
+ vt 3.27876 3.86979
2909
+ vn -0.149042 -0.988831 0
2910
+ vt 3.37555 4.21354
2911
+ vt 3.27876 4.21354
2912
+ f 349/999/166 376/1000/166 347/1001/166
2913
+
2914
+ v 0.286419 2.12514 1.17951
2915
+ vt 3.37555 3.86979
2916
+ f 376/1000/166 349/999/166 377/1002/166
2917
+
2918
+ usemtl _auto_22
2919
+ vt 24.2988 40.3125
2920
+ vt 25.4603 46.4375
2921
+ vt 24.2988 46.4375
2922
+ f 350/1003/166 377/1004/166 349/1005/166
2923
+
2924
+ vt 25.4603 40.3125
2925
+ f 377/1004/166 350/1003/166 351/1006/166
2926
+
2927
+ vt 38.4778 40.3125
2928
+ vn 0.149042 -0.988831 0
2929
+ v 0.315591 2.12953 1.17951
2930
+ vt 39.6393 46.4375
2931
+ vt 38.4778 46.4375
2932
+ f 351/1007/167 378/1008/167 377/1009/167
2933
+
2934
+ vt 39.6393 40.3125
2935
+ f 378/1008/167 351/1007/167 352/1010/167
2936
+
2937
+ vt 49.0362 40.3125
2938
+ vn 0.428496 -0.903544 0
2939
+ vt 50.2207 46.4375
2940
+ vt 49.0362 46.4375
2941
+ f 352/1011/168 355/1012/168 378/1013/168
2942
+
2943
+ vt 50.2207 40.3125
2944
+ f 355/1012/168 352/1011/168 353/1014/168
2945
+
2946
+ usemtl _auto_12
2947
+ vt 17.0386 4.21354
2948
+ vt 16.9399 3.86979
2949
+ vt 17.0386 3.86979
2950
+ f 357/1015/168 378/1016/168 355/1017/168
2951
+
2952
+ vt 16.9399 4.21354
2953
+ f 378/1016/168 357/1015/168 360/1018/168
2954
+
2955
+ vt 10.7376 4.21354
2956
+ vt 10.6408 3.86979
2957
+ vt 10.7376 3.86979
2958
+ f 360/1019/167 377/1020/167 378/1021/167
2959
+
2960
+ vt 10.6408 4.21354
2961
+ f 377/1020/167 360/1019/167 376/1022/167
2962
+
2963
+ v 0.286419 2.22203 1.28429
2964
+ vt 7.08734 24.6905
2965
+ f 379/1023/42 376/998/42 360/982/42
2966
+
2967
+ v 0.285518 2.22217 1.28429
2968
+ vt 7.08439 24.6909
2969
+ f 380/1024/42 376/998/42 379/1023/42
2970
+
2971
+ v 0.283229 2.22325 1.28429
2972
+ vt 7.07688 24.6945
2973
+ f 381/1025/42 376/998/42 380/1024/42
2974
+
2975
+ v 0.279349 2.22666 1.28429
2976
+ vt 7.06414 24.7057
2977
+ f 382/1026/42 376/998/42 381/1025/42
2978
+
2979
+ v 0.274919 2.23327 1.28429
2980
+ vt 7.04961 24.7274
2981
+ f 383/1027/42 376/998/42 382/1026/42
2982
+
2983
+ f 375/997/42 376/998/42 383/1027/42
2984
+
2985
+ vt -20.8541 4.21354
2986
+ vn -0.940357 -0.340189 0
2987
+ v 0.271453 2.24285 1.38113
2988
+ vt -20.8875 4.53125
2989
+ vt -20.8875 4.21354
2990
+ f 383/1028/169 384/1029/169 375/1030/169
2991
+
2992
+ v 0.274919 2.23327 1.38113
2993
+ vt -20.8541 4.53125
2994
+ f 384/1029/169 383/1028/169 385/1031/169
2995
+
2996
+ vt -16.5899 4.21354
2997
+ vn -0.830677 -0.556754 0
2998
+ vt -16.616 4.53125
2999
+ vt -16.616 4.21354
3000
+ f 382/1032/170 385/1033/170 383/1034/170
3001
+
3002
+ v 0.279349 2.22666 1.38113
3003
+ vt -16.5899 4.53125
3004
+ f 385/1033/170 382/1032/170 386/1035/170
3005
+
3006
+ vt -10.9986 4.21354
3007
+ vn -0.659997 -0.751268 0
3008
+ v 0.283229 2.22325 1.38113
3009
+ vt -10.9817 4.53125
3010
+ vt -10.9986 4.53125
3011
+ f 382/1036/171 387/1037/171 386/1038/171
3012
+
3013
+ vt -10.9817 4.21354
3014
+ f 387/1037/171 382/1036/171 381/1039/171
3015
+
3016
+ vt -4.18711 4.21354
3017
+ vn -0.428509 -0.903538 0
3018
+ v 0.285518 2.22217 1.38113
3019
+ vt -4.1788 4.53125
3020
+ vt -4.18711 4.53125
3021
+ f 381/1040/172 388/1041/172 387/1042/172
3022
+
3023
+ vt -4.1788 4.21354
3024
+ f 388/1041/172 381/1040/172 380/1043/172
3025
+
3026
+ vt 3.32518 4.21354
3027
+ vn -0.149104 -0.988822 0
3028
+ v 0.286419 2.22203 1.38113
3029
+ vt 3.32817 4.53125
3030
+ vt 3.32518 4.53125
3031
+ f 380/1044/173 389/1045/173 388/1046/173
3032
+
3033
+ vt 3.32817 4.21354
3034
+ f 389/1045/173 380/1044/173 379/1047/173
3035
+
3036
+ vt 10.6882 4.21354
3037
+ vn 0.149104 -0.988822 0
3038
+ v 0.28732 2.22217 1.38113
3039
+ vt 10.6912 4.53125
3040
+ vt 10.6882 4.53125
3041
+ f 379/1048/174 390/1049/174 389/1050/174
3042
+
3043
+ v 0.28732 2.22217 1.28429
3044
+ vt 10.6912 4.21354
3045
+ f 390/1049/174 379/1048/174 391/1051/174
3046
+
3047
+ vt 7.0903 24.6909
3048
+ f 379/1023/42 360/982/42 391/1052/42
3049
+
3050
+ v 0.289609 2.22325 1.28429
3051
+ vt 7.09781 24.6945
3052
+ f 391/1052/42 360/982/42 392/1053/42
3053
+
3054
+ v 0.29349 2.22666 1.28429
3055
+ vt 7.11054 24.7057
3056
+ f 392/1053/42 360/982/42 393/1054/42
3057
+
3058
+ v 0.297919 2.23327 1.28429
3059
+ vt 7.12507 24.7274
3060
+ f 393/1054/42 360/982/42 394/1055/42
3061
+
3062
+ v 0.301385 2.24285 1.28429
3063
+ vt 7.13644 24.7588
3064
+ f 394/1055/42 360/982/42 395/1056/42
3065
+
3066
+ f 395/1056/42 360/982/42 361/983/42
3067
+
3068
+ vt 25.4494 4.21354
3069
+ vn 0.993453 -0.114244 0
3070
+ v 0.301385 2.24285 1.38113
3071
+ vt 25.412 4.53125
3072
+ vt 25.412 4.21354
3073
+ f 361/1057/175 396/1058/175 395/1059/175
3074
+
3075
+ v 0.302688 2.25418 1.38113
3076
+ vt 25.4494 4.53125
3077
+ f 396/1058/175 361/1057/175 397/1060/175
3078
+
3079
+ vt 23.8553 4.21354
3080
+ vn 0.993453 0.114241 0
3081
+ vt 23.8179 4.53125
3082
+ vt 23.8179 4.21354
3083
+ f 362/1061/176 397/1062/176 361/1063/176
3084
+
3085
+ v 0.301385 2.26551 1.38113
3086
+ vt 23.8553 4.53125
3087
+ f 397/1062/176 362/1061/176 398/1064/176
3088
+
3089
+ vt 20.9574 4.21354
3090
+ vn 0.940349 0.340211 0
3091
+ vt 20.924 4.53125
3092
+ vt 20.924 4.21354
3093
+ f 363/1065/177 398/1066/177 362/1067/177
3094
+
3095
+ v 0.297919 2.27509 1.38113
3096
+ vt 20.9574 4.53125
3097
+ f 398/1066/177 363/1065/177 399/1068/177
3098
+
3099
+ vt 16.714 4.21354
3100
+ vn 0.830677 0.556754 0
3101
+ vt 16.6879 4.53125
3102
+ vt 16.6879 4.21354
3103
+ f 364/1069/178 399/1070/178 363/1071/178
3104
+
3105
+ v 0.29349 2.2817 1.38113
3106
+ vt 16.714 4.53125
3107
+ f 399/1070/178 364/1069/178 400/1072/178
3108
+
3109
+ vt 11.083 4.21354
3110
+ vn 0.660021 0.751247 0
3111
+ v 0.289609 2.28511 1.38113
3112
+ vt 11.0999 4.53125
3113
+ vt 11.083 4.53125
3114
+ f 364/1073/179 401/1074/179 400/1075/179
3115
+
3116
+ vt 11.0999 4.21354
3117
+ f 401/1074/179 364/1073/179 365/1076/179
3118
+
3119
+ vt 4.25516 4.21354
3120
+ vn 0.428509 0.903538 0
3121
+ v 0.28732 2.2862 1.38113
3122
+ vt 4.26347 4.53125
3123
+ vt 4.25516 4.53125
3124
+ f 365/1077/180 402/1078/180 401/1079/180
3125
+
3126
+ vt 4.26347 4.21354
3127
+ f 402/1078/180 365/1077/180 366/1080/180
3128
+
3129
+ vt -3.29972 4.21354
3130
+ vn 0.148831 0.988863 0
3131
+ v 0.286419 2.28633 1.38113
3132
+ vt -3.29673 4.53125
3133
+ vt -3.29972 4.53125
3134
+ f 366/1081/181 403/1082/181 402/1083/181
3135
+
3136
+ vt -3.29673 4.21354
3137
+ f 403/1082/181 366/1081/181 368/1084/181
3138
+
3139
+ vt -10.7196 4.21354
3140
+ vn -0.148831 0.988863 0
3141
+ v 0.285518 2.2862 1.38113
3142
+ vt -10.7166 4.53125
3143
+ vt -10.7196 4.53125
3144
+ f 368/1085/182 404/1086/182 403/1087/182
3145
+
3146
+ vt -10.7166 4.21354
3147
+ f 404/1086/182 368/1085/182 369/1088/182
3148
+
3149
+ vt -17.0709 4.21354
3150
+ vn -0.428509 0.903538 0
3151
+ v 0.283229 2.28511 1.38113
3152
+ vt -17.0626 4.53125
3153
+ vt -17.0709 4.53125
3154
+ f 369/1089/183 405/1090/183 404/1091/183
3155
+
3156
+ vt -17.0626 4.21354
3157
+ f 405/1090/183 369/1089/183 370/1092/183
3158
+
3159
+ vt -21.7489 4.21354
3160
+ vn -0.659997 0.751268 0
3161
+ v 0.279349 2.2817 1.38113
3162
+ vt -21.7319 4.53125
3163
+ vt -21.7489 4.53125
3164
+ f 370/1093/184 406/1094/184 405/1095/184
3165
+
3166
+ vt -21.7319 4.21354
3167
+ f 406/1094/184 370/1093/184 371/1096/184
3168
+
3169
+ vt -24.5795 4.21354
3170
+ vn -0.830677 0.556754 0
3171
+ vt -24.6056 4.53125
3172
+ vt -24.6056 4.21354
3173
+ f 372/1097/185 406/1098/185 371/1099/185
3174
+
3175
+ v 0.274919 2.27509 1.38113
3176
+ vt -24.5795 4.53125
3177
+ f 406/1098/185 372/1097/185 407/1100/185
3178
+
3179
+ vt -25.7463 4.21354
3180
+ vn -0.940357 0.340189 0
3181
+ vt -25.7798 4.53125
3182
+ vt -25.7798 4.21354
3183
+ f 373/1101/186 407/1102/186 372/1103/186
3184
+
3185
+ v 0.271453 2.26551 1.38113
3186
+ vt -25.7463 4.53125
3187
+ f 407/1102/186 373/1101/186 408/1104/186
3188
+
3189
+ vt -25.4372 4.21354
3190
+ vn -0.993453 0.114241 0
3191
+ vt -25.4746 4.53125
3192
+ vt -25.4746 4.21354
3193
+ f 374/1105/187 408/1106/187 373/1107/187
3194
+
3195
+ v 0.27015 2.25418 1.38113
3196
+ vt -25.4372 4.53125
3197
+ f 408/1106/187 374/1105/187 409/1108/187
3198
+
3199
+ vt -23.7927 4.21354
3200
+ vn -0.993453 -0.114244 0
3201
+ vt -23.8301 4.53125
3202
+ vt -23.8301 4.21354
3203
+ f 375/1109/188 409/1110/188 374/1111/188
3204
+
3205
+ vt -23.7927 4.53125
3206
+ f 409/1110/188 375/1109/188 384/1112/188
3207
+
3208
+ vt 7.03396 24.796
3209
+ f 384/997/42 408/995/42 409/1113/42
3210
+
3211
+ f 408/995/42 384/997/42 385/1027/42
3212
+
3213
+ f 408/995/42 385/1027/42 407/994/42
3214
+
3215
+ f 407/994/42 385/1027/42 386/1026/42
3216
+
3217
+ f 407/994/42 386/1026/42 406/993/42
3218
+
3219
+ vt 7.07687 24.6945
3220
+ f 406/993/42 386/1026/42 387/1114/42
3221
+
3222
+ vt 7.07687 24.8975
3223
+ f 406/993/42 387/1114/42 405/1115/42
3224
+
3225
+ vt 7.08438 24.691
3226
+ f 405/1115/42 387/1114/42 388/1116/42
3227
+
3228
+ vt 7.08438 24.901
3229
+ f 405/1115/42 388/1116/42 404/1117/42
3230
+
3231
+ f 404/1117/42 388/1116/42 389/1023/42
3232
+
3233
+ f 404/1117/42 389/1023/42 403/990/42
3234
+
3235
+ vt 7.09029 24.691
3236
+ f 403/990/42 389/1023/42 390/1118/42
3237
+
3238
+ vt 7.09029 24.901
3239
+ f 403/990/42 390/1118/42 402/1119/42
3240
+
3241
+ v 0.289609 2.22325 1.38113
3242
+ vt 7.0978 24.6945
3243
+ f 402/1119/42 390/1118/42 410/1120/42
3244
+
3245
+ vt 16.9863 4.21354
3246
+ vn 0.428509 -0.903538 0
3247
+ vt 16.9946 4.53125
3248
+ vt 16.9863 4.53125
3249
+ f 391/1121/189 410/1122/189 390/1123/189
3250
+
3251
+ vt 16.9946 4.21354
3252
+ f 410/1122/189 391/1121/189 392/1124/189
3253
+
3254
+ vt 21.6307 4.21354
3255
+ vn 0.660021 -0.751247 0
3256
+ v 0.29349 2.22666 1.38113
3257
+ vt 21.6476 4.53125
3258
+ vt 21.6307 4.53125
3259
+ f 392/1125/190 411/1126/190 410/1127/190
3260
+
3261
+ vt 21.6476 4.21354
3262
+ f 411/1126/190 392/1125/190 393/1128/190
3263
+
3264
+ vt 24.5075 4.21354
3265
+ vn 0.830677 -0.556754 0
3266
+ vt 24.4814 4.53125
3267
+ vt 24.4814 4.21354
3268
+ f 394/1129/191 411/1130/191 393/1131/191
3269
+
3270
+ v 0.297919 2.23327 1.38113
3271
+ vt 24.5075 4.53125
3272
+ f 411/1130/191 394/1129/191 412/1132/191
3273
+
3274
+ vt 25.7098 4.21354
3275
+ vn 0.940349 -0.340211 0
3276
+ vt 25.6764 4.53125
3277
+ vt 25.6764 4.21354
3278
+ f 395/1133/192 412/1134/192 394/1135/192
3279
+
3280
+ vt 25.7098 4.53125
3281
+ f 412/1134/192 395/1133/192 396/1136/192
3282
+
3283
+ f 399/985/42 412/1055/42 396/1056/42
3284
+
3285
+ vt 7.11053 24.8863
3286
+ f 400/1137/42 412/1055/42 399/985/42
3287
+
3288
+ vt 7.11053 24.7057
3289
+ f 400/1137/42 411/1138/42 412/1055/42
3290
+
3291
+ vt 7.0978 24.8975
3292
+ f 401/1139/42 411/1138/42 400/1137/42
3293
+
3294
+ f 401/1139/42 410/1120/42 411/1138/42
3295
+
3296
+ f 402/1119/42 410/1120/42 401/1139/42
3297
+
3298
+ f 399/985/42 396/1056/42 398/984/42
3299
+
3300
+ vt 7.14071 24.796
3301
+ f 398/984/42 396/1056/42 397/1140/42
3302
+
3303
+ v 0.286419 2.38323 1.17951
3304
+ vt -10.767 3.86979
3305
+ vn -0.149051 0.98883 0
3306
+ vt -10.6702 4.21354
3307
+ vt -10.767 4.21354
3308
+ f 413/1141/193 346/1142/193 367/1143/193
3309
+
3310
+ vt -10.6702 3.86979
3311
+ f 346/1142/193 413/1141/193 345/1144/193
3312
+
3313
+ usemtl _auto_22
3314
+ vt -39.9926 40.3125
3315
+ vt -38.8311 46.4375
3316
+ vt -39.9926 46.4375
3317
+ f 343/1145/193 345/1146/193 413/1147/193
3318
+
3319
+ vt -38.8311 40.3125
3320
+ f 345/1146/193 343/1145/193 344/1148/193
3321
+
3322
+ vt -23.9454 46.4375
3323
+ vn 0.149051 0.98883 0
3324
+ vt -25.1069 40.3125
3325
+ vt -23.9454 40.3125
3326
+ f 413/1149/194 342/1150/194 343/1151/194
3327
+
3328
+ v 0.315591 2.37883 1.17951
3329
+ vt -25.1069 46.4375
3330
+ f 342/1150/194 413/1149/194 414/1152/194
3331
+
3332
+ usemtl _auto_12
3333
+ vt -3.24934 4.21354
3334
+ vt -3.34614 3.86979
3335
+ vt -3.24934 3.86979
3336
+ f 367/1153/194 414/1154/194 413/1155/194
3337
+
3338
+ vt -3.34614 4.21354
3339
+ f 414/1154/194 367/1153/194 359/1156/194
3340
+
3341
+ vt 4.30989 4.21354
3342
+ vn 0.428489 0.903547 0
3343
+ v 0.342775 2.36594 1.17951
3344
+ vt 4.21118 3.86979
3345
+ vt 4.30989 3.86979
3346
+ f 359/1157/195 415/1158/195 414/1159/195
3347
+
3348
+ vt 4.21118 4.21354
3349
+ f 415/1158/195 359/1157/195 358/1160/195
3350
+
3351
+ vt 11.1439 4.21354
3352
+ vn 0.659998 0.751267 0
3353
+ v 0.366119 2.34543 1.17951
3354
+ vt 11.042 3.86979
3355
+ vt 11.1439 3.86979
3356
+ f 358/1161/196 416/1162/196 415/1163/196
3357
+
3358
+ v 0.366119 2.34543 1.28429
3359
+ vt 11.042 4.21354
3360
+ f 416/1162/196 358/1161/196 417/1164/196
3361
+
3362
+ vt 7.34883 25.0953
3363
+ f 358/978/42 356/980/42 417/1165/42
3364
+
3365
+ v 0.384031 2.18966 1.28429
3366
+ vt 7.4076 24.5843
3367
+ f 417/1165/42 356/980/42 418/1166/42
3368
+
3369
+ vt 24.4404 4.21354
3370
+ vn 0.830686 -0.556741 0
3371
+ v 0.384031 2.18966 1.17951
3372
+ vt 24.546 3.86979
3373
+ vt 24.546 4.21354
3374
+ f 356/1167/197 419/1168/197 418/1169/197
3375
+
3376
+ vt 24.4404 3.86979
3377
+ f 419/1168/197 356/1167/197 354/1170/197
3378
+
3379
+ usemtl _auto_22
3380
+ vt 57.259 46.4375
3381
+ vt 58.5257 40.3125
3382
+ vt 58.5257 46.4375
3383
+ f 354/1171/197 335/1172/197 419/1173/197
3384
+
3385
+ vt 57.259 40.3125
3386
+ f 335/1172/197 354/1171/197 334/1174/197
3387
+
3388
+ vt 57.0636 40.3125
3389
+ vn 0.940352 -0.340203 0
3390
+ vt 55.7606 46.4375
3391
+ vt 55.7606 40.3125
3392
+ f 336/1175/198 419/1176/198 335/1177/198
3393
+
3394
+ v 0.395291 2.22078 1.17951
3395
+ vt 57.0636 46.4375
3396
+ f 419/1176/198 336/1175/198 420/1178/198
3397
+
3398
+ vt 52.6322 40.3125
3399
+ vn 0.993453 -0.114243 0
3400
+ vt 51.3086 46.4375
3401
+ vt 51.3086 40.3125
3402
+ f 337/1179/199 420/1180/199 336/1181/199
3403
+
3404
+ v 0.399132 2.25418 1.17951
3405
+ vt 52.6322 46.4375
3406
+ f 420/1180/199 337/1179/199 421/1182/199
3407
+
3408
+ vt 45.555 40.3125
3409
+ vn 0.993453 0.114242 0
3410
+ vt 44.2314 46.4375
3411
+ vt 44.2314 40.3125
3412
+ f 338/1183/200 421/1184/200 337/1185/200
3413
+
3414
+ v 0.395291 2.28758 1.17951
3415
+ vt 45.555 46.4375
3416
+ f 421/1184/200 338/1183/200 422/1186/200
3417
+
3418
+ vt 35.9256 40.3125
3419
+ vn 0.940352 0.340203 0
3420
+ vt 34.6225 46.4375
3421
+ vt 34.6225 40.3125
3422
+ f 339/1187/201 422/1188/201 338/1189/201
3423
+
3424
+ v 0.384031 2.3187 1.17951
3425
+ vt 35.9256 46.4375
3426
+ f 422/1188/201 339/1187/201 423/1190/201
3427
+
3428
+ vt 23.7345 40.3125
3429
+ vn 0.830686 0.556741 0
3430
+ vt 22.4679 46.4375
3431
+ vt 22.4679 40.3125
3432
+ f 340/1191/202 423/1192/202 339/1193/202
3433
+
3434
+ vt 23.7345 46.4375
3435
+ f 423/1192/202 340/1191/202 416/1194/202
3436
+
3437
+ vt 7.90068 40.3125
3438
+ vt 9.12399 46.4375
3439
+ vt 7.90068 46.4375
3440
+ f 340/1195/196 415/1196/196 416/1197/196
3441
+
3442
+ vt 9.12399 40.3125
3443
+ f 415/1196/196 340/1195/196 341/1198/196
3444
+
3445
+ vt -8.442 40.3125
3446
+ vt -7.25751 46.4375
3447
+ vt -8.442 46.4375
3448
+ f 341/1199/195 414/1200/195 415/1201/195
3449
+
3450
+ vt -7.25751 40.3125
3451
+ f 414/1200/195 341/1199/195 342/1202/195
3452
+
3453
+ usemtl _auto_12
3454
+ vt 16.755 3.86979
3455
+ v 0.384031 2.3187 1.28429
3456
+ vt 16.6495 4.21354
3457
+ vt 16.6495 3.86979
3458
+ f 416/1203/202 424/1204/202 423/1205/202
3459
+
3460
+ vt 16.755 4.21354
3461
+ f 424/1204/202 416/1203/202 417/1206/202
3462
+
3463
+ vt 7.4076 25.0077
3464
+ f 417/1165/42 418/1166/42 424/1207/42
3465
+
3466
+ v 0.395291 2.22078 1.28429
3467
+ vt 7.44454 24.6864
3468
+ f 424/1207/42 418/1166/42 425/1208/42
3469
+
3470
+ vt 25.638 4.21354
3471
+ vt 25.7466 3.86979
3472
+ vt 25.7466 4.21354
3473
+ f 418/1209/198 420/1210/198 425/1211/198
3474
+
3475
+ vt 25.638 3.86979
3476
+ f 420/1210/198 418/1209/198 419/1212/198
3477
+
3478
+ vt 25.4856 3.86979
3479
+ vt 25.3753 4.21354
3480
+ vt 25.3753 3.86979
3481
+ f 421/1213/199 425/1214/199 420/1215/199
3482
+
3483
+ v 0.399132 2.25418 1.28429
3484
+ vt 25.4856 4.21354
3485
+ f 425/1214/199 421/1213/199 426/1216/199
3486
+
3487
+ vt 23.8921 3.86979
3488
+ vt 23.7818 4.21354
3489
+ vt 23.7818 3.86979
3490
+ f 422/1217/200 426/1218/200 421/1219/200
3491
+
3492
+ v 0.395291 2.28758 1.28429
3493
+ vt 23.8921 4.21354
3494
+ f 426/1218/200 422/1217/200 427/1220/200
3495
+
3496
+ vt 20.9958 3.86979
3497
+ vt 20.8873 4.21354
3498
+ vt 20.8873 3.86979
3499
+ f 423/1221/201 427/1222/201 422/1223/201
3500
+
3501
+ vt 20.9958 4.21354
3502
+ f 427/1222/201 423/1221/201 424/1224/201
3503
+
3504
+ vt 7.44454 24.9055
3505
+ f 424/1207/42 425/1208/42 427/1225/42
3506
+
3507
+ vt 7.45714 24.796
3508
+ f 427/1225/42 425/1208/42 426/1226/42
3509
+
3510
+ usemtl _auto_22
3511
+ vt -6.64968 46.4375
3512
+ vn -0.659994 -0.751271 0
3513
+ vt -7.873 40.3125
3514
+ vt -6.64968 40.3125
3515
+ f 348/1227/203 272/1228/203 273/1229/203
3516
+
3517
+ v 0.206719 2.16293 1.17951
3518
+ vt -7.873 46.4375
3519
+ f 272/1228/203 348/1227/203 428/1230/203
3520
+
3521
+ usemtl _auto_12
3522
+ vt -10.9377 4.21354
3523
+ vt -11.0397 3.86979
3524
+ vt -10.9377 3.86979
3525
+ f 257/1231/203 428/1232/203 348/1233/203
3526
+
3527
+ vt -11.0397 4.21354
3528
+ f 428/1232/203 257/1231/203 258/1234/203
3529
+
3530
+ vt -16.6544 4.21354
3531
+ vn -0.83069 -0.556735 0
3532
+ vt -16.5488 3.86979
3533
+ vt -16.5488 4.21354
3534
+ f 260/1235/204 428/1236/204 258/1237/204
3535
+
3536
+ v 0.188807 2.18966 1.17951
3537
+ vt -16.6544 3.86979
3538
+ f 428/1236/204 260/1235/204 429/1238/204
3539
+
3540
+ vt -20.9242 4.21354
3541
+ vn -0.940349 -0.34021 0
3542
+ vt -20.8156 3.86979
3543
+ vt -20.8156 4.21354
3544
+ f 262/1239/205 429/1240/205 260/1241/205
3545
+
3546
+ v 0.177547 2.22078 1.17951
3547
+ vt -20.9242 3.86979
3548
+ f 429/1240/205 262/1239/205 430/1242/205
3549
+
3550
+ vt -23.8663 4.21354
3551
+ vt -23.756 3.86979
3552
+ vt -23.756 4.21354
3553
+ f 263/1243/123 430/1244/123 262/1245/123
3554
+
3555
+ vt -23.8663 3.86979
3556
+ f 430/1244/123 263/1243/123 264/1246/123
3557
+
3558
+ usemtl _auto_22
3559
+ vt -45.2455 46.4375
3560
+ vt -43.9219 40.3125
3561
+ vt -43.9219 46.4375
3562
+ f 264/1247/123 270/1248/123 430/1249/123
3563
+
3564
+ vt -45.2455 40.3125
3565
+ f 270/1248/123 264/1247/123 269/1250/123
3566
+
3567
+ vt -52.9417 46.4375
3568
+ vt -51.6181 40.3125
3569
+ vt -51.6181 46.4375
3570
+ f 265/1251/117 269/1252/117 264/1253/117
3571
+
3572
+ vt -52.9417 40.3125
3573
+ f 269/1252/117 265/1251/117 268/1254/117
3574
+
3575
+ vt -57.9233 46.4375
3576
+ vt -56.6202 40.3125
3577
+ vt -56.6202 46.4375
3578
+ f 266/1255/118 268/1256/118 265/1257/118
3579
+
3580
+ vt -57.9233 40.3125
3581
+ f 268/1256/118 266/1255/118 267/1258/118
3582
+
3583
+ vt -33.7626 40.3125
3584
+ vt -35.0657 46.4375
3585
+ vt -35.0657 40.3125
3586
+ f 271/1259/205 430/1260/205 270/1261/205
3587
+
3588
+ vt -33.7626 46.4375
3589
+ f 430/1260/205 271/1259/205 429/1262/205
3590
+
3591
+ vt -21.2603 40.3125
3592
+ vt -22.527 46.4375
3593
+ vt -22.527 40.3125
3594
+ f 272/1263/204 429/1264/204 271/1265/204
3595
+
3596
+ vt -21.2603 46.4375
3597
+ f 429/1264/204 272/1263/204 428/1266/204
3598
+
3599
+ usemtl _auto_17
3600
+ v 0.0424862 1.79979 1.44621
3601
+ vt -22.7265 30.8615
3602
+ vt -30.414 34.7519
3603
+ vt -30.414 30.8615
3604
+ f 431/1267/44 326/1268/44 282/1269/44
3605
+
3606
+ v 0.0424862 1.8986 1.44621
3607
+ vt -22.7265 34.7519
3608
+ f 326/1268/44 431/1267/44 432/1270/44
3609
+
3610
+ usemtl _auto_3
3611
+ v 0.0424862 1.8986 1.49701
3612
+ vt -5.25098 1.09144
3613
+ f 431/750/4 433/1271/4 432/864/4
3614
+
3615
+ v 0.0424862 1.79979 1.49701
3616
+ vt -5.17893 1.09144
3617
+ f 433/1271/4 431/750/4 434/1272/4
3618
+
3619
+ usemtl _auto_17
3620
+ vt 22.7265 56.9375
3621
+ v 0.237749 1.79979 1.49701
3622
+ vt 30.414 58.9375
3623
+ vt 22.7265 58.9375
3624
+ f 431/1273/43 435/1274/43 434/1275/43
3625
+
3626
+ vt 30.414 56.9375
3627
+ f 435/1274/43 431/1273/43 282/1276/43
3628
+
3629
+ vt -4.26103 56.9375
3630
+ vn -0.769731 -0.638369 0
3631
+ vt -4.33967 58.9375
3632
+ vt -4.33967 56.9375
3633
+ f 285/1277/206 435/1278/206 282/1279/206
3634
+
3635
+ v 0.239024 1.79825 1.49701
3636
+ vt -4.26103 58.9375
3637
+ f 435/1278/206 285/1277/206 436/1280/206
3638
+
3639
+ vt 30.4642 58.9375
3640
+ f 285/793/43 306/794/43 436/1281/43
3641
+
3642
+ usemtl _auto_3
3643
+ f 314/852/42 436/797/42 306/796/42
3644
+
3645
+ v 0.238076 1.89907 1.49701
3646
+ vt 1.53972 5.25131
3647
+ f 437/1282/42 436/797/42 314/852/42
3648
+
3649
+ v 0.237749 1.8986 1.49701
3650
+ vt 1.53948 5.25098
3651
+ f 438/1283/42 436/797/42 437/1282/42
3652
+
3653
+ vt 1.53948 5.17893
3654
+ f 438/1283/42 435/1284/42 436/797/42
3655
+
3656
+ vt 1.39712 5.25098
3657
+ f 433/1285/42 435/1284/42 438/1283/42
3658
+
3659
+ vt 1.39712 5.17893
3660
+ f 435/1284/42 433/1285/42 434/1286/42
3661
+
3662
+ vt -1.39712 1.09144
3663
+ vt -1.53948 1.09144
3664
+ f 326/859/41 433/1287/41 438/1288/41
3665
+
3666
+ vt -1.39712 1.0544
3667
+ f 433/1287/41 326/859/41 432/1289/41
3668
+
3669
+ vt 0.00452165 0.037037
3670
+ vn -0.815848 0.578266 0
3671
+ vt 0.00493174 -1.11022e-15
3672
+ vt 0.00493174 0.037037
3673
+ f 437/1290/207 326/1291/207 438/1292/207
3674
+
3675
+ v 0.238076 1.89907 1.44621
3676
+ vt 0.00452165 -1.11022e-15
3677
+ f 326/1291/207 437/1290/207 439/1293/207
3678
+
3679
+ vn -0.638374 0.769727 0
3680
+ vt 0 2.22045e-16
3681
+ vt 0.00452165 2.22045e-16
3682
+ f 437/1290/208 315/1294/208 439/1295/208
3683
+
3684
+ vt 0 0.037037
3685
+ f 315/1294/208 437/1290/208 314/1296/208
3686
+
3687
+ usemtl _auto_17
3688
+ vt 30.414 34.9259
3689
+ vt 30.4269 34.7701
3690
+ vt 30.6148 34.9259
3691
+ f 323/1297/42 439/1298/42 315/1299/42
3692
+
3693
+ vt 30.414 34.7519
3694
+ f 439/1298/42 323/1297/42 326/1300/42
3695
+
3696
+ usemtl _auto_3
3697
+ f 314/852/42 306/796/42 313/822/42
3698
+
3699
+ usemtl _auto_17
3700
+ vt 30.4642 30.8009
3701
+ vt 30.414 30.8615
3702
+ vt 30.414 30.8009
3703
+ f 285/1301/42 282/1302/42 284/1303/42
3704
+
3705
+ usemtl _auto_3
3706
+ v 0.28948 1.92268 1.44621
3707
+ vt 1.5772 5.26853
3708
+ f 322/851/42 303/822/42 440/1304/42
3709
+
3710
+ v 0.308691 1.92089 1.44621
3711
+ vt 1.5912 5.26722
3712
+ f 440/1304/42 303/822/42 441/1305/42
3713
+
3714
+ v 0.326783 1.91418 1.44621
3715
+ vt 1.60439 5.26234
3716
+ f 441/1305/42 303/822/42 442/1306/42
3717
+
3718
+ vt 1.72009 0.694444
3719
+ vn 0.578273 0.815843 4.16232e-19
3720
+ vt 1.73415 1.0544
3721
+ vt 1.72009 1.0544
3722
+ f 302/1307/209 442/1308/209 303/1309/209
3723
+
3724
+ vt 1.72009 0.677083
3725
+ f 318/1310/209 442/1308/209 302/1307/209
3726
+
3727
+ v 0.326783 1.91418 0.928688
3728
+ vt 1.73415 0.677083
3729
+ f 442/1308/209 318/1310/209 443/1311/209
3730
+
3731
+ usemtl _auto_17
3732
+ v 0.308691 1.92089 0.928688
3733
+ vt -33.207 35.6291
3734
+ vt -33.9193 35.3652
3735
+ f 318/843/44 444/1312/44 443/1313/44
3736
+
3737
+ v 0.28948 1.92268 0.928688
3738
+ vt -32.4507 35.6996
3739
+ f 318/843/44 445/1314/44 444/1312/44
3740
+
3741
+ f 318/843/44 320/845/44 445/1314/44
3742
+
3743
+ usemtl _auto_3
3744
+ vt -2.42575 1.0544
3745
+ vn -0.167982 0.98579 1.79696e-19
3746
+ vt -2.43981 0.677083
3747
+ vt -2.42575 0.677083
3748
+ f 322/1315/210 445/1316/210 320/1317/210
3749
+
3750
+ vt -2.43981 1.0544
3751
+ f 445/1316/210 322/1315/210 440/1318/210
3752
+
3753
+ vt -1.08103 1.0544
3754
+ vn 0.0928774 0.995678 -2.64768e-31
3755
+ vt -1.0951 0.677083
3756
+ vt -1.08103 0.677083
3757
+ f 440/1319/211 444/1320/211 445/1321/211
3758
+
3759
+ vt -1.0951 1.0544
3760
+ f 444/1320/211 440/1319/211 441/1322/211
3761
+
3762
+ vt 0.337832 1.0544
3763
+ vn 0.347417 0.937711 -1.43576e-31
3764
+ vt 0.323765 0.677083
3765
+ vt 0.337832 0.677083
3766
+ f 441/1323/212 443/1324/212 444/1325/212
3767
+
3768
+ vt 0.323765 1.0544
3769
+ f 443/1324/212 441/1323/212 442/1326/212
3770
+
3771
+ vt 3.33067e-16 0.359954
3772
+ vn -0.769715 -0.638387 8.53068e-32
3773
+ vt 0.00343389 -1.11022e-16
3774
+ f 285/1327/213 287/1328/213 307/801/213
3775
+
3776
+ vt 3.33067e-16 -1.11022e-16
3777
+ f 287/1328/213 285/1327/213 286/1329/213
3778
+
3779
+ usemtl _auto_20
3780
+ f 248/661/42 247/663/42 173/445/42
3781
+
3782
+ v 0.14471 1.95684 0.9525
3783
+ vt 6.62241 31.7607
3784
+ f 173/445/42 247/663/42 446/1330/42
3785
+
3786
+ usemtl _auto_23
3787
+ vt -33.7114 49.1324
3788
+ vn -0.870448 -0.228921 0.435793
3789
+ vt -27.5493 40.0356
3790
+ vt -29.0226 49.1324
3791
+ f 247/1331/214 246/1332/214 446/1333/214
3792
+
3793
+ vt -33.6845 46.9113
3794
+ vn -0.904322 -0.105827 0.413525
3795
+ vt -31.6699 37.9189
3796
+ vt -29.2202 37.9189
3797
+ f 446/1334/215 246/1335/215 245/1336/215
3798
+
3799
+ vt -34.6878 46.2612
3800
+ vn -0.913514 -0.0763596 0.399575
3801
+ vt -30.1029 37.3297
3802
+ vt -29.8046 46.2612
3803
+ f 446/1337/216 245/1338/216 172/1339/216
3804
+
3805
+ usemtl _auto_20
3806
+ f 173/445/42 446/1330/42 172/444/42
3807
+
3808
+ usemtl _auto_23
3809
+ vt -29.6333 33.123
3810
+ vn -0.600913 0.497222 0.625838
3811
+ vt -30.8861 22.6256
3812
+ vt -25.7551 33.123
3813
+ f 169/1340/217 226/1341/217 168/1342/217
3814
+
3815
+ vt -26.4319 25.9592
3816
+ vn -0.395679 0.60651 0.689625
3817
+ vt -29.3806 14.6531
3818
+ vt -22.9943 25.9592
3819
+ f 168/1343/218 226/1344/218 167/1345/218
3820
+
3821
+ usemtl _auto_8
3822
+ vt 12.7729 1.97215e-31
3823
+ vt 10.3667 1.5625
3824
+ vt 10.3667 1.97215e-31
3825
+ f 137/1346/24 128/1347/24 129/1348/24
3826
+
3827
+ vt 12.7729 1.5625
3828
+ f 128/1347/24 137/1346/24 138/1349/24
3829
+
3830
+ usemtl _auto_24
3831
+ vt -22.1356 3.51563
3832
+ vt -21.1408 3.46875
3833
+ vt -21.1408 3.51563
3834
+ f 180/1350/4 183/1351/4 185/1352/4
3835
+
3836
+ vt -22.1356 3.46875
3837
+ f 183/1351/4 180/1350/4 182/1353/4
3838
+
3839
+ usemtl _auto_8
3840
+ f 115/279/4 113/281/4 120/286/4
3841
+
3842
+ v -0.490316 2.30941 0.284761
3843
+ vt -12.4886 0.46713
3844
+ f 447/1354/4 120/286/4 113/281/4
3845
+
3846
+ v -0.490316 2.13093 0.315544
3847
+ vt -12.1958 0.517626
3848
+ f 448/1355/4 120/286/4 447/1354/4
3849
+
3850
+ v -0.490316 2.13093 0.852119
3851
+ vt -12.1958 1.39783
3852
+ f 449/1356/4 120/286/4 448/1355/4
3853
+
3854
+ f 118/284/4 120/286/4 449/1356/4
3855
+
3856
+ v -0.433166 2.06392 0.803827
3857
+ vt -12.0859 -0.954026
3858
+ vn -0.645428 1.24638e-18 -0.763821
3859
+ vt -10.9744 -0.831287
3860
+ vt -12.1958 -0.831287
3861
+ f 450/1357/219 118/1358/219 449/1359/219
3862
+
3863
+ v -0.433166 1.4534 0.803827
3864
+ vt -11.0844 -0.954026
3865
+ f 118/1358/219 450/1357/219 451/1360/219
3866
+
3867
+ v -0.490316 2.06392 0.803827
3868
+ vt 2.2695 12.0859
3869
+ vt 2.36325 11.0844
3870
+ vt 2.36325 12.0859
3871
+ f 452/1361/42 451/1362/42 450/1363/42
3872
+
3873
+ v -0.490316 1.4534 0.803827
3874
+ vt 2.2695 11.0844
3875
+ f 451/1362/42 452/1361/42 453/1364/42
3876
+
3877
+ v -0.490316 1.47649 0.688107
3878
+ vt -11.1222 1.12879
3879
+ vt -11.0844 1.31861
3880
+ vt -12.0859 1.31861
3881
+ f 454/1365/4 453/1366/4 452/1367/4
3882
+
3883
+ v -0.490316 1.4534 0.363835
3884
+ vt -11.0844 0.596843
3885
+ f 453/1366/4 454/1365/4 455/1368/4
3886
+
3887
+ v -0.490316 1.47649 0.488082
3888
+ vt -11.1222 0.80066
3889
+ f 456/1369/4 455/1368/4 454/1365/4
3890
+
3891
+ v -0.490316 2.06392 0.363835
3892
+ vt -12.0859 0.596843
3893
+ f 455/1368/4 456/1369/4 457/1370/4
3894
+
3895
+ v -0.490316 1.49236 0.488082
3896
+ vt -11.1483 0.80066
3897
+ f 457/1370/4 456/1369/4 458/1371/4
3898
+
3899
+ usemtl _auto_3
3900
+ v -0.534766 1.47649 0.488082
3901
+ vt -0.976258 4.94322
3902
+ vt -1.00866 4.9548
3903
+ vt -1.00866 4.94322
3904
+ f 459/1372/44 458/1373/44 456/1374/44
3905
+
3906
+ v -0.534766 1.49236 0.488082
3907
+ vt -0.976258 4.9548
3908
+ f 458/1373/44 459/1372/44 460/1375/44
3909
+
3910
+ vt -4.94322 0.355849
3911
+ v -0.534766 1.49236 0.688107
3912
+ vt -4.9548 0.501682
3913
+ vt -4.9548 0.355849
3914
+ f 459/1376/4 461/1377/4 460/1378/4
3915
+
3916
+ v -0.534766 1.47649 0.688107
3917
+ vt -4.94322 0.501682
3918
+ f 461/1377/4 459/1376/4 462/1379/4
3919
+
3920
+ vt 0.976258 0.355849
3921
+ v -0.519333 1.47649 0.502263
3922
+ vt 0.98751 0.366188
3923
+ vt 0.976258 0.501682
3924
+ f 459/1380/43 463/1381/43 462/1382/43
3925
+
3926
+ v -0.490316 1.47649 0.502263
3927
+ vt 1.00866 0.366188
3928
+ f 459/1380/43 464/1383/43 463/1381/43
3929
+
3930
+ vt 1.00866 0.355849
3931
+ f 464/1383/43 459/1380/43 456/1384/43
3932
+
3933
+ usemtl _auto_8
3934
+ v -0.490316 1.47649 0.67139
3935
+ vt -11.1222 1.10136
3936
+ vt -11.1222 0.823923
3937
+ f 456/1369/4 465/1385/4 464/1386/4
3938
+
3939
+ f 456/1369/4 454/1365/4 465/1385/4
3940
+
3941
+ usemtl _auto_3
3942
+ vt 1.00866 0.501682
3943
+ v -0.519333 1.47649 0.67139
3944
+ vt 0.98751 0.489494
3945
+ vt 1.00866 0.489494
3946
+ f 454/1387/43 466/1388/43 465/1389/43
3947
+
3948
+ f 462/1382/43 466/1388/43 454/1387/43
3949
+
3950
+ f 462/1382/43 463/1381/43 466/1388/43
3951
+
3952
+ v -0.519333 1.49236 0.502263
3953
+ vt 4.9548 0.366188
3954
+ vt 4.94322 0.489494
3955
+ vt 4.94322 0.366188
3956
+ f 467/1390/24 466/1391/24 463/1392/24
3957
+
3958
+ v -0.519333 1.49236 0.67139
3959
+ vt 4.9548 0.489494
3960
+ f 466/1391/24 467/1390/24 468/1393/24
3961
+
3962
+ vt -0.98751 0.366188
3963
+ vt -0.976258 0.501682
3964
+ vt -0.98751 0.489494
3965
+ f 467/1394/41 461/1395/41 468/1396/41
3966
+
3967
+ vt -0.976258 0.355849
3968
+ f 467/1394/41 460/1397/41 461/1395/41
3969
+
3970
+ vt -1.00866 0.355849
3971
+ f 460/1397/41 467/1394/41 458/1398/41
3972
+
3973
+ v -0.490316 1.49236 0.502263
3974
+ vt -1.00866 0.366188
3975
+ f 469/1399/41 458/1398/41 467/1394/41
3976
+
3977
+ usemtl _auto_8
3978
+ vt -11.1483 0.823923
3979
+ f 469/1400/4 452/1367/4 458/1371/4
3980
+
3981
+ v -0.490316 1.49236 0.67139
3982
+ vt -11.1483 1.10136
3983
+ f 470/1401/4 452/1367/4 469/1400/4
3984
+
3985
+ v -0.490316 1.49236 0.688107
3986
+ vt -11.1483 1.12879
3987
+ f 471/1402/4 452/1367/4 470/1401/4
3988
+
3989
+ f 454/1365/4 452/1367/4 471/1402/4
3990
+
3991
+ usemtl _auto_3
3992
+ vt 0.976258 4.9548
3993
+ vt 1.00866 4.94322
3994
+ vt 1.00866 4.9548
3995
+ f 461/1403/42 454/1404/42 471/1405/42
3996
+
3997
+ vt 0.976258 4.94322
3998
+ f 454/1404/42 461/1403/42 462/1406/42
3999
+
4000
+ vt -1.00866 0.489494
4001
+ vt -1.00866 0.501682
4002
+ f 470/1407/41 461/1395/41 471/1408/41
4003
+
4004
+ f 468/1396/41 461/1395/41 470/1407/41
4005
+
4006
+ vt -0.98751 4.94322
4007
+ vt -0.98751 4.9548
4008
+ f 470/1373/44 466/1409/44 468/1410/44
4009
+
4010
+ f 466/1409/44 470/1373/44 465/1374/44
4011
+
4012
+ usemtl _auto_8
4013
+ f 470/1401/4 464/1386/4 465/1385/4
4014
+
4015
+ f 464/1386/4 470/1401/4 469/1400/4
4016
+
4017
+ usemtl _auto_3
4018
+ vt 0.98751 4.9548
4019
+ f 467/1411/42 464/1404/42 469/1405/42
4020
+
4021
+ vt 0.98751 4.94322
4022
+ f 464/1404/42 467/1411/42 463/1412/42
4023
+
4024
+ usemtl _auto_8
4025
+ f 457/1370/4 458/1371/4 452/1367/4
4026
+
4027
+ vt -2.2695 1.31861
4028
+ v -0.433166 2.06392 0.363835
4029
+ vt -2.36325 0.596843
4030
+ vt -2.2695 0.596843
4031
+ f 452/1413/41 472/1414/41 457/1415/41
4032
+
4033
+ vt -2.36325 1.31861
4034
+ f 472/1414/41 452/1413/41 450/1416/41
4035
+
4036
+ vt -7.80655 1.39783
4037
+ vn -0.760858 -0.648918 3.08899e-18
4038
+ vt -7.66208 0.596843
4039
+ vt -7.66208 1.31861
4040
+ f 449/1417/220 472/1418/220 450/1419/220
4041
+
4042
+ vt -7.80655 0.517624
4043
+ f 472/1418/220 449/1417/220 448/1420/220
4044
+
4045
+ vt -12.1958 2.06758
4046
+ vn -0.645428 1.24638e-18 0.763821
4047
+ v -0.433166 1.4534 0.363835
4048
+ vt -11.0844 2.19032
4049
+ vt -12.0859 2.19032
4050
+ f 448/1421/221 473/1422/221 472/1423/221
4051
+
4052
+ v -0.490316 1.38639 0.315544
4053
+ vt -10.9745 2.06758
4054
+ f 473/1422/221 448/1421/221 474/1424/221
4055
+
4056
+ vt -10.9744 0.517625
4057
+ f 447/1354/4 474/1425/4 448/1355/4
4058
+
4059
+ f 117/283/4 474/1425/4 447/1354/4
4060
+
4061
+ f 474/1425/4 117/283/4 118/284/4
4062
+
4063
+ vt -9.96718 1.31861
4064
+ vn -0.760857 0.64892 6.43369e-33
4065
+ vt -9.82271 0.517624
4066
+ vt -9.82271 1.39783
4067
+ f 451/1426/222 474/1427/222 118/1428/222
4068
+
4069
+ vt -9.96718 0.596843
4070
+ f 474/1427/222 451/1426/222 473/1429/222
4071
+
4072
+ vt 2.36325 1.31861
4073
+ vt 2.2695 0.596843
4074
+ vt 2.36325 0.596843
4075
+ f 451/1430/43 455/1431/43 473/1432/43
4076
+
4077
+ vt 2.2695 1.31861
4078
+ f 455/1431/43 451/1430/43 453/1433/43
4079
+
4080
+ vt -2.2695 11.0844
4081
+ vt -2.36325 12.0859
4082
+ vt -2.36325 11.0844
4083
+ f 455/1434/44 472/1435/44 473/1436/44
4084
+
4085
+ vt -2.2695 12.0859
4086
+ f 472/1435/44 455/1434/44 457/1437/44
4087
+
4088
+ vt -12.4068 -1.97313
4089
+ vn -0.375382 3.64393e-19 -0.92687
4090
+ vt -10.6709 -1.92818
4091
+ vt -12.4886 -1.92818
4092
+ f 110/1438/223 117/1439/223 447/1440/223
4093
+
4094
+ vt -10.7527 -1.97313
4095
+ f 117/1439/223 110/1438/223 111/1441/223
4096
+
4097
+ vt -10.6303 0.450253
4098
+ vn -0.891055 0.453896 -1.00393e-19
4099
+ vt -10.5385 0.0921278
4100
+ vt -10.5385 0.467128
4101
+ f 111/1442/224 114/1443/224 117/1444/224
4102
+
4103
+ vt -10.6303 0.109003
4104
+ f 114/1443/224 111/1442/224 112/1445/224
4105
+
4106
+ vt -10.0979 0.467128
4107
+ vn -0.891055 -0.453895 -1.00379e-19
4108
+ vt -10.0061 0.109003
4109
+ vt -10.0061 0.450253
4110
+ f 447/1446/225 109/1447/225 110/1448/225
4111
+
4112
+ vt -10.0979 0.0921278
4113
+ f 109/1447/225 447/1446/225 113/1449/225
4114
+
4115
+ usemtl _auto_3
4116
+ vt -5.18956 0.114773
4117
+ vt -5.19213 0.134333
4118
+ f 99/1450/4 2/194/4 107/1451/4
4119
+
4120
+ f 75/193/4 2/194/4 99/1450/4
4121
+
4122
+ f 71/181/4 75/193/4 99/1450/4
4123
+
4124
+ f 71/181/4 48/97/4 75/193/4
4125
+
4126
+ vt 0.994776 4.18279
4127
+ vn 4.26867e-31 -0.608759 0.793355
4128
+ f 74/1452/226 99/116/226 75/119/226
4129
+
4130
+ vt 0.994776 4.18702
4131
+ f 99/116/226 74/1452/226 95/1453/226
4132
+
4133
+ v -0.528416 1.82251 0.131791
4134
+ vt -5.19551 0.0960862
4135
+ f 71/181/4 99/1450/4 475/1454/4
4136
+
4137
+ vt -5.19214 0.118129
4138
+ f 475/1454/4 99/1450/4 100/1455/4
4139
+
4140
+ vt -5.19213 0.118129
4141
+ f 99/1450/4 107/1451/4 100/1456/4
4142
+
4143
+ vt -5.19375 0.130425
4144
+ f 100/1456/4 107/1451/4 105/1457/4
4145
+
4146
+ vt -5.19214 0.134332
4147
+ v -0.528416 1.82251 0.214483
4148
+ vt -5.19551 0.156375
4149
+ vt -5.19375 0.130424
4150
+ f 107/1458/4 476/1459/4 105/1460/4
4151
+
4152
+ f 2/194/4 476/1459/4 107/1458/4
4153
+
4154
+ f 2/194/4 76/195/4 476/1459/4
4155
+
4156
+ vt -0.994776 -4.73109
4157
+ vn 5.36679e-31 0.382681 0.923881
4158
+ vt -0.980887 -4.74017
4159
+ vt -0.980887 -4.73109
4160
+ f 85/1461/227 476/1462/227 76/1463/227
4161
+
4162
+ vt -0.994776 -4.74017
4163
+ f 476/1462/227 85/1461/227 88/1464/227
4164
+
4165
+ vt -0.994776 -4.02667
4166
+ vn 0 0.608763 0.793352
4167
+ v -0.528416 1.8324 0.206896
4168
+ vt -0.980887 -4.03576
4169
+ vt -0.980887 -4.02667
4170
+ f 88/1465/228 477/1466/228 476/1467/228
4171
+
4172
+ v -0.509366 1.8324 0.206896
4173
+ vt -0.994776 -4.03576
4174
+ f 477/1466/228 88/1465/228 478/1468/228
4175
+
4176
+ v -0.509366 1.8324 0.139378
4177
+ vt 5.20272 0.101617
4178
+ vt 5.20272 0.150842
4179
+ f 88/212/24 479/1469/24 478/1470/24
4180
+
4181
+ f 88/212/24 92/216/24 479/1469/24
4182
+
4183
+ vt -0.980887 4.18036
4184
+ vn 0 0.608761 -0.793353
4185
+ vt -0.994776 4.18945
4186
+ vt -0.994776 4.18036
4187
+ f 475/1471/229 479/1472/229 92/1473/229
4188
+
4189
+ v -0.528416 1.8324 0.139378
4190
+ vt -0.980887 4.18945
4191
+ f 479/1472/229 475/1471/229 480/1474/229
4192
+
4193
+ vt -5.20272 0.150843
4194
+ vt -5.20272 0.101618
4195
+ f 475/1454/4 477/1475/4 480/1476/4
4196
+
4197
+ f 475/1454/4 476/1459/4 477/1475/4
4198
+
4199
+ vt -5.19431 0.12623
4200
+ f 475/1454/4 103/1477/4 476/1459/4
4201
+
4202
+ vt -5.19375 0.122037
4203
+ f 475/1454/4 101/1478/4 103/1477/4
4204
+
4205
+ f 475/1454/4 100/1455/4 101/1478/4
4206
+
4207
+ f 100/1456/4 105/1457/4 101/1478/4
4208
+
4209
+ vt -5.1943 0.126231
4210
+ f 101/1478/4 105/1457/4 103/1479/4
4211
+
4212
+ f 105/1460/4 476/1459/4 103/1477/4
4213
+
4214
+ v -0.528416 1.83998 0.197008
4215
+ vt -5.20825 0.143634
4216
+ f 480/1476/4 477/1475/4 481/1480/4
4217
+
4218
+ vt -0.980887 -3.04754
4219
+ vn -1.21934e-30 0.793358 0.608755
4220
+ v -0.509366 1.83998 0.197008
4221
+ vt -0.994776 -3.05662
4222
+ vt -0.980887 -3.05662
4223
+ f 477/1481/230 482/1482/230 481/1483/230
4224
+
4225
+ vt -0.994776 -3.04754
4226
+ f 482/1482/230 477/1481/230 478/1484/230
4227
+
4228
+ v -0.509366 1.83998 0.149266
4229
+ vt 5.20825 0.108826
4230
+ vt 5.20825 0.143633
4231
+ f 478/1470/24 483/1485/24 482/1486/24
4232
+
4233
+ f 478/1470/24 479/1469/24 483/1485/24
4234
+
4235
+ vt -0.994776 3.24783
4236
+ vn -1.11262e-30 0.793359 -0.608754
4237
+ v -0.528416 1.83998 0.149266
4238
+ vt -0.980887 3.25691
4239
+ vt -0.994776 3.25691
4240
+ f 479/1487/231 484/1488/231 483/1489/231
4241
+
4242
+ vt -0.980887 3.24783
4243
+ f 484/1488/231 479/1487/231 480/1490/231
4244
+
4245
+ vt -5.20825 0.108827
4246
+ f 480/1476/4 481/1480/4 484/1491/4
4247
+
4248
+ v -0.528416 1.84475 0.185494
4249
+ vt -5.21173 0.135239
4250
+ f 484/1491/4 481/1480/4 485/1492/4
4251
+
4252
+ vt -0.980887 -1.86041
4253
+ vn -1.29566e-30 0.923875 0.382694
4254
+ v -0.509366 1.84475 0.185494
4255
+ vt -0.994776 -1.86949
4256
+ vt -0.980887 -1.86949
4257
+ f 481/1493/232 486/1494/232 485/1495/232
4258
+
4259
+ vt -0.994776 -1.86041
4260
+ f 486/1494/232 481/1493/232 482/1496/232
4261
+
4262
+ v -0.509366 1.84475 0.160781
4263
+ vt 5.21173 0.117221
4264
+ vt 5.21173 0.135238
4265
+ f 482/1486/24 487/1497/24 486/1498/24
4266
+
4267
+ f 482/1486/24 483/1485/24 487/1497/24
4268
+
4269
+ vt -0.994776 2.09365
4270
+ vn -1.29566e-30 0.923875 -0.382694
4271
+ v -0.528416 1.84475 0.160781
4272
+ vt -0.980887 2.10274
4273
+ vt -0.994776 2.10274
4274
+ f 483/1499/233 488/1500/233 487/1501/233
4275
+
4276
+ vt -0.980887 2.09365
4277
+ f 488/1500/233 483/1499/233 484/1502/233
4278
+
4279
+ vt -5.21173 0.117222
4280
+ f 484/1491/4 485/1492/4 488/1503/4
4281
+
4282
+ v -0.528416 1.84638 0.173137
4283
+ vt -5.21291 0.126231
4284
+ f 488/1503/4 485/1492/4 489/1504/4
4285
+
4286
+ vt -0.980887 -0.546184
4287
+ vn 1.4133e-30 0.991447 0.130514
4288
+ v -0.509366 1.84638 0.173137
4289
+ vt -0.994776 -0.55527
4290
+ vt -0.980887 -0.55527
4291
+ f 485/1505/234 490/1506/234 489/1507/234
4292
+
4293
+ vt -0.994776 -0.546184
4294
+ f 490/1506/234 485/1505/234 486/1508/234
4295
+
4296
+ vt 5.21291 0.126229
4297
+ f 486/1498/24 487/1497/24 490/1509/24
4298
+
4299
+ vt -0.994776 0.796484
4300
+ vn 1.36754e-30 0.991446 -0.130514
4301
+ vt -0.980887 0.80557
4302
+ vt -0.994776 0.80557
4303
+ f 487/1510/235 489/1511/235 490/1512/235
4304
+
4305
+ vt -0.980887 0.796484
4306
+ f 489/1511/235 487/1510/235 488/1513/235
4307
+
4308
+ vt -0.994776 4.83679
4309
+ vn 0 0.382681 -0.923881
4310
+ vt -0.980887 4.8277
4311
+ vt -0.980887 4.83679
4312
+ f 92/1514/236 71/1515/236 475/1516/236
4313
+
4314
+ vt -0.994776 4.8277
4315
+ f 71/1515/236 92/1514/236 70/1517/236
4316
+
4317
+ vt -0.980887 -5.12186
4318
+ vn 4.39131e-31 0.130526 0.991445
4319
+ vt -0.994776 -5.11278
4320
+ vt -0.994776 -5.12186
4321
+ f 76/1518/237 78/1519/237 85/1520/237
4322
+
4323
+ vt -0.980887 -5.11278
4324
+ f 78/1519/237 76/1518/237 77/1521/237
4325
+
4326
+ vt 0.980887 -4.73352
4327
+ vn 1.4246e-18 -0.382689 -0.923877
4328
+ vt 1.00867 -4.73775
4329
+ vt 1.00867 -4.73352
4330
+ f 14/1522/238 51/1523/238 26/1524/238
4331
+
4332
+ vt 0.980887 -4.73775
4333
+ f 51/1523/238 14/1522/238 45/1525/238
4334
+
rendering/data/washing_basin/_auto_12.jpg ADDED
rendering/data/washing_basin/_auto_20.jpg ADDED
rendering/data/washing_basin/_auto_24.jpg ADDED
rendering/data/washing_basin/_auto_3.jpg ADDED
rendering/data/washing_basin/_auto_8.jpg ADDED
rendering/data/washing_basin2.mtl ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #
2
+ ## Alias OBJ Material File
3
+ # Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
4
+
5
+ newmtl _auto_46
6
+ Ka 0.000000 0.000000 0.000000
7
+ Kd 0.819608 0.705882 0.545098
8
+ Ks 0.330000 0.330000 0.330000
9
+
10
+ newmtl _auto_48
11
+ Ka 0.000000 0.000000 0.000000
12
+ Kd 0.627451 0.317647 0.176471
13
+ Ks 0.330000 0.330000 0.330000
14
+
rendering/data/washing_basin2.obj ADDED
The diff for this file is too large to render. See raw diff
 
rendering/data/window.jpg ADDED
rendering/floorplan.py ADDED
@@ -0,0 +1,987 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from panda3d.egg import *
2
+ from panda3d.core import *
3
+ from obj2egg import ObjMaterial
4
+ from copy import deepcopy
5
+ import numpy as np
6
+ import cv2
7
+ import copy
8
+
9
+ def calcDistance(point_1, point_2):
10
+ return pow(pow(point_1[0] - point_2[0], 2) + pow(point_1[1] - point_2[1], 2), 0.5)
11
+
12
+ def calcLineDim(line, lineWidth = -1):
13
+ if abs(line[0][0] - line[1][0]) > abs(line[0][1] - line[1][1]):
14
+ if lineWidth < 0 or abs(line[0][1] - line[1][1]) <= lineWidth:
15
+ return 0
16
+ pass
17
+ elif abs(line[0][0] - line[1][0]) < abs(line[0][1] - line[1][1]):
18
+ if lineWidth < 0 or abs(line[0][0] - line[1][0]) <= lineWidth:
19
+ return 1
20
+ else:
21
+ return -1
22
+
23
+ class Floorplan():
24
+ def __init__(self, filename):
25
+ self.wallWidth = 0.005
26
+ self.wallHeight = 0.3
27
+ self.doorWidth = self.wallWidth
28
+ self.doorHeight = self.wallHeight * 0.8
29
+ self.windowWidth = self.wallWidth + 0.0001
30
+ self.windowHeight = self.wallHeight * 0.5
31
+ self.windowOffset = self.wallHeight * 0.4
32
+ self.filename = filename
33
+
34
+ self.floorMat = ObjMaterial()
35
+ #self.floorMat.filename = self.filename + '.png'
36
+ self.floorMat.name = 'floor'
37
+ self.floorMat.put('map_Kd', self.filename + '.png')
38
+
39
+ self.ceilingMat = ObjMaterial()
40
+ self.ceilingMat.name = 'ceiling'
41
+ self.ceilingMat.put('map_Kd', 'data/ceiling.jpg')
42
+
43
+ self.wallMats = []
44
+ wallMat_1 = ObjMaterial()
45
+ wallMat_1.name = 'wall_1'
46
+ wallMat_1.put('map_Kd', 'data/bedroom_wall.jpg')
47
+ wallMat_2 = ObjMaterial()
48
+ wallMat_2.name = 'wall_2'
49
+ wallMat_2.put('map_Kd', 'data/kitchen_wall.jpg')
50
+ wallMat_3 = ObjMaterial()
51
+ wallMat_3.name = 'wall_3'
52
+ wallMat_3.put('map_Kd', 'data/dining_wall.jpg')
53
+ wallMat_4 = ObjMaterial()
54
+ wallMat_4.name = 'wall_4'
55
+ wallMat_4.put('map_Kd', 'data/bathroom_wall.jpg')
56
+ wallMat_5 = ObjMaterial()
57
+ wallMat_5.name = 'wall_5'
58
+ wallMat_5.put('map_Kd', 'data/wall.jpg')
59
+
60
+ self.wallMats.append(wallMat_3)
61
+ self.wallMats.append(wallMat_2)
62
+ self.wallMats.append(wallMat_1)
63
+ self.wallMats.append(wallMat_4)
64
+ self.wallMats.append(wallMat_4)
65
+ self.wallMats.append(wallMat_1)
66
+ self.wallMats.append(wallMat_5)
67
+ self.wallMats.append(wallMat_2)
68
+ self.wallMats.append(wallMat_4)
69
+ self.wallMats.append(wallMat_5)
70
+ self.wallMats.append(wallMat_5)
71
+
72
+
73
+ self.doorMat = ObjMaterial()
74
+ self.doorMat.name = 'door'
75
+ self.doorMat.put('map_Kd', 'data/door.jpg')
76
+
77
+ self.windowMat = ObjMaterial()
78
+ self.windowMat.name = 'window'
79
+ self.windowMat.put('map_Kd', 'data/window.jpg')
80
+
81
+ self.iconNodes = {}
82
+ self.iconNodes['cooking_counter'] = base.loader.loadModel('data/cooking_counter.egg')
83
+ self.iconNodes['bathtub'] = base.loader.loadModel('data/bathtub.egg')
84
+ self.iconNodes['toilet'] = base.loader.loadModel('data/toilet.egg')
85
+ self.iconNodes['washing_basin'] = base.loader.loadModel('data/washing_basin.egg')
86
+ return
87
+
88
+
89
+ def read(self):
90
+ floorplanFile = open(self.filename + '.txt', 'r')
91
+ self.walls = []
92
+ self.doors = []
93
+ self.icons = []
94
+ self.wallsInt = []
95
+ for line in floorplanFile.readlines():
96
+ line = line.strip()
97
+ values = line.split('\t')
98
+ if len(values) == 2:
99
+ self.width = float(values[0])
100
+ self.height = float(values[1])
101
+ self.maxDim = max(self.width, self.height)
102
+ elif len(values) == 6:
103
+ wall = []
104
+ for i in xrange(4):
105
+ wall.append(float(values[i]))
106
+ continue
107
+ lineDim = calcLineDim(((wall[0], wall[1]), (wall[2], wall[3])))
108
+ wall[lineDim], wall[2 + lineDim] = min(wall[lineDim], wall[2 + lineDim]), max(wall[lineDim], wall[2 + lineDim])
109
+ wall[1 - lineDim] = wall[3 - lineDim] = (wall[1 - lineDim] + wall[3 - lineDim]) / 2
110
+ wall.append(int(values[4]) - 1)
111
+ wall.append(int(values[5]) - 1)
112
+ for pointIndex in xrange(2):
113
+ wall[pointIndex * 2 + 0] /= self.maxDim
114
+ wall[pointIndex * 2 + 1] /= self.maxDim
115
+ continue
116
+ self.walls.append(wall)
117
+
118
+ wallInt = []
119
+ for i in xrange(4):
120
+ wallInt.append(int(values[i]))
121
+ continue
122
+ wallInt[lineDim], wallInt[2 + lineDim] = min(wallInt[lineDim], wallInt[2 + lineDim]), max(wallInt[lineDim], wallInt[2 + lineDim])
123
+ self.wallsInt.append(wallInt)
124
+ elif len(values) == 7:
125
+ item = []
126
+ for i in xrange(4):
127
+ item.append(float(values[i]))
128
+
129
+ for pointIndex in xrange(2):
130
+ item[pointIndex * 2 + 0] /= self.maxDim
131
+ item[pointIndex * 2 + 1] /= self.maxDim
132
+ continue
133
+
134
+ if values[4] == 'door':
135
+ self.doors.append(item)
136
+ else:
137
+ item.append(values[4])
138
+ self.icons.append(item)
139
+ pass
140
+ pass
141
+ continue
142
+ return
143
+
144
+ def generateFloor(self, data):
145
+ floorGroup = EggGroup('floor')
146
+ data.addChild(floorGroup)
147
+
148
+ vp = EggVertexPool('floor_vertex')
149
+ floorGroup.addChild(vp)
150
+
151
+
152
+ exteriorWalls = []
153
+ for wall in self.walls:
154
+ if wall[4] == 10 or wall[5] == 10:
155
+ exteriorWalls.append(copy.deepcopy(wall))
156
+ pass
157
+ continue
158
+
159
+
160
+ exteriorOpenings = []
161
+ for wall in exteriorWalls:
162
+ lineDim = calcLineDim((wall[:2], wall[2:4]))
163
+ for doorIndex, door in enumerate(self.doors):
164
+ if calcLineDim((door[:2], door[2:4])) != lineDim:
165
+ continue
166
+ if door[lineDim] >= wall[lineDim] and door[2 + lineDim] <= wall[2 + lineDim] and abs(door[1 - lineDim] - wall[1 - lineDim]) <= self.wallWidth:
167
+ exteriorOpenings.append(doorIndex)
168
+ pass
169
+ continue
170
+ continue
171
+
172
+ minDistance = 10000
173
+ mainDoorIndex = -1
174
+ for icon in self.icons:
175
+ if icon[4] == 'entrance':
176
+ for doorIndex in exteriorOpenings:
177
+ door = self.doors[doorIndex]
178
+ distance = pow(pow((door[0] + door[2]) / 2 - (icon[0] + icon[2]) / 2, 2) + pow((door[1] + door[3]) / 2 - (icon[1] + icon[3]) / 2, 2), 0.5)
179
+ if distance < minDistance:
180
+ minDistance = distance
181
+ mainDoorIndex = doorIndex
182
+ pass
183
+ continue
184
+ break
185
+ continue
186
+
187
+ self.startCameraPos = [0.5, -0.5, self.wallHeight * 0.5]
188
+ self.startTarget = [0.5, 0.5, self.wallHeight * 0.5]
189
+ if mainDoorIndex >= 0:
190
+ mainDoor = self.doors[mainDoorIndex]
191
+ lineDim = calcLineDim((mainDoor[:2], mainDoor[2:4]))
192
+ fixedValue = (mainDoor[1 - lineDim] + mainDoor[3 - lineDim]) / 2
193
+ imageSize = [self.width / self.maxDim, self.height / self.maxDim]
194
+ side = int(fixedValue < imageSize[1 - lineDim] * 0.5) * 2 - 1
195
+ self.startCameraPos[lineDim] = (mainDoor[lineDim] + mainDoor[2 + lineDim]) / 2
196
+ self.startTarget[lineDim] = (mainDoor[lineDim] + mainDoor[2 + lineDim]) / 2
197
+ self.startCameraPos[1 - lineDim] = fixedValue - 0.5 * side
198
+ self.startTarget[1 - lineDim] = fixedValue + 0.5 * side
199
+
200
+ self.startCameraPos[0] = 1 - self.startCameraPos[0]
201
+ self.startTarget[0] = 1 - self.startTarget[0]
202
+ pass
203
+
204
+ newDoors = []
205
+ self.windows = []
206
+ for doorIndex, door in enumerate(self.doors):
207
+ if doorIndex == mainDoorIndex or doorIndex not in exteriorOpenings:
208
+ newDoors.append(door)
209
+ else:
210
+ self.windows.append(door)
211
+ pass
212
+ continue
213
+ self.doors = newDoors
214
+
215
+
216
+ exteriorWallLoops = []
217
+ visitedMask = {}
218
+ gap = 5.0 / self.maxDim
219
+ for wallIndex, wall in enumerate(exteriorWalls):
220
+ if wallIndex in visitedMask:
221
+ continue
222
+ visitedMask[wallIndex] = True
223
+ exteriorWallLoop = []
224
+ exteriorWallLoop.append(wall)
225
+ for loopWall in exteriorWallLoop:
226
+ for neighborWallIndex, neighborWall in enumerate(exteriorWalls):
227
+ if neighborWallIndex in visitedMask:
228
+ continue
229
+ #if calcDistance(neighborWall[:2], loopWall[:2]) < gap or calcDistance(neighborWall[2:4], loopWall[:2]) < gap or calcDistance(neighborWall[:2], loopWall[2:4]) < gap or calcDistance(neighborWall[2:4], loopWall[2:4]) < gap:
230
+ if calcDistance(neighborWall[:2], loopWall[2:4]) < gap:
231
+ exteriorWallLoop.append(neighborWall)
232
+ visitedMask[neighborWallIndex] = True
233
+ break
234
+ elif calcDistance(neighborWall[2:4], loopWall[2:4]) < gap:
235
+ neighborWall[0], neighborWall[2] = neighborWall[2], neighborWall[0]
236
+ neighborWall[1], neighborWall[3] = neighborWall[3], neighborWall[1]
237
+ exteriorWallLoop.append(neighborWall)
238
+ visitedMask[neighborWallIndex] = True
239
+ break
240
+ continue
241
+ continue
242
+ exteriorWallLoops.append(exteriorWallLoop)
243
+ continue
244
+
245
+
246
+ for exteriorWallLoop in exteriorWallLoops:
247
+ poly = EggPolygon()
248
+ floorGroup.addChild(poly)
249
+
250
+ poly.setTexture(self.floorMat.getEggTexture())
251
+ poly.setMaterial(self.floorMat.getEggMaterial())
252
+
253
+ for wallIndex, wall in enumerate(exteriorWallLoop):
254
+ if wallIndex == 0:
255
+ v = EggVertex()
256
+ v.setPos(Point3D(1 - wall[0], wall[1], 0))
257
+ v.setUv(Point2D(wall[0] * self.maxDim / self.width, 1 - wall[1] * self.maxDim / self.height))
258
+ poly.addVertex(vp.addVertex(v))
259
+ else:
260
+ v = EggVertex()
261
+ v.setPos(Point3D(1 - (wall[0] + exteriorWallLoop[wallIndex - 1][2]) / 2, (wall[1] + exteriorWallLoop[wallIndex - 1][3]) / 2, 0))
262
+ v.setUv(Point2D((wall[0] + exteriorWallLoop[wallIndex - 1][2]) / 2 * self.maxDim / self.width, 1 - (wall[1] + exteriorWallLoop[wallIndex - 1][3]) / 2 * self.maxDim / self.height))
263
+ poly.addVertex(vp.addVertex(v))
264
+ pass
265
+ if wallIndex == len(exteriorWallLoop) - 1:
266
+ v = EggVertex()
267
+ v.setPos(Point3D(1 - wall[2], wall[3], 0))
268
+ v.setUv(Point2D(wall[2] * self.maxDim / self.width, 1 - wall[3] * self.maxDim / self.height))
269
+ poly.addVertex(vp.addVertex(v))
270
+ pass
271
+ continue
272
+ continue
273
+
274
+
275
+ ceilingGroup = EggGroup('ceiling')
276
+ data.addChild(ceilingGroup)
277
+
278
+ vp = EggVertexPool('ceiling_vertex')
279
+ ceilingGroup.addChild(vp)
280
+
281
+ for exteriorWallLoop in exteriorWallLoops:
282
+ poly = EggPolygon()
283
+ ceilingGroup.addChild(poly)
284
+
285
+ poly.setTexture(self.ceilingMat.getEggTexture())
286
+ poly.setMaterial(self.ceilingMat.getEggMaterial())
287
+
288
+ for wallIndex, wall in enumerate(exteriorWallLoop):
289
+ if wallIndex == 0:
290
+ v = EggVertex()
291
+ v.setPos(Point3D(1 - wall[0], wall[1], self.wallHeight))
292
+ v.setUv(Point2D(wall[0], 1 - wall[1]))
293
+ poly.addVertex(vp.addVertex(v))
294
+ else:
295
+ v = EggVertex()
296
+ v.setPos(Point3D(1 - (wall[0] + exteriorWallLoop[wallIndex - 1][2]) / 2, (wall[1] + exteriorWallLoop[wallIndex - 1][3]) / 2, self.wallHeight))
297
+ v.setUv(Point2D((wall[0] + exteriorWallLoop[wallIndex - 1][2]) / 2, 1 - (wall[1] + exteriorWallLoop[wallIndex - 1][3]) / 2))
298
+ poly.addVertex(vp.addVertex(v))
299
+ pass
300
+ if wallIndex == len(exteriorWallLoop) - 1:
301
+ v = EggVertex()
302
+ v.setPos(Point3D(1 - wall[2], wall[3], self.wallHeight))
303
+ v.setUv(Point2D(wall[2], 1 - wall[3]))
304
+ poly.addVertex(vp.addVertex(v))
305
+ pass
306
+ continue
307
+ continue
308
+
309
+ return
310
+
311
+
312
+ def generateWalls(self, data):
313
+
314
+ wallsGroup = EggGroup('walls')
315
+ data.addChild(wallsGroup)
316
+
317
+ vp = EggVertexPool('wall_vertex')
318
+ data.addChild(vp)
319
+
320
+ for wallIndex, wall in enumerate(self.walls):
321
+ wallGroup = EggGroup('wall')
322
+ wallsGroup.addChild(wallGroup)
323
+ lineDim = calcLineDim((wall[:2], wall[2:4]))
324
+ # if lineDim == 0:
325
+ # if wall[lineDim] < wall[2 + lineDim]:
326
+ # deltas = (-self.wallWidth, self.wallWidth, self.wallWidth, self.wallWidth)
327
+ # else:
328
+ # deltas = (self.wallWidth, self.wallWidth, -self.wallWidth, self.wallWidth)
329
+ # pass
330
+ # else:
331
+ # if wall[lineDim] < wall[2 + lineDim]:
332
+ # deltas = (self.wallWidth, -self.wallWidth, self.wallWidth, self.wallWidth)
333
+ # else:
334
+ # deltas = (self.wallWidth, self.wallWidth, self.wallWidth, -self.wallWidth)
335
+ # pass
336
+ # pass
337
+
338
+ #print(self.wallsInt[wallIndex])
339
+ #print(wall)
340
+ if lineDim == 0:
341
+ deltas = (0, self.wallWidth)
342
+ else:
343
+ deltas = (self.wallWidth, 0)
344
+ pass
345
+
346
+ poly = EggPolygon()
347
+ wallGroup.addChild(poly)
348
+
349
+ if lineDim == 0:
350
+ poly.setTexture(self.wallMats[wall[4]].getEggTexture())
351
+ poly.setMaterial(self.wallMats[wall[4]].getEggMaterial())
352
+ else:
353
+ poly.setTexture(self.wallMats[wall[5]].getEggTexture())
354
+ poly.setMaterial(self.wallMats[wall[5]].getEggMaterial())
355
+ pass
356
+
357
+
358
+ values = [wall[lineDim] - self.wallWidth + 0.0001, wall[2 + lineDim] + self.wallWidth - 0.0001]
359
+ for door in self.doors:
360
+ if calcLineDim((door[:2], door[2:4])) != lineDim:
361
+ continue
362
+ if door[lineDim] >= wall[lineDim] and door[2 + lineDim] <= wall[2 + lineDim] and abs(door[1 - lineDim] - wall[1 - lineDim]) <= self.wallWidth:
363
+ values.append(door[lineDim])
364
+ values.append(door[2 + lineDim])
365
+ #doors.append(door)
366
+ pass
367
+ continue
368
+
369
+ values.sort()
370
+
371
+ fixedValue = (wall[1 - lineDim] + wall[3 - lineDim]) / 2
372
+ for valueIndex, value in enumerate(values):
373
+ if valueIndex % 2 == 0 and valueIndex > 0:
374
+ v = EggVertex()
375
+ if lineDim == 0:
376
+ v.setPos(Point3D(1 - (value - deltas[0]), fixedValue - deltas[1], self.doorHeight))
377
+ else:
378
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), value - deltas[1], self.doorHeight))
379
+ pass
380
+ v.setUv(Point2D(self.doorHeight / self.wallHeight, (value - wall[lineDim]) / (wall[2 + lineDim] - wall[lineDim])))
381
+ poly.addVertex(vp.addVertex(v))
382
+ pass
383
+
384
+ v = EggVertex()
385
+ if lineDim == 0:
386
+ v.setPos(Point3D(1 - (value - deltas[0]), fixedValue - deltas[1], 0))
387
+ else:
388
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), value - deltas[1], 0))
389
+ pass
390
+ v.setUv(Point2D(0, (value - wall[lineDim]) / (wall[2 + lineDim] - wall[lineDim])))
391
+ poly.addVertex(vp.addVertex(v))
392
+
393
+ if valueIndex % 2 == 1 and valueIndex + 1 < len(values):
394
+ v = EggVertex()
395
+ if lineDim == 0:
396
+ v.setPos(Point3D(1 - (value - deltas[0]), fixedValue - deltas[1], self.doorHeight))
397
+ else:
398
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), value - deltas[1], self.doorHeight))
399
+ pass
400
+ v.setUv(Point2D(self.doorHeight / self.wallHeight, (value - wall[lineDim]) / (wall[2 + lineDim] - wall[lineDim])))
401
+ poly.addVertex(vp.addVertex(v))
402
+ pass
403
+ continue
404
+ # v = EggVertex()
405
+ # v.setPos(Point3D(wall[0] - deltas[0], wall[1] - deltas[1], 0))
406
+ # v.setUv(Point2D(0, 0))
407
+ # poly.addVertex(vp.addVertex(v))
408
+
409
+ # v = EggVertex()
410
+ # v.setPos(Point3D(wall[2] - deltas[0], wall[3] - deltas[1], 0))
411
+ # v.setUv(Point2D(0, 1))
412
+ # poly.addVertex(vp.addVertex(v))
413
+
414
+ v = EggVertex()
415
+ if lineDim == 0:
416
+ v.setPos(Point3D(1 - (values[len(values) - 1] - deltas[0]), fixedValue - deltas[1], self.wallHeight))
417
+ else:
418
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[len(values) - 1] - deltas[1], self.wallHeight))
419
+ pass
420
+ v.setUv(Point2D(1, 1))
421
+ poly.addVertex(vp.addVertex(v))
422
+
423
+ v = EggVertex()
424
+ if lineDim == 0:
425
+ v.setPos(Point3D(1 - (values[0] - deltas[0]), fixedValue - deltas[1], self.wallHeight))
426
+ else:
427
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[0] - deltas[1], self.wallHeight))
428
+ pass
429
+ v.setUv(Point2D(1, 0))
430
+ poly.addVertex(vp.addVertex(v))
431
+
432
+ # for v in poly.getVertices():
433
+ # print(v)
434
+ # continue
435
+
436
+ poly = EggPolygon()
437
+ wallGroup.addChild(poly)
438
+ if lineDim == 0:
439
+ poly.setTexture(self.wallMats[wall[5]].getEggTexture())
440
+ poly.setMaterial(self.wallMats[wall[5]].getEggMaterial())
441
+ else:
442
+ poly.setTexture(self.wallMats[wall[4]].getEggTexture())
443
+ poly.setMaterial(self.wallMats[wall[4]].getEggMaterial())
444
+ pass
445
+
446
+ #deltas = (0.1, 0.1)
447
+
448
+ for valueIndex, value in enumerate(values):
449
+ if valueIndex % 2 == 0 and valueIndex > 0:
450
+ v = EggVertex()
451
+ if lineDim == 0:
452
+ v.setPos(Point3D(1 - (value + deltas[0]), fixedValue + deltas[1], self.doorHeight))
453
+ else:
454
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), value + deltas[1], self.doorHeight))
455
+ pass
456
+ v.setUv(Point2D(self.doorHeight / self.wallHeight, (value - wall[lineDim]) / (wall[2 + lineDim] - wall[lineDim])))
457
+ poly.addVertex(vp.addVertex(v))
458
+ pass
459
+
460
+ v = EggVertex()
461
+ if lineDim == 0:
462
+ v.setPos(Point3D(1 - (value + deltas[0]), fixedValue + deltas[1], 0))
463
+ else:
464
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), value + deltas[1], 0))
465
+ pass
466
+ v.setUv(Point2D(0, (value - wall[lineDim]) / (wall[2 + lineDim] - wall[lineDim])))
467
+ poly.addVertex(vp.addVertex(v))
468
+
469
+ if valueIndex % 2 == 1 and valueIndex + 1 < len(values):
470
+ v = EggVertex()
471
+ if lineDim == 0:
472
+ v.setPos(Point3D(1 - (value + deltas[0]), fixedValue + deltas[1], self.doorHeight))
473
+ else:
474
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), value + deltas[1], self.doorHeight))
475
+ pass
476
+ v.setUv(Point2D(self.doorHeight / self.wallHeight, (value - wall[lineDim]) / (wall[2 + lineDim] - wall[lineDim])))
477
+ poly.addVertex(vp.addVertex(v))
478
+ pass
479
+ continue
480
+ # v = EggVertex()
481
+ # v.setPos(Point3D(wall[0] + deltas[0], wall[1] + deltas[1], 0))
482
+ # v.setUv(Point2D(0, 0))
483
+ # poly.addVertex(vp.addVertex(v))
484
+
485
+ # v = EggVertex()
486
+ # v.setPos(Point3D(wall[2] + deltas[0], wall[3] + deltas[1], 0))
487
+ # v.setUv(Point2D(0, 1))
488
+ # poly.addVertex(vp.addVertex(v))
489
+
490
+ v = EggVertex()
491
+ if lineDim == 0:
492
+ v.setPos(Point3D(1 - (values[len(values) - 1] + deltas[0]), fixedValue + deltas[1], self.wallHeight))
493
+ else:
494
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[len(values) - 1] + deltas[1], self.wallHeight))
495
+ pass
496
+ v.setUv(Point2D(1, 1))
497
+ poly.addVertex(vp.addVertex(v))
498
+
499
+ v = EggVertex()
500
+ if lineDim == 0:
501
+ v.setPos(Point3D(1 - (values[0] + deltas[0]), fixedValue + deltas[1], self.wallHeight))
502
+ else:
503
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[0] + deltas[1], self.wallHeight))
504
+ pass
505
+ v.setUv(Point2D(1, 0))
506
+ poly.addVertex(vp.addVertex(v))
507
+
508
+
509
+
510
+
511
+ if lineDim == 0:
512
+ poly = EggPolygon()
513
+ wallGroup.addChild(poly)
514
+ poly.setTexture(self.wallMats[10].getEggTexture())
515
+ poly.setMaterial(self.wallMats[10].getEggMaterial())
516
+
517
+ v = EggVertex()
518
+ v.setPos(Point3D(1 - values[0], fixedValue - deltas[1], 0))
519
+ v.setUv(Point2D(0, 0))
520
+ poly.addVertex(vp.addVertex(v))
521
+
522
+ v = EggVertex()
523
+ v.setPos(Point3D(1 - values[0], fixedValue - deltas[1], self.wallHeight))
524
+ v.setUv(Point2D(0, 1))
525
+ poly.addVertex(vp.addVertex(v))
526
+
527
+ v = EggVertex()
528
+ v.setPos(Point3D(1 - values[0], fixedValue + deltas[1], self.wallHeight))
529
+ v.setUv(Point2D(1, 1))
530
+ poly.addVertex(vp.addVertex(v))
531
+
532
+ v = EggVertex()
533
+ v.setPos(Point3D(1 - values[0], fixedValue + deltas[1], 0))
534
+ v.setUv(Point2D(1, 0))
535
+ poly.addVertex(vp.addVertex(v))
536
+
537
+
538
+ poly = EggPolygon()
539
+ wallGroup.addChild(poly)
540
+ poly.setTexture(self.wallMats[10].getEggTexture())
541
+ poly.setMaterial(self.wallMats[10].getEggMaterial())
542
+
543
+ v = EggVertex()
544
+ v.setPos(Point3D(1 - values[0], fixedValue - deltas[1], self.wallHeight))
545
+ v.setUv(Point2D(0, 0))
546
+ poly.addVertex(vp.addVertex(v))
547
+
548
+ v = EggVertex()
549
+ v.setPos(Point3D(1 - values[len(values) - 1], fixedValue - deltas[1], self.wallHeight))
550
+ v.setUv(Point2D(0, 1))
551
+ poly.addVertex(vp.addVertex(v))
552
+
553
+ v = EggVertex()
554
+ v.setPos(Point3D(1 - values[len(values) - 1], fixedValue + deltas[1], self.wallHeight))
555
+ v.setUv(Point2D(1, 1))
556
+ poly.addVertex(vp.addVertex(v))
557
+
558
+ v = EggVertex()
559
+ v.setPos(Point3D(1 - values[0], fixedValue + deltas[1], self.wallHeight))
560
+ v.setUv(Point2D(1, 0))
561
+ poly.addVertex(vp.addVertex(v))
562
+
563
+
564
+ poly = EggPolygon()
565
+ wallGroup.addChild(poly)
566
+ poly.setTexture(self.wallMats[10].getEggTexture())
567
+ poly.setMaterial(self.wallMats[10].getEggMaterial())
568
+
569
+ v = EggVertex()
570
+ v.setPos(Point3D(1 - values[len(values) - 1], fixedValue - deltas[1], self.wallHeight))
571
+ v.setUv(Point2D(0, 0))
572
+ poly.addVertex(vp.addVertex(v))
573
+
574
+ v = EggVertex()
575
+ v.setPos(Point3D(1 - values[len(values) - 1], fixedValue - deltas[1], 0))
576
+ v.setUv(Point2D(0, 1))
577
+ poly.addVertex(vp.addVertex(v))
578
+
579
+ v = EggVertex()
580
+ v.setPos(Point3D(1 - values[len(values) - 1], fixedValue + deltas[1], 0))
581
+ v.setUv(Point2D(1, 1))
582
+ poly.addVertex(vp.addVertex(v))
583
+
584
+ v = EggVertex()
585
+ v.setPos(Point3D(1 - values[len(values) - 1], fixedValue + deltas[1], self.wallHeight))
586
+ v.setUv(Point2D(1, 0))
587
+ poly.addVertex(vp.addVertex(v))
588
+
589
+ else:
590
+ poly = EggPolygon()
591
+ wallGroup.addChild(poly)
592
+ poly.setTexture(self.wallMats[10].getEggTexture())
593
+ poly.setMaterial(self.wallMats[10].getEggMaterial())
594
+
595
+ v = EggVertex()
596
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[0], 0))
597
+ v.setUv(Point2D(0, 0))
598
+ poly.addVertex(vp.addVertex(v))
599
+
600
+ v = EggVertex()
601
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[0], self.wallHeight))
602
+ v.setUv(Point2D(0, 1))
603
+ poly.addVertex(vp.addVertex(v))
604
+
605
+ v = EggVertex()
606
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[0], self.wallHeight))
607
+ v.setUv(Point2D(1, 1))
608
+ poly.addVertex(vp.addVertex(v))
609
+
610
+ v = EggVertex()
611
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[0], 0))
612
+ v.setUv(Point2D(1, 0))
613
+ poly.addVertex(vp.addVertex(v))
614
+
615
+
616
+ poly = EggPolygon()
617
+ wallGroup.addChild(poly)
618
+ poly.setTexture(self.wallMats[10].getEggTexture())
619
+ poly.setMaterial(self.wallMats[10].getEggMaterial())
620
+
621
+ v = EggVertex()
622
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[0], self.wallHeight))
623
+ v.setUv(Point2D(0, 0))
624
+ poly.addVertex(vp.addVertex(v))
625
+
626
+ v = EggVertex()
627
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[len(values) - 1], self.wallHeight))
628
+ v.setUv(Point2D(0, 1))
629
+ poly.addVertex(vp.addVertex(v))
630
+
631
+ v = EggVertex()
632
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[len(values) - 1], self.wallHeight))
633
+ v.setUv(Point2D(1, 1))
634
+ poly.addVertex(vp.addVertex(v))
635
+
636
+ v = EggVertex()
637
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[0], self.wallHeight))
638
+ v.setUv(Point2D(1, 0))
639
+ poly.addVertex(vp.addVertex(v))
640
+
641
+
642
+ poly = EggPolygon()
643
+ wallGroup.addChild(poly)
644
+ poly.setTexture(self.wallMats[10].getEggTexture())
645
+ poly.setMaterial(self.wallMats[10].getEggMaterial())
646
+
647
+ v = EggVertex()
648
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[len(values) - 1], self.wallHeight))
649
+ v.setUv(Point2D(0, 0))
650
+ poly.addVertex(vp.addVertex(v))
651
+
652
+ v = EggVertex()
653
+ v.setPos(Point3D(1 - (fixedValue - deltas[0]), values[len(values) - 1], 0))
654
+ v.setUv(Point2D(0, 1))
655
+ poly.addVertex(vp.addVertex(v))
656
+
657
+ v = EggVertex()
658
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[len(values) - 1], 0))
659
+ v.setUv(Point2D(1, 1))
660
+ poly.addVertex(vp.addVertex(v))
661
+
662
+ v = EggVertex()
663
+ v.setPos(Point3D(1 - (fixedValue + deltas[0]), values[len(values) - 1], self.wallHeight))
664
+ v.setUv(Point2D(1, 0))
665
+ poly.addVertex(vp.addVertex(v))
666
+
667
+ continue
668
+ return
669
+
670
+
671
+ def generateDoors(self, data):
672
+ doorsGroup = EggGroup('doors')
673
+ data.addChild(doorsGroup)
674
+
675
+ vp = EggVertexPool('door_vertex')
676
+ doorsGroup.addChild(vp)
677
+
678
+ for doorIndex, door in enumerate(self.doors):
679
+ doorGroup = EggGroup('door_' + str(doorIndex))
680
+ doorsGroup.addChild(doorGroup)
681
+
682
+ lineDim = calcLineDim((door[:2], door[2:4]))
683
+
684
+ if lineDim == 0:
685
+ deltas = (0, self.doorWidth)
686
+ else:
687
+ deltas = (self.doorWidth, 0)
688
+ pass
689
+
690
+ poly = EggPolygon()
691
+ doorGroup.addChild(poly)
692
+ poly.setTexture(self.doorMat.getEggTexture())
693
+ poly.setMaterial(self.doorMat.getEggMaterial())
694
+
695
+ v = EggVertex()
696
+ v.setPos(Point3D(1 - (door[0] - deltas[0]), door[1] - deltas[1], 0))
697
+ v.setUv(Point2D(0, 0))
698
+ poly.addVertex(vp.addVertex(v))
699
+
700
+ v = EggVertex()
701
+ v.setPos(Point3D(1 - (door[2] - deltas[0]), door[3] - deltas[1], 0))
702
+ v.setUv(Point2D(1, 0))
703
+ poly.addVertex(vp.addVertex(v))
704
+
705
+ v = EggVertex()
706
+ v.setPos(Point3D(1 - (door[2] - deltas[0]), door[3] - deltas[1], self.doorHeight))
707
+ v.setUv(Point2D(1, 1))
708
+ poly.addVertex(vp.addVertex(v))
709
+
710
+ v = EggVertex()
711
+ v.setPos(Point3D(1 - (door[0] - deltas[0]), door[1] - deltas[1], self.doorHeight))
712
+ v.setUv(Point2D(0, 1))
713
+ poly.addVertex(vp.addVertex(v))
714
+
715
+
716
+ poly = EggPolygon()
717
+ doorGroup.addChild(poly)
718
+ poly.setTexture(self.doorMat.getEggTexture())
719
+ poly.setMaterial(self.doorMat.getEggMaterial())
720
+
721
+ v = EggVertex()
722
+ v.setPos(Point3D(1 - (door[0] + deltas[0]), door[1] + deltas[1], 0))
723
+ v.setUv(Point2D(0, 0))
724
+ poly.addVertex(vp.addVertex(v))
725
+
726
+ v = EggVertex()
727
+ v.setPos(Point3D(1 - (door[2] + deltas[0]), door[3] + deltas[1], 0))
728
+ v.setUv(Point2D(1, 0))
729
+ poly.addVertex(vp.addVertex(v))
730
+
731
+ v = EggVertex()
732
+ v.setPos(Point3D(1 - (door[2] + deltas[0]), door[3] + deltas[1], self.doorHeight))
733
+ v.setUv(Point2D(1, 1))
734
+ poly.addVertex(vp.addVertex(v))
735
+
736
+ v = EggVertex()
737
+ v.setPos(Point3D(1 - (door[0] + deltas[0]), door[1] + deltas[1], self.doorHeight))
738
+ v.setUv(Point2D(0, 1))
739
+ poly.addVertex(vp.addVertex(v))
740
+
741
+ continue
742
+ return
743
+
744
+
745
+ def generateWindows(self, data):
746
+ windowsGroup = EggGroup('windows')
747
+ data.addChild(windowsGroup)
748
+
749
+ vp = EggVertexPool('window_vertex')
750
+ windowsGroup.addChild(vp)
751
+
752
+ for windowIndex, window in enumerate(self.windows):
753
+ windowGroup = EggGroup('window_' + str(windowIndex))
754
+ windowsGroup.addChild(windowGroup)
755
+
756
+ lineDim = calcLineDim((window[:2], window[2:4]))
757
+
758
+ if lineDim == 0:
759
+ deltas = (0, self.windowWidth)
760
+ else:
761
+ deltas = (self.windowWidth, 0)
762
+ pass
763
+
764
+ poly = EggPolygon()
765
+ windowGroup.addChild(poly)
766
+ poly.setTexture(self.windowMat.getEggTexture())
767
+ poly.setMaterial(self.windowMat.getEggMaterial())
768
+
769
+ v = EggVertex()
770
+ v.setPos(Point3D(1 - (window[0] - deltas[0]), window[1] - deltas[1], self.windowOffset))
771
+ v.setUv(Point2D(0, 0))
772
+ poly.addVertex(vp.addVertex(v))
773
+
774
+ v = EggVertex()
775
+ v.setPos(Point3D(1 - (window[2] - deltas[0]), window[3] - deltas[1], self.windowOffset))
776
+ v.setUv(Point2D(1, 0))
777
+ poly.addVertex(vp.addVertex(v))
778
+
779
+ v = EggVertex()
780
+ v.setPos(Point3D(1 - (window[2] - deltas[0]), window[3] - deltas[1], self.windowOffset + self.windowHeight))
781
+ v.setUv(Point2D(1, 1))
782
+ poly.addVertex(vp.addVertex(v))
783
+
784
+ v = EggVertex()
785
+ v.setPos(Point3D(1 - (window[0] - deltas[0]), window[1] - deltas[1], self.windowOffset + self.windowHeight))
786
+ v.setUv(Point2D(0, 1))
787
+ poly.addVertex(vp.addVertex(v))
788
+
789
+
790
+ poly = EggPolygon()
791
+ windowGroup.addChild(poly)
792
+ poly.setTexture(self.windowMat.getEggTexture())
793
+ poly.setMaterial(self.windowMat.getEggMaterial())
794
+
795
+ v = EggVertex()
796
+ v.setPos(Point3D(1 - (window[0] + deltas[0]), window[1] + deltas[1], self.windowOffset))
797
+ v.setUv(Point2D(0, 0))
798
+ poly.addVertex(vp.addVertex(v))
799
+
800
+ v = EggVertex()
801
+ v.setPos(Point3D(1 - (window[2] + deltas[0]), window[3] + deltas[1], self.windowOffset))
802
+ v.setUv(Point2D(1, 0))
803
+ poly.addVertex(vp.addVertex(v))
804
+
805
+ v = EggVertex()
806
+ v.setPos(Point3D(1 - (window[2] + deltas[0]), window[3] + deltas[1], self.windowOffset + self.windowHeight))
807
+ v.setUv(Point2D(1, 1))
808
+ poly.addVertex(vp.addVertex(v))
809
+
810
+ v = EggVertex()
811
+ v.setPos(Point3D(1 - (window[0] + deltas[0]), window[1] + deltas[1], self.windowOffset + self.windowHeight))
812
+ v.setUv(Point2D(0, 1))
813
+ poly.addVertex(vp.addVertex(v))
814
+
815
+ continue
816
+ return
817
+
818
+
819
+ def generateIcons(self, scene):
820
+ for icon in self.icons:
821
+ if icon[4] not in self.iconNodes:
822
+ continue
823
+ #self.iconNodes[icon[4]].reparentTo(scene)
824
+ node = deepcopy(self.iconNodes[icon[4]])
825
+ node.setHpr(0, -90, 0)
826
+ mins, maxs = node.getTightBounds()
827
+ dimensions = Point3(maxs - mins)
828
+
829
+ minDistances = [self.maxDim, self.maxDim, self.maxDim, self.maxDim]
830
+ for wall in self.walls:
831
+ lineDim = calcLineDim(((wall[0], wall[1]), (wall[2], wall[3])))
832
+ if lineDim == -1:
833
+ continue
834
+ if ((icon[lineDim] + icon[2 + lineDim]) / 2 - wall[lineDim]) * ((icon[lineDim] + icon[2 + lineDim]) / 2 - wall[2 + lineDim]) > 0:
835
+ continue
836
+ side = int(wall[1 - lineDim] > (icon[1 - lineDim] + icon[3 - lineDim]) / 2)
837
+ index = lineDim * 2 + side
838
+ distance = abs(wall[1 - lineDim] - icon[1 - lineDim + side * 2])
839
+ if distance < minDistances[index]:
840
+ minDistances[index] = distance
841
+ pass
842
+ continue
843
+
844
+
845
+ orientation = 0
846
+ if icon[4] in ['cooking_counter']:
847
+ if icon[2] - icon[0] > icon[3] - icon[1]:
848
+ if minDistances[0] < minDistances[1]:
849
+ orientation = 0
850
+ else:
851
+ orientation = 1
852
+ else:
853
+ if minDistances[2] < minDistances[3]:
854
+ orientation = 2
855
+ else:
856
+ orientation = 3
857
+ pass
858
+ pass
859
+ elif icon[4] in ['toilet']:
860
+ if icon[2] - icon[0] < icon[3] - icon[1]:
861
+ if minDistances[0] < minDistances[1]:
862
+ orientation = 0
863
+ else:
864
+ orientation = 1
865
+ else:
866
+ if minDistances[2] < minDistances[3]:
867
+ orientation = 2
868
+ else:
869
+ orientation = 3
870
+ pass
871
+ pass
872
+ elif icon[4] in ['washing_basin']:
873
+ orientation = np.argmin(minDistances)
874
+ pass
875
+
876
+
877
+ if orientation == 1:
878
+ node.setH(180)
879
+ elif orientation == 2:
880
+ node.setH(90)
881
+ elif orientation == 3:
882
+ node.setH(270)
883
+ pass
884
+ if icon[4] == 'washing_basin':
885
+ node.setH(90 + node.getH())
886
+ mins, maxs = node.getTightBounds()
887
+ dimensions = Point3(maxs - mins)
888
+
889
+ # if ((maxs.getX() - mins.getX()) - (maxs.getY() - mins.getY())) * ((icon[2] - icon[0]) - (icon[3] - icon[1])) > 0:
890
+ # scaleX = (icon[2] - icon[0]) / dimensions.getX()
891
+ # scaleZ = (icon[3] - icon[1]) / dimensions.getZ()
892
+ # scaleY = max(scaleX, scaleZ)
893
+ # node.setScale(scaleX, scaleY, scaleZ)
894
+ # node.setHpr(0, -90, 0)
895
+ # node.setPos(icon[0] - mins.getX() * scaleX, icon[1] - mins.getZ() * scaleZ, maxs.getY() * scaleY)
896
+ # orientation
897
+ # else:
898
+ # scaleX = (icon[3] - icon[1]) / dimensions.getX()
899
+ # scaleZ = (icon[2] - icon[0]) / dimensions.getZ()
900
+ # scaleY = max(scaleX, scaleZ)
901
+ # node.setScale(scaleX, scaleY, scaleZ)
902
+ # node.setHpr(90, -90, 0)
903
+ # node.setPos(icon[0] + maxs.getZ() * scaleZ, icon[1] - mins.getX() * scaleX, maxs.getY() * scaleY)
904
+ # #pivotNode = scene.attachNewNode("pivot")
905
+ # #pivotNode.setPos(icon[0] - mins.getX() * scaleX, icon[1] - mins.getZ() * scaleZ, maxs.getY() * scaleY)
906
+ # #node.wrtReparentTo(pivotNode)
907
+ # #pivotNode.setHpr(90, 0, 0)
908
+ # pass
909
+
910
+
911
+ scaleX = (icon[2] - icon[0]) / dimensions.getX()
912
+ scaleY = (icon[3] - icon[1]) / dimensions.getY()
913
+ scaleZ = max(scaleX, scaleY)
914
+ node.setScale(scaleX, scaleY, scaleZ)
915
+ node.setPos(1 - icon[0] - maxs.getX() * scaleX, icon[1] - mins.getY() * scaleY, -mins.getZ() * scaleZ)
916
+
917
+ node.setTwoSided(True)
918
+ node.reparentTo(scene)
919
+ #data.addChild(node.node())
920
+ #node.setPos(icon[0], icon[1], 0)
921
+ #node.reparentTo(data)
922
+ continue
923
+ return
924
+
925
+ def generateEggModel(self):
926
+ data = EggData()
927
+ model = EggGroup('model')
928
+ data.addChild(model)
929
+ self.generateFloor(model)
930
+ self.generateWalls(model)
931
+ self.generateDoors(model)
932
+ self.generateWindows(model)
933
+ data.writeEgg(Filename("test/floorplan.egg"))
934
+ scene = NodePath(loadEggData(data))
935
+ self.generateIcons(scene)
936
+ return scene
937
+
938
+ poly = EggPolygon()
939
+ data.addChild(poly)
940
+
941
+
942
+ v = EggVertex()
943
+ v.setPos(Point3D(0, 0, 0))
944
+ v.setUv(Point2D(0, 0))
945
+ poly.addVertex(vp.addVertex(v))
946
+
947
+ v = EggVertex()
948
+ v.setPos(Point3D(1, 0, 0))
949
+ v.setUv(Point2D(1, 0))
950
+ poly.addVertex(vp.addVertex(v))
951
+
952
+ v = EggVertex()
953
+ v.setPos(Point3D(1, 0, 1))
954
+ v.setUv(Point2D(1, 1))
955
+ poly.addVertex(vp.addVertex(v))
956
+
957
+ v = EggVertex()
958
+ v.setPos(Point3D(0, 0, 1))
959
+ v.setUv(Point2D(0, 1))
960
+ poly.addVertex(vp.addVertex(v))
961
+
962
+ # To write the egg file to disk, use this:
963
+ data.writeEgg(Filename("floorplan.egg"))
964
+
965
+ # To load the egg file and render it immediately, use this:
966
+ node = loadEggData(data)
967
+ scene = NodePath(node)
968
+ return scene
969
+
970
+ def segmentRooms(self):
971
+ wallMask = np.ones((self.height, self.width), np.uint8) * 255
972
+ for wall in self.wallsInt:
973
+ lineDim = calcLineDim(((wall[0], wall[1]), (wall[2], wall[3])))
974
+ if lineDim == 0:
975
+ wallMask[wall[1], wall[0]:wall[2] + 1] = 0
976
+ else:
977
+ wallMask[wall[1]:wall[3] + 1, wall[0]] = 0
978
+ pass
979
+ continue
980
+ cv2.imwrite('test/walls.png', wallMask)
981
+
982
+ numLabels, labels, stats, centroids = cv2.connectedComponentsWithStats(wallMask, 4)
983
+ print(numLabels.shape)
984
+ print(labels.shape)
985
+ print(stats.shape)
986
+ print(centroids.shape)
987
+ cv2.imwrite('test/rooms.png', labels)
rendering/obj2egg.py ADDED
@@ -0,0 +1,554 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/python
2
+ """
3
+ This Version: $Id: obj2egg.py,v 1.7 2008/05/26 17:42:53 andyp Exp $
4
+ Info: info >at< pfastergames.com
5
+
6
+ Extended from: http://panda3d.org/phpbb2/viewtopic.php?t=3378
7
+ .___..__ .___.___.___.__..__ . .
8
+ | [__)[__ [__ [__ | |[__)|\/|
9
+ | | \[___[___| |__|| \| |
10
+ obj2egg.py [n##][b][t][s] filename1.obj ...
11
+ -n regenerate normals with # degree smoothing
12
+ exaple -n30 (normals at less 30 degrees will be smoothed)
13
+ -b make binarmals
14
+ -t make tangents
15
+ -s show in pview
16
+
17
+ licensed under WTFPL (http://sam.zoy.org/wtfpl/)
18
+ """
19
+
20
+ from pandac.PandaModules import *
21
+ import math
22
+ import string
23
+ import getopt
24
+ import sys, os
25
+
26
+
27
+ def floats(float_list):
28
+ """coerce a list of strings that represent floats into a list of floats"""
29
+ return [ float(number) for number in float_list ]
30
+
31
+ def ints(int_list):
32
+ """coerce a list of strings that represent integers into a list of integers"""
33
+ return [ int(number) for number in int_list ]
34
+
35
+
36
+ class ObjMaterial:
37
+ """a wavefront material"""
38
+ def __init__(self):
39
+ self.filename = None
40
+ self.name = "default"
41
+ self.eggdiffusetexture = None
42
+ self.eggmaterial = None
43
+ self.attrib = {}
44
+ self.attrib["Ns"] = 100.0
45
+ self.attrib["d"] = 1.0
46
+ self.attrib["illum"] = 2
47
+ # "magenta"
48
+ self.attrib["Kd"] = [1.0, 1.0, 1.0]
49
+ self.attrib["Ka"] = [0.0, 0.0, 0.0]
50
+ self.attrib["Ks"] = [0.0, 0.0, 0.0]
51
+ self.attrib["Ke"] = [0.0, 0.0, 0.0]
52
+
53
+ def put(self, key, value):
54
+ self.attrib[key] = value
55
+ return self
56
+
57
+ def get(self, key):
58
+ if self.attrib.has_key(key):
59
+ return self.attrib[key]
60
+ return None
61
+
62
+ def has_key(self, key):
63
+ return self.attrib.has_key(key)
64
+
65
+ def isTextured(self):
66
+ # for k in ("map_Kd", "map_Bump", "map_Ks"): <-- NOT YET
67
+ if self.attrib.has_key("map_Kd"):
68
+ return True;
69
+ return False;
70
+
71
+ def getEggTexture(self):
72
+ if self.eggdiffusetexture:
73
+ return self.eggdiffusetexture
74
+ if not self.isTextured():
75
+ return None
76
+ m = EggTexture(self.name + "_diffuse", self.get("map_Kd"))
77
+ m.setFormat(EggTexture.FRgb)
78
+ m.setMagfilter(EggTexture.FTLinearMipmapLinear)
79
+ m.setMinfilter(EggTexture.FTLinearMipmapLinear)
80
+ m.setWrapU(EggTexture.WMRepeat)
81
+ m.setWrapV(EggTexture.WMRepeat)
82
+ self.eggdiffusetexture = m
83
+ return self.eggdiffusetexture
84
+
85
+ def getEggMaterial(self):
86
+ if self.eggmaterial:
87
+ return self.eggmaterial
88
+ m = EggMaterial(self.name + "_mat")
89
+ # XXX TODO: add support for specular, and obey illum setting
90
+ # XXX as best as we can
91
+ rgb = self.get("Kd")
92
+ if rgb is not None:
93
+ m.setDiff(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
94
+ rgb = self.get("Ka")
95
+ if rgb is not None:
96
+ m.setAmb(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
97
+ rgb = self.get("Ks")
98
+ if rgb is not None:
99
+ m.setSpec(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
100
+ ns = self.get("Ns")
101
+ if ns is not None:
102
+ m.setShininess(ns)
103
+ self.eggmaterial = m
104
+ return self.eggmaterial
105
+
106
+ class MtlFile:
107
+ """an object representing all Wavefront materials in a .mtl file"""
108
+ def __init__(self, filename=None):
109
+ self.filename = None
110
+ self.materials = {}
111
+ self.comments = {}
112
+ if filename is not None:
113
+ self.read(filename)
114
+
115
+ def read(self, filename, verbose=False):
116
+ self.filename = filename
117
+ self.materials = {}
118
+ self.comments = {}
119
+ try:
120
+ file = open(filename)
121
+ except:
122
+ return self
123
+ linenumber = 0
124
+ mat = None
125
+ for line in file.readlines():
126
+ line = line.strip()
127
+ linenumber = linenumber + 1
128
+ if not line:
129
+ continue
130
+ if line[0] == '#':
131
+ self.comments[linenumber] = line
132
+ print line
133
+ continue
134
+ tokens = line.split()
135
+ if not tokens:
136
+ continue
137
+ if verbose: print "tokens[0]:", tokens
138
+ if tokens[0] == "newmtl":
139
+ mat = ObjMaterial()
140
+ mat.filename = filename
141
+ mat.name = tokens[1]
142
+ self.materials[mat.name] = mat
143
+ if verbose: print "newmtl:", mat.name
144
+ continue
145
+ if tokens[0] in ("Ns", "d", "Tr"):
146
+ # "d factor" - specifies the dissovle for the current material,
147
+ # 1.0 is full opaque
148
+ # "Ns exponent" - specifies the specular exponent. A high exponent
149
+ # results in a tight, concentrated highlight.
150
+ mat.put(tokens[0], float(tokens[1]))
151
+ continue
152
+ if tokens[0] in ("illum"):
153
+ # according to http://www.fileformat.info/format/material/
154
+ # 0 = Color on and Ambient off
155
+ # 1 = Color on and Ambient on
156
+ # 2 = Highlight on
157
+ # 3 = Reflection on and Ray trace on
158
+ # 4 = Transparency: Glass on, Reflection: Ray trace on
159
+ # 5 = Reflection: Fesnel on and Ray trace on
160
+ # 6 = Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
161
+ # 7 = Transparency: Refraction on, Refelction: Fresnel on and Ray Trace on
162
+ # 8 = Reflection on and Ray trace off
163
+ # 9 = Transparency: Glass on, Reflection: Ray trace off
164
+ # 10 = Casts shadows onto invisible surfaces
165
+ mat.put(tokens[0], int(tokens[1]))
166
+ continue
167
+ if tokens[0] in ("Kd", "Ka", "Ks", "Ke"):
168
+ mat.put(tokens[0], floats(tokens[1:]))
169
+ continue
170
+ if tokens[0] in ("map_Kd", "map_Bump", "map_Ks", "map_bump", "bump"):
171
+ # Ultimate Unwrap 3D Pro emits these:
172
+ # map_Kd == diffuse
173
+ # map_Bump == bump
174
+ # map_Ks == specular
175
+ mat.put(tokens[0], pathify(tokens[1]))
176
+ if verbose: print "map:", mat.name, tokens[0], mat.get(tokens[0])
177
+ continue
178
+ if tokens[0] in ("Ni"):
179
+ # blender's .obj exporter can emit this "Ni 1.000000"
180
+ mat.put(tokens[0], float(tokens[1]))
181
+ continue
182
+ print "file \"%s\": line %d: unrecognized:" % (filename, linenumber), tokens
183
+ file.close()
184
+ if verbose: print "%d materials" % len(self.materials), "loaded from", filename
185
+ return self
186
+
187
+ class ObjFile:
188
+ """a representation of a wavefront .obj file"""
189
+ def __init__(self, filename=None):
190
+ self.filename = None
191
+ self.objects = ["defaultobject"]
192
+ self.groups = ["defaultgroup"]
193
+ self.points = []
194
+ self.uvs = []
195
+ self.normals = []
196
+ self.faces = []
197
+ self.polylines = []
198
+ self.matlibs = []
199
+ self.materialsbyname = {}
200
+ self.comments = {}
201
+ self.currentobject = self.objects[0]
202
+ self.currentgroup = self.groups[0]
203
+ self.currentmaterial = None
204
+ if filename is not None:
205
+ self.read(filename)
206
+
207
+ def read(self, filename, verbose=False):
208
+ if verbose: print "ObjFile.read:", "filename:", filename
209
+ self.filename = filename
210
+ self.objects = ["defaultobject"]
211
+ self.groups = ["defaultgroup"]
212
+ self.points = []
213
+ self.uvs = []
214
+ self.normals = []
215
+ self.faces = []
216
+ self.polylines = []
217
+ self.matlibs = []
218
+ self.materialsbyname = {}
219
+ self.comments = {}
220
+ self.currentobject = self.objects[0]
221
+ self.currentgroup = self.groups[0]
222
+ self.currentmaterial = None
223
+ try:
224
+ file = open(filename)
225
+ except:
226
+ return self
227
+ linenumber = 0
228
+ for line in file.readlines():
229
+ line = line.strip()
230
+ linenumber = linenumber + 1
231
+ if not line:
232
+ continue
233
+ if line[0] == '#':
234
+ self.comments[linenumber] = line
235
+ print line
236
+ continue
237
+ tokens = line.split()
238
+ if not tokens:
239
+ continue
240
+ if tokens[0] == "mtllib":
241
+ if verbose: print "mtllib:", tokens[1:]
242
+ mtllib = MtlFile(tokens[1])
243
+ # if verbose: print mtllib
244
+ self.matlibs.append(mtllib)
245
+ self.indexmaterials(mtllib)
246
+ continue
247
+ if tokens[0] == "g":
248
+ if verbose: print "g:", tokens[1:]
249
+ self.__newgroup("".join(tokens[1:]))
250
+ continue
251
+ if tokens[0] == "o":
252
+ if verbose: print "o:", tokens[1:]
253
+ self.__newobject("".join(tokens[1:]))
254
+ continue
255
+ if tokens[0] == "usemtl":
256
+ if verbose: print "usemtl:", tokens[1:]
257
+ self.__usematerial(tokens[1])
258
+ continue
259
+ if tokens[0] == "v":
260
+ if verbose: print "v:", tokens[1:]
261
+ self.__newv(tokens[1:])
262
+ continue
263
+ if tokens[0] == "vn":
264
+ if verbose: print "vn:", tokens[1:]
265
+ self.__newnormal(tokens[1:])
266
+ continue
267
+ if tokens[0] == "vt":
268
+ if verbose: print "vt:", tokens[1:]
269
+ self.__newuv(tokens[1:])
270
+ continue
271
+ if tokens[0] == "f":
272
+ if verbose: print "f:", tokens[1:]
273
+ self.__newface(tokens[1:])
274
+ continue
275
+ if tokens[0] == "s":
276
+ # apparently, this enables/disables smoothing
277
+ print "%s:%d:" % (filename, linenumber), "ignoring:", tokens
278
+ continue
279
+ if tokens[0] == "l":
280
+ if verbose: print "l:", tokens[1:]
281
+ self.__newpolyline(tokens[1:])
282
+ continue
283
+ print "%s:%d:" % (filename, linenumber), "unknown:", tokens
284
+ file.close()
285
+ return self
286
+
287
+ def __vertlist(self, lst):
288
+ res = []
289
+ for vert in lst:
290
+ vinfo = vert.split("/")
291
+ vlen = len(vinfo)
292
+ vertex = {'v':None, 'vt':None, 'vn':None}
293
+ if vlen == 1:
294
+ vertex['v'] = int(vinfo[0])
295
+ elif vlen == 2:
296
+ if vinfo[0] != '':
297
+ vertex['v'] = int(vinfo[0])
298
+ if vinfo[1] != '':
299
+ vertex['vt'] = int(vinfo[1])
300
+ elif vlen == 3:
301
+ if vinfo[0] != '':
302
+ vertex['v'] = int(vinfo[0])
303
+ if vinfo[1] != '':
304
+ vertex['vt'] = int(vinfo[1])
305
+ if vinfo[2] != '':
306
+ vertex['vn'] = int(vinfo[2])
307
+ else:
308
+ print "aborting..."
309
+ raise UNKNOWN, res
310
+ res.append(vertex)
311
+ if False: print res
312
+ return res
313
+
314
+ def __enclose(self, lst):
315
+ mdata = (self.currentobject, self.currentgroup, self.currentmaterial)
316
+ return (lst, mdata)
317
+
318
+ def __newpolyline(self, l):
319
+ polyline = self.__vertlist(l)
320
+ if False: print "__newline:", polyline
321
+ self.polylines.append(self.__enclose(polyline))
322
+ return self
323
+
324
+ def __newface(self, f):
325
+ face = self.__vertlist(f)
326
+ if False: print face
327
+ self.faces.append(self.__enclose(face))
328
+ return self
329
+
330
+ def __newuv(self, uv):
331
+ self.uvs.append(floats(uv))
332
+ return self
333
+
334
+ def __newnormal(self, normal):
335
+ self.normals.append(floats(normal))
336
+ return self
337
+
338
+ def __newv(self, v):
339
+ # capture the current metadata with vertices
340
+ vdata = floats(v)
341
+ mdata = (self.currentobject, self.currentgroup, self.currentmaterial)
342
+ vinfo = (vdata, mdata)
343
+ self.points.append(vinfo)
344
+ return self
345
+
346
+ def indexmaterials(self, mtllib, verbose=False):
347
+ # traverse the materials defined in mtllib, indexing
348
+ # them by name.
349
+ for mname in mtllib.materials:
350
+ mobj = mtllib.materials[mname]
351
+ self.materialsbyname[mobj.name] = mobj
352
+ if verbose:
353
+ print "indexmaterials:", mtllib.filename, "materials:", self.materialsbyname.keys()
354
+ return self
355
+
356
+ def __closeobject(self):
357
+ self.currentobject = "defaultobject"
358
+ return self
359
+
360
+ def __newobject(self, object):
361
+ self.__closeobject()
362
+ if False: print "__newobject:", "object:", object
363
+ self.currentobject = object
364
+ self.objects.append(object)
365
+ return self
366
+
367
+ def __closegroup(self):
368
+ self.currentgroup = "defaultgroup"
369
+ return self
370
+
371
+ def __newgroup(self, group):
372
+ self.__closegroup()
373
+ if False: print "__newgroup:", "group:", group
374
+ self.currentgroup = group
375
+ self.groups.append(group)
376
+ return self
377
+
378
+ def __usematerial(self, material):
379
+ if False: print "__usematerial:", "material:", material
380
+ if self.materialsbyname.has_key(material):
381
+ self.currentmaterial = material
382
+ else:
383
+ print "warning:", "__usematerial:", "unknown material:", material
384
+ return self
385
+
386
+ def __itemsby(self, itemlist, objname, groupname):
387
+ res = []
388
+ for item in itemlist:
389
+ vlist, mdata = item
390
+ wobj, wgrp, wmat = mdata
391
+ if (wobj == objname) and (wgrp == groupname):
392
+ res.append(item)
393
+ return res
394
+
395
+ def __facesby(self, objname, groupname):
396
+ return self.__itemsby(self.faces, objname, groupname)
397
+
398
+ def __linesby(self, objname, groupname):
399
+ return self.__itemsby(self.polylines, objname, groupname)
400
+
401
+ def __eggifyverts(self, eprim, evpool, vlist):
402
+ for vertex in vlist:
403
+ ixyz = vertex['v']
404
+ vinfo = self.points[ixyz-1]
405
+ vxyz, vmeta = vinfo
406
+ ev = EggVertex()
407
+ ev.setPos(Point3D(vxyz[0], vxyz[1], vxyz[2]))
408
+ iuv = vertex['vt']
409
+ if iuv is not None:
410
+ vuv = self.uvs[iuv-1]
411
+ ev.setUv(Point2D(vuv[0], vuv[1]))
412
+ inormal = vertex['vn']
413
+ if inormal is not None:
414
+ vn = self.normals[inormal-1]
415
+ ev.setNormal(Vec3D(vn[0], vn[1], vn[2]))
416
+ evpool.addVertex(ev)
417
+ eprim.addVertex(ev)
418
+ return self
419
+
420
+ def __eggifymats(self, eprim, wmat):
421
+ if self.materialsbyname.has_key(wmat):
422
+ mtl = self.materialsbyname[wmat]
423
+ if mtl.isTextured():
424
+ eprim.setTexture(mtl.getEggTexture())
425
+ # NOTE: it looks like you almost always want to setMaterial()
426
+ # for textured polys.... [continued below...]
427
+ eprim.setMaterial(mtl.getEggMaterial())
428
+ rgb = mtl.get("Kd")
429
+ if rgb is not None:
430
+ # ... and some untextured .obj's store the color of the
431
+ # material # in the Kd settings...
432
+ eprim.setColor(Vec4(rgb[0], rgb[1], rgb[2], 1.0))
433
+ # [continued...] but you may *not* always want to assign
434
+ # materials to untextured polys... hmmmm.
435
+ if False:
436
+ eprim.setMaterial(mtl.getEggMaterial())
437
+ return self
438
+
439
+ def __facestoegg(self, egg, objname, groupname):
440
+ selectedfaces = self.__facesby(objname, groupname)
441
+ if len(selectedfaces) == 0:
442
+ return self
443
+ eobj = EggGroup(objname)
444
+ egg.addChild(eobj)
445
+ egrp = EggGroup(groupname)
446
+ eobj.addChild(egrp)
447
+ evpool = EggVertexPool(groupname)
448
+ egrp.addChild(evpool)
449
+ for face in selectedfaces:
450
+ vlist, mdata = face
451
+ wobj, wgrp, wmat = mdata
452
+ epoly = EggPolygon()
453
+ egrp.addChild(epoly)
454
+ self.__eggifymats(epoly, wmat)
455
+ self.__eggifyverts(epoly, evpool, vlist)
456
+ #; each matching face
457
+ return self
458
+
459
+ def __polylinestoegg(self, egg, objname, groupname):
460
+ selectedlines = self.__linesby(objname, groupname)
461
+ if len(selectedlines) == 0:
462
+ return self
463
+ eobj = EggGroup(objname)
464
+ egg.addChild(eobj)
465
+ egrp = EggGroup(groupname)
466
+ eobj.addChild(egrp)
467
+ evpool = EggVertexPool(groupname)
468
+ egrp.addChild(evpool)
469
+ for line in selectedlines:
470
+ vlist, mdata = line
471
+ wobj, wgrp, wmat = mdata
472
+ eline = EggLine()
473
+ egrp.addChild(eline)
474
+ self.__eggifymats(eline, wmat)
475
+ self.__eggifyverts(eline, evpool, vlist)
476
+ #; each matching line
477
+ return self
478
+
479
+ def toEgg(self, verbose=True):
480
+ if verbose: print "converting..."
481
+ # make a new egg
482
+ egg = EggData()
483
+ # convert polygon faces
484
+ if len(self.faces) > 0:
485
+ for objname in self.objects:
486
+ for groupname in self.groups:
487
+ self.__facestoegg(egg, objname, groupname)
488
+ # convert polylines
489
+ if len(self.polylines) > 0:
490
+ for objname in self.objects:
491
+ for groupname in self.groups:
492
+ self.__polylinestoegg(egg, objname, groupname)
493
+ return egg
494
+
495
+ def pathify(path):
496
+ if os.path.isfile(path):
497
+ return path
498
+ # if it was written on win32, it may have \'s in it, and
499
+ # also a full rather than relative pathname (Hexagon does this... ick)
500
+ orig = path
501
+ path = path.lower()
502
+ path = path.replace("\\", "/")
503
+ h, t = os.path.split(path)
504
+ if os.path.isfile(t):
505
+ return t
506
+ print "warning: can't make sense of this map file name:", orig
507
+ return t
508
+
509
+ def main(argv=None):
510
+ if argv is None:
511
+ argv = sys.argv
512
+ try:
513
+ opts, args = getopt.getopt(argv[1:], "hn:bs", ["help", "normals", "binormals", "show"])
514
+ except getopt.error, msg:
515
+ print msg
516
+ print __doc__
517
+ return 2
518
+ show = False
519
+ for o, a in opts:
520
+ if o in ("-h", "--help"):
521
+ print __doc__
522
+ return 0
523
+ elif o in ("-s", "--show"):
524
+ show = True
525
+ for infile in args:
526
+ try:
527
+ if ".obj" not in infile:
528
+ print "WARNING", finfile, "does not look like a valid obj file"
529
+ continue
530
+ obj = ObjFile(infile)
531
+ egg = obj.toEgg()
532
+ f, e = os.path.splitext(infile)
533
+ outfile = f + ".egg"
534
+ for o, a in opts:
535
+ if o in ("-n", "--normals"):
536
+ egg.recomputeVertexNormals(float(a))
537
+ elif o in ("-b", "--binormals"):
538
+ egg.recomputeTangentBinormal(GlobPattern(""))
539
+ egg.removeUnusedVertices(GlobPattern(""))
540
+ if True:
541
+ egg.triangulatePolygons(EggData.TConvex & EggData.TPolygon)
542
+ if True:
543
+ egg.recomputePolygonNormals()
544
+ egg.writeEgg(Filename(outfile))
545
+ if show:
546
+ os.system("pview " + outfile)
547
+ except Exception,e:
548
+ print e
549
+ return 0
550
+
551
+ if __name__ == "__main__":
552
+ sys.exit(main())
553
+
554
+
rendering/renderer.py ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from panda3d.core import *
2
+ from direct.showbase.ShowBase import ShowBase
3
+ import cv2
4
+ from floorplan import Floorplan
5
+ import numpy as np
6
+ import random
7
+ import math
8
+
9
+ class Renderer(ShowBase):
10
+ def __init__(self):
11
+ #self.scene = self.loader.loadModel("floorplan_1.txt-floor.obj")
12
+ loadPrcFileData("", "window-type offscreen")
13
+ loadPrcFileData("", "win-size 128 128")
14
+ ShowBase.__init__(self)
15
+
16
+ self.scene = NodePath("Scene")
17
+ self.scene.reparentTo(self.render)
18
+ self.scene.setScale(1, 1, 1)
19
+ self.scene.setTwoSided(True)
20
+ self.scene.setPos(0, 0, 0)
21
+ self.scene.setHpr(0, 0, 0)
22
+ self.near_plane = 0.1
23
+ self.far_plane = 5.0
24
+ self.resolution = 128
25
+ self.max_16bit_val = 65535
26
+ self.light_sources = []
27
+ self.light_nodes = []
28
+
29
+ self.alight = AmbientLight('alight')
30
+ self.alight.setColor(VBase4(0.2, 0.2, 0.2, 1))
31
+ self.alnp = self.render.attachNewNode(self.alight)
32
+ self.render.setLight(self.alnp)
33
+ self.attenuation = False
34
+
35
+ base.camLens.setNear(self.near_plane)
36
+ base.camLens.setFar(self.far_plane)
37
+
38
+ self.generate_depth = True
39
+ if self.generate_depth is True:
40
+ self.depth_tex = Texture()
41
+ self.depth_tex.setFormat(Texture.FDepthComponent)
42
+ self.depth_buffer = base.win.makeTextureBuffer('depthmap', self.resolution, self.resolution, self.depth_tex, to_ram=True)
43
+ self.depth_cam = self.makeCamera(self.depth_buffer, lens = base.camLens)
44
+ print(self.depth_cam.node().getLens().getFilmSize())
45
+ self.depth_cam.reparentTo(base.render)
46
+ pass
47
+
48
+ self.models = []
49
+ self.backgrounds = []
50
+ self.model = None
51
+
52
+ self.createLightSources()
53
+ return
54
+
55
+ def delete(self):
56
+ self.alnp.removeNode()
57
+ for n in self.light_nodes:
58
+ n.removeNode()
59
+ continue
60
+ for m in self.models:
61
+ self.loader.unloadModel(m)
62
+ continue
63
+ base.destroy()
64
+ return
65
+
66
+ def selectModel(self, model_ind):
67
+ self.model = self.models[model_ind]
68
+ self.model.reparentTo(self.scene)
69
+
70
+ def unselectModel(self, model_ind):
71
+ self.model.detachNode()
72
+ self.model = None
73
+
74
+ def loadModels(self, filenames):
75
+ self.models = []
76
+ for filename in filenames:
77
+ floorplan = Floorplan(filename)
78
+ floorplan.read()
79
+ floorplan.segmentRooms()
80
+ exit(1)
81
+ self.models.append(floorplan.generateEggModel())
82
+ continue
83
+ return
84
+
85
+ def createLightSources(self):
86
+ for i in range(0, 7):
87
+ plight = PointLight('plight')
88
+ if self.attenuation is True:
89
+ plight.setAttenuation((1, 0, 1))
90
+ pass
91
+ plight.setColor(VBase4(0, 0, 0, 0))
92
+ self.light_sources.append(plight)
93
+ plnp = self.render.attachNewNode(plight)
94
+ plnp.setPos(3, 3, 3)
95
+ render.setLight(plnp)
96
+ self.light_nodes.append(plnp)
97
+ continue
98
+ return
99
+
100
+ def activateLightSources(self, light_sources, spher=True):
101
+ i = 0
102
+ for lght in light_sources:
103
+ lp_rad = lght[0]
104
+ lp_el = lght[1]
105
+ lp_az = lght[2]
106
+ lp_int = lght[3]
107
+ if spher:
108
+ self.light_nodes[i].setPos(
109
+ lp_rad*math.cos(lp_el)*math.cos(lp_az),
110
+ lp_rad*math.cos(lp_el)*math.sin(lp_az),
111
+ lp_rad*math.sin(lp_el))
112
+ else:
113
+ self.light_nodes[i].setPos(lp_rad, lp_el, lp_az)
114
+ pass
115
+ self.light_sources[i].setColor(VBase4(lp_int, lp_int, lp_int, 1))
116
+ i += 1
117
+ continue
118
+ return
119
+
120
+ def deactivateLightSources(self):
121
+ for i in range(0, 7):
122
+ self.light_sources[i].setColor(VBase4(0, 0, 0, 0))
123
+ continue
124
+ return
125
+
126
+ def textureToImage(self, texture):
127
+ im = texture.getRamImageAs("RGB")
128
+ strim = im.getData()
129
+ image = np.fromstring(strim, dtype='uint8')
130
+ #image = image.reshape(1200, 1200)
131
+ #cv2.imwrite('test/test.png', image.astype(np.uint8))
132
+ image = image.reshape(self.resolution, self.resolution, 3)
133
+ image = np.flipud(image)
134
+ return image
135
+
136
+ def setCameraPosition(self, pos, target):
137
+ self.camera.setPos(pos[0], pos[1], pos[2])
138
+ self.camera.lookAt(target[0], target[1], target[2])
139
+
140
+ if self.generate_depth is True:
141
+ self.depth_cam.setPos(pos[0], pos[1], pos[2])
142
+ self.depth_cam.lookAt(target[0], target[1], target[2])
143
+ pass
144
+ return
145
+
146
+ def renderView(self, camera_pos, light_sources):
147
+ angle = math.radians(random.randint(0, 360))
148
+ target = (camera_pos[0] + math.sin(angle), camera_pos[1] + math.cos(angle), camera_pos[2])
149
+ self.setCameraPosition(camera_pos, target)
150
+
151
+ self.activateLightSources(light_sources)
152
+
153
+ base.graphicsEngine.renderFrame()
154
+ tex = base.win.getScreenshot()
155
+ im = self.textureToImage(tex)
156
+
157
+ dm_uint = False
158
+
159
+ if self.generate_depth is True:
160
+ depth_im = PNMImage()
161
+ self.depth_tex.store(depth_im)
162
+
163
+ depth_map = np.zeros([self.resolution, self.resolution], dtype='float')
164
+ for i in range(0, self.resolution):
165
+ for j in range(0, self.resolution):
166
+ depth_val = depth_im.getGray(j, i)
167
+ depth_map[i, j] = self.far_plane * self.near_plane / (self.far_plane - depth_val * (self.far_plane - self.near_plane))
168
+ depth_map[i, j] = depth_map[i, j] / self.far_plane
169
+ continue
170
+ continue
171
+ dm_uint = np.round(depth_map * self.max_16bit_val).astype('uint16')
172
+ pass
173
+
174
+
175
+ im = im.astype(dtype=np.uint8)
176
+ self.deactivateLightSources()
177
+ return im, dm_uint
178
+
179
+
180
+ renderer = Renderer()
181
+ renderer.loadModels(['test/floorplan_2', ])
182
+ renderer.selectModel(0)
183
+
184
+ num_light = random.randint(2, 4)
185
+ lights = []
186
+ for nl in range(0, num_light):
187
+ light_pos = [random.random()*2. + 2.5,
188
+ random.randint(-90, 90),
189
+ random.randint(0, 360),
190
+ random.randint(10, 15)]
191
+ lights.append(light_pos)
192
+ continue
193
+
194
+ for im_num in range(0, 20):
195
+ x = random.random()
196
+ y = random.random()
197
+ z = 0.15
198
+ im, dm = renderer.renderView([x, y, z], lights)
199
+ cv2.imwrite('test/rendering_' + str(im_num) + '.png', (np.asarray(im)).astype(np.uint8))
200
+ cv2.imwrite('test/depth_' + str(im_num) + '.png', (np.asarray(1 / (dm / 65535.0) * 255)).astype(np.uint8))
201
+ continue
202
+
203
+ exit(1)
rendering/viewer.py ADDED
@@ -0,0 +1,261 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from math import pi, sin, cos
2
+ from panda3d.core import *
3
+ from direct.showbase.ShowBase import ShowBase
4
+ from direct.task import Task
5
+ from floorplan import Floorplan
6
+ import numpy as np
7
+ import random
8
+ import copy
9
+
10
+ class Viewer(ShowBase):
11
+ def __init__(self):
12
+
13
+ ShowBase.__init__(self)
14
+ #self.scene = self.loader.loadModel("floorplan_1.txt-floor.obj")
15
+ #self.scene = base.loader.loadModel("floorplan_1.txt-floor.egg")
16
+ #self.scene = base.loader.loadModel("panda.egg")
17
+
18
+ #self.scene = base.loader.loadModel("environment")
19
+
20
+ base.setBackgroundColor(0, 0, 0)
21
+ self.angle = 0.0
22
+ lens = PerspectiveLens()
23
+ lens.setFov(60)
24
+ lens.setNear(0.01)
25
+ lens.setFar(100000)
26
+ base.cam.node().setLens(lens)
27
+ floorplan = Floorplan('test/floorplan_7')
28
+ #floorplan.setFilename('test/floorplan_2')
29
+ floorplan.read()
30
+ self.scene = floorplan.generateEggModel()
31
+ self.scene.reparentTo(self.render)
32
+ #self.scene.setScale(0.01, 0.01, 0.01)
33
+ #self.scene.setTwoSided(True)
34
+ self.scene.setTwoSided(True)
35
+ #self.scene.setPos(0, 0, 3)
36
+ #texture = loader.loadTexture("floorplan_1.png")
37
+ #self.scene.setTexture(texture)
38
+ #self.scene.setHpr(0, 0, 0)
39
+
40
+ # angleDegrees = 0
41
+ # angleRadians = angleDegrees * (pi / 180.0)
42
+ # self.camera.setPos(20 * sin(angleRadians), -20 * cos(angleRadians), 3)
43
+ # self.camera.setHpr(angleDegrees, 0, 0)
44
+ #self.camera.lookAt(0, 0, 0)
45
+
46
+ self.alight = AmbientLight('alight')
47
+ self.alight.setColor(VBase4(0.2, 0.2, 0.2, 1))
48
+ self.alnp = self.render.attachNewNode(self.alight)
49
+ self.render.setLight(self.alnp)
50
+
51
+ dlight = DirectionalLight('dlight')
52
+ dlight.setColor(VBase4(1, 1, 1, 1))
53
+ dlnp = self.render.attachNewNode(dlight)
54
+ #dlnp.setHpr(0, -90, 0)
55
+ dlnp.setPos(0.5, 0.5, 3)
56
+ dlnp.lookAt(0.5, 0.5, 2)
57
+ self.render.setLight(dlnp)
58
+
59
+ for i in xrange(10):
60
+ plight = PointLight('plight')
61
+ plight.setAttenuation((1, 0, 1))
62
+ color = random.randint(10, 15)
63
+ plight.setColor(VBase4(color, color, color, 1))
64
+ plnp = self.render.attachNewNode(plight)
65
+ if i == 0:
66
+ plnp.setPos(0.5, 0.5, 3)
67
+ else:
68
+ plnp.setPos(1 * random.random(), 1 * random.random(), 0.3)
69
+ pass
70
+ self.render.setLight(plnp)
71
+
72
+
73
+
74
+ #base.useTrackball()
75
+ #base.trackball.node().setPos(2.0, 0, 3)
76
+ #base.trackball.node().setHpr(0, 0, 3)
77
+ #base.enableMouse()
78
+ #base.useDrive()
79
+ base.disableMouse()
80
+ self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
81
+ #self.accept('arrow_up', self.moveForward)
82
+ #self.accept('arrow_up_-repeat', self.moveForward)
83
+ self.topDownCameraPos = [0.5, 0.5, 1.5]
84
+ self.topDownTarget = [0.5, 0.499, 0.5]
85
+ self.topDownH = 0
86
+ self.startCameraPos = floorplan.startCameraPos
87
+ self.startTarget = floorplan.startTarget
88
+ self.startH = 0
89
+
90
+ self.cameraPos = self.topDownCameraPos
91
+ self.target = self.topDownTarget
92
+ self.H = self.topDownH
93
+
94
+ self.accept('space', self.openDoor)
95
+ self.accept('enter', self.startChangingView)
96
+
97
+ self.viewMode = 'T'
98
+ self.viewChangingProgress = 1.02
99
+
100
+ ceiling = self.scene.find("**/ceiling")
101
+ ceiling.hide()
102
+
103
+ return
104
+
105
+ def moveForward(self):
106
+ self.cameraPos[0] -= 0.1
107
+
108
+ def openDoor(self):
109
+ minDistance = 10000
110
+ doors = self.scene.find("**/doors")
111
+ for door in doors.getChildren():
112
+ mins, maxs = door.getTightBounds()
113
+
114
+ vec_1 = (mins + maxs) / 2 - Vec3(self.target[0], self.target[1], (mins[2] + maxs[2]) / 2)
115
+ vec_2 = (mins + maxs) / 2 - Vec3(self.cameraPos[0], self.cameraPos[1], (mins[2] + maxs[2]) / 2)
116
+ if (vec_1.dot(vec_2) > 0 and vec_1.length() > vec_2.length()) or np.arccos(abs(vec_1.dot(vec_2)) / (vec_1.length() * vec_2.length())) > np.pi / 4:
117
+ continue
118
+
119
+ distance = pow(pow(self.cameraPos[0] - (mins[0] + maxs[0]) / 2, 2) + pow(self.cameraPos[1] - (mins[1] + maxs[1]) / 2, 2) + pow(self.cameraPos[2] - (mins[2] + maxs[2]) / 2, 2), 0.5)
120
+ if distance < minDistance:
121
+ minDistanceDoor = door
122
+ minDistance = distance
123
+ pass
124
+ continue
125
+
126
+ if minDistance > 1:
127
+ return
128
+ mins, maxs = minDistanceDoor.getTightBounds()
129
+ if abs(maxs[0] - mins[0]) > abs(maxs[1] - mins[1]):
130
+ minsExpected = Vec3(mins[0] - (maxs[1] - mins[1]), mins[1], mins[2])
131
+ maxsExpected = Vec3(mins[0], mins[1] + (maxs[0] - mins[0]), maxs[2])
132
+ else:
133
+ minsExpected = Vec3(mins[0] - (maxs[1] - mins[1]) + (maxs[0] - mins[0]), mins[1] - (maxs[0] - mins[0]), mins[2])
134
+ maxsExpected = Vec3(mins[0] + (maxs[0] - mins[0]), mins[1] + (maxs[0] - mins[0]) - (maxs[0] - mins[0]), maxs[2])
135
+ pass
136
+ minDistanceDoor.setH(minDistanceDoor, 90)
137
+ mins, maxs = minDistanceDoor.getTightBounds()
138
+ minDistanceDoor.setPos(minDistanceDoor, minsExpected[1] - mins[1], -minsExpected[0] + mins[0], 0)
139
+ #print(scene.findAllMatches('doors'))
140
+ return
141
+
142
+ def startChangingView(self):
143
+ self.viewChangingProgress = 0
144
+ self.prevCameraPos = copy.deepcopy(self.cameraPos)
145
+ self.prevTarget = copy.deepcopy(self.target)
146
+ self.prevH = self.camera.getR()
147
+ if self.viewMode == 'T':
148
+ self.newCameraPos = self.startCameraPos
149
+ self.newTarget = self.startTarget
150
+ self.newH = self.startH
151
+ self.viewMode = 'C'
152
+ else:
153
+ self.newCameraPos = self.topDownCameraPos
154
+ self.newTarget = self.topDownTarget
155
+ self.newH = self.topDownH
156
+ self.startCameraPos = copy.deepcopy(self.cameraPos)
157
+ self.startTarget = copy.deepcopy(self.target)
158
+ self.startH = self.camera.getR()
159
+ self.viewMode = 'T'
160
+ pass
161
+ return
162
+
163
+
164
+ def changeView(self):
165
+ self.cameraPos = []
166
+ self.target = []
167
+ for c in xrange(3):
168
+ self.cameraPos.append(self.prevCameraPos[c] + (self.newCameraPos[c] - self.prevCameraPos[c]) * self.viewChangingProgress)
169
+ self.target.append(self.prevTarget[c] + (self.newTarget[c] - self.prevTarget[c]) * self.viewChangingProgress)
170
+ continue
171
+ self.H = self.prevH + (self.newH - self.prevH) * self.viewChangingProgress
172
+
173
+ if self.viewChangingProgress + 0.02 >= 1 and self.viewMode == 'C':
174
+ ceiling = self.scene.find("**/ceiling")
175
+ ceiling.show()
176
+ pass
177
+
178
+ if self.viewChangingProgress <= 0.02 and self.viewMode == 'T':
179
+ ceiling = self.scene.find("**/ceiling")
180
+ ceiling.hide()
181
+ pass
182
+ return
183
+
184
+ def spinCameraTask(self, task):
185
+ #print(task.time)
186
+ #angleDegrees = task.time * 6.0
187
+ movementStep = 0.003
188
+ if self.viewChangingProgress <= 1.01:
189
+ self.changeView()
190
+ self.viewChangingProgress += 0.02
191
+ pass
192
+
193
+ if base.mouseWatcherNode.is_button_down('w'):
194
+ for c in xrange(2):
195
+ step = movementStep * (self.target[c] - self.cameraPos[c])
196
+ self.cameraPos[c] += step
197
+ self.target[c] += step
198
+ continue
199
+ pass
200
+ if base.mouseWatcherNode.is_button_down('s'):
201
+ for c in xrange(2):
202
+ step = movementStep * (self.target[c] - self.cameraPos[c])
203
+ self.cameraPos[c] -= step
204
+ self.target[c] -= step
205
+ continue
206
+ pass
207
+ if base.mouseWatcherNode.is_button_down('a'):
208
+ step = movementStep * (self.target[0] - self.cameraPos[0])
209
+ self.cameraPos[1] += step
210
+ self.target[1] += step
211
+ step = movementStep * (self.target[1] - self.cameraPos[1])
212
+ self.cameraPos[0] -= step
213
+ self.target[0] -= step
214
+ pass
215
+ if base.mouseWatcherNode.is_button_down('d'):
216
+ step = movementStep * (self.target[0] - self.cameraPos[0])
217
+ self.cameraPos[1] -= step
218
+ self.target[1] -= step
219
+ step = movementStep * (self.target[1] - self.cameraPos[1])
220
+ self.cameraPos[0] += step
221
+ self.target[0] += step
222
+ pass
223
+
224
+ rotationStep = 0.02
225
+ if base.mouseWatcherNode.is_button_down('arrow_left'):
226
+ angle = np.angle(complex(self.target[0] - self.cameraPos[0], self.target[1] - self.cameraPos[1]))
227
+ angle += rotationStep
228
+ self.target[0] = self.cameraPos[0] + np.cos(angle)
229
+ self.target[1] = self.cameraPos[1] + np.sin(angle)
230
+ pass
231
+ if base.mouseWatcherNode.is_button_down('arrow_right'):
232
+ angle = np.angle(complex(self.target[0] - self.cameraPos[0], self.target[1] - self.cameraPos[1]))
233
+ angle -= rotationStep
234
+ self.target[0] = self.cameraPos[0] + np.cos(angle)
235
+ self.target[1] = self.cameraPos[1] + np.sin(angle)
236
+ pass
237
+
238
+ if base.mouseWatcherNode.is_button_down('arrow_up'):
239
+ angle = np.arcsin(self.target[2] - self.cameraPos[2])
240
+ angle += rotationStep
241
+ self.target[2] = self.cameraPos[2] + np.sin(angle)
242
+ pass
243
+ if base.mouseWatcherNode.is_button_down('arrow_down'):
244
+ angle = np.arcsin(self.target[2] - self.cameraPos[2])
245
+ angle -= rotationStep
246
+ self.target[2] = self.cameraPos[2] + np.sin(angle)
247
+ pass
248
+
249
+ angleDegrees = self.angle
250
+ angleRadians = angleDegrees * (pi / 180.0)
251
+ #self.camera.setPos(2.0 * sin(angleRadians), -2.0 * cos(angleRadians), 3)
252
+ self.camera.setPos(self.cameraPos[0], self.cameraPos[1], self.cameraPos[2])
253
+ #self.camera.setHpr(angleDegrees, 0, 0)
254
+ #self.camera.lookAt(0, 0, 0)
255
+ self.camera.lookAt(self.target[0], self.target[1], self.target[2])
256
+ self.camera.setR(self.H)
257
+ #if base.mouseWatcherNode.hasMouse()
258
+ return Task.cont
259
+
260
+ app = Viewer()
261
+ app.run()