From 1719e9c1e8b873186aa9c60deb2d8e7d319763cf Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 17 May 2021 11:35:56 +0200 Subject: [PATCH] [DEV] work on EMF blender export --- blender/io_scene_emf/__init__.py | 9 +- blender/io_scene_emf/exportEmf.py | 9 + blender/io_scene_emf/export_emf.py | 259 ++--- blender/io_scene_emf/readme.md | 4 + blender/io_scene_obj/__init__.py | 514 ++++++++++ blender/io_scene_obj/export_obj.py | 792 +++++++++++++++ blender/io_scene_obj/import_obj.py | 1323 ++++++++++++++++++++++++++ samples/resources/emf/tree1.blend | Bin 0 -> 680216 bytes samples/resources/emf/tree1.emf | 3 + samples/resources/emf/tree1.mtl | 2 + samples/resources/emf/tree1.obj | 3 + samples/resources/emf/tree1_base.emf | 59 ++ 12 files changed, 2848 insertions(+), 129 deletions(-) create mode 100644 blender/io_scene_emf/exportEmf.py create mode 100644 blender/io_scene_emf/readme.md create mode 100644 blender/io_scene_obj/__init__.py create mode 100644 blender/io_scene_obj/export_obj.py create mode 100644 blender/io_scene_obj/import_obj.py create mode 100644 samples/resources/emf/tree1.blend create mode 100644 samples/resources/emf/tree1.emf create mode 100644 samples/resources/emf/tree1.mtl create mode 100644 samples/resources/emf/tree1.obj create mode 100644 samples/resources/emf/tree1_base.emf diff --git a/blender/io_scene_emf/__init__.py b/blender/io_scene_emf/__init__.py index c343177..a41166a 100644 --- a/blender/io_scene_emf/__init__.py +++ b/blender/io_scene_emf/__init__.py @@ -4,7 +4,7 @@ bl_info = { "name": "EGE Mesh file format emf", "author": "Edouard DUPIN", - "blender": (2, 80, 0), + "blender": (2, 81, 6), "location": "File > Import-Export", "description": "Import-Export emf, Import EMF mesh, UV's, materials and textures", "category": "Import-Export"} @@ -161,4 +161,9 @@ def unregister(): if __name__ == "__main__": - register() + print("Registering."); + register(); + #print("Executing."); + #bpy.ops.export_scene.emf(); + + diff --git a/blender/io_scene_emf/exportEmf.py b/blender/io_scene_emf/exportEmf.py new file mode 100644 index 0000000..1cec20e --- /dev/null +++ b/blender/io_scene_emf/exportEmf.py @@ -0,0 +1,9 @@ +import bpy + +bpy.ops.wm.open_mainfile(filepath="/home/heero/dev/workspace-game/atriasoft/ege/blender/io_scene_emf/../../samples/resources/emf/tree1.blend") + +bpy.ops.export_scene.emf(filepath="/home/heero/dev/workspace-game/atriasoft/ege/blender/io_scene_emf/../../samples/resources/emf/tree1.emf") + +#bpy.ops.wm.open_mainfile(filepath="/home/heero/dev/workspace-game/atriasoft/ewol/resources/resources/ewol/theme/shape/Entry.blend") + +#bpy.ops.export_scene.emf(filepath="/home/heero/dev/workspace-game/atriasoft/ewol/resources/resources/ewol/theme/shape/Entry.emf") diff --git a/blender/io_scene_emf/export_emf.py b/blender/io_scene_emf/export_emf.py index 16eb2a9..ddf183e 100644 --- a/blender/io_scene_emf/export_emf.py +++ b/blender/io_scene_emf/export_emf.py @@ -4,7 +4,7 @@ import time import bpy import mathutils -import bpy_extras.io_utils +from bpy_extras import io_utils, node_shader_utils EXPORT_COLLISION_NAME = "" @@ -117,13 +117,14 @@ def get_physics_shape(obj, mainObjScale): def write_collision_shape(object, file, mainObjScale, offset): + fw = file.write if len(getChildren(object))==0: # no phisical shape ... return string_offset = "" for iii in range(offset): string_offset += "\t" - file.write(string_offset + 'Physics:\n') + fw(string_offset + 'Physics:\n') for subObj in getChildren(object): print(" element='" + subObj.name + "' type '" + str(subObj.type) + "'") if subObj.type != 'MESH' \ @@ -133,9 +134,9 @@ def write_collision_shape(object, file, mainObjScale, offset): if shape=="": print("error of shape detection type ..."); continue - file.write(string_offset + "\t" + shape + "\n" ) + fw(string_offset + "\t" + shape + "\n" ) for (k,v) in props.items(): - file.write(string_offset + "\t\t%s:%s\n" % (k, v) ) + fw(string_offset + "\t\t%s:%s\n" % (k, v) ) @@ -157,6 +158,7 @@ def mesh_triangulate(me): def write_mtl(scene, file, filepath, path_mode, copy_set, mtl_dict): from mathutils import Color + fw = file.write world = scene.world #if world and world.ambient_color: # world_amb = world.ambient_color @@ -164,8 +166,8 @@ def write_mtl(scene, file, filepath, path_mode, copy_set, mtl_dict): world_amb = Color((0.0, 0.0, 0.0)) source_dir = os.path.dirname(bpy.data.filepath) dest_dir = os.path.dirname(filepath) - file.write('\n') - #file.write('\nMaterials:%i\n' % len(mtl_dict)) + fw('\n') + #fw('\nMaterials:%i\n' % len(mtl_dict)) mtl_dict_values = list(mtl_dict.values()) mtl_dict_values.sort(key=lambda m: m[0]) # Write material/image combinations we have used. @@ -173,97 +175,100 @@ def write_mtl(scene, file, filepath, path_mode, copy_set, mtl_dict): for mtl_mat_name, mat, face_img in mtl_dict_values: # Get the Blender data for the material and the image. # Having an image named None will make a bug, dont do it:) - file.write('Materials:%s\n' % mtl_mat_name) # Define a new material: matname_imgname - if mat: - # convert from blenders spec to 0 - 1000 range. - if mat.specular_shader == 'WARDISO': - tspec = (0.4 - mat.specular_slope) / 0.0004 + #print("material: '" + str(mtl_mat_name) + "': " + str(mat) + " " + str(face_img)); + #print(" mat: "); + #for elem in dir(mat): + # print(" - " + elem); + fw('Materials:%s\n' % mtl_mat_name) # Define a new material: matname_imgname + mat_wrap = node_shader_utils.PrincipledBSDFWrapper(mat) if mat else None + + if mat_wrap: + use_mirror = mat_wrap.metallic != 0.0 + use_transparency = mat_wrap.alpha != 1.0 + + # XXX Totally empirical conversion, trying to adapt it + # (from 1.0 - 0.0 Principled BSDF range to 0.0 - 900.0 OBJ specular exponent range)... + spec = (1.0 - mat_wrap.roughness) * 30 + spec *= spec + fw(' Ns %.6f\n' % spec) + + # Ambient + if use_mirror: + fw(' Ka %.6f %.6f %.6f\n' % (mat_wrap.metallic, mat_wrap.metallic, mat_wrap.metallic)) else: - tspec = (mat.specular_hardness - 1) * 1.9607843137254901 - file.write('\tNs %.6f\n' % tspec) - del tspec - file.write('\tKa %.6f %.6f %.6f\n' % (mat.ambient * world_amb)[:]) # Ambient, uses mirror color, - file.write('\tKd %.6f %.6f %.6f\n' % (mat.diffuse_intensity * mat.diffuse_color)[:]) # Diffuse - file.write('\tKs %.6f %.6f %.6f\n' % (mat.specular_intensity * mat.specular_color)[:]) # Specular - if hasattr(mat, "ior"): - file.write('\tNi %.6f\n' % mat.ior) # Refraction index + fw(' Ka %.6f %.6f %.6f\n' % (1.0, 1.0, 1.0)) + fw(' Kd %.6f %.6f %.6f\n' % mat_wrap.base_color[:3]) # Diffuse + # XXX TODO Find a way to handle tint and diffuse color, in a consistent way with import... + fw(' Ks %.6f %.6f %.6f\n' % (mat_wrap.specular, mat_wrap.specular, mat_wrap.specular)) # Specular + # Emission, not in original MTL standard but seems pretty common, see T45766. + emission_strength = mat_wrap.emission_strength + emission = [emission_strength * c for c in mat_wrap.emission_color[:3]] + fw(' Ke %.6f %.6f %.6f\n' % tuple(emission)) + fw(' vNi %.6f\n' % mat_wrap.ior) # Refraction index + fw(' d %.6f\n' % mat_wrap.alpha) # Alpha (obj uses 'd' for dissolve) + + # See http://en.wikipedia.org/wiki/Wavefront_.obj_file for whole list of values... + # Note that mapping is rather fuzzy sometimes, trying to do our best here. + if mat_wrap.specular == 0: + fw(' illum 1\n') # no specular. + elif use_mirror: + if use_transparency: + fw(' illum 6\n') # Reflection, Transparency, Ray trace + else: + fw(' illum 3\n') # Reflection and Ray trace + elif use_transparency: + fw(' illum 9\n') # 'Glass' transparency and no Ray trace reflection... fuzzy matching, but... else: - file.write('\tNi %.6f\n' % 1.0) - file.write('\td %.6f\n' % mat.alpha) # Alpha (obj uses 'd' for dissolve) - # 0 to disable lighting, 1 for ambient & diffuse only (specular color set to black), 2 for full lighting. - if mat.use_shadeless: - file.write('\tillum 0\n') # ignore lighting - elif mat.specular_intensity == 0: - file.write('\tillum 1\n') # no specular. - else: - file.write('\tillum 2\n') # light normaly + fw(' illum 2\n') # light normally + + #### And now, the image textures... + image_map = { + "map_Kd": "base_color_texture", + "map_Ka": None, # ambient... + "map_Ks": "specular_texture", + "map_Ns": "roughness_texture", + "map_d": "alpha_texture", + "map_Tr": None, # transmission roughness? + "map_Bump": "normalmap_texture", + "disp": None, # displacement... + "refl": "metallic_texture", + "map_Ke": "emission_color_texture" if emission_strength != 0.0 else None, + } + + for key, mat_wrap_key in sorted(image_map.items()): + if mat_wrap_key is None: + continue + tex_wrap = getattr(mat_wrap, mat_wrap_key, None) + if tex_wrap is None: + continue + image = tex_wrap.image + if image is None: + continue + + filepath = io_utils.path_reference(image.filepath, source_dir, dest_dir, + path_mode, "", copy_set, image.library) + options = [] + if key == "map_Bump": + if mat_wrap.normalmap_strength != 1.0: + options.append('-bm %.6f' % mat_wrap.normalmap_strength) + if tex_wrap.translation != Vector((0.0, 0.0, 0.0)): + options.append('-o %.6f %.6f %.6f' % tex_wrap.translation[:]) + if tex_wrap.scale != Vector((1.0, 1.0, 1.0)): + options.append('-s %.6f %.6f %.6f' % tex_wrap.scale[:]) + if options: + fw('%s %s %s\n' % (key, " ".join(options), repr(filepath)[1:-1])) + else: + fw('%s %s\n' % (key, repr(filepath)[1:-1])) + else: - #write a dummy material here? - file.write('\tNs 0\n') - file.write('\tKa %.6f %.6f %.6f\n' % world_amb[:]) # Ambient, uses mirror color, - file.write('\tKd 0.8 0.8 0.8\n') - file.write('\tKs 0.8 0.8 0.8\n') - file.write('\td 1\n') # No alpha - file.write('\tillum 2\n') # light normaly - # Write images! - if face_img: # We have an image on the face! - filepath = face_img.filepath - if filepath: # may be '' for generated images - # write relative image path - filepath = bpy_extras.io_utils.path_reference(filepath, - source_dir, - dest_dir, - path_mode, - "", - copy_set, - face_img.library) - file.write('\tmap_Kd %s\n' % filepath) # Diffuse mapping image - del filepath - else: - # so we write the materials image. - face_img = None - if mat: # No face image. if we havea material search for MTex image. - image_map = {} - # backwards so topmost are highest priority - for mtex in reversed(mat.texture_slots): - if mtex and mtex.texture and mtex.texture.type == 'IMAGE': - image = mtex.texture.image - if image: - # texface overrides others - if( mtex.use_map_color_diffuse - and (face_img is None) - and (mtex.use_map_warp is False) - and (mtex.texture_coords != 'REFLECTION') - ): - image_map["map_Kd"] = image - if mtex.use_map_ambient: - image_map["map_Ka"] = image - # this is the Spec intensity channel but Ks stands for specular Color - if mtex.use_map_color_spec: # specular color - image_map["map_Ks"] = image - if mtex.use_map_hardness: # specular hardness/glossiness - image_map["map_Ns"] = image - if mtex.use_map_alpha: - image_map["map_d"] = image - if mtex.use_map_translucency: - image_map["map_Tr"] = image - if mtex.use_map_normal and (mtex.texture.use_normal_map is True): - image_map["map_Bump"] = image - if mtex.use_map_normal and (mtex.texture.use_normal_map is False): - image_map["map_Disp"] = image - if mtex.use_map_color_diffuse and (mtex.texture_coords == 'REFLECTION'): - image_map["map_refl"] = image - if mtex.use_map_emit: - image_map["map_Ke"] = image - for key, image in image_map.items(): - filepath = bpy_extras.io_utils.path_reference(image.filepath, - source_dir, - dest_dir, - path_mode, - "", - copy_set, - image.library) - file.write('\t%s %s\n' % (key, repr(filepath)[1:-1])) + # Write a dummy material here? + fw(' Ns 500\n') + fw(' Ka 0.8 0.8 0.8\n') + fw(' Kd 0.8 0.8 0.8\n') + fw(' Ks 0.8 0.8 0.8\n') + fw(' d 1\n') # No alpha + fw(' illum 2\n') # light normally + def veckey3d(v): return round(v.x, 6), round(v.y, 6), round(v.z, 6) @@ -273,7 +278,7 @@ def veckey2d(v): def write_mesh(scene, file, object, mtl_dict): print("**************** '" + str(object.name) + "' *******************") - + fw = file.write # Initialize totals, these are updated each object totverts = 1 totuvco = 1 @@ -288,7 +293,7 @@ def write_mesh(scene, file, object, mtl_dict): if object.type != 'MESH': print(object.name + 'is not a mesh type - ignoring type=' + object.type) - file.write('# can not export:"%s":type="%s"\n' % (object.name, str(object.type))) + fw('# can not export:"%s":type="%s"\n' % (object.name, str(object.type))) return #print("name:'%s'" % object.name) #for plop in object.child: @@ -319,16 +324,16 @@ def write_mesh(scene, file, object, mtl_dict): if me is None: continue me.transform(ob_mat) - #print("ploppp:" + str(ob_mat) ) + print("ploppp:" + str(ob_mat) ) # _must_ do this first since it re-allocs arrays # triangulate all the mesh: mesh_triangulate(me) # calculated normals: me.calc_normals() # export UV mapping: - faceuv = len(me.uv_textures) > 0 + faceuv = len(me.uv_layers) > 0 if faceuv: - uv_texture = me.uv_textures.active.data[:] + uv_texture = me.uv_layers.active.data[:] uv_layer = me.uv_layers.active.data[:] me_verts = me.vertices[:] # Make our own list so it can be sorted to reduce context switching @@ -365,19 +370,19 @@ def write_mesh(scene, file, object, mtl_dict): obnamestring = name_compat(name1) else: obnamestring = '%s_%s' % (name_compat(name1), name_compat(name2)) - file.write('Mesh:%s\n' % obnamestring) # Write Object name + fw('Mesh:%s\n' % obnamestring) # Write Object name ########################################################### ## Vert ########################################################### - file.write('\tVertex:%d\n\t\t' % len(me_verts)) + fw('\tVertex:%d\n\t\t' % len(me_verts)) for v in me_verts: - file.write('%.6f %.6f %.6f|' % v.co[:]) - file.write('\n') + fw('%.6f %.6f %.6f|' % v.co[:]) + fw('\n') ########################################################### ## UV ########################################################### if faceuv: - file.write('\tUV-mapping:\n\t\t') + fw('\tUV-mapping:\n\t\t') # in case removing some of these dont get defined. uv = uvkey = uv_dict = f_index = uv_index = None uv_face_mapping = [None] * len(face_index_pairs) @@ -391,12 +396,12 @@ def write_mesh(scene, file, object, mtl_dict): uv_k = uv_dict[uvkey] except: uv_k = uv_dict[uvkey] = len(uv_dict) - file.write('%.6f %.6f|' % uv[:]) + fw('%.6f %.6f|' % uv[:]) uv_ls.append(uv_k) uv_unique_count = len(uv_dict) del uv, uvkey, uv_dict, f_index, uv_index, uv_ls, uv_k # Only need uv_unique_count and uv_face_mapping - file.write('\n') + fw('\n') else: print("does not use UV-MAPPING") ########################################################### @@ -409,7 +414,7 @@ def write_mesh(scene, file, object, mtl_dict): localIsSmooth = 'face' else: localIsSmooth = 'face' - file.write('\tNormal(%s):%d\n\t\t' % (localIsSmooth, len(face_index_pairs)) ) + fw('\tNormal(%s):%d\n\t\t' % (localIsSmooth, len(face_index_pairs)) ) for f, f_index in face_index_pairs: if f.use_smooth: for v_idx in f.vertices: @@ -418,22 +423,22 @@ def write_mesh(scene, file, object, mtl_dict): if noKey not in globalNormals: globalNormals[noKey] = totno totno += 1 - file.write('%.6f %.6f %.6f|' % noKey) + fw('%.6f %.6f %.6f|' % noKey) else: # Hard, 1 normal from the face. noKey = veckey3d(f.normal) if noKey not in globalNormals: globalNormals[noKey] = totno totno += 1 - file.write('%.6f %.6f %.6f|' % noKey) + fw('%.6f %.6f %.6f|' % noKey) - file.write('\n') + fw('\n') if not faceuv: f_image = None ########################################################### ## faces ########################################################### - file.write('\tFace:%d' % len(face_index_pairs)) + fw('\tFace:%d' % len(face_index_pairs)) for f, f_index in face_index_pairs: f_smooth = f.use_smooth f_mat = min(f.material_index, len(materials) - 1) @@ -451,7 +456,7 @@ def write_mesh(scene, file, object, mtl_dict): else: if key[0] is None and key[1] is None: # inform the use of a material: - file.write("\n\t\t---:") # mat, image + fw("\n\t\t---:") # mat, image else: mat_data = mtl_dict.get(key) if not mat_data: @@ -476,14 +481,14 @@ def write_mesh(scene, file, object, mtl_dict): mat_data = mtl_dict[key] = mtl_name, materials[f_mat], f_image mtl_rev_dict[mtl_name] = key # set the use of a material: - file.write("\n\t\t%s\n\t\t\t" % mat_data[0]) # can be mat_image or (null) + fw("\n\t\t%s\n\t\t\t" % mat_data[0]) # can be mat_image or (null) contextMat = key f_v = [(vi, me_verts[v_idx]) for vi, v_idx in enumerate(f.vertices)] if faceuv: # export the normals: if f_smooth: # Smoothed, use vertex normals for vi, v in f_v: - file.write(" %d/%d/%d" % + fw(" %d/%d/%d" % (v.index + totverts-1, totuvco + uv_face_mapping[f_index][vi]-1, globalNormals[veckey3d(v.normal)]-1, @@ -491,7 +496,7 @@ def write_mesh(scene, file, object, mtl_dict): else: # No smoothing, face normals no = globalNormals[veckey3d(f.normal)] for vi, v in f_v: - file.write(" %d/%d/%d" % + fw(" %d/%d/%d" % (v.index + totverts-1, totuvco + uv_face_mapping[f_index][vi]-1, no-1, @@ -501,31 +506,31 @@ def write_mesh(scene, file, object, mtl_dict): # export the normals: if f_smooth: # Smoothed, use vertex normals for vi, v in f_v: - file.write(" %d/%d" % ( + fw(" %d/%d" % ( v.index + totverts-1, globalNormals[veckey3d(v.normal)]-1, )) else: # No smoothing, face normals no = globalNormals[veckey3d(f.normal)] for vi, v in f_v: - file.write(" %d/%d" % (v.index + totverts-1, no-1)) - file.write('|') - file.write('\n') + fw(" %d/%d" % (v.index + totverts-1, no-1)) + fw('|') + fw('\n') # Write edges. ==> did not know what it is ... - #file.write('Faces:%d' % len(edges)) + #fw('Faces:%d' % len(edges)) #for ed in edges: # if ed.is_loose: - # file.write('%d %d\n' % (ed.vertices[0] + totverts, ed.vertices[1] + totverts)) + # fw('%d %d\n' % (ed.vertices[0] + totverts, ed.vertices[1] + totverts)) # Make the indices global rather then per mesh totverts += len(me_verts) if faceuv: totuvco += uv_unique_count # clean up - bpy.data.meshes.remove(me) + # TODO: bpy.data. .remove(me) - if object.dupli_type != 'NONE': - object.dupli_list_clear() + # TODO: if object.dupli_type != 'NONE': + # TODO: object.dupli_list_clear() ##################################################################### ## Save collision shapes (for one object): ##################################################################### @@ -554,10 +559,10 @@ def write_file(filepath, mtlfilepath = os.path.splitext(filepath)[0] + ".mtl" file = open(filepath, "w", encoding="utf8", newline="\n") - + fw = file.write # Write Header - file.write('EMF(STRING)\n') # if binary:file.write('EMF(BINARY)\n') - file.write('# Blender v%s EMF File: %r\n' % (bpy.app.version_string, os.path.basename(bpy.data.filepath))) + fw('EMF(STRING)\n') # if binary:fw('EMF(BINARY)\n') + fw('# Blender v%s EMF File: %r\n' % (bpy.app.version_string, os.path.basename(bpy.data.filepath))) # A Dict of Materials # (material.name, image.name):matname_imagename # matname_imagename has gaps removed. diff --git a/blender/io_scene_emf/readme.md b/blender/io_scene_emf/readme.md new file mode 100644 index 0000000..dee8519 --- /dev/null +++ b/blender/io_scene_emf/readme.md @@ -0,0 +1,4 @@ + +To export manyally a emf... (for test ...) + +blender --background -P ./exportEmf.py diff --git a/blender/io_scene_obj/__init__.py b/blender/io_scene_obj/__init__.py new file mode 100644 index 0000000..df600bf --- /dev/null +++ b/blender/io_scene_obj/__init__.py @@ -0,0 +1,514 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +bl_info = { + "name": "Wavefront OBJ format", + "author": "Campbell Barton, Bastien Montagne", + "version": (3, 8, 1), + "blender": (2, 81, 6), + "location": "File > Import-Export", + "description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures", + "warning": "", + "doc_url": "{BLENDER_MANUAL_URL}/addons/import_export/scene_obj.html", + "support": 'OFFICIAL', + "category": "Import-Export", +} + +if "bpy" in locals(): + import importlib + if "import_obj" in locals(): + importlib.reload(import_obj) + if "export_obj" in locals(): + importlib.reload(export_obj) + + +import bpy +from bpy.props import ( + BoolProperty, + FloatProperty, + StringProperty, + EnumProperty, + ) +from bpy_extras.io_utils import ( + ImportHelper, + ExportHelper, + orientation_helper, + path_reference_mode, + axis_conversion, + ) + + +@orientation_helper(axis_forward='-Z', axis_up='Y') +class ImportOBJ(bpy.types.Operator, ImportHelper): + """Load a Wavefront OBJ File""" + bl_idname = "import_scene.obj" + bl_label = "Import OBJ" + bl_options = {'PRESET', 'UNDO'} + + filename_ext = ".obj" + filter_glob: StringProperty( + default="*.obj;*.mtl", + options={'HIDDEN'}, + ) + + use_edges: BoolProperty( + name="Lines", + description="Import lines and faces with 2 verts as edge", + default=True, + ) + use_smooth_groups: BoolProperty( + name="Smooth Groups", + description="Surround smooth groups by sharp edges", + default=True, + ) + + use_split_objects: BoolProperty( + name="Object", + description="Import OBJ Objects into Blender Objects", + default=True, + ) + use_split_groups: BoolProperty( + name="Group", + description="Import OBJ Groups into Blender Objects", + default=False, + ) + + use_groups_as_vgroups: BoolProperty( + name="Poly Groups", + description="Import OBJ groups as vertex groups", + default=False, + ) + + use_image_search: BoolProperty( + name="Image Search", + description="Search subdirs for any associated images " + "(Warning, may be slow)", + default=True, + ) + + split_mode: EnumProperty( + name="Split", + items=(('ON', "Split", "Split geometry, omits unused verts"), + ('OFF', "Keep Vert Order", "Keep vertex order from file"), + ), + ) + + global_clamp_size: FloatProperty( + name="Clamp Size", + description="Clamp bounds under this value (zero to disable)", + min=0.0, max=1000.0, + soft_min=0.0, soft_max=1000.0, + default=0.0, + ) + + def execute(self, context): + # print("Selected: " + context.active_object.name) + from . import import_obj + + if self.split_mode == 'OFF': + self.use_split_objects = False + self.use_split_groups = False + else: + self.use_groups_as_vgroups = False + + keywords = self.as_keywords(ignore=("axis_forward", + "axis_up", + "filter_glob", + "split_mode", + )) + + global_matrix = axis_conversion(from_forward=self.axis_forward, + from_up=self.axis_up, + ).to_4x4() + keywords["global_matrix"] = global_matrix + + if bpy.data.is_saved and context.preferences.filepaths.use_relative_paths: + import os + keywords["relpath"] = os.path.dirname(bpy.data.filepath) + + return import_obj.load(context, **keywords) + + def draw(self, context): + pass + + +class OBJ_PT_import_include(bpy.types.Panel): + bl_space_type = 'FILE_BROWSER' + bl_region_type = 'TOOL_PROPS' + bl_label = "Include" + bl_parent_id = "FILE_PT_operator" + + @classmethod + def poll(cls, context): + sfile = context.space_data + operator = sfile.active_operator + + return operator.bl_idname == "IMPORT_SCENE_OT_obj" + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False # No animation. + + sfile = context.space_data + operator = sfile.active_operator + + layout.prop(operator, 'use_image_search') + layout.prop(operator, 'use_smooth_groups') + layout.prop(operator, 'use_edges') + + +class OBJ_PT_import_transform(bpy.types.Panel): + bl_space_type = 'FILE_BROWSER' + bl_region_type = 'TOOL_PROPS' + bl_label = "Transform" + bl_parent_id = "FILE_PT_operator" + + @classmethod + def poll(cls, context): + sfile = context.space_data + operator = sfile.active_operator + + return operator.bl_idname == "IMPORT_SCENE_OT_obj" + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False # No animation. + + sfile = context.space_data + operator = sfile.active_operator + + layout.prop(operator, "global_clamp_size") + layout.prop(operator, "axis_forward") + layout.prop(operator, "axis_up") + + +class OBJ_PT_import_geometry(bpy.types.Panel): + bl_space_type = 'FILE_BROWSER' + bl_region_type = 'TOOL_PROPS' + bl_label = "Geometry" + bl_parent_id = "FILE_PT_operator" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + sfile = context.space_data + operator = sfile.active_operator + + return operator.bl_idname == "IMPORT_SCENE_OT_obj" + + def draw(self, context): + layout = self.layout + + sfile = context.space_data + operator = sfile.active_operator + + layout.row().prop(operator, "split_mode", expand=True) + + layout.use_property_split = True + layout.use_property_decorate = False # No animation. + + col = layout.column() + if operator.split_mode == 'ON': + col.prop(operator, "use_split_objects", text="Split by Object") + col.prop(operator, "use_split_groups", text="Split by Group") + else: + col.prop(operator, "use_groups_as_vgroups") + + +@orientation_helper(axis_forward='-Z', axis_up='Y') +class ExportOBJ(bpy.types.Operator, ExportHelper): + """Save a Wavefront OBJ File""" + + bl_idname = "export_scene.obj" + bl_label = 'Export OBJ' + bl_options = {'PRESET'} + + filename_ext = ".obj" + filter_glob: StringProperty( + default="*.obj;*.mtl", + options={'HIDDEN'}, + ) + + # context group + use_selection: BoolProperty( + name="Selection Only", + description="Export selected objects only", + default=False, + ) + use_animation: BoolProperty( + name="Animation", + description="Write out an OBJ for each frame", + default=False, + ) + + # object group + use_mesh_modifiers: BoolProperty( + name="Apply Modifiers", + description="Apply modifiers", + default=True, + ) + # Non working in Blender 2.8 currently. + # ~ use_mesh_modifiers_render: BoolProperty( + # ~ name="Use Modifiers Render Settings", + # ~ description="Use render settings when applying modifiers to mesh objects", + # ~ default=False, + # ~ ) + + # extra data group + use_edges: BoolProperty( + name="Include Edges", + description="", + default=True, + ) + use_smooth_groups: BoolProperty( + name="Smooth Groups", + description="Write sharp edges as smooth groups", + default=False, + ) + use_smooth_groups_bitflags: BoolProperty( + name="Bitflag Smooth Groups", + description="Same as 'Smooth Groups', but generate smooth groups IDs as bitflags " + "(produces at most 32 different smooth groups, usually much less)", + default=False, + ) + use_normals: BoolProperty( + name="Write Normals", + description="Export one normal per vertex and per face, to represent flat faces and sharp edges", + default=True, + ) + use_uvs: BoolProperty( + name="Include UVs", + description="Write out the active UV coordinates", + default=True, + ) + use_materials: BoolProperty( + name="Write Materials", + description="Write out the MTL file", + default=True, + ) + use_triangles: BoolProperty( + name="Triangulate Faces", + description="Convert all faces to triangles", + default=False, + ) + use_nurbs: BoolProperty( + name="Write Nurbs", + description="Write nurbs curves as OBJ nurbs rather than " + "converting to geometry", + default=False, + ) + use_vertex_groups: BoolProperty( + name="Polygroups", + description="", + default=False, + ) + + # grouping group + use_blen_objects: BoolProperty( + name="OBJ Objects", + description="Export Blender objects as OBJ objects", + default=True, + ) + group_by_object: BoolProperty( + name="OBJ Groups", + description="Export Blender objects as OBJ groups", + default=False, + ) + group_by_material: BoolProperty( + name="Material Groups", + description="Generate an OBJ group for each part of a geometry using a different material", + default=False, + ) + keep_vertex_order: BoolProperty( + name="Keep Vertex Order", + description="", + default=False, + ) + + global_scale: FloatProperty( + name="Scale", + min=0.01, max=1000.0, + default=1.0, + ) + + path_mode: path_reference_mode + + check_extension = True + + def execute(self, context): + from . import export_obj + + from mathutils import Matrix + keywords = self.as_keywords(ignore=("axis_forward", + "axis_up", + "global_scale", + "check_existing", + "filter_glob", + )) + + global_matrix = (Matrix.Scale(self.global_scale, 4) @ + axis_conversion(to_forward=self.axis_forward, + to_up=self.axis_up, + ).to_4x4()) + + keywords["global_matrix"] = global_matrix + return export_obj.save(context, **keywords) + + def draw(self, context): + pass + + +class OBJ_PT_export_include(bpy.types.Panel): + bl_space_type = 'FILE_BROWSER' + bl_region_type = 'TOOL_PROPS' + bl_label = "Include" + bl_parent_id = "FILE_PT_operator" + + @classmethod + def poll(cls, context): + sfile = context.space_data + operator = sfile.active_operator + + return operator.bl_idname == "EXPORT_SCENE_OT_obj" + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False # No animation. + + sfile = context.space_data + operator = sfile.active_operator + + col = layout.column(heading="Limit to") + col.prop(operator, 'use_selection') + + col = layout.column(heading="Objects as", align=True) + col.prop(operator, 'use_blen_objects') + col.prop(operator, 'group_by_object') + col.prop(operator, 'group_by_material') + + layout.separator() + + layout.prop(operator, 'use_animation') + + +class OBJ_PT_export_transform(bpy.types.Panel): + bl_space_type = 'FILE_BROWSER' + bl_region_type = 'TOOL_PROPS' + bl_label = "Transform" + bl_parent_id = "FILE_PT_operator" + + @classmethod + def poll(cls, context): + sfile = context.space_data + operator = sfile.active_operator + + return operator.bl_idname == "EXPORT_SCENE_OT_obj" + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False # No animation. + + sfile = context.space_data + operator = sfile.active_operator + + layout.prop(operator, 'global_scale') + layout.prop(operator, 'path_mode') + layout.prop(operator, 'axis_forward') + layout.prop(operator, 'axis_up') + + +class OBJ_PT_export_geometry(bpy.types.Panel): + bl_space_type = 'FILE_BROWSER' + bl_region_type = 'TOOL_PROPS' + bl_label = "Geometry" + bl_parent_id = "FILE_PT_operator" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + sfile = context.space_data + operator = sfile.active_operator + + return operator.bl_idname == "EXPORT_SCENE_OT_obj" + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False # No animation. + + sfile = context.space_data + operator = sfile.active_operator + + layout.prop(operator, 'use_mesh_modifiers') + # Property definition disabled, not working in 2.8 currently. + # layout.prop(operator, 'use_mesh_modifiers_render') + layout.prop(operator, 'use_smooth_groups') + layout.prop(operator, 'use_smooth_groups_bitflags') + layout.prop(operator, 'use_normals') + layout.prop(operator, 'use_uvs') + layout.prop(operator, 'use_materials') + layout.prop(operator, 'use_triangles') + layout.prop(operator, 'use_nurbs', text="Curves as NURBS") + layout.prop(operator, 'use_vertex_groups') + layout.prop(operator, 'keep_vertex_order') + + +def menu_func_import(self, context): + self.layout.operator(ImportOBJ.bl_idname, text="Wavefront (.obj)") + + +def menu_func_export(self, context): + self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)") + + +classes = ( + ImportOBJ, + OBJ_PT_import_include, + OBJ_PT_import_transform, + OBJ_PT_import_geometry, + ExportOBJ, + OBJ_PT_export_include, + OBJ_PT_export_transform, + OBJ_PT_export_geometry, +) + + +def register(): + for cls in classes: + bpy.utils.register_class(cls) + + bpy.types.TOPBAR_MT_file_import.append(menu_func_import) + bpy.types.TOPBAR_MT_file_export.append(menu_func_export) + + +def unregister(): + bpy.types.TOPBAR_MT_file_import.remove(menu_func_import) + bpy.types.TOPBAR_MT_file_export.remove(menu_func_export) + + for cls in classes: + bpy.utils.unregister_class(cls) + + +if __name__ == "__main__": + register() diff --git a/blender/io_scene_obj/export_obj.py b/blender/io_scene_obj/export_obj.py new file mode 100644 index 0000000..50cec83 --- /dev/null +++ b/blender/io_scene_obj/export_obj.py @@ -0,0 +1,792 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +import os + +import bpy +from mathutils import Matrix, Vector, Color +from bpy_extras import io_utils, node_shader_utils + +from bpy_extras.wm_utils.progress_report import ( + ProgressReport, + ProgressReportSubstep, +) + + +def name_compat(name): + if name is None: + return 'None' + else: + return name.replace(' ', '_') + + +def mesh_triangulate(me): + import bmesh + bm = bmesh.new() + bm.from_mesh(me) + bmesh.ops.triangulate(bm, faces=bm.faces) + bm.to_mesh(me) + bm.free() + + +def write_mtl(scene, filepath, path_mode, copy_set, mtl_dict): + source_dir = os.path.dirname(bpy.data.filepath) + dest_dir = os.path.dirname(filepath) + + with open(filepath, "w", encoding="utf8", newline="\n") as f: + fw = f.write + + fw('# Blender MTL File: %r\n' % (os.path.basename(bpy.data.filepath) or "None")) + fw('# Material Count: %i\n' % len(mtl_dict)) + + mtl_dict_values = list(mtl_dict.values()) + mtl_dict_values.sort(key=lambda m: m[0]) + + # Write material/image combinations we have used. + # Using mtl_dict.values() directly gives un-predictable order. + for mtl_mat_name, mat in mtl_dict_values: + # Get the Blender data for the material and the image. + # Having an image named None will make a bug, dont do it :) + + fw('\nnewmtl %s\n' % mtl_mat_name) # Define a new material: matname_imgname + + mat_wrap = node_shader_utils.PrincipledBSDFWrapper(mat) if mat else None + + if mat_wrap: + use_mirror = mat_wrap.metallic != 0.0 + use_transparency = mat_wrap.alpha != 1.0 + + # XXX Totally empirical conversion, trying to adapt it + # (from 1.0 - 0.0 Principled BSDF range to 0.0 - 900.0 OBJ specular exponent range)... + spec = (1.0 - mat_wrap.roughness) * 30 + spec *= spec + fw('Ns %.6f\n' % spec) + + # Ambient + if use_mirror: + fw('Ka %.6f %.6f %.6f\n' % (mat_wrap.metallic, mat_wrap.metallic, mat_wrap.metallic)) + else: + fw('Ka %.6f %.6f %.6f\n' % (1.0, 1.0, 1.0)) + fw('Kd %.6f %.6f %.6f\n' % mat_wrap.base_color[:3]) # Diffuse + # XXX TODO Find a way to handle tint and diffuse color, in a consistent way with import... + fw('Ks %.6f %.6f %.6f\n' % (mat_wrap.specular, mat_wrap.specular, mat_wrap.specular)) # Specular + # Emission, not in original MTL standard but seems pretty common, see T45766. + emission_strength = mat_wrap.emission_strength + emission = [emission_strength * c for c in mat_wrap.emission_color[:3]] + fw('Ke %.6f %.6f %.6f\n' % tuple(emission)) + fw('Ni %.6f\n' % mat_wrap.ior) # Refraction index + fw('d %.6f\n' % mat_wrap.alpha) # Alpha (obj uses 'd' for dissolve) + + # See http://en.wikipedia.org/wiki/Wavefront_.obj_file for whole list of values... + # Note that mapping is rather fuzzy sometimes, trying to do our best here. + if mat_wrap.specular == 0: + fw('illum 1\n') # no specular. + elif use_mirror: + if use_transparency: + fw('illum 6\n') # Reflection, Transparency, Ray trace + else: + fw('illum 3\n') # Reflection and Ray trace + elif use_transparency: + fw('illum 9\n') # 'Glass' transparency and no Ray trace reflection... fuzzy matching, but... + else: + fw('illum 2\n') # light normally + + #### And now, the image textures... + image_map = { + "map_Kd": "base_color_texture", + "map_Ka": None, # ambient... + "map_Ks": "specular_texture", + "map_Ns": "roughness_texture", + "map_d": "alpha_texture", + "map_Tr": None, # transmission roughness? + "map_Bump": "normalmap_texture", + "disp": None, # displacement... + "refl": "metallic_texture", + "map_Ke": "emission_color_texture" if emission_strength != 0.0 else None, + } + + for key, mat_wrap_key in sorted(image_map.items()): + if mat_wrap_key is None: + continue + tex_wrap = getattr(mat_wrap, mat_wrap_key, None) + if tex_wrap is None: + continue + image = tex_wrap.image + if image is None: + continue + + filepath = io_utils.path_reference(image.filepath, source_dir, dest_dir, + path_mode, "", copy_set, image.library) + options = [] + if key == "map_Bump": + if mat_wrap.normalmap_strength != 1.0: + options.append('-bm %.6f' % mat_wrap.normalmap_strength) + if tex_wrap.translation != Vector((0.0, 0.0, 0.0)): + options.append('-o %.6f %.6f %.6f' % tex_wrap.translation[:]) + if tex_wrap.scale != Vector((1.0, 1.0, 1.0)): + options.append('-s %.6f %.6f %.6f' % tex_wrap.scale[:]) + if options: + fw('%s %s %s\n' % (key, " ".join(options), repr(filepath)[1:-1])) + else: + fw('%s %s\n' % (key, repr(filepath)[1:-1])) + + else: + # Write a dummy material here? + fw('Ns 500\n') + fw('Ka 0.8 0.8 0.8\n') + fw('Kd 0.8 0.8 0.8\n') + fw('Ks 0.8 0.8 0.8\n') + fw('d 1\n') # No alpha + fw('illum 2\n') # light normally + + +def test_nurbs_compat(ob): + if ob.type != 'CURVE': + return False + + for nu in ob.data.splines: + if nu.point_count_v == 1 and nu.type != 'BEZIER': # not a surface and not bezier + return True + + return False + + +def write_nurb(fw, ob, ob_mat): + tot_verts = 0 + cu = ob.data + + # use negative indices + for nu in cu.splines: + if nu.type == 'POLY': + DEG_ORDER_U = 1 + else: + DEG_ORDER_U = nu.order_u - 1 # odd but tested to be correct + + if nu.type == 'BEZIER': + print("\tWarning, bezier curve:", ob.name, "only poly and nurbs curves supported") + continue + + if nu.point_count_v > 1: + print("\tWarning, surface:", ob.name, "only poly and nurbs curves supported") + continue + + if len(nu.points) <= DEG_ORDER_U: + print("\tWarning, order_u is lower then vert count, skipping:", ob.name) + continue + + pt_num = 0 + do_closed = nu.use_cyclic_u + do_endpoints = (do_closed == 0) and nu.use_endpoint_u + + for pt in nu.points: + fw('v %.6f %.6f %.6f\n' % (ob_mat @ pt.co.to_3d())[:]) + pt_num += 1 + tot_verts += pt_num + + fw('g %s\n' % (name_compat(ob.name))) # name_compat(ob.getData(1)) could use the data name too + fw('cstype bspline\n') # not ideal, hard coded + fw('deg %d\n' % DEG_ORDER_U) # not used for curves but most files have it still + + curve_ls = [-(i + 1) for i in range(pt_num)] + + # 'curv' keyword + if do_closed: + if DEG_ORDER_U == 1: + pt_num += 1 + curve_ls.append(-1) + else: + pt_num += DEG_ORDER_U + curve_ls = curve_ls + curve_ls[0:DEG_ORDER_U] + + fw('curv 0.0 1.0 %s\n' % (" ".join([str(i) for i in curve_ls]))) # Blender has no U and V values for the curve + + # 'parm' keyword + tot_parm = (DEG_ORDER_U + 1) + pt_num + tot_parm_div = float(tot_parm - 1) + parm_ls = [(i / tot_parm_div) for i in range(tot_parm)] + + if do_endpoints: # end points, force param + for i in range(DEG_ORDER_U + 1): + parm_ls[i] = 0.0 + parm_ls[-(1 + i)] = 1.0 + + fw("parm u %s\n" % " ".join(["%.6f" % i for i in parm_ls])) + + fw('end\n') + + return tot_verts + + +def write_file(filepath, objects, depsgraph, scene, + EXPORT_TRI=False, + EXPORT_EDGES=False, + EXPORT_SMOOTH_GROUPS=False, + EXPORT_SMOOTH_GROUPS_BITFLAGS=False, + EXPORT_NORMALS=False, + EXPORT_UV=True, + EXPORT_MTL=True, + EXPORT_APPLY_MODIFIERS=True, + EXPORT_APPLY_MODIFIERS_RENDER=False, + EXPORT_BLEN_OBS=True, + EXPORT_GROUP_BY_OB=False, + EXPORT_GROUP_BY_MAT=False, + EXPORT_KEEP_VERT_ORDER=False, + EXPORT_POLYGROUPS=False, + EXPORT_CURVE_AS_NURBS=True, + EXPORT_GLOBAL_MATRIX=None, + EXPORT_PATH_MODE='AUTO', + progress=ProgressReport(), + ): + """ + Basic write function. The context and options must be already set + This can be accessed externaly + eg. + write( 'c:\\test\\foobar.obj', Blender.Object.GetSelected() ) # Using default options. + """ + if EXPORT_GLOBAL_MATRIX is None: + EXPORT_GLOBAL_MATRIX = Matrix() + + def veckey3d(v): + return round(v.x, 4), round(v.y, 4), round(v.z, 4) + + def veckey2d(v): + return round(v[0], 4), round(v[1], 4) + + def findVertexGroupName(face, vWeightMap): + """ + Searches the vertexDict to see what groups is assigned to a given face. + We use a frequency system in order to sort out the name because a given vertex can + belong to two or more groups at the same time. To find the right name for the face + we list all the possible vertex group names with their frequency and then sort by + frequency in descend order. The top element is the one shared by the highest number + of vertices is the face's group + """ + weightDict = {} + for vert_index in face.vertices: + vWeights = vWeightMap[vert_index] + for vGroupName, weight in vWeights: + weightDict[vGroupName] = weightDict.get(vGroupName, 0.0) + weight + + if weightDict: + return max((weight, vGroupName) for vGroupName, weight in weightDict.items())[1] + else: + return '(null)' + + with ProgressReportSubstep(progress, 2, "OBJ Export path: %r" % filepath, "OBJ Export Finished") as subprogress1: + with open(filepath, "w", encoding="utf8", newline="\n") as f: + fw = f.write + + # Write Header + fw('# Blender v%s OBJ File: %r\n' % (bpy.app.version_string, os.path.basename(bpy.data.filepath))) + fw('# www.blender.org\n') + + # Tell the obj file what material file to use. + if EXPORT_MTL: + mtlfilepath = os.path.splitext(filepath)[0] + ".mtl" + # filepath can contain non utf8 chars, use repr + fw('mtllib %s\n' % repr(os.path.basename(mtlfilepath))[1:-1]) + + # Initialize totals, these are updated each object + totverts = totuvco = totno = 1 + + face_vert_index = 1 + + # A Dict of Materials + # (material.name, image.name):matname_imagename # matname_imagename has gaps removed. + mtl_dict = {} + # Used to reduce the usage of matname_texname materials, which can become annoying in case of + # repeated exports/imports, yet keeping unique mat names per keys! + # mtl_name: (material.name, image.name) + mtl_rev_dict = {} + + copy_set = set() + + # Get all meshes + subprogress1.enter_substeps(len(objects)) + for i, ob_main in enumerate(objects): + # ignore dupli children + if ob_main.parent and ob_main.parent.instance_type in {'VERTS', 'FACES'}: + subprogress1.step("Ignoring %s, dupli child..." % ob_main.name) + continue + + obs = [(ob_main, ob_main.matrix_world)] + if ob_main.is_instancer: + obs += [(dup.instance_object.original, dup.matrix_world.copy()) + for dup in depsgraph.object_instances + if dup.parent and dup.parent.original == ob_main] + # ~ print(ob_main.name, 'has', len(obs) - 1, 'dupli children') + + subprogress1.enter_substeps(len(obs)) + for ob, ob_mat in obs: + with ProgressReportSubstep(subprogress1, 6) as subprogress2: + uv_unique_count = no_unique_count = 0 + + # Nurbs curve support + if EXPORT_CURVE_AS_NURBS and test_nurbs_compat(ob): + ob_mat = EXPORT_GLOBAL_MATRIX @ ob_mat + totverts += write_nurb(fw, ob, ob_mat) + continue + # END NURBS + + ob_for_convert = ob.evaluated_get(depsgraph) if EXPORT_APPLY_MODIFIERS else ob.original + + try: + me = ob_for_convert.to_mesh() + except RuntimeError: + me = None + + if me is None: + continue + + # _must_ do this before applying transformation, else tessellation may differ + if EXPORT_TRI: + # _must_ do this first since it re-allocs arrays + mesh_triangulate(me) + + me.transform(EXPORT_GLOBAL_MATRIX @ ob_mat) + # If negative scaling, we have to invert the normals... + if ob_mat.determinant() < 0.0: + me.flip_normals() + + if EXPORT_UV: + faceuv = len(me.uv_layers) > 0 + if faceuv: + uv_layer = me.uv_layers.active.data[:] + else: + faceuv = False + + me_verts = me.vertices[:] + + # Make our own list so it can be sorted to reduce context switching + face_index_pairs = [(face, index) for index, face in enumerate(me.polygons)] + + if EXPORT_EDGES: + edges = me.edges + else: + edges = [] + + if not (len(face_index_pairs) + len(edges) + len(me.vertices)): # Make sure there is something to write + # clean up + ob_for_convert.to_mesh_clear() + continue # dont bother with this mesh. + + if EXPORT_NORMALS and face_index_pairs: + me.calc_normals_split() + # No need to call me.free_normals_split later, as this mesh is deleted anyway! + + loops = me.loops + + if (EXPORT_SMOOTH_GROUPS or EXPORT_SMOOTH_GROUPS_BITFLAGS) and face_index_pairs: + smooth_groups, smooth_groups_tot = me.calc_smooth_groups(use_bitflags=EXPORT_SMOOTH_GROUPS_BITFLAGS) + if smooth_groups_tot <= 1: + smooth_groups, smooth_groups_tot = (), 0 + else: + smooth_groups, smooth_groups_tot = (), 0 + + materials = me.materials[:] + material_names = [m.name if m else None for m in materials] + + # avoid bad index errors + if not materials: + materials = [None] + material_names = [name_compat(None)] + + # Sort by Material, then images + # so we dont over context switch in the obj file. + if EXPORT_KEEP_VERT_ORDER: + pass + else: + if len(materials) > 1: + if smooth_groups: + sort_func = lambda a: (a[0].material_index, + smooth_groups[a[1]] if a[0].use_smooth else False) + else: + sort_func = lambda a: (a[0].material_index, + a[0].use_smooth) + else: + # no materials + if smooth_groups: + sort_func = lambda a: smooth_groups[a[1] if a[0].use_smooth else False] + else: + sort_func = lambda a: a[0].use_smooth + + face_index_pairs.sort(key=sort_func) + + del sort_func + + # Set the default mat to no material and no image. + contextMat = 0, 0 # Can never be this, so we will label a new material the first chance we get. + contextSmooth = None # Will either be true or false, set bad to force initialization switch. + + if EXPORT_BLEN_OBS or EXPORT_GROUP_BY_OB: + name1 = ob.name + name2 = ob.data.name + if name1 == name2: + obnamestring = name_compat(name1) + else: + obnamestring = '%s_%s' % (name_compat(name1), name_compat(name2)) + + if EXPORT_BLEN_OBS: + fw('o %s\n' % obnamestring) # Write Object name + else: # if EXPORT_GROUP_BY_OB: + fw('g %s\n' % obnamestring) + + subprogress2.step() + + # Vert + for v in me_verts: + fw('v %.6f %.6f %.6f\n' % v.co[:]) + + subprogress2.step() + + # UV + if faceuv: + # in case removing some of these dont get defined. + uv = f_index = uv_index = uv_key = uv_val = uv_ls = None + + uv_face_mapping = [None] * len(face_index_pairs) + + uv_dict = {} + uv_get = uv_dict.get + for f, f_index in face_index_pairs: + uv_ls = uv_face_mapping[f_index] = [] + for uv_index, l_index in enumerate(f.loop_indices): + uv = uv_layer[l_index].uv + # include the vertex index in the key so we don't share UV's between vertices, + # allowed by the OBJ spec but can cause issues for other importers, see: T47010. + + # this works too, shared UV's for all verts + #~ uv_key = veckey2d(uv) + uv_key = loops[l_index].vertex_index, veckey2d(uv) + + uv_val = uv_get(uv_key) + if uv_val is None: + uv_val = uv_dict[uv_key] = uv_unique_count + fw('vt %.6f %.6f\n' % uv[:]) + uv_unique_count += 1 + uv_ls.append(uv_val) + + del uv_dict, uv, f_index, uv_index, uv_ls, uv_get, uv_key, uv_val + # Only need uv_unique_count and uv_face_mapping + + subprogress2.step() + + # NORMAL, Smooth/Non smoothed. + if EXPORT_NORMALS: + no_key = no_val = None + normals_to_idx = {} + no_get = normals_to_idx.get + loops_to_normals = [0] * len(loops) + for f, f_index in face_index_pairs: + for l_idx in f.loop_indices: + no_key = veckey3d(loops[l_idx].normal) + no_val = no_get(no_key) + if no_val is None: + no_val = normals_to_idx[no_key] = no_unique_count + fw('vn %.4f %.4f %.4f\n' % no_key) + no_unique_count += 1 + loops_to_normals[l_idx] = no_val + del normals_to_idx, no_get, no_key, no_val + else: + loops_to_normals = [] + + subprogress2.step() + + # XXX + if EXPORT_POLYGROUPS: + # Retrieve the list of vertex groups + vertGroupNames = ob.vertex_groups.keys() + if vertGroupNames: + currentVGroup = '' + # Create a dictionary keyed by face id and listing, for each vertex, the vertex groups it belongs to + vgroupsMap = [[] for _i in range(len(me_verts))] + for v_idx, v_ls in enumerate(vgroupsMap): + v_ls[:] = [(vertGroupNames[g.group], g.weight) for g in me_verts[v_idx].groups] + + for f, f_index in face_index_pairs: + f_smooth = f.use_smooth + if f_smooth and smooth_groups: + f_smooth = smooth_groups[f_index] + f_mat = min(f.material_index, len(materials) - 1) + + # MAKE KEY + key = material_names[f_mat], None # No image, use None instead. + + # Write the vertex group + if EXPORT_POLYGROUPS: + if vertGroupNames: + # find what vertext group the face belongs to + vgroup_of_face = findVertexGroupName(f, vgroupsMap) + if vgroup_of_face != currentVGroup: + currentVGroup = vgroup_of_face + fw('g %s\n' % vgroup_of_face) + + # CHECK FOR CONTEXT SWITCH + if key == contextMat: + pass # Context already switched, dont do anything + else: + if key[0] is None and key[1] is None: + # Write a null material, since we know the context has changed. + if EXPORT_GROUP_BY_MAT: + # can be mat_image or (null) + fw("g %s_%s\n" % (name_compat(ob.name), name_compat(ob.data.name))) + if EXPORT_MTL: + fw("usemtl (null)\n") # mat, image + + else: + mat_data = mtl_dict.get(key) + if not mat_data: + # First add to global dict so we can export to mtl + # Then write mtl + + # Make a new names from the mat and image name, + # converting any spaces to underscores with name_compat. + + # If none image dont bother adding it to the name + # Try to avoid as much as possible adding texname (or other things) + # to the mtl name (see [#32102])... + mtl_name = "%s" % name_compat(key[0]) + if mtl_rev_dict.get(mtl_name, None) not in {key, None}: + if key[1] is None: + tmp_ext = "_NONE" + else: + tmp_ext = "_%s" % name_compat(key[1]) + i = 0 + while mtl_rev_dict.get(mtl_name + tmp_ext, None) not in {key, None}: + i += 1 + tmp_ext = "_%3d" % i + mtl_name += tmp_ext + mat_data = mtl_dict[key] = mtl_name, materials[f_mat] + mtl_rev_dict[mtl_name] = key + + if EXPORT_GROUP_BY_MAT: + # can be mat_image or (null) + fw("g %s_%s_%s\n" % (name_compat(ob.name), name_compat(ob.data.name), mat_data[0])) + if EXPORT_MTL: + fw("usemtl %s\n" % mat_data[0]) # can be mat_image or (null) + + contextMat = key + if f_smooth != contextSmooth: + if f_smooth: # on now off + if smooth_groups: + f_smooth = smooth_groups[f_index] + fw('s %d\n' % f_smooth) + else: + fw('s 1\n') + else: # was off now on + fw('s off\n') + contextSmooth = f_smooth + + f_v = [(vi, me_verts[v_idx], l_idx) + for vi, (v_idx, l_idx) in enumerate(zip(f.vertices, f.loop_indices))] + + fw('f') + if faceuv: + if EXPORT_NORMALS: + for vi, v, li in f_v: + fw(" %d/%d/%d" % (totverts + v.index, + totuvco + uv_face_mapping[f_index][vi], + totno + loops_to_normals[li], + )) # vert, uv, normal + else: # No Normals + for vi, v, li in f_v: + fw(" %d/%d" % (totverts + v.index, + totuvco + uv_face_mapping[f_index][vi], + )) # vert, uv + + face_vert_index += len(f_v) + + else: # No UV's + if EXPORT_NORMALS: + for vi, v, li in f_v: + fw(" %d//%d" % (totverts + v.index, totno + loops_to_normals[li])) + else: # No Normals + for vi, v, li in f_v: + fw(" %d" % (totverts + v.index)) + + fw('\n') + + subprogress2.step() + + # Write edges. + if EXPORT_EDGES: + for ed in edges: + if ed.is_loose: + fw('l %d %d\n' % (totverts + ed.vertices[0], totverts + ed.vertices[1])) + + # Make the indices global rather then per mesh + totverts += len(me_verts) + totuvco += uv_unique_count + totno += no_unique_count + + # clean up + ob_for_convert.to_mesh_clear() + + subprogress1.leave_substeps("Finished writing geometry of '%s'." % ob_main.name) + subprogress1.leave_substeps() + + subprogress1.step("Finished exporting geometry, now exporting materials") + + # Now we have all our materials, save them + if EXPORT_MTL: + write_mtl(scene, mtlfilepath, EXPORT_PATH_MODE, copy_set, mtl_dict) + + # copy all collected files. + io_utils.path_reference_copy(copy_set) + + +def _write(context, filepath, + EXPORT_TRI, # ok + EXPORT_EDGES, + EXPORT_SMOOTH_GROUPS, + EXPORT_SMOOTH_GROUPS_BITFLAGS, + EXPORT_NORMALS, # ok + EXPORT_UV, # ok + EXPORT_MTL, + EXPORT_APPLY_MODIFIERS, # ok + EXPORT_APPLY_MODIFIERS_RENDER, # ok + EXPORT_BLEN_OBS, + EXPORT_GROUP_BY_OB, + EXPORT_GROUP_BY_MAT, + EXPORT_KEEP_VERT_ORDER, + EXPORT_POLYGROUPS, + EXPORT_CURVE_AS_NURBS, + EXPORT_SEL_ONLY, # ok + EXPORT_ANIMATION, + EXPORT_GLOBAL_MATRIX, + EXPORT_PATH_MODE, # Not used + ): + + with ProgressReport(context.window_manager) as progress: + base_name, ext = os.path.splitext(filepath) + context_name = [base_name, '', '', ext] # Base name, scene name, frame number, extension + + depsgraph = context.evaluated_depsgraph_get() + scene = context.scene + + # Exit edit mode before exporting, so current object states are exported properly. + if bpy.ops.object.mode_set.poll(): + bpy.ops.object.mode_set(mode='OBJECT') + + orig_frame = scene.frame_current + + # Export an animation? + if EXPORT_ANIMATION: + scene_frames = range(scene.frame_start, scene.frame_end + 1) # Up to and including the end frame. + else: + scene_frames = [orig_frame] # Dont export an animation. + + # Loop through all frames in the scene and export. + progress.enter_substeps(len(scene_frames)) + for frame in scene_frames: + if EXPORT_ANIMATION: # Add frame to the filepath. + context_name[2] = '_%.6d' % frame + + scene.frame_set(frame, subframe=0.0) + if EXPORT_SEL_ONLY: + objects = context.selected_objects + else: + objects = scene.objects + + full_path = ''.join(context_name) + + # erm... bit of a problem here, this can overwrite files when exporting frames. not too bad. + # EXPORT THE FILE. + progress.enter_substeps(1) + write_file(full_path, objects, depsgraph, scene, + EXPORT_TRI, + EXPORT_EDGES, + EXPORT_SMOOTH_GROUPS, + EXPORT_SMOOTH_GROUPS_BITFLAGS, + EXPORT_NORMALS, + EXPORT_UV, + EXPORT_MTL, + EXPORT_APPLY_MODIFIERS, + EXPORT_APPLY_MODIFIERS_RENDER, + EXPORT_BLEN_OBS, + EXPORT_GROUP_BY_OB, + EXPORT_GROUP_BY_MAT, + EXPORT_KEEP_VERT_ORDER, + EXPORT_POLYGROUPS, + EXPORT_CURVE_AS_NURBS, + EXPORT_GLOBAL_MATRIX, + EXPORT_PATH_MODE, + progress, + ) + progress.leave_substeps() + + scene.frame_set(orig_frame, subframe=0.0) + progress.leave_substeps() + + +""" +Currently the exporter lacks these features: +* multiple scene export (only active scene is written) +* particles +""" + + +def save(context, + filepath, + *, + use_triangles=False, + use_edges=True, + use_normals=False, + use_smooth_groups=False, + use_smooth_groups_bitflags=False, + use_uvs=True, + use_materials=True, + use_mesh_modifiers=True, + use_mesh_modifiers_render=False, + use_blen_objects=True, + group_by_object=False, + group_by_material=False, + keep_vertex_order=False, + use_vertex_groups=False, + use_nurbs=True, + use_selection=True, + use_animation=False, + global_matrix=None, + path_mode='AUTO' + ): + + _write(context, filepath, + EXPORT_TRI=use_triangles, + EXPORT_EDGES=use_edges, + EXPORT_SMOOTH_GROUPS=use_smooth_groups, + EXPORT_SMOOTH_GROUPS_BITFLAGS=use_smooth_groups_bitflags, + EXPORT_NORMALS=use_normals, + EXPORT_UV=use_uvs, + EXPORT_MTL=use_materials, + EXPORT_APPLY_MODIFIERS=use_mesh_modifiers, + EXPORT_APPLY_MODIFIERS_RENDER=use_mesh_modifiers_render, + EXPORT_BLEN_OBS=use_blen_objects, + EXPORT_GROUP_BY_OB=group_by_object, + EXPORT_GROUP_BY_MAT=group_by_material, + EXPORT_KEEP_VERT_ORDER=keep_vertex_order, + EXPORT_POLYGROUPS=use_vertex_groups, + EXPORT_CURVE_AS_NURBS=use_nurbs, + EXPORT_SEL_ONLY=use_selection, + EXPORT_ANIMATION=use_animation, + EXPORT_GLOBAL_MATRIX=global_matrix, + EXPORT_PATH_MODE=path_mode, + ) + + return {'FINISHED'} diff --git a/blender/io_scene_obj/import_obj.py b/blender/io_scene_obj/import_obj.py new file mode 100644 index 0000000..470e85e --- /dev/null +++ b/blender/io_scene_obj/import_obj.py @@ -0,0 +1,1323 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +# Script copyright (C) Campbell Barton +# Contributors: Campbell Barton, Jiri Hnidek, Paolo Ciccone + +""" +This script imports a Wavefront OBJ files to Blender. + +Usage: +Run this script from "File->Import" menu and then load the desired OBJ file. +Note, This loads mesh objects and materials only, nurbs and curves are not supported. + +http://wiki.blender.org/index.php/Scripts/Manual/Import/wavefront_obj +""" + +import array +import os +import time +import bpy +import mathutils + +from bpy_extras.io_utils import unpack_list +from bpy_extras.image_utils import load_image +from bpy_extras.wm_utils.progress_report import ProgressReport + + +def line_value(line_split): + """ + Returns 1 string representing the value for this line + None will be returned if there's only 1 word + """ + length = len(line_split) + if length == 1: + return None + + elif length == 2: + return line_split[1] + + elif length > 2: + return b' '.join(line_split[1:]) + + +def filenames_group_by_ext(line, ext): + """ + Splits material libraries supporting spaces, so: + b'foo bar.mtl baz spam.MTL' -> (b'foo bar.mtl', b'baz spam.MTL') + Also handle " chars (some software use those to protect filenames with spaces, see T67266... sic). + """ + # Note that we assume that if there are some " in that line, + # then all filenames are properly enclosed within those... + start = line.find(b'"') + 1 + if start != 0: + while start != 0: + end = line.find(b'"', start) + if end != -1: + yield line[start:end] + start = line.find(b'"', end + 1) + 1 + else: + break + return + + line_lower = line.lower() + i_prev = 0 + while i_prev != -1 and i_prev < len(line): + i = line_lower.find(ext, i_prev) + if i != -1: + i += len(ext) + yield line[i_prev:i].strip() + i_prev = i + + +def obj_image_load(img_data, context_imagepath_map, line, DIR, recursive, relpath): + """ + Mainly uses comprehensiveImageLoad + But we try all space-separated items from current line when file is not found with last one + (users keep generating/using image files with spaces in a format that does not support them, sigh...) + Also tries to replace '_' with ' ' for Max's exporter replaces spaces with underscores. + Also handle " chars (some software use those to protect filenames with spaces, see T67266... sic). + Also corrects img_data (in case filenames with spaces have been split up in multiple entries, see T72148). + """ + filepath_parts = line.split(b' ') + + start = line.find(b'"') + 1 + if start != 0: + end = line.find(b'"', start) + if end != 0: + filepath_parts = (line[start:end],) + + image = None + for i in range(-1, -len(filepath_parts), -1): + imagepath = os.fsdecode(b" ".join(filepath_parts[i:])) + image = context_imagepath_map.get(imagepath, ...) + if image is ...: + image = load_image(imagepath, DIR, recursive=recursive, relpath=relpath) + if image is None and "_" in imagepath: + image = load_image(imagepath.replace("_", " "), DIR, recursive=recursive, relpath=relpath) + if image is not None: + context_imagepath_map[imagepath] = image + del img_data[i:] + img_data.append(imagepath) + break; + else: + del img_data[i:] + img_data.append(imagepath) + break; + + if image is None: + imagepath = os.fsdecode(filepath_parts[-1]) + image = load_image(imagepath, DIR, recursive=recursive, place_holder=True, relpath=relpath) + context_imagepath_map[imagepath] = image + + return image + + +def create_materials(filepath, relpath, + material_libs, unique_materials, + use_image_search, float_func): + """ + Create all the used materials in this obj, + assign colors and images to the materials from all referenced material libs + """ + from math import sqrt + from bpy_extras import node_shader_utils + + DIR = os.path.dirname(filepath) + context_material_vars = set() + + # Don't load the same image multiple times + context_imagepath_map = {} + + nodal_material_wrap_map = {} + + def load_material_image(blender_material, mat_wrap, context_material_name, img_data, line, type): + """ + Set textures defined in .mtl file. + """ + map_options = {} + + # Absolute path - c:\.. etc would work here + image = obj_image_load(img_data, context_imagepath_map, line, DIR, use_image_search, relpath) + + curr_token = [] + for token in img_data[:-1]: + if token.startswith(b'-') and token[1:].isalpha(): + if curr_token: + map_options[curr_token[0]] = curr_token[1:] + curr_token[:] = [] + curr_token.append(token) + if curr_token: + map_options[curr_token[0]] = curr_token[1:] + + map_offset = map_options.get(b'-o') + map_scale = map_options.get(b'-s') + if map_offset is not None: + map_offset = tuple(map(float_func, map_offset)) + if map_scale is not None: + map_scale = tuple(map(float_func, map_scale)) + + def _generic_tex_set(nodetex, image, texcoords, translation, scale): + nodetex.image = image + nodetex.texcoords = texcoords + if translation is not None: + nodetex.translation = translation + if scale is not None: + nodetex.scale = scale + + # Adds textures for materials (rendering) + if type == 'Kd': + _generic_tex_set(mat_wrap.base_color_texture, image, 'UV', map_offset, map_scale) + + elif type == 'Ka': + # XXX Not supported? + print("WARNING, currently unsupported ambient texture, skipped.") + + elif type == 'Ks': + _generic_tex_set(mat_wrap.specular_texture, image, 'UV', map_offset, map_scale) + + elif type == 'Ke': + _generic_tex_set(mat_wrap.emission_color_texture, image, 'UV', map_offset, map_scale) + mat_wrap.emission_strength = 1.0 + + elif type == 'Bump': + bump_mult = map_options.get(b'-bm') + bump_mult = float(bump_mult[0]) if (bump_mult and len(bump_mult[0]) > 1) else 1.0 + mat_wrap.normalmap_strength_set(bump_mult) + + _generic_tex_set(mat_wrap.normalmap_texture, image, 'UV', map_offset, map_scale) + + elif type == 'D': + _generic_tex_set(mat_wrap.alpha_texture, image, 'UV', map_offset, map_scale) + + elif type == 'disp': + # XXX Not supported? + print("WARNING, currently unsupported displacement texture, skipped.") + # ~ mat_wrap.bump_image_set(image) + # ~ mat_wrap.bump_mapping_set(coords='UV', translation=map_offset, scale=map_scale) + + elif type == 'refl': + map_type = map_options.get(b'-type') + if map_type and map_type != [b'sphere']: + print("WARNING, unsupported reflection type '%s', defaulting to 'sphere'" + "" % ' '.join(i.decode() for i in map_type)) + + _generic_tex_set(mat_wrap.base_color_texture, image, 'Reflection', map_offset, map_scale) + mat_wrap.base_color_texture.projection = 'SPHERE' + + else: + raise Exception("invalid type %r" % type) + + def finalize_material(context_material, context_material_vars, spec_colors, + do_highlight, do_reflection, do_transparency, do_glass): + # Finalize previous mat, if any. + if context_material: + if "specular" in context_material_vars: + # XXX This is highly approximated, not sure whether we can do better... + # TODO: Find a way to guesstimate best value from diffuse color... + # IDEA: Use standard deviation of both spec and diff colors (i.e. how far away they are + # from some grey), and apply the the proportion between those two as tint factor? + spec = sum(spec_colors) / 3.0 + # ~ spec_var = math.sqrt(sum((c - spec) ** 2 for c in spec_color) / 3.0) + # ~ diff = sum(context_mat_wrap.base_color) / 3.0 + # ~ diff_var = math.sqrt(sum((c - diff) ** 2 for c in context_mat_wrap.base_color) / 3.0) + # ~ tint = min(1.0, spec_var / diff_var) + context_mat_wrap.specular = spec + context_mat_wrap.specular_tint = 0.0 + if "roughness" not in context_material_vars: + context_mat_wrap.roughness = 0.0 + + # FIXME, how else to use this? + if do_highlight: + if "specular" not in context_material_vars: + context_mat_wrap.specular = 1.0 + if "roughness" not in context_material_vars: + context_mat_wrap.roughness = 0.0 + else: + if "specular" not in context_material_vars: + context_mat_wrap.specular = 0.0 + if "roughness" not in context_material_vars: + context_mat_wrap.roughness = 1.0 + + if do_reflection: + if "metallic" not in context_material_vars: + context_mat_wrap.metallic = 1.0 + else: + # since we are (ab)using ambient term for metallic (which can be non-zero) + context_mat_wrap.metallic = 0.0 + + if do_transparency: + if "ior" not in context_material_vars: + context_mat_wrap.ior = 1.0 + if "alpha" not in context_material_vars: + context_mat_wrap.alpha = 1.0 + # EEVEE only + context_material.blend_method = 'BLEND' + + if do_glass: + if "ior" not in context_material_vars: + context_mat_wrap.ior = 1.5 + + # Try to find a MTL with the same name as the OBJ if no MTLs are specified. + temp_mtl = os.path.splitext((os.path.basename(filepath)))[0] + ".mtl" + if os.path.exists(os.path.join(DIR, temp_mtl)): + material_libs.add(temp_mtl) + del temp_mtl + + # Create new materials + for name in unique_materials: # .keys() + ma_name = "Default OBJ" if name is None else name.decode('utf-8', "replace") + ma = unique_materials[name] = bpy.data.materials.new(ma_name) + ma_wrap = node_shader_utils.PrincipledBSDFWrapper(ma, is_readonly=False) + nodal_material_wrap_map[ma] = ma_wrap + ma_wrap.use_nodes = True + + for libname in sorted(material_libs): + # print(libname) + mtlpath = os.path.join(DIR, libname) + if not os.path.exists(mtlpath): + print("\tMaterial not found MTL: %r" % mtlpath) + else: + # Note: with modern Principled BSDF shader, things like ambient, raytrace or fresnel are always 'ON' + # (i.e. automatically controlled by other parameters). + do_highlight = False + do_reflection = False + do_transparency = False + do_glass = False + spec_colors = [0.0, 0.0, 0.0] + + # print('\t\tloading mtl: %e' % mtlpath) + context_material = None + context_mat_wrap = None + mtl = open(mtlpath, 'rb') + for line in mtl: # .readlines(): + line = line.strip() + if not line or line.startswith(b'#'): + continue + + line_split = line.split() + line_id = line_split[0].lower() + + if line_id == b'newmtl': + # Finalize previous mat, if any. + finalize_material(context_material, context_material_vars, spec_colors, + do_highlight, do_reflection, do_transparency, do_glass) + + context_material_name = line_value(line_split) + context_material = unique_materials.get(context_material_name) + if context_material is not None: + context_mat_wrap = nodal_material_wrap_map[context_material] + context_material_vars.clear() + + spec_colors[:] = [0.0, 0.0, 0.0] + do_highlight = False + do_reflection = False + do_transparency = False + do_glass = False + + + elif context_material: + def _get_colors(line_split): + # OBJ 'allows' one or two components values, treat single component as greyscale, and two as blue = 0.0. + ln = len(line_split) + if ln == 2: + return [float_func(line_split[1])] * 3 + elif ln == 3: + return [float_func(line_split[1]), float_func(line_split[2]), 0.0] + else: + return [float_func(line_split[1]), float_func(line_split[2]), float_func(line_split[3])] + + # we need to make a material to assign properties to it. + if line_id == b'ka': + refl = sum(_get_colors(line_split)) / 3.0 + context_mat_wrap.metallic = refl + context_material_vars.add("metallic") + elif line_id == b'kd': + context_mat_wrap.base_color = _get_colors(line_split) + elif line_id == b'ks': + spec_colors[:] = _get_colors(line_split) + context_material_vars.add("specular") + elif line_id == b'ke': + # We cannot set context_material.emit right now, we need final diffuse color as well for this. + # XXX Unsupported currently + context_mat_wrap.emission_color = _get_colors(line_split) + context_mat_wrap.emission_strength = 1.0 + elif line_id == b'ns': + # XXX Totally empirical conversion, trying to adapt it + # (from 0.0 - 900.0 OBJ specular exponent range to 1.0 - 0.0 Principled BSDF range)... + val = max(0.0, min(900.0, float_func(line_split[1]))) + context_mat_wrap.roughness = 1.0 - (sqrt(val) / 30) + context_material_vars.add("roughness") + elif line_id == b'ni': # Refraction index (between 0.001 and 10). + context_mat_wrap.ior = float_func(line_split[1]) + context_material_vars.add("ior") + elif line_id == b'd': # dissolve (transparency) + context_mat_wrap.alpha = float_func(line_split[1]) + context_material_vars.add("alpha") + elif line_id == b'tr': # translucency + print("WARNING, currently unsupported 'tr' translucency option, skipped.") + elif line_id == b'tf': + # rgb, filter color, blender has no support for this. + print("WARNING, currently unsupported 'tf' filter color option, skipped.") + elif line_id == b'illum': + # Some MTL files incorrectly use a float for this value, see T60135. + illum = any_number_as_int(line_split[1]) + + # inline comments are from the spec, v4.2 + if illum == 0: + # Color on and Ambient off + print("WARNING, Principled BSDF shader does not support illumination 0 mode " + "(colors with no ambient), skipped.") + elif illum == 1: + # Color on and Ambient on + pass + elif illum == 2: + # Highlight on + do_highlight = True + elif illum == 3: + # Reflection on and Ray trace on + do_reflection = True + elif illum == 4: + # Transparency: Glass on + # Reflection: Ray trace on + do_transparency = True + do_reflection = True + do_glass = True + elif illum == 5: + # Reflection: Fresnel on and Ray trace on + do_reflection = True + elif illum == 6: + # Transparency: Refraction on + # Reflection: Fresnel off and Ray trace on + do_transparency = True + do_reflection = True + elif illum == 7: + # Transparency: Refraction on + # Reflection: Fresnel on and Ray trace on + do_transparency = True + do_reflection = True + elif illum == 8: + # Reflection on and Ray trace off + do_reflection = True + elif illum == 9: + # Transparency: Glass on + # Reflection: Ray trace off + do_transparency = True + do_reflection = False + do_glass = True + elif illum == 10: + # Casts shadows onto invisible surfaces + print("WARNING, Principled BSDF shader does not support illumination 10 mode " + "(cast shadows on invisible surfaces), skipped.") + pass + + elif line_id == b'map_ka': + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'Ka') + elif line_id == b'map_ks': + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'Ks') + elif line_id == b'map_kd': + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'Kd') + elif line_id == b'map_ke': + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'Ke') + elif line_id in {b'map_bump', b'bump'}: # 'bump' is incorrect but some files use it. + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'Bump') + elif line_id in {b'map_d', b'map_tr'}: # Alpha map - Dissolve + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'D') + + elif line_id in {b'map_disp', b'disp'}: # displacementmap + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'disp') + + elif line_id in {b'map_refl', b'refl'}: # reflectionmap + img_data = line.split()[1:] + if img_data: + load_material_image(context_material, context_mat_wrap, + context_material_name, img_data, line, 'refl') + else: + print("WARNING: %r:%r (ignored)" % (filepath, line)) + + # Finalize last mat, if any. + finalize_material(context_material, context_material_vars, spec_colors, + do_highlight, do_reflection, do_transparency, do_glass) + mtl.close() + + +def face_is_edge(face): + """Simple check to test whether given (temp, working) data is an edge, and not a real face.""" + face_vert_loc_indices = face[0] + face_vert_nor_indices = face[1] + return len(face_vert_nor_indices) == 1 or len(face_vert_loc_indices) == 2 + + +def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP): + """ + Takes vert_loc and faces, and separates into multiple sets of + (verts_loc, faces, unique_materials, dataname) + """ + + filename = os.path.splitext((os.path.basename(filepath)))[0] + + if not SPLIT_OB_OR_GROUP or not faces: + use_verts_nor = any(f[1] for f in faces) + use_verts_tex = any(f[2] for f in faces) + # use the filename for the object name since we aren't chopping up the mesh. + return [(verts_loc, faces, unique_materials, filename, use_verts_nor, use_verts_tex)] + + def key_to_name(key): + # if the key is a tuple, join it to make a string + if not key: + return filename # assume its a string. make sure this is true if the splitting code is changed + elif isinstance(key, bytes): + return key.decode('utf-8', 'replace') + else: + return "_".join(k.decode('utf-8', 'replace') for k in key) + + # Return a key that makes the faces unique. + face_split_dict = {} + + oldkey = -1 # initialize to a value that will never match the key + + for face in faces: + (face_vert_loc_indices, + face_vert_nor_indices, + face_vert_tex_indices, + context_material, + _context_smooth_group, + context_object_key, + _face_invalid_blenpoly, + ) = face + key = context_object_key + + if oldkey != key: + # Check the key has changed. + (verts_split, faces_split, unique_materials_split, vert_remap, + use_verts_nor, use_verts_tex) = face_split_dict.setdefault(key, ([], [], {}, {}, [], [])) + oldkey = key + + if not face_is_edge(face): + if not use_verts_nor and face_vert_nor_indices: + use_verts_nor.append(True) + + if not use_verts_tex and face_vert_tex_indices: + use_verts_tex.append(True) + + # Remap verts to new vert list and add where needed + for loop_idx, vert_idx in enumerate(face_vert_loc_indices): + map_index = vert_remap.get(vert_idx) + if map_index is None: + map_index = len(verts_split) + vert_remap[vert_idx] = map_index # set the new remapped index so we only add once and can reference next time. + verts_split.append(verts_loc[vert_idx]) # add the vert to the local verts + + face_vert_loc_indices[loop_idx] = map_index # remap to the local index + + if context_material not in unique_materials_split: + unique_materials_split[context_material] = unique_materials[context_material] + + faces_split.append(face) + + # remove one of the items and reorder + return [(verts_split, faces_split, unique_materials_split, key_to_name(key), bool(use_vnor), bool(use_vtex)) + for key, (verts_split, faces_split, unique_materials_split, _, use_vnor, use_vtex) + in face_split_dict.items()] + + +def create_mesh(new_objects, + use_edges, + verts_loc, + verts_nor, + verts_tex, + faces, + unique_materials, + unique_smooth_groups, + vertex_groups, + dataname, + ): + """ + Takes all the data gathered and generates a mesh, adding the new object to new_objects + deals with ngons, sharp edges and assigning materials + """ + + if unique_smooth_groups: + sharp_edges = set() + smooth_group_users = {context_smooth_group: {} for context_smooth_group in unique_smooth_groups.keys()} + context_smooth_group_old = -1 + + fgon_edges = set() # Used for storing fgon keys when we need to tessellate/untessellate them (ngons with hole). + edges = [] + tot_loops = 0 + + context_object_key = None + + # reverse loop through face indices + for f_idx in range(len(faces) - 1, -1, -1): + face = faces[f_idx] + + (face_vert_loc_indices, + face_vert_nor_indices, + face_vert_tex_indices, + context_material, + context_smooth_group, + context_object_key, + face_invalid_blenpoly, + ) = face + + len_face_vert_loc_indices = len(face_vert_loc_indices) + + if len_face_vert_loc_indices == 1: + faces.pop(f_idx) # cant add single vert faces + + # Face with a single item in face_vert_nor_indices is actually a polyline! + elif face_is_edge(face): + if use_edges: + edges.extend((face_vert_loc_indices[i], face_vert_loc_indices[i + 1]) + for i in range(len_face_vert_loc_indices - 1)) + faces.pop(f_idx) + + else: + # Smooth Group + if unique_smooth_groups and context_smooth_group: + # Is a part of of a smooth group and is a face + if context_smooth_group_old is not context_smooth_group: + edge_dict = smooth_group_users[context_smooth_group] + context_smooth_group_old = context_smooth_group + + prev_vidx = face_vert_loc_indices[-1] + for vidx in face_vert_loc_indices: + edge_key = (prev_vidx, vidx) if (prev_vidx < vidx) else (vidx, prev_vidx) + prev_vidx = vidx + edge_dict[edge_key] = edge_dict.get(edge_key, 0) + 1 + + # NGons into triangles + if face_invalid_blenpoly: + # ignore triangles with invalid indices + if len(face_vert_loc_indices) > 3: + from bpy_extras.mesh_utils import ngon_tessellate + ngon_face_indices = ngon_tessellate(verts_loc, face_vert_loc_indices, debug_print=bpy.app.debug) + faces.extend([([face_vert_loc_indices[ngon[0]], + face_vert_loc_indices[ngon[1]], + face_vert_loc_indices[ngon[2]], + ], + [face_vert_nor_indices[ngon[0]], + face_vert_nor_indices[ngon[1]], + face_vert_nor_indices[ngon[2]], + ] if face_vert_nor_indices else [], + [face_vert_tex_indices[ngon[0]], + face_vert_tex_indices[ngon[1]], + face_vert_tex_indices[ngon[2]], + ] if face_vert_tex_indices else [], + context_material, + context_smooth_group, + context_object_key, + [], + ) + for ngon in ngon_face_indices] + ) + tot_loops += 3 * len(ngon_face_indices) + + # edges to make ngons + if len(ngon_face_indices) > 1: + edge_users = set() + for ngon in ngon_face_indices: + prev_vidx = face_vert_loc_indices[ngon[-1]] + for ngidx in ngon: + vidx = face_vert_loc_indices[ngidx] + if vidx == prev_vidx: + continue # broken OBJ... Just skip. + edge_key = (prev_vidx, vidx) if (prev_vidx < vidx) else (vidx, prev_vidx) + prev_vidx = vidx + if edge_key in edge_users: + fgon_edges.add(edge_key) + else: + edge_users.add(edge_key) + + faces.pop(f_idx) + else: + tot_loops += len_face_vert_loc_indices + + # Build sharp edges + if unique_smooth_groups: + for edge_dict in smooth_group_users.values(): + for key, users in edge_dict.items(): + if users == 1: # This edge is on the boundary of a group + sharp_edges.add(key) + + # map the material names to an index + material_mapping = {name: i for i, name in enumerate(unique_materials)} # enumerate over unique_materials keys() + + materials = [None] * len(unique_materials) + + for name, index in material_mapping.items(): + materials[index] = unique_materials[name] + + me = bpy.data.meshes.new(dataname) + + # make sure the list isnt too big + for material in materials: + me.materials.append(material) + + me.vertices.add(len(verts_loc)) + me.loops.add(tot_loops) + me.polygons.add(len(faces)) + + # verts_loc is a list of (x, y, z) tuples + me.vertices.foreach_set("co", unpack_list(verts_loc)) + + loops_vert_idx = tuple(vidx for (face_vert_loc_indices, _, _, _, _, _, _) in faces for vidx in face_vert_loc_indices) + faces_loop_start = [] + lidx = 0 + for f in faces: + face_vert_loc_indices = f[0] + nbr_vidx = len(face_vert_loc_indices) + faces_loop_start.append(lidx) + lidx += nbr_vidx + faces_loop_total = tuple(len(face_vert_loc_indices) for (face_vert_loc_indices, _, _, _, _, _, _) in faces) + + me.loops.foreach_set("vertex_index", loops_vert_idx) + me.polygons.foreach_set("loop_start", faces_loop_start) + me.polygons.foreach_set("loop_total", faces_loop_total) + + faces_ma_index = tuple(material_mapping[context_material] for (_, _, _, context_material, _, _, _) in faces) + me.polygons.foreach_set("material_index", faces_ma_index) + + faces_use_smooth = tuple(bool(context_smooth_group) for (_, _, _, _, context_smooth_group, _, _) in faces) + me.polygons.foreach_set("use_smooth", faces_use_smooth) + + if verts_nor and me.loops: + # Note: we store 'temp' normals in loops, since validate() may alter final mesh, + # we can only set custom lnors *after* calling it. + me.create_normals_split() + loops_nor = tuple(no for (_, face_vert_nor_indices, _, _, _, _, _) in faces + for face_noidx in face_vert_nor_indices + for no in verts_nor[face_noidx]) + me.loops.foreach_set("normal", loops_nor) + + if verts_tex and me.polygons: + # Some files Do not explicitely write the 'v' value when it's 0.0, see T68249... + verts_tex = [uv if len(uv) == 2 else uv + [0.0] for uv in verts_tex] + me.uv_layers.new(do_init=False) + loops_uv = tuple(uv for (_, _, face_vert_tex_indices, _, _, _, _) in faces + for face_uvidx in face_vert_tex_indices + for uv in verts_tex[face_uvidx]) + me.uv_layers[0].data.foreach_set("uv", loops_uv) + + use_edges = use_edges and bool(edges) + if use_edges: + me.edges.add(len(edges)) + # edges should be a list of (a, b) tuples + me.edges.foreach_set("vertices", unpack_list(edges)) + + me.validate(clean_customdata=False) # *Very* important to not remove lnors here! + me.update(calc_edges=use_edges, calc_edges_loose=use_edges) + + # Un-tessellate as much as possible, in case we had to triangulate some ngons... + if fgon_edges: + import bmesh + bm = bmesh.new() + bm.from_mesh(me) + verts = bm.verts[:] + get = bm.edges.get + edges = [get((verts[vidx1], verts[vidx2])) for vidx1, vidx2 in fgon_edges] + try: + bmesh.ops.dissolve_edges(bm, edges=edges, use_verts=False) + except: + # Possible dissolve fails for some edges, but don't fail silently in case this is a real bug. + import traceback + traceback.print_exc() + + bm.to_mesh(me) + bm.free() + + # XXX If validate changes the geometry, this is likely to be broken... + if unique_smooth_groups and sharp_edges: + for e in me.edges: + if e.key in sharp_edges: + e.use_edge_sharp = True + + if verts_nor: + clnors = array.array('f', [0.0] * (len(me.loops) * 3)) + me.loops.foreach_get("normal", clnors) + + if not unique_smooth_groups: + me.polygons.foreach_set("use_smooth", [True] * len(me.polygons)) + + me.normals_split_custom_set(tuple(zip(*(iter(clnors),) * 3))) + me.use_auto_smooth = True + + ob = bpy.data.objects.new(me.name, me) + new_objects.append(ob) + + # Create the vertex groups. No need to have the flag passed here since we test for the + # content of the vertex_groups. If the user selects to NOT have vertex groups saved then + # the following test will never run + for group_name, group_indices in vertex_groups.items(): + group = ob.vertex_groups.new(name=group_name.decode('utf-8', "replace")) + group.add(group_indices, 1.0, 'REPLACE') + + +def create_nurbs(context_nurbs, vert_loc, new_objects): + """ + Add nurbs object to blender, only support one type at the moment + """ + deg = context_nurbs.get(b'deg', (3,)) + curv_range = context_nurbs.get(b'curv_range') + curv_idx = context_nurbs.get(b'curv_idx', []) + parm_u = context_nurbs.get(b'parm_u', []) + parm_v = context_nurbs.get(b'parm_v', []) + name = context_nurbs.get(b'name', b'ObjNurb') + cstype = context_nurbs.get(b'cstype') + + if cstype is None: + print('\tWarning, cstype not found') + return + if cstype != b'bspline': + print('\tWarning, cstype is not supported (only bspline)') + return + if not curv_idx: + print('\tWarning, curv argument empty or not set') + return + if len(deg) > 1 or parm_v: + print('\tWarning, surfaces not supported') + return + + cu = bpy.data.curves.new(name.decode('utf-8', "replace"), 'CURVE') + cu.dimensions = '3D' + + nu = cu.splines.new('NURBS') + nu.points.add(len(curv_idx) - 1) # a point is added to start with + nu.points.foreach_set("co", [co_axis for vt_idx in curv_idx for co_axis in (vert_loc[vt_idx] + [1.0])]) + + nu.order_u = deg[0] + 1 + + # get for endpoint flag from the weighting + if curv_range and len(parm_u) > deg[0] + 1: + do_endpoints = True + for i in range(deg[0] + 1): + + if abs(parm_u[i] - curv_range[0]) > 0.0001: + do_endpoints = False + break + + if abs(parm_u[-(i + 1)] - curv_range[1]) > 0.0001: + do_endpoints = False + break + + else: + do_endpoints = False + + if do_endpoints: + nu.use_endpoint_u = True + + # close + ''' + do_closed = False + if len(parm_u) > deg[0]+1: + for i in xrange(deg[0]+1): + #print curv_idx[i], curv_idx[-(i+1)] + + if curv_idx[i]==curv_idx[-(i+1)]: + do_closed = True + break + + if do_closed: + nu.use_cyclic_u = True + ''' + + ob = bpy.data.objects.new(name.decode('utf-8', "replace"), cu) + + new_objects.append(ob) + + +def strip_slash(line_split): + if line_split[-1][-1] == 92: # '\' char + if len(line_split[-1]) == 1: + line_split.pop() # remove the \ item + else: + line_split[-1] = line_split[-1][:-1] # remove the \ from the end last number + return True + return False + + +def get_float_func(filepath): + """ + find the float function for this obj file + - whether to replace commas or not + """ + file = open(filepath, 'rb') + for line in file: # .readlines(): + line = line.lstrip() + if line.startswith(b'v'): # vn vt v + if b',' in line: + file.close() + return lambda f: float(f.replace(b',', b'.')) + elif b'.' in line: + file.close() + return float + + file.close() + # in case all vert values were ints + return float + + +def any_number_as_int(svalue): + if b',' in svalue: + svalue = svalue.replace(b',', b'.') + return int(float(svalue)) + + +def load(context, + filepath, + *, + global_clamp_size=0.0, + use_smooth_groups=True, + use_edges=True, + use_split_objects=True, + use_split_groups=False, + use_image_search=True, + use_groups_as_vgroups=False, + relpath=None, + global_matrix=None + ): + """ + Called by the user interface or another script. + load_obj(path) - should give acceptable results. + This function passes the file and sends the data off + to be split into objects and then converted into mesh objects + """ + def unique_name(existing_names, name_orig): + i = 0 + if name_orig is None: + name_orig = b"ObjObject" + name = name_orig + while name in existing_names: + name = b"%s.%03d" % (name_orig, i) + i += 1 + existing_names.add(name) + return name + + def handle_vec(line_start, context_multi_line, line_split, tag, data, vec, vec_len): + ret_context_multi_line = tag if strip_slash(line_split) else b'' + if line_start == tag: + vec[:] = [float_func(v) for v in line_split[1:]] + elif context_multi_line == tag: + vec += [float_func(v) for v in line_split] + if not ret_context_multi_line: + data.append(tuple(vec[:vec_len])) + return ret_context_multi_line + + def create_face(context_material, context_smooth_group, context_object_key): + face_vert_loc_indices = [] + face_vert_nor_indices = [] + face_vert_tex_indices = [] + return ( + face_vert_loc_indices, + face_vert_nor_indices, + face_vert_tex_indices, + context_material, + context_smooth_group, + context_object_key, + [], # If non-empty, that face is a Blender-invalid ngon (holes...), need a mutable object for that... + ) + + with ProgressReport(context.window_manager) as progress: + progress.enter_substeps(1, "Importing OBJ %r..." % filepath) + + if global_matrix is None: + global_matrix = mathutils.Matrix() + + if use_split_objects or use_split_groups: + use_groups_as_vgroups = False + + verts_loc = [] + verts_nor = [] + verts_tex = [] + faces = [] # tuples of the faces + material_libs = set() # filenames to material libs this OBJ uses + vertex_groups = {} # when use_groups_as_vgroups is true + + # Get the string to float conversion func for this file- is 'float' for almost all files. + float_func = get_float_func(filepath) + + # Context variables + context_material = None + context_smooth_group = None + context_object_key = None + context_object_obpart = None + context_vgroup = None + + objects_names = set() + + # Nurbs + context_nurbs = {} + nurbs = [] + context_parm = b'' # used by nurbs too but could be used elsewhere + + # Until we can use sets + use_default_material = False + unique_materials = {} + unique_smooth_groups = {} + # unique_obects= {} - no use for this variable since the objects are stored in the face. + + # when there are faces that end with \ + # it means they are multiline- + # since we use xreadline we cant skip to the next line + # so we need to know whether + context_multi_line = b'' + + # Per-face handling data. + face_vert_loc_indices = None + face_vert_nor_indices = None + face_vert_tex_indices = None + verts_loc_len = verts_nor_len = verts_tex_len = 0 + face_items_usage = set() + face_invalid_blenpoly = None + prev_vidx = None + face = None + vec = [] + + quick_vert_failures = 0 + skip_quick_vert = False + + progress.enter_substeps(3, "Parsing OBJ file...") + with open(filepath, 'rb') as f: + for line in f: + line_split = line.split() + + if not line_split: + continue + + line_start = line_split[0] # we compare with this a _lot_ + + if len(line_split) == 1 and not context_multi_line and line_start != b'end': + print("WARNING, skipping malformatted line: %s" % line.decode('UTF-8', 'replace').rstrip()) + continue + + # Handling vertex data are pretty similar, factorize that. + # Also, most OBJ files store all those on a single line, so try fast parsing for that first, + # and only fallback to full multi-line parsing when needed, this gives significant speed-up + # (~40% on affected code). + if line_start == b'v': + vdata, vdata_len, do_quick_vert = verts_loc, 3, not skip_quick_vert + elif line_start == b'vn': + vdata, vdata_len, do_quick_vert = verts_nor, 3, not skip_quick_vert + elif line_start == b'vt': + vdata, vdata_len, do_quick_vert = verts_tex, 2, not skip_quick_vert + elif context_multi_line == b'v': + vdata, vdata_len, do_quick_vert = verts_loc, 3, False + elif context_multi_line == b'vn': + vdata, vdata_len, do_quick_vert = verts_nor, 3, False + elif context_multi_line == b'vt': + vdata, vdata_len, do_quick_vert = verts_tex, 2, False + else: + vdata_len = 0 + + if vdata_len: + if do_quick_vert: + try: + vdata.append(list(map(float_func, line_split[1:vdata_len + 1]))) + except: + do_quick_vert = False + # In case we get too many failures on quick parsing, force fallback to full multi-line one. + # Exception handling can become costly... + quick_vert_failures += 1 + if quick_vert_failures > 10000: + skip_quick_vert = True + if not do_quick_vert: + context_multi_line = handle_vec(line_start, context_multi_line, line_split, + context_multi_line or line_start, + vdata, vec, vdata_len) + + elif line_start == b'f' or context_multi_line == b'f': + if not context_multi_line: + line_split = line_split[1:] + # Instantiate a face + face = create_face(context_material, context_smooth_group, context_object_key) + (face_vert_loc_indices, face_vert_nor_indices, face_vert_tex_indices, + _1, _2, _3, face_invalid_blenpoly) = face + faces.append(face) + face_items_usage.clear() + verts_loc_len = len(verts_loc) + verts_nor_len = len(verts_nor) + verts_tex_len = len(verts_tex) + if context_material is None: + use_default_material = True + # Else, use face_vert_loc_indices and face_vert_tex_indices previously defined and used the obj_face + + context_multi_line = b'f' if strip_slash(line_split) else b'' + + for v in line_split: + obj_vert = v.split(b'/') + idx = int(obj_vert[0]) # Note that we assume here we cannot get OBJ invalid 0 index... + vert_loc_index = (idx + verts_loc_len) if (idx < 1) else idx - 1 + # Add the vertex to the current group + # *warning*, this wont work for files that have groups defined around verts + if use_groups_as_vgroups and context_vgroup: + vertex_groups[context_vgroup].append(vert_loc_index) + # This a first round to quick-detect ngons that *may* use a same edge more than once. + # Potential candidate will be re-checked once we have done parsing the whole face. + if not face_invalid_blenpoly: + # If we use more than once a same vertex, invalid ngon is suspected. + if vert_loc_index in face_items_usage: + face_invalid_blenpoly.append(True) + else: + face_items_usage.add(vert_loc_index) + face_vert_loc_indices.append(vert_loc_index) + + # formatting for faces with normals and textures is + # loc_index/tex_index/nor_index + if len(obj_vert) > 1 and obj_vert[1] and obj_vert[1] != b'0': + idx = int(obj_vert[1]) + face_vert_tex_indices.append((idx + verts_tex_len) if (idx < 1) else idx - 1) + else: + face_vert_tex_indices.append(0) + + if len(obj_vert) > 2 and obj_vert[2] and obj_vert[2] != b'0': + idx = int(obj_vert[2]) + face_vert_nor_indices.append((idx + verts_nor_len) if (idx < 1) else idx - 1) + else: + face_vert_nor_indices.append(0) + + if not context_multi_line: + # Means we have finished a face, we have to do final check if ngon is suspected to be blender-invalid... + if face_invalid_blenpoly: + face_invalid_blenpoly.clear() + face_items_usage.clear() + prev_vidx = face_vert_loc_indices[-1] + for vidx in face_vert_loc_indices: + edge_key = (prev_vidx, vidx) if (prev_vidx < vidx) else (vidx, prev_vidx) + if edge_key in face_items_usage: + face_invalid_blenpoly.append(True) + break + face_items_usage.add(edge_key) + prev_vidx = vidx + + elif use_edges and (line_start == b'l' or context_multi_line == b'l'): + # very similar to the face load function above with some parts removed + if not context_multi_line: + line_split = line_split[1:] + # Instantiate a face + face = create_face(context_material, context_smooth_group, context_object_key) + face_vert_loc_indices = face[0] + # XXX A bit hackish, we use special 'value' of face_vert_nor_indices (a single True item) to tag this + # as a polyline, and not a regular face... + face[1][:] = [True] + faces.append(face) + if context_material is None: + use_default_material = True + # Else, use face_vert_loc_indices previously defined and used the obj_face + + context_multi_line = b'l' if strip_slash(line_split) else b'' + + for v in line_split: + obj_vert = v.split(b'/') + idx = int(obj_vert[0]) - 1 + face_vert_loc_indices.append((idx + len(verts_loc) + 1) if (idx < 0) else idx) + + elif line_start == b's': + if use_smooth_groups: + context_smooth_group = line_value(line_split) + if context_smooth_group == b'off': + context_smooth_group = None + elif context_smooth_group: # is not None + unique_smooth_groups[context_smooth_group] = None + + elif line_start == b'o': + if use_split_objects: + context_object_key = unique_name(objects_names, line_value(line_split)) + context_object_obpart = context_object_key + # unique_objects[context_object_key]= None + + elif line_start == b'g': + if use_split_groups: + grppart = line_value(line_split) + context_object_key = (context_object_obpart, grppart) if context_object_obpart else grppart + # print 'context_object_key', context_object_key + # unique_objects[context_object_key]= None + elif use_groups_as_vgroups: + context_vgroup = line_value(line.split()) + if context_vgroup and context_vgroup != b'(null)': + vertex_groups.setdefault(context_vgroup, []) + else: + context_vgroup = None # dont assign a vgroup + + elif line_start == b'usemtl': + context_material = line_value(line.split()) + unique_materials[context_material] = None + elif line_start == b'mtllib': # usemap or usemat + # can have multiple mtllib filenames per line, mtllib can appear more than once, + # so make sure only occurrence of material exists + material_libs |= {os.fsdecode(f) for f in filenames_group_by_ext(line.lstrip()[7:].strip(), b'.mtl') + } + + # Nurbs support + elif line_start == b'cstype': + context_nurbs[b'cstype'] = line_value(line.split()) # 'rat bspline' / 'bspline' + elif line_start == b'curv' or context_multi_line == b'curv': + curv_idx = context_nurbs[b'curv_idx'] = context_nurbs.get(b'curv_idx', []) # in case were multiline + + if not context_multi_line: + context_nurbs[b'curv_range'] = float_func(line_split[1]), float_func(line_split[2]) + line_split[0:3] = [] # remove first 3 items + + if strip_slash(line_split): + context_multi_line = b'curv' + else: + context_multi_line = b'' + + for i in line_split: + vert_loc_index = int(i) - 1 + + if vert_loc_index < 0: + vert_loc_index = len(verts_loc) + vert_loc_index + 1 + + curv_idx.append(vert_loc_index) + + elif line_start == b'parm' or context_multi_line == b'parm': + if context_multi_line: + context_multi_line = b'' + else: + context_parm = line_split[1] + line_split[0:2] = [] # remove first 2 + + if strip_slash(line_split): + context_multi_line = b'parm' + else: + context_multi_line = b'' + + if context_parm.lower() == b'u': + context_nurbs.setdefault(b'parm_u', []).extend([float_func(f) for f in line_split]) + elif context_parm.lower() == b'v': # surfaces not supported yet + context_nurbs.setdefault(b'parm_v', []).extend([float_func(f) for f in line_split]) + # else: # may want to support other parm's ? + + elif line_start == b'deg': + context_nurbs[b'deg'] = [int(i) for i in line.split()[1:]] + elif line_start == b'end': + # Add the nurbs curve + if context_object_key: + context_nurbs[b'name'] = context_object_key + nurbs.append(context_nurbs) + context_nurbs = {} + context_parm = b'' + + ''' # How to use usemap? deprecated? + elif line_start == b'usema': # usemap or usemat + context_image= line_value(line_split) + ''' + + progress.step("Done, loading materials and images...") + + if use_default_material: + unique_materials[None] = None + create_materials(filepath, relpath, material_libs, unique_materials, + use_image_search, float_func) + + progress.step("Done, building geometries (verts:%i faces:%i materials: %i smoothgroups:%i) ..." % + (len(verts_loc), len(faces), len(unique_materials), len(unique_smooth_groups))) + + # deselect all + if bpy.ops.object.select_all.poll(): + bpy.ops.object.select_all(action='DESELECT') + + new_objects = [] # put new objects here + + # Split the mesh by objects/materials, may + SPLIT_OB_OR_GROUP = bool(use_split_objects or use_split_groups) + + for data in split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP): + verts_loc_split, faces_split, unique_materials_split, dataname, use_vnor, use_vtex = data + # Create meshes from the data, warning 'vertex_groups' wont support splitting + #~ print(dataname, use_vnor, use_vtex) + create_mesh(new_objects, + use_edges, + verts_loc_split, + verts_nor if use_vnor else [], + verts_tex if use_vtex else [], + faces_split, + unique_materials_split, + unique_smooth_groups, + vertex_groups, + dataname, + ) + + # nurbs support + for context_nurbs in nurbs: + create_nurbs(context_nurbs, verts_loc, new_objects) + + view_layer = context.view_layer + collection = view_layer.active_layer_collection.collection + + # Create new obj + for obj in new_objects: + collection.objects.link(obj) + obj.select_set(True) + + # we could apply this anywhere before scaling. + obj.matrix_world = global_matrix + + view_layer.update() + + axis_min = [1000000000] * 3 + axis_max = [-1000000000] * 3 + + if global_clamp_size: + # Get all object bounds + for ob in new_objects: + for v in ob.bound_box: + for axis, value in enumerate(v): + if axis_min[axis] > value: + axis_min[axis] = value + if axis_max[axis] < value: + axis_max[axis] = value + + # Scale objects + max_axis = max(axis_max[0] - axis_min[0], axis_max[1] - axis_min[1], axis_max[2] - axis_min[2]) + scale = 1.0 + + while global_clamp_size < max_axis * scale: + scale = scale / 10.0 + + for obj in new_objects: + obj.scale = scale, scale, scale + + progress.leave_substeps("Done.") + progress.leave_substeps("Finished importing: %r" % filepath) + + return {'FINISHED'} diff --git a/samples/resources/emf/tree1.blend b/samples/resources/emf/tree1.blend new file mode 100644 index 0000000000000000000000000000000000000000..4c912f6098999d785dc8738d3b9697661fc096d5 GIT binary patch literal 680216 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 E0CAX!_W%F@ literal 0 HcmV?d00001 diff --git a/samples/resources/emf/tree1.emf b/samples/resources/emf/tree1.emf new file mode 100644 index 0000000..a4899cd --- /dev/null +++ b/samples/resources/emf/tree1.emf @@ -0,0 +1,3 @@ +EMF(STRING) +# Blender v2.92.0 EMF File: 'tree1.blend' + diff --git a/samples/resources/emf/tree1.mtl b/samples/resources/emf/tree1.mtl new file mode 100644 index 0000000..e91290f --- /dev/null +++ b/samples/resources/emf/tree1.mtl @@ -0,0 +1,2 @@ +# Blender MTL File: 'tree1.blend' +# Material Count: 0 diff --git a/samples/resources/emf/tree1.obj b/samples/resources/emf/tree1.obj new file mode 100644 index 0000000..65a5423 --- /dev/null +++ b/samples/resources/emf/tree1.obj @@ -0,0 +1,3 @@ +# Blender v2.92.0 OBJ File: 'tree1.blend' +# www.blender.org +mtllib tree1.mtl diff --git a/samples/resources/emf/tree1_base.emf b/samples/resources/emf/tree1_base.emf new file mode 100644 index 0000000..fc0965d --- /dev/null +++ b/samples/resources/emf/tree1_base.emf @@ -0,0 +1,59 @@ +EMF(STRING) +# Blender v2.79 (sub 0) EMF File: 'tree1.blend' +Mesh:Arbre_Normal_Mesh + Vertex:521 + 0.246538 0.301485 -0.016064|0.213460 0.247165 1.985610|0.378271 0.121232 -0.016064|0.316472 0.106212 2.007318|0.343963 -0.099375 -0.016064|0.289643 -0.066297 1.983936|0.163710 -0.231108 -0.016064|0.148690 -0.169308 2.139126|-0.056897 -0.196800 -0.016064|-0.023819 -0.142480 2.018460|-0.188631 -0.016547 -0.016064|-0.126831 -0.001527 2.025722|-0.154322 0.204061 -0.016064|-0.100002 0.170982 1.958771|0.025931 0.335794 -0.016064|0.030340 0.249318 2.003469|0.516562 -0.145789 3.494941|0.537350 -0.175639 3.482738|0.530688 -0.213083 3.477684|0.500478 -0.236188 3.482738|0.464417 -0.231419 3.494941|0.443629 -0.201569 3.507143|0.450291 -0.164125 3.512197|0.480501 -0.141020 3.507143|0.256755 0.090122 2.631967|0.174877 0.100034 2.738116|0.105471 0.045857 2.750797|0.089192 -0.040673 2.738116|0.135578 -0.108868 2.707499|0.217456 -0.118780 2.676882|0.286863 -0.064604 2.588668|0.303141 0.021927 2.690727|0.213460 0.247165 0.310603|0.316472 0.106212 0.310603|0.289643 -0.066297 0.310603|0.148690 -0.169308 0.310603|-0.023819 -0.142480 0.310603|-0.126831 -0.001527 0.310603|-0.100002 0.170982 0.310603|0.040951 0.273994 0.310603|0.235108 0.168644 2.345717|0.085249 0.157046 2.327315|0.002734 0.108420 2.400621|-0.018819 -0.021100 2.348543|0.055880 -0.125674 2.303871|0.183073 -0.144044 2.330409|0.288253 -0.065450 2.324068|0.309806 0.064070 2.272285|-1.187769 0.825777 2.829607|-1.183773 0.851472 2.823376|-1.162778 0.866816 2.829607|-1.152804 0.853860 2.885775|-1.168470 0.842154 2.896750|-1.171681 0.822862 2.885775|-0.634694 0.424901 2.546430|-0.622312 0.499307 2.588760|-0.561889 0.544457 2.546430|-0.696744 0.436145 2.329801|-0.600358 0.594425 2.329801|-0.681332 0.535247 2.305768|0.213460 0.247165 1.750552|0.316472 0.106212 1.752315|0.289643 -0.066297 1.751937|0.148690 -0.169308 1.637461|-0.023819 -0.142480 1.662861|-0.126831 -0.001527 1.612578|-0.100002 0.170982 1.616111|0.040951 0.273994 1.717057|0.365294 -1.019071 2.687464|0.323529 -1.044914 2.675762|0.316326 -1.061767 2.628716|0.416244 -1.050097 2.667544|0.402741 -1.093151 2.644793|0.367276 -1.092793 2.608797|0.139812 -0.579825 2.056043|0.252729 -0.597386 2.013838|0.344991 -0.529958 2.056043|0.139812 -0.579825 2.207653|0.344991 -0.529958 2.207653|0.252729 -0.597386 2.325249|1.077229 0.200520 3.088413|1.085695 0.181188 3.072207|1.082543 0.185746 3.093437|1.089563 0.239341 3.043863|1.101540 0.206698 3.025691|1.105777 0.228978 3.029366|0.703828 0.139111 2.441713|0.657137 0.204475 2.487612|0.690356 0.058155 2.474080|0.670668 0.155395 2.713742|0.699662 0.112769 2.737694|0.689487 0.058684 2.686678|-0.796344 0.608554 2.686900|-0.750183 0.643048 2.654561|-0.779572 0.681222 2.489063|-0.841434 0.636012 2.470703|-0.805804 0.551710 2.654561|-0.853208 0.560300 2.489063|-0.487274 0.314267 2.481901|-0.562836 0.327960 2.228120|-0.433846 0.381522 2.533449|-0.405278 0.451048 2.482012|-0.448580 0.513453 2.228009|-0.544068 0.448643 2.198854|-0.668726 0.134407 3.112195|-0.671693 0.142475 3.131027|-0.655978 0.155340 3.135035|-0.627373 0.117899 3.097990|-0.621808 0.122135 3.120922|-0.613086 0.141869 3.124030|-0.442862 0.232210 2.745912|-0.428586 0.243078 2.804745|-0.406210 0.293707 2.812716|-0.548955 0.274561 2.782356|-0.556568 0.295261 2.830668|-0.516251 0.328266 2.840951|0.280962 0.097582 1.030452|0.258432 -0.047290 1.030452|0.140060 -0.133799 1.003378|-0.004813 -0.111269 1.030452|-0.091322 0.007103 1.030452|-0.068791 0.151976 1.015318|0.049581 0.238485 1.030452|0.194454 0.215954 1.030452|0.264320 0.010347 2.792065|0.471779 -0.351961 3.013625|-0.025721 -0.342832 3.183122|-0.033127 0.201970 3.189101|0.431264 0.391481 3.092571|0.767166 -0.000299 3.133187|0.328508 -0.502918 3.533632|-0.092513 -0.079847 3.635244|0.113459 0.408708 3.643319|0.607710 0.291512 3.643319|0.811523 -0.315607 3.517017|0.338151 -0.044740 3.902288|0.048662 -0.222849 2.910902|0.344192 -0.160816 2.825425|0.200310 -0.486737 3.051492|0.635400 -0.099372 2.901178|0.552357 0.015392 2.829535|0.070087 0.166399 2.837127|-0.101625 -0.072951 3.142112|0.366839 0.224570 2.799966|0.173118 0.375961 3.055419|0.647258 0.240885 3.070669|0.731388 -0.453486 3.277112|0.817680 -0.172792 3.374303|0.087948 -0.457647 3.418030|0.462479 -0.564869 3.320618|-0.131909 0.066722 3.419194|-0.107652 -0.230863 3.419194|0.251209 0.482579 3.423496|0.022110 0.322918 3.419370|0.782688 0.142569 3.419370|0.541724 0.413691 3.423495|0.674471 -0.500883 3.471836|0.027153 -0.312605 3.672385|-0.014104 0.170187 3.673351|0.326786 0.454898 3.687902|0.749580 -0.011678 3.669796|0.346956 -0.318834 3.754359|0.630349 -0.208434 3.745193|0.085015 -0.065376 3.830142|0.191816 0.235194 3.836866|0.482328 0.166308 3.836866|0.299314 -0.424196 2.128791|0.603007 -0.974057 2.205589|0.154635 -1.056471 2.466020|0.289116 -0.705708 2.860710|0.773824 -0.552532 2.810841|0.999266 -0.869166 2.468948|0.482295 -1.412185 2.492228|0.157751 -1.261216 2.852662|0.434111 -0.957067 3.070162|0.913054 -0.993652 2.933718|0.980705 -1.251902 2.496691|0.622976 -1.360085 2.876495|0.163815 -0.732920 2.264517|0.384495 -0.604157 2.076608|0.320506 -1.071825 2.218277|0.802733 -0.732113 2.254484|0.677093 -0.545980 2.215952|0.235744 -0.395557 2.430266|0.147248 -0.842901 2.652065|0.524313 -0.351641 2.358857|0.518023 -0.510784 2.843756|0.939929 -0.654001 2.632163|0.843873 -1.187322 2.269598|1.021707 -1.108509 2.489450|0.258906 -1.318719 2.506496|0.565707 -1.286051 2.284506|0.182548 -0.958900 2.937081|0.128843 -1.154825 2.718279|0.583027 -0.749636 2.985415|0.388701 -0.808427 3.063720|1.075836 -0.929191 2.748849|0.870001 -0.811956 2.911383|0.789090 -1.323155 2.386606|0.225317 -1.438730 2.694845|0.310430 -1.125267 3.053535|0.604520 -0.996113 2.973825|1.024185 -1.141069 2.805734|0.558190 -1.431922 2.670894|0.870302 -1.290148 2.731847|0.318730 -1.399556 2.824529|0.508428 -1.183706 3.045892|0.800149 -1.161705 2.997416|0.789090 -1.323155 2.386606|1.284389 -0.012646 2.638858|1.146375 0.059148 3.059638|0.842540 0.099056 2.793797|1.055124 0.393536 2.571956|1.383057 0.513485 2.767193|1.350433 0.379877 3.148603|0.774769 0.263284 3.134810|0.657404 0.389583 2.776249|0.937133 0.611125 2.703492|1.160799 0.684787 3.015754|1.104828 0.425268 3.316426|0.811416 0.575576 3.060511|1.054100 -0.025744 2.669995|1.241429 -0.042092 2.783383|0.951262 -0.017888 2.961908|1.379882 0.139976 3.027335|1.429411 0.073334 2.856072|1.251250 0.118084 2.497720|0.938957 0.209146 2.628405|1.433297 0.145475 2.643963|1.283438 0.444341 2.602265|1.427505 0.454939 2.960646|1.115966 0.214043 3.285760|1.212289 0.422244 3.270381|0.724683 0.188009 2.967711|0.923367 0.136560 3.183363|0.839303 0.431405 2.615067|0.729792 0.276823 2.752173|1.146310 0.585948 2.707525|1.007190 0.578311 2.609368|1.305477 0.606699 3.128630|1.254561 0.638899 2.911837|0.989254 0.288222 3.285876|0.606205 0.317941 2.948459|0.779666 0.570996 2.725922|1.008472 0.606207 2.842522|1.143558 0.646475 3.186607|0.770011 0.415842 3.127167|0.992637 0.554334 3.202176|0.653200 0.437398 2.936933|0.838091 0.639135 2.860547|0.995743 0.704402 3.018124|-0.790196 0.398157 2.643519|-1.037477 0.321861 3.035126|-1.363841 0.217682 2.631505|-1.161449 0.634725 2.345126|-0.836408 0.909095 2.627900|-0.898823 0.759874 3.119641|-1.592517 0.412604 3.060082|-1.668778 0.625986 2.498816|-1.412543 1.083635 2.422415|-1.275629 1.184371 2.901265|-1.321103 0.746913 3.370275|-1.650008 0.936522 2.877237|-1.059812 0.197820 2.596799|-0.855196 0.315216 2.803784|-1.225066 0.126912 2.879753|-0.788671 0.514000 3.028630|-0.714406 0.532452 2.889722|-0.839336 0.465853 2.404539|-1.252826 0.373737 2.422695|-0.676670 0.605678 2.620908|-0.905553 0.778480 2.412448|-0.796796 0.865909 2.885540|-1.191947 0.500931 3.341946|-1.143858 0.783431 3.283074|-1.565362 0.294806 2.817853|-1.379179 0.319842 3.177423|-1.444641 0.611775 2.361501|-1.550551 0.393457 2.535470|-1.147442 1.079953 2.472031|-1.289508 0.867293 2.359835|-1.080322 1.022721 3.096780|-1.067540 1.139320 2.753519|-1.401096 0.534674 3.343818|-1.747045 0.513464 2.725068|-1.576738 0.867421 2.441342|-1.354285 1.224256 2.585084|-1.363989 1.021054 3.181231|-1.670238 0.665724 3.008446|-1.527017 0.857802 3.190746|-1.723253 0.795093 2.665546|-1.585365 1.072877 2.602395|-1.493914 1.129079 2.883368|0.128183 0.129736 2.524099|-0.470854 0.188332 2.704556|-0.385809 -0.101781 2.944481|-0.849071 -0.085453 2.893439|-0.734795 0.317064 2.919045|-0.282121 0.478355 2.786447|-0.075496 0.213163 2.796682|-0.599478 -0.224615 3.281540|-0.935944 0.229651 3.144623|-0.553234 0.552373 3.186814|-0.234930 0.393433 3.217364|-0.238875 0.004006 3.265942|-0.517963 0.132396 3.465116|-0.679416 0.046715 2.786691|-0.414217 0.017749 2.775462|-0.608142 -0.124002 2.901025|-0.212727 0.032623 2.868351|-0.214774 0.202713 2.667214|-0.664737 0.256086 2.770657|-0.912907 0.118443 2.853068|-0.334500 0.357152 2.662121|-0.467270 0.431584 2.825039|-0.118715 0.382237 2.714626|-0.278223 -0.092923 3.106548|-0.125995 0.107119 3.053353|-0.771756 -0.178297 3.065518|-0.488677 -0.198148 3.106825|-0.881069 0.309397 3.012617|-0.987902 0.000214 3.007051|-0.397570 0.528825 3.008792|-0.627970 0.493321 3.040121|-0.074436 0.323254 2.966551|-0.204556 0.481842 2.965680|-0.394283 -0.172776 3.314178|-0.843733 -0.081128 3.233177|-0.714928 0.454903 3.196901|-0.402956 0.512453 3.231387|-0.190776 0.199158 3.268216|-0.576782 -0.112372 3.423059|-0.351556 0.008726 3.428032|-0.740793 0.225573 3.344746|-0.580659 0.462026 3.341442|-0.373487 0.307326 3.396943|0.213460 0.247165 1.936648|0.316472 0.106212 1.953634|0.289643 -0.066297 1.935102|-0.023819 -0.142480 1.944338|-0.126831 -0.001527 2.002693|-0.100002 0.170982 1.883967|0.032574 0.254513 1.946651|0.376021 -1.025602 2.683270|0.340205 -1.055069 2.669242|0.327052 -1.068299 2.624523|0.139812 -0.579825 2.175735|0.344991 -0.529958 2.175735|-0.955184 -0.434089 2.090201|-0.986123 -0.419535 2.079719|-0.993419 -0.392141 2.060282|-0.934384 -0.399934 2.128551|-0.957296 -0.372197 2.132869|-0.973626 -0.359638 2.096776|-0.440100 -0.220947 1.946293|-0.501936 -0.164883 1.849730|-0.441306 -0.336215 1.938212|-0.647422 -0.212673 1.796633|-0.651991 -0.290550 1.868960|-0.594190 -0.386435 1.882415|-0.736039 0.035791 2.215356|-0.554072 -0.095161 1.901188|-0.795291 0.285792 1.782145|-1.052161 0.078836 2.040837|-0.887093 -0.232163 2.393744|-0.577271 -0.327891 2.304460|-0.694346 -0.097470 1.507908|-1.173046 0.123227 1.753778|-1.231567 -0.278616 2.049572|-0.950945 -0.499436 2.047887|-0.671831 -0.424038 1.782484|-0.990287 -0.360296 1.613466|-0.768011 0.184159 1.997952|-0.600413 -0.005081 2.083944|-0.640013 0.106593 1.840167|-0.537631 -0.217983 2.097306|-0.597199 -0.142352 2.342504|-0.914986 0.128072 2.137815|-0.971219 0.305617 1.908378|-0.777616 -0.087577 2.394087|-0.963734 -0.100748 2.272034|-0.700598 -0.290367 2.447879|-0.561477 -0.275136 1.827205|-0.614683 -0.412445 2.037764|-0.744435 0.149499 1.630332|-0.593084 -0.086669 1.689930|-1.157725 0.138020 1.916082|-0.975619 0.303315 1.700320|-1.066859 -0.287311 2.220666|-1.173663 -0.119853 2.094663|-0.721873 -0.456999 2.246169|-0.912524 -0.397809 2.293406|-0.636381 -0.287404 1.588049|-0.917274 0.081039 1.539934|-1.246636 -0.135307 1.927169|-1.136791 -0.409677 2.047513|-0.796636 -0.512819 1.912655|-0.818925 -0.227074 1.479203|-0.793491 -0.434064 1.627272|-1.137465 -0.142888 1.675886|-1.232219 -0.324996 1.874436|-1.023014 -0.476358 1.817377|0.641076 0.895965 2.456116|0.663840 0.864815 2.460914|0.600608 0.896440 2.460063|0.645860 0.878612 2.535696|0.612742 0.876049 2.531630|0.662367 0.855502 2.519468|0.412244 0.474817 2.306918|0.461848 0.405374 2.258155|0.312730 0.467116 2.294698|0.466274 0.433359 2.082204|0.276267 0.528389 2.079647|0.397869 0.526959 2.067788|0.103509 0.789991 2.500947|0.395445 1.128664 2.464463|0.561348 0.775633 2.352992|0.468389 0.596289 2.727583|0.340998 0.868864 2.991250|0.431136 1.233593 2.838813|0.817814 1.049678 2.436532|0.849496 0.658551 2.502163|0.718496 0.650643 2.841868|0.689944 1.005201 3.004449|0.705577 1.304352 2.737708|0.923438 0.948624 2.724667|0.288208 0.746031 2.366307|0.172525 0.915293 2.444946|0.474764 0.984517 2.301721|0.242581 1.163150 2.658229|0.109761 1.028354 2.637876|0.147325 0.629001 2.602293|0.484529 0.636974 2.506755|0.069703 0.821186 2.713281|0.326041 0.691829 2.889561|0.343628 1.072412 2.953988|0.577723 1.308702 2.566491|0.603700 1.296661 2.794620|0.760116 0.887577 2.355964|0.653212 1.161070 2.404970|0.672085 0.561138 2.643062|0.726459 0.675278 2.446333|0.542980 0.725959 2.930902|0.613871 0.589964 2.856556|0.575833 1.168708 3.008284|0.556605 0.944894 3.021164|0.715183 1.257266 2.562313|0.912977 0.812942 2.404472|0.829186 0.625989 2.723339|0.708570 0.804569 2.867384|0.743436 1.164729 2.953015|0.897181 1.019741 2.563653|0.819903 1.143030 2.794297|0.933423 0.800816 2.531147|0.865347 0.761423 2.804151|0.830248 0.950999 2.933661|0.051947 0.078451 2.568364|0.032921 -0.030476 2.535158|0.094057 -0.117623 2.557886|0.199543 -0.131942 2.496378|0.287587 -0.065045 2.450818|0.245477 0.131030 2.482838|1.093950 0.194478 3.047974|1.094648 0.208269 3.060057|1.083655 0.220745 3.065204|0.663619 0.180964 2.595934|0.689939 0.058408 2.575920|-0.432592 -0.961584 2.727655|-0.403451 -1.002379 2.710229|-0.353833 -1.009545 2.720582|-0.412408 -0.965242 2.800455|-0.388558 -0.999238 2.809321|-0.347407 -1.004824 2.785327|-0.073932 -0.568383 2.528577|-0.147250 -0.558431 2.571328|-0.189743 -0.497859 2.555531|-0.085380 -0.576795 2.413220|-0.225705 -0.491342 2.425824|-0.173786 -0.564026 2.394775|-0.040381 -0.962749 2.576286|-0.378644 -0.776901 2.575463|-0.158121 -0.677132 2.974084|-0.084073 -1.085604 2.915756|-0.081054 -1.297921 2.464732|-0.257207 -1.097709 2.259768|-0.633174 -0.709633 2.899564|-0.234762 -1.023064 3.184770|-0.301442 -1.419938 2.884037|-0.499815 -1.349069 2.595699|-0.674121 -0.997555 2.586563|-0.699118 -1.112519 2.933266|-0.083072 -0.807854 2.787200|-0.181119 -0.835326 2.540364|-0.266762 -0.695614 2.756264|-0.330535 -0.919008 2.398520|-0.097618 -1.021488 2.330417|-0.002696 -1.002388 2.784994|-0.029655 -0.842670 3.032156|0.003995 -1.138459 2.449598|-0.062182 -1.224670 2.644274|-0.112305 -1.223526 2.278755|-0.555250 -0.853840 2.546999|-0.496706 -1.059200 2.404103|-0.367155 -0.655161 2.968537|-0.514039 -0.709716 2.728364|-0.113585 -1.072732 3.086559|-0.175617 -0.758766 3.154501|-0.213178 -1.382082 2.666656|-0.167474 -1.307495 2.885001|-0.366485 -1.248328 2.339446|-0.263260 -1.368097 2.470146|-0.719218 -0.811871 2.732228|-0.452032 -0.777187 3.112195|-0.284020 -1.296414 3.026112|-0.409070 -1.427742 2.763542|-0.626769 -1.191174 2.560630|-0.725206 -0.859057 2.947976|-0.770945 -1.022706 2.756813|-0.480971 -1.117579 3.092043|-0.455922 -1.372642 2.966032|-0.633408 -1.288525 2.788957| + Normal(face):1004 + 0.807370 0.590045 0.000000|0.988122 -0.153672 0.000000|0.938774 -0.124698 -0.321177|-0.329108 -0.755852 -0.566017|-0.807370 -0.590045 0.000000|-0.988122 0.153672 0.000000|0.319463 0.934132 0.159186|0.040584 0.999176 -0.000000|-0.533073 0.846069 0.000000|0.000000 -0.000000 -1.000000|0.294007 -0.179039 0.938885|-0.500478 0.749252 0.433754|-0.894762 0.104706 0.434094|-0.757568 -0.614343 0.220622|-0.152603 -0.984231 -0.089450|0.545734 -0.780341 -0.305356|0.963140 0.108918 -0.245963|0.800040 0.593374 -0.088567|0.080156 0.962801 0.258047|-0.453937 0.863724 0.218911|-0.944263 0.133540 0.300891|-0.825734 -0.526462 0.202489|-0.089188 -0.992564 0.082838|0.612786 -0.790242 -0.003188|0.796596 -0.334009 -0.503857|0.528453 0.707248 -0.469614|0.794618 0.580726 0.177029|0.972515 -0.151245 0.177029|0.580726 -0.794618 0.177029|-0.151245 -0.972515 0.177030|-0.794618 -0.580726 0.177030|-0.972515 0.151245 0.177029|0.151245 0.972515 0.177029|-0.580726 0.794618 0.177030|-0.073170 -0.459246 0.885291|0.528920 0.083923 0.844512|0.158517 -0.508032 0.846626|-0.749776 -0.626513 0.212879|-0.235672 -0.964071 0.122577|0.598513 -0.801111 -0.001774|0.986711 -0.162425 0.004437|0.088522 -0.529291 0.843810|-0.619217 0.733890 0.279241|-0.976891 0.043515 0.209263|-0.544592 -0.831074 0.112853|0.508632 0.854341 0.106743|-0.285501 0.669247 -0.686002|-0.731981 -0.050930 -0.679419|0.835798 -0.424264 0.348485|0.553282 -0.832764 0.019576|-0.564827 -0.815816 0.124157|0.539022 0.836657 0.097265|-0.184597 0.616347 -0.765532|-0.644753 -0.083974 -0.759764|0.806484 0.589398 -0.046833|0.987042 -0.153504 -0.046743|0.597084 -0.800430 -0.052951|-0.163111 -0.985186 -0.052951|-0.806016 -0.589055 -0.057899|-0.987444 0.147720 -0.055971|0.153487 0.986929 -0.049112|-0.584446 0.809500 -0.055971|0.050872 -0.479032 0.876322|-0.377002 -0.852124 0.362980|-0.585747 -0.658570 -0.472426|0.998046 0.062482 0.000000|-0.986416 -0.029486 0.161597|0.356893 0.661677 0.659402|0.616205 -0.430247 -0.659681|-0.209371 -0.695904 -0.686936|-0.936592 -0.350422 -0.000000|0.992950 0.118531 0.000000|-0.705151 0.131557 0.696746|0.514103 0.421740 0.746882|0.953355 -0.224766 0.201481|0.705348 0.442122 0.554087|-0.331591 0.917650 0.219011|-0.674332 -0.044494 0.737087|-0.007663 -0.977916 0.208857|0.555388 -0.794252 -0.246389|0.425347 -0.396124 -0.813736|0.191349 0.651925 -0.733744|-0.186540 0.943758 0.272992|-0.244093 0.532382 0.810548|0.073328 -0.691581 0.718567|0.292313 -0.956316 0.003575|0.528921 0.083924 0.844512|0.158516 -0.508034 0.846625|0.508632 0.854342 0.106741|-0.285501 0.669246 -0.686002|-0.731980 -0.050924 -0.679420|0.480671 0.385273 0.787731|-0.002636 -0.372681 0.927956|-0.556193 -0.819785 0.136390|0.536917 0.835919 0.113839|-0.065578 0.574605 -0.815799|-0.529664 -0.121208 -0.839502|0.047193 -0.349203 0.935858|-0.287291 -0.927040 0.240957|-0.462721 -0.742916 -0.483700|-0.942384 0.226983 -0.245747|-0.647922 0.749978 0.133153|0.375783 0.709731 0.595877|0.906678 -0.368352 -0.205553|0.844780 -0.454018 -0.283222|-0.646413 -0.727846 -0.228889|-0.947403 -0.319807 -0.012273|-0.164530 0.782812 0.600113|0.366510 0.839768 0.400575|0.806484 0.589397 0.046849|0.987037 -0.153503 0.046849|0.589346 -0.806413 0.048675|-0.153490 -0.986951 0.048675|-0.806484 -0.589397 0.046849|-0.986990 0.153496 0.047853|0.153503 0.987037 0.046849|-0.589370 0.806445 0.047853|0.366999 -0.068871 0.927669|-0.131484 0.916289 0.378320|0.136230 0.986699 0.088693|-0.590046 0.807370 0.000000|0.050888 -0.479045 0.876314|-0.376999 -0.852125 0.362980|-0.584958 -0.644468 -0.492427|0.990747 0.135720 0.000000|-0.481170 -0.508639 0.713976|-0.900399 0.065361 0.430128|-0.208893 -0.658893 -0.722651|-0.127223 -0.743387 -0.656651|-0.339985 0.936218 0.088914|0.384688 -0.783031 0.488751|0.017899 -0.070105 0.997379|-0.510140 0.560687 0.652217|-0.359268 0.074923 -0.930222|-0.281498 -0.297703 -0.912213|-0.641221 0.767357 0.000000|0.349910 -0.928689 -0.122884|-0.101857 0.970669 0.217778|0.793491 0.597616 0.115012|0.920907 -0.387873 -0.038526|-0.844243 0.460431 0.274331|-0.056525 0.741192 -0.668909|0.616200 0.340992 -0.709945|-0.134697 0.200889 0.970309|0.528688 -0.201379 0.824582|0.912012 -0.408012 -0.041953|-0.755394 0.585204 0.294817|-0.087625 0.333453 -0.938686|0.305692 0.077250 -0.948992|-0.355966 0.911911 0.204223|-0.952904 0.077024 0.293329|0.201954 0.377391 0.903765|0.513536 0.172675 0.840514|0.604375 -0.796697 -0.001883|0.739593 0.402254 0.539623|-0.354428 0.909187 0.218540|0.514891 -0.813396 -0.270694|-0.172046 0.946598 0.272675|0.291994 -0.956414 0.003574|-0.762387 -0.621540 0.180149|-0.107073 -0.993113 0.047568|0.835065 -0.548478 -0.042875|-0.815577 0.520753 0.252288|0.076875 -0.608603 -0.789742|-0.669671 -0.169480 -0.723061|-0.179845 0.128192 0.975306|0.466830 -0.229510 0.854046|0.845031 -0.532820 -0.045006|-0.866853 0.424380 0.261662|0.157370 -0.278905 -0.947336|-0.455393 0.054312 -0.888632|0.643796 -0.544214 -0.537920|0.585384 -0.564057 -0.582379|0.200562 0.954759 0.219566|0.020657 0.995560 0.091840|-0.528503 0.847038 0.056669|0.294026 -0.179038 0.938879|0.294008 -0.179041 0.938884|0.294010 -0.179038 0.938884|0.294014 -0.179052 0.938880|0.294012 -0.179042 0.938883|-0.503692 0.746898 0.434094|-0.895379 0.100770 0.433754|-0.756107 -0.616427 0.219817|-0.159566 -0.983326 -0.087223|0.375797 -0.891778 -0.252008|0.942357 -0.125819 -0.310053|0.868527 0.478074 -0.130788|0.227593 0.970042 0.084969|-0.552029 0.777643 0.300891|-0.959038 0.085153 0.270177|-0.747578 -0.617877 0.243629|-0.087495 -0.992860 0.081080|0.606863 -0.794786 0.005731|0.828262 -0.065746 -0.556470|0.310515 0.902659 -0.297972|0.972515 -0.151245 0.177030|0.580726 -0.794618 0.177030|-0.151245 -0.972515 0.177029|-0.972515 0.151245 0.177030|-0.580726 0.794618 0.177029|-0.073165 -0.459248 0.885290|0.158519 -0.508029 0.846627|-0.775400 -0.579594 0.250652|-0.173647 -0.971795 0.159565|0.593213 -0.805033 0.004428|0.988113 -0.153726 0.000406|0.088528 -0.529293 0.843808|-0.487015 0.847954 0.209262|-0.936228 0.213314 0.279239|-0.544592 -0.831074 0.112852|-0.285496 0.669250 -0.686000|0.835799 -0.424262 0.348485|0.553280 -0.832765 0.019574|-0.562279 -0.818402 0.118577|0.527347 0.841575 0.116860|-0.214967 0.605370 -0.766366|-0.644753 -0.083973 -0.759764|0.806767 0.589020 -0.046728|0.987058 -0.153405 -0.046720|0.614152 -0.787768 -0.047320|-0.161136 -0.985482 -0.053479|-0.796995 -0.601599 -0.053643|-0.986285 0.154572 -0.057871|0.162407 0.985604 -0.047005|-0.565884 0.822987 -0.049675|0.050904 -0.479049 0.876311|-0.376997 -0.852127 0.362977|-0.914157 -0.405361 0.000000|0.578243 0.583445 0.570287|-0.648204 0.352359 0.675037|-0.500372 0.483417 0.718286|0.726239 -0.314302 -0.611385|-0.349999 -0.665072 -0.659681|-0.551117 0.148971 0.821022|0.566114 0.440523 0.696745|0.954314 -0.229779 0.191014|0.723826 0.408313 0.556198|-0.517680 0.710852 0.476127|-0.681069 0.003996 0.732208|-0.490580 -0.547304 0.678078|0.335349 -0.942087 0.003716|0.425347 -0.396123 -0.813736|0.191349 0.651925 -0.733743|-0.194085 0.956193 0.219149|-0.193684 0.377171 0.905665|0.079609 -0.766557 0.637222|0.292258 -0.956328 0.004595|0.528921 0.083925 0.844511|0.158516 -0.508032 0.846626|0.478108 0.381404 0.791166|-0.096629 -0.555991 0.825553|-0.554878 -0.823114 0.120802|0.529943 0.835008 0.148059|-0.112538 0.540795 -0.833592|-0.546327 -0.227842 -0.805987|0.174241 -0.227860 0.957977|-0.296357 -0.893915 0.336286|-0.462719 -0.742917 -0.483700|-0.942384 0.226977 -0.245750|-0.647919 0.749980 0.133155|0.375782 0.709731 0.595877|0.820217 -0.517460 -0.243884|0.937908 -0.301277 -0.171930|-0.422469 -0.883248 -0.203452|-0.945084 -0.027982 0.325628|-0.589895 0.531069 0.608268|0.585995 0.693865 0.418524|0.582421 -0.811546 0.046680|-0.144981 -0.988333 0.046680|-0.986288 0.158271 0.046755|-0.593290 0.803630 0.046755|0.309175 0.108277 0.944821|-0.068687 0.843038 0.533451|-0.549443 0.833991 0.050718|0.050888 -0.479047 0.876313|-0.376999 -0.852125 0.362979|-0.933751 -0.357922 0.000000|0.580564 0.599979 0.550428|-0.481173 -0.508634 0.713978|-0.245475 -0.603587 -0.758567|-0.425593 -0.372297 -0.824782|-0.614048 0.724778 -0.312477|0.218493 -0.943202 0.250261|0.068240 -0.338646 0.938436|-0.508658 0.540395 0.670254|0.017349 -0.680957 -0.732118|-0.157225 -0.431751 -0.888184|-0.419352 0.800143 0.428853|0.420935 -0.907091 0.000000|0.037450 0.962705 0.267948|0.834114 0.547237 0.069182|-0.056523 0.741191 -0.668910|0.616200 0.340991 -0.709945|-0.134696 0.200889 0.970309|0.528689 -0.201379 0.824582|0.305692 0.077249 -0.948991|-0.095374 0.982947 0.157225|-0.420048 0.864002 0.277598|-0.961682 0.051778 0.269234|0.201965 0.377384 0.903765|0.513535 0.172676 0.840514|0.598794 -0.800883 0.005708|0.955611 -0.214968 0.201485|0.723825 0.408312 0.556199|-0.565406 0.692966 0.447342|0.315344 -0.948970 0.003651|-0.173841 0.960160 0.218797|0.292022 -0.956400 0.004594|-0.827380 -0.543505 0.141578|-0.160276 -0.983178 0.087596|0.835065 -0.548478 -0.042876|-0.815578 0.520753 0.252288|0.076872 -0.608603 -0.789743|-0.669669 -0.169482 -0.723062|-0.179849 0.128195 0.975305|0.466832 -0.229511 0.854045|-0.866853 0.424380 0.261663|0.157372 -0.278906 -0.947336|-0.455392 0.054312 -0.888633|-0.211697 -0.281213 -0.936004|0.317030 -0.549492 -0.773014|-0.341081 -0.156893 -0.926849|-0.143829 0.105124 -0.984003|0.129397 -0.025364 -0.991268|0.449860 -0.589917 -0.670540|-0.579852 -0.806745 -0.113726|-0.931708 0.273071 -0.239484|-0.018279 0.961386 -0.274597|0.892758 0.381880 -0.239062|0.242954 -0.800533 -0.547833|-0.756293 -0.652541 0.047021|-0.855221 0.514182 -0.064922|0.228424 0.963312 -0.140898|0.985197 0.125937 -0.116303|0.117095 -0.767482 0.630285|-0.704899 -0.256903 0.661149|-0.641545 0.423622 0.639504|0.449140 0.588900 0.671915|0.725291 -0.185455 0.662993|-0.651013 -0.612781 -0.447975|-0.133126 -0.524519 -0.840927|0.199829 -0.616477 -0.761593|0.799547 0.232976 -0.553576|0.303014 -0.337175 -0.891345|0.130146 -0.130821 -0.982827|-0.913735 0.278264 -0.296070|-0.852313 -0.051732 -0.520467|-0.876750 -0.303303 -0.373252|0.019666 0.866578 -0.498653|-0.225072 0.753769 -0.617394|-0.717849 0.639526 -0.275137|0.795906 0.253139 -0.549959|0.607934 0.446344 -0.656653|0.454613 0.726893 -0.514737|0.955243 -0.228694 -0.187641|0.914354 -0.151007 -0.375705|0.881560 -0.276590 -0.382558|-0.242223 -0.961822 0.127386|-0.277324 -0.960736 -0.008764|0.314866 -0.784366 -0.534443|-0.988798 -0.080601 0.125627|-0.994399 -0.081058 -0.067826|-0.937914 -0.292192 -0.186926|-0.568869 0.818384 -0.081461|-0.566480 0.815851 -0.116136|-0.702440 0.685484 -0.191548|0.740914 0.656333 0.142385|0.742792 0.661720 -0.101917|0.539880 0.808428 -0.234465|0.061716 -0.947308 0.314322|0.363529 -0.923996 -0.118651|0.791239 -0.605733 0.083834|-0.859393 -0.388851 0.332023|-0.743205 -0.641979 0.188440|-0.351171 -0.847013 0.399060|-0.860595 0.481241 0.166685|-0.842414 0.506312 0.184354|-0.914662 0.236915 0.327512|0.515006 0.805515 0.293113|0.230577 0.972392 0.035892|-0.242226 0.955343 0.169251|0.979777 0.118717 0.161071|0.980046 0.082930 0.180646|0.829259 0.420205 0.368453|0.206943 -0.459508 0.863728|0.270848 -0.635210 0.723291|0.514833 -0.542670 0.663669|-0.206320 -0.469852 0.858296|-0.225887 -0.485896 0.844322|-0.178358 -0.748276 0.638961|-0.279124 0.077768 0.957101|-0.647990 0.213894 0.730998|-0.737770 0.130414 0.662335|0.061005 0.257279 0.964410|0.119894 0.505631 0.854379|-0.287782 0.652251 0.701249|0.457131 -0.036822 0.888637|0.531347 0.002642 0.847150|0.655978 0.364657 0.660847|-0.623111 -0.069027 -0.779081|0.360254 -0.110187 -0.926324|-0.924813 0.307333 -0.224205|-0.180697 0.974815 -0.130709|0.367905 0.721011 -0.587188|0.248816 -0.009670 -0.968503|-0.777500 -0.385792 -0.496646|-0.849385 0.443705 0.285781|0.193445 0.538894 0.819861|0.910299 0.378381 -0.167878|0.036571 -0.249165 -0.967770|-0.887914 -0.390553 -0.243060|-0.683597 0.458912 0.567535|0.312850 0.441835 0.840777|0.965925 0.069201 -0.249399|0.210715 -0.957836 -0.195320|-0.484921 -0.676897 0.553771|0.007706 -0.103976 0.994550|0.121585 0.279332 0.952466|0.639127 -0.748128 0.178385|-0.801220 -0.299784 -0.517858|-0.583603 -0.161238 -0.795870|0.059947 -0.296899 -0.953025|0.784402 0.438707 -0.438462|0.413289 0.091416 -0.906000|0.327061 0.402708 -0.854902|-0.865579 0.349197 0.358936|-0.979407 0.201319 0.015266|-0.999111 0.002122 -0.042106|0.191738 0.931768 0.308292|-0.067510 0.948228 0.310332|-0.522003 0.660005 0.540284|0.786507 0.496006 -0.367947|0.669412 0.702956 -0.240291|0.563276 0.824405 0.055470|0.794452 -0.254995 -0.551202|0.768065 0.048212 -0.638554|0.740999 0.011962 -0.671400|-0.344680 -0.734574 -0.584462|-0.396822 -0.653479 -0.644591|0.043012 -0.249825 -0.967335|-0.974544 0.017522 0.223513|-0.982988 0.091775 0.159096|-0.995472 0.040484 -0.085999|0.332696 0.142041 0.932276|0.170672 0.536580 0.826409|-0.505844 0.643958 0.573969|0.683161 0.246381 0.687450|0.688593 0.543582 0.479957|0.765535 0.458672 0.451193|0.081550 -0.866100 -0.493173|0.205668 -0.684998 -0.698913|0.542752 -0.663023 -0.515578|-0.946938 -0.317825 -0.047921|-0.899440 -0.277791 -0.337403|-0.352658 -0.759397 -0.546762|-0.135351 0.001588 0.990797|-0.580680 0.117555 0.805600|-0.749426 -0.120333 0.651061|0.126260 0.150450 0.980522|0.244787 -0.024233 0.969274|0.492481 0.002019 0.870321|0.960363 -0.276421 -0.035981|0.968962 -0.245022 -0.032816|0.751561 -0.006116 0.659635|0.372772 -0.906290 0.199196|0.415284 -0.909629 -0.010724|0.344063 -0.938905 0.008828|0.070218 -0.948388 0.309240|0.038663 -0.963930 0.263331|0.012053 -0.993310 -0.114849|-0.030301 -0.702534 0.711005|-0.158436 -0.635624 0.755566|-0.390512 -0.596944 0.700827|0.173834 -0.621077 0.764228|0.135023 0.294305 0.946125|0.503425 0.072880 0.860960|0.487440 -0.728618 0.481163|0.479536 -0.733625 0.481497|0.650449 -0.155176 0.743530|0.606415 -0.779410 -0.157416|0.551742 -0.699089 0.454814|0.599202 -0.729488 -0.329854|0.820966 -0.482398 -0.305461|0.876919 -0.480575 -0.007808|0.494147 -0.619254 0.610199|-0.427452 -0.899551 -0.089960|-0.033372 -0.273982 -0.961156|0.596668 0.586906 -0.547291|0.676929 0.513312 0.527521|0.245214 -0.778473 0.577797|-0.568731 -0.766759 -0.297700|-0.060122 0.029998 -0.997740|0.574631 0.752486 -0.321814|0.529368 0.429188 0.731824|-0.796993 -0.124136 0.591094|-0.946817 0.012029 -0.321547|-0.658427 0.447009 -0.605522|-0.255484 0.949277 0.183306|-0.423743 0.468347 0.775302|-0.095709 -0.950940 -0.294200|0.460852 -0.886228 0.047065|0.479718 -0.780732 0.400410|0.852023 0.203109 0.482497|0.735500 -0.600667 0.313431|0.829363 -0.556617 0.048310|0.023128 -0.292250 -0.956062|0.108327 -0.636723 -0.763445|-0.122322 -0.762720 -0.635055|0.763704 0.413488 -0.495765|0.731021 0.171544 -0.660440|0.216563 0.070504 -0.973720|0.854995 0.217157 0.470985|0.950969 0.237449 0.198180|0.882847 0.466115 -0.057606|0.419050 0.116324 0.900481|0.611178 0.060424 0.789183|0.549667 -0.062113 0.833072|-0.521750 -0.788733 0.325080|-0.465402 -0.833070 0.298990|0.261155 -0.742711 0.616586|-0.501033 -0.377501 -0.778755|-0.338298 -0.480597 -0.809062|-0.298208 -0.681748 -0.668051|0.176185 0.364676 -0.914314|0.205440 0.345783 -0.915548|0.169166 0.154709 -0.973369|0.404813 0.861116 0.307581|0.613803 0.740269 0.274314|0.708253 0.705895 0.009431|-0.573665 -0.537345 0.618198|-0.092312 -0.615598 0.782635|-0.010444 -0.119813 0.992742|-0.746333 -0.455903 -0.484912|-0.679597 -0.680713 -0.273455|-0.793340 -0.577707 0.192008|-0.270896 0.122136 -0.954829|-0.269520 0.157442 -0.950037|-0.522570 -0.003747 -0.852588|0.251296 0.966089 0.059355|0.429242 0.851413 -0.301409|0.136466 0.724734 -0.675380|0.262594 0.575275 0.774663|0.233795 0.557875 0.796314|0.153998 0.831546 0.533681|-0.873735 0.263400 0.408910|-0.781617 -0.009135 0.623691|-0.609885 0.132469 0.781340|-0.960672 0.175884 0.214884|-0.972539 0.123811 0.197073|-0.910639 -0.206615 0.357835|-0.894651 0.446627 0.011159|-0.837903 0.314505 -0.446100|-0.848204 0.207325 -0.487408|-0.772505 0.622182 0.126984|-0.547384 0.836812 0.010781|-0.512969 0.731719 -0.448832|-0.711314 0.563233 0.420477|-0.601968 0.629754 0.490962|-0.254819 0.868105 0.425981|0.029981 -0.981134 -0.190988|0.348012 -0.835202 0.425823|-0.048930 -0.738461 -0.672518|0.579460 -0.525586 -0.622885|0.714647 -0.666117 -0.213464|0.338891 -0.754314 0.562283|-0.671558 -0.736810 -0.078233|-0.219780 -0.156331 -0.962942|0.367803 0.757300 -0.539646|0.871691 0.211692 0.441974|0.029266 -0.822809 0.567563|-0.790334 -0.559645 -0.249339|-0.167550 0.153708 -0.973807|0.359680 0.839126 -0.408041|0.681623 0.197150 0.704644|-0.577455 0.022878 0.816102|-0.926973 0.352226 -0.129064|-0.277223 0.900363 -0.335401|0.096690 0.871688 -0.480428|-0.234253 0.522243 0.819993|-0.576298 -0.796812 -0.181579|-0.085047 -0.996372 -0.003146|0.163416 -0.906820 0.388553|0.957307 -0.027930 0.287722|0.348218 -0.835183 0.425692|0.527722 -0.849263 -0.016169|-0.393989 -0.032980 -0.918523|-0.447891 -0.364141 -0.816575|-0.630573 -0.424188 -0.649956|0.756570 0.298163 -0.581980|0.597176 0.190737 -0.779102|0.059832 0.299249 -0.952297|0.933601 -0.090353 0.346736|0.999832 -0.000021 0.018308|0.968167 0.187642 -0.165657|0.388691 -0.112273 0.914502|0.642758 -0.243720 0.726266|0.572247 -0.312934 0.758028|-0.657620 -0.593226 0.464347|-0.610832 -0.683455 0.399715|0.034992 -0.817648 0.574655|-0.614274 -0.233399 -0.753785|-0.555531 -0.295721 -0.777132|-0.554575 -0.506353 -0.660343|0.120502 0.961844 -0.245633|0.351029 0.753317 -0.556139|0.080644 0.217859 -0.972643|0.460489 0.887350 0.023648|0.736232 0.672782 -0.072982|0.722193 0.690354 0.042996|-0.523273 -0.309377 0.794022|-0.266978 -0.457376 0.848251|-0.085483 -0.147562 0.985352|-0.802974 -0.426615 -0.416211|-0.684967 -0.667765 -0.291393|-0.689269 -0.560489 0.459086|-0.280112 0.822386 -0.495195|-0.418950 0.448156 -0.789707|-0.673094 0.261740 -0.691691|-0.006160 0.912697 -0.408592|-0.068512 0.973961 -0.216116|0.119957 0.992427 -0.026451|0.367045 0.422179 0.828881|0.395902 0.425397 0.813817|0.311161 0.920142 0.237733|-0.520389 0.440230 0.731705|-0.455099 0.272427 0.847744|-0.524339 0.261545 0.810347|-0.756189 0.409121 0.510684|-0.777824 0.355977 0.517947|-0.740023 0.010614 0.672498|-0.706860 0.695879 0.126891|-0.740584 0.671707 -0.018577|-0.838260 0.516239 -0.175549|-0.532397 0.824644 0.191093|0.117621 0.870357 -0.478167|0.183357 0.981252 -0.059378|-0.371058 0.722757 0.583042|-0.379734 0.720105 0.580733|0.118117 0.966326 0.228609|-0.082868 -0.405842 -0.910179|0.323391 -0.746116 -0.582005|-0.337406 -0.048343 -0.940117|-0.317077 0.017748 -0.948234|-0.135375 -0.137306 -0.981234|0.504064 -0.813468 -0.290153|-0.129955 -0.895839 -0.424953|-0.447056 0.616262 -0.648354|-0.297923 0.885818 -0.355764|0.974035 0.187163 -0.127379|0.433826 -0.868298 -0.240529|-0.605160 -0.781855 -0.149946|-0.423238 0.673107 -0.606463|0.211693 0.971069 -0.110507|0.975694 -0.186624 0.114859|0.102180 -0.787302 0.608041|-0.716016 -0.013571 0.697952|-0.458376 0.800388 0.386355|0.474429 0.593139 0.650464|0.801033 -0.203989 0.562792|-0.066171 -0.574165 -0.816062|-0.097725 -0.581641 -0.807554|0.193418 -0.785426 -0.587959|0.551372 -0.634248 -0.541958|0.334453 -0.717925 -0.610512|-0.108768 -0.412127 -0.904611|-0.539444 0.658187 -0.525158|-0.288099 -0.053026 -0.956131|-0.341979 -0.284399 -0.895638|-0.311202 0.742691 -0.592929|-0.409180 0.656704 -0.633492|-0.483955 0.705128 -0.518249|0.677449 -0.173724 -0.714761|0.218995 0.137918 -0.965929|0.093393 0.692959 -0.714903|0.805598 -0.573232 0.149720|0.775801 -0.620631 -0.113797|0.770316 -0.628435 -0.108083|-0.043222 -0.983373 -0.176377|-0.018103 -0.943954 -0.329580|0.171225 -0.891029 -0.420416|-0.926931 0.323702 -0.189779|-0.924515 0.323091 -0.202198|-0.712635 -0.344150 -0.611320|-0.183727 0.940729 -0.285084|-0.192533 0.895644 -0.400939|-0.484486 0.675480 -0.555878|0.736260 0.605754 0.301635|0.772984 0.634299 0.012645|0.428770 0.880384 -0.202684|0.243777 -0.969801 0.007689|0.445143 -0.890546 -0.093676|0.762527 -0.618986 0.188176|-0.855533 -0.109661 0.506002|-0.653366 -0.742112 0.149605|-0.526691 -0.813820 0.245547|-0.518257 0.851590 -0.078769|-0.574964 0.809242 -0.120598|-0.722170 0.682566 0.112135|0.563302 0.755946 0.333521|0.252023 0.964649 0.077049|0.234591 0.969044 0.076950|0.901486 -0.226487 0.368818|0.941271 -0.094337 0.324205|0.838109 0.308279 0.450042|0.079049 -0.187234 0.979130|0.282006 -0.556589 0.781461|0.710819 -0.486183 0.508294|-0.485773 -0.033347 0.873449|-0.584403 -0.096924 0.805654|-0.493141 -0.641361 0.587766|-0.370829 0.263580 0.890512|-0.662752 0.457124 0.593125|-0.626776 0.470910 0.620803|0.013371 0.353477 0.935348|0.273361 0.627607 0.728961|0.075014 0.855136 0.512947|0.300457 0.120578 0.946143|0.620178 0.126164 0.774249|0.665953 0.326875 0.670566|0.677223 0.651707 -0.341536|0.127058 0.789942 -0.599874|0.919779 0.381087 -0.093698|0.942003 0.317114 -0.109861|0.850225 0.431813 -0.301091|-0.214779 0.732147 -0.646399|0.107140 0.984760 -0.136996|0.936577 -0.298095 0.184292|0.721495 -0.664335 0.195203|-0.184854 -0.351402 -0.917794|-0.250577 0.784854 -0.566759|0.084017 0.904768 0.417536|0.911145 -0.368137 0.185176|0.351040 -0.923413 -0.155177|-0.523116 -0.069802 -0.849398|-0.833354 0.544352 0.095925|-0.343445 -0.026382 0.938802|0.110347 -0.756712 0.644368|-0.532945 -0.839561 -0.105392|-0.851551 -0.140614 -0.505063|0.531944 0.779222 -0.331433|0.533664 0.790704 -0.299983|0.166622 0.856648 -0.488254|0.046838 0.624534 -0.779592|0.157286 0.769129 -0.619437|0.679805 0.661665 -0.316331|0.878646 -0.351601 0.323046|0.913819 0.379211 -0.145375|0.801942 0.590438 -0.090957|0.882050 -0.461372 0.095520|0.923669 -0.348310 0.159737|0.868346 -0.409505 0.279787|0.307829 0.214637 -0.926915|0.800898 0.093035 -0.591529|0.821115 -0.468832 -0.325524|-0.623341 0.319053 -0.713899|-0.401040 0.443437 -0.801580|-0.406634 0.450333 -0.794889|-0.169611 0.978360 -0.118503|-0.033010 0.978799 -0.202144|-0.006186 0.913468 -0.406863|0.616943 -0.048096 0.785537|0.626567 -0.044583 0.778091|0.672529 0.647588 0.358240|0.637207 -0.760269 0.126330|0.725026 -0.683842 0.081840|0.890856 -0.371153 0.261957|-0.323881 -0.810938 -0.487319|-0.078017 -0.764945 -0.639353|0.319446 -0.860093 -0.397737|-0.429756 0.851837 -0.299472|-0.389230 0.762201 -0.517251|-0.656392 0.360479 -0.662725|-0.159230 0.147431 0.976171|-0.143271 0.794457 0.590180|-0.297484 0.807177 0.509871|0.551745 -0.661717 0.507650|0.594233 -0.598094 0.537746|0.403982 -0.512566 0.757677|-0.236036 -0.922680 -0.304876|0.171971 -0.978546 -0.113463|0.179995 -0.978836 -0.097377|-0.728790 -0.087274 -0.679152|-0.659522 -0.207071 -0.722601|-0.591828 -0.596312 -0.542358|-0.939148 -0.115441 0.323534|-0.970174 0.241034 0.025790|-0.868176 0.158152 -0.470380|-0.586718 -0.106976 0.802694|-0.513639 -0.007128 0.857977|-0.546172 0.543040 0.637812|-0.541818 -0.414453 0.731206|-0.110820 -0.448930 0.886668|-0.143252 -0.477376 0.866943|-0.691327 -0.594636 0.410457|-0.514755 -0.849966 0.112183|-0.176867 -0.959306 0.220114|-0.886539 -0.442287 0.135757|-0.854055 -0.469084 -0.224836|-0.712420 -0.637815 -0.292660|0.592541 0.703274 0.392811|0.952638 0.287196 0.099999|0.193448 0.823394 0.533479|0.156512 0.795449 0.585461|0.384068 0.715686 0.583340|0.996209 -0.005298 -0.086833|0.769596 0.581351 -0.264109|-0.478939 0.563900 0.672780|-0.710773 0.207859 0.672009|0.421290 -0.720521 0.550785|0.983058 0.033619 -0.180187|0.330516 0.754659 -0.566788|-0.524811 0.506305 0.684272|-0.592192 -0.349024 0.726286|0.622136 -0.767216 0.155968|0.440658 -0.231474 -0.867318|-0.620921 0.142590 -0.770795|-0.996232 -0.082848 0.025646|-0.434526 -0.899494 0.045801|0.382134 -0.891881 -0.241913|0.696840 0.678807 0.231591|0.682709 0.699942 0.209738|0.915622 0.400537 0.034747|0.974072 0.059887 0.218168|0.947115 0.288154 0.141209|0.581563 0.721490 0.375815|-0.604402 0.551518 0.574914|0.229051 0.796208 0.559990|0.356095 0.861940 0.360909|-0.523283 0.394422 0.755385|-0.495076 0.515652 0.699288|-0.613285 0.492752 0.617315|0.749981 -0.054614 0.659201|0.356475 0.363672 0.860621|-0.225844 0.168724 0.959441|0.815424 -0.557097 -0.157247|0.930133 -0.367196 -0.004422|0.931149 -0.364324 -0.015115|0.794042 0.391533 -0.464972|0.832003 0.452040 -0.321606|0.924838 0.346511 -0.156857|-0.674450 0.738312 -0.003623|-0.668251 0.743912 0.005899|0.102631 0.994632 -0.013178|-0.717280 0.064560 0.693788|-0.645968 0.151039 0.748273|-0.577376 0.522942 0.627031|-0.179859 -0.898641 0.400118|-0.078809 -0.764463 0.639833|-0.373970 -0.437831 0.817588|0.870796 0.059852 -0.487988|0.953626 -0.055545 -0.295825|0.813790 -0.534803 -0.227445|-0.552964 0.387201 -0.737771|0.167207 0.605388 -0.778169|0.255403 0.470489 -0.844635|-0.901055 0.222981 0.371994|-0.883854 0.302001 0.357209|-0.948437 0.311002 0.061187|-0.398623 -0.823670 0.403320|-0.632851 -0.488440 0.600771|-0.645480 -0.476154 0.597188|0.522311 -0.849146 -0.078367|0.458151 -0.887690 0.045869|0.049444 -0.986820 0.154080|-0.164498 -0.587172 -0.792572|0.297597 -0.530988 -0.793403|0.569906 -0.717582 -0.400353|-0.545787 -0.131900 -0.827477|-0.525370 0.000015 -0.850874|0.018657 0.199081 -0.979805|-0.718285 -0.306992 -0.624358|-0.915938 0.041356 -0.399183|-0.917229 -0.006055 -0.398313|-0.598441 -0.651200 -0.466698|-0.596215 -0.800360 -0.062860|-0.799148 -0.580361 0.156666|-0.270686 -0.817318 -0.508646|-0.043051 -0.962953 -0.266212|-0.135461 -0.989160 -0.056678|-0.593767 -0.032277 -0.803989|-0.552901 0.627764 -0.547918|-0.575427 -0.542113 -0.612370|-0.941512 -0.320932 -0.102751|-0.976719 0.125543 -0.173950|-0.456598 0.741167 -0.492127|0.121025 -0.189024 -0.974486|-0.244057 -0.950376 -0.192931|-0.088036 -0.490542 0.866959|-0.420495 0.667447 0.614571|-0.247157 0.654930 -0.714129|0.245355 -0.412361 -0.877359|-0.129664 -0.986716 0.097868|0.006273 -0.381483 0.924354|-0.187252 0.853326 0.486592|0.749357 0.572296 -0.333078|0.862511 -0.471274 -0.184326|0.562409 -0.529237 0.635298|0.203911 -0.539267 0.817075|0.737947 0.618043 0.271029|-0.020536 -0.246347 -0.968964|-0.445835 0.108120 -0.888561|-0.457942 0.542832 -0.704005|-0.664456 0.584384 0.465826|-0.553097 0.627706 -0.547786|-0.855300 0.274774 -0.439273|-0.028655 -0.982670 -0.183138|-0.120785 -0.858740 -0.497972|0.049781 -0.753960 -0.655031|-0.643281 -0.339756 0.686116|-0.642260 -0.561017 0.522266|-0.225726 -0.912901 0.340089|-0.657311 0.640561 0.397018|-0.777517 0.342345 0.527511|-0.720583 0.133850 0.680327|-0.043146 0.997409 0.057560|-0.375521 0.922292 0.091442|-0.344678 0.938700 -0.006282|0.373190 0.303000 -0.876881|0.267636 0.270331 -0.924820|-0.246522 0.662708 -0.707139|0.098688 -0.872336 -0.478843|0.012494 -0.866388 -0.499215|-0.055602 -0.727516 -0.683833|0.313474 -0.324469 0.892443|-0.082686 -0.510873 0.855670|-0.290921 -0.913828 0.283341|0.102674 0.048355 0.993539|-0.257378 0.077541 0.963195|-0.196866 0.179005 0.963951|0.528630 0.615529 -0.584529|0.270653 0.770222 -0.577500|0.335235 0.914353 -0.227102|0.265298 -0.591074 -0.761740|0.092568 -0.402368 -0.910786|0.412970 0.283227 -0.865586|0.468872 -0.668778 0.576971|0.282835 -0.937295 0.203673|0.420622 -0.902330 -0.094219|0.330667 -0.511242 0.793278|0.478189 -0.360025 0.801072|0.406108 -0.123898 0.905387|0.218259 0.835872 0.503667|0.192026 0.830721 0.522521|0.311314 0.195454 0.929990|0.889373 0.453813 0.055405|0.792559 0.606945 -0.058888|0.828206 0.550961 -0.102548|0.981128 0.174720 -0.082829|0.973349 0.181875 -0.139690|0.820392 0.386811 -0.421110|0.955670 -0.208127 0.208274|0.918926 -0.351789 0.178382|0.860915 -0.508732 0.004156|0.907389 -0.109259 0.405843|0.187606 -0.530158 0.826884|0.339171 -0.132517 0.931344|0.865415 0.324003 0.382204|0.870049 0.319391 0.375504|0.483186 0.117698 0.867570| + Face:1004 + troc + 1/0 337/0 336/0| 337/1 5/1 338/1| 75/2 71/2 72/2| 75/3 73/3 74/3| 9/4 340/4 339/4| 340/5 13/5 341/5| 25/6 16/6 24/6| 342/7 1/7 336/7| 13/8 342/8 341/8| 6/9 10/9 14/9| 22/10 20/10 16/10| 25/11 22/11 23/11| 27/12 22/12 26/12| 28/13 21/13 27/13| 29/14 20/14 28/14| 29/15 18/15 19/15| 31/16 18/16 30/16| 31/17 16/17 17/17| 293/18 24/18 461/18| 456/19 25/19 293/19| 456/20 27/20 26/20| 458/21 27/21 457/21| 458/22 29/22 28/22| 459/23 30/23 29/23| 86/24 84/24 88/24| 87/25 85/25 86/25| 0/26 33/26 2/26| 33/27 4/27 2/27| 4/28 35/28 6/28| 6/29 36/29 8/29| 36/30 10/30 8/30| 37/31 12/31 10/31| 39/32 0/32 14/32| 38/33 14/33 12/33| 408/34 406/34 410/34| 92/35 51/35 52/35| 92/36 53/36 96/36| 11/37 44/37 43/37| 7/38 44/38 9/38| 7/39 46/39 45/39| 5/40 47/40 46/40| 408/41 407/41 405/41| 49/42 51/42 50/42| 49/43 53/43 52/43| 96/44 48/44 97/44| 93/45 50/45 51/45| 95/46 50/46 94/46| 95/47 48/47 49/47| 111/48 109/48 108/48| 111/49 107/49 110/49| 98/50 57/50 99/50| 101/51 58/51 56/51| 103/52 58/52 102/52| 103/53 57/53 59/53| 60/54 116/54 123/54| 116/55 62/55 117/55| 117/56 63/56 118/56| 63/57 119/57 118/57| 119/58 65/58 120/58| 120/59 66/59 121/59| 67/60 123/60 122/60| 66/61 122/61 121/61| 68/62 344/62 343/62| 344/63 70/63 345/63| 346/64 73/64 345/64| 78/65 343/65 347/65| 79/66 70/66 69/66| 79/67 68/67 78/67| 63/68 76/68 75/68| 63/69 74/69 64/69| 339/70 74/70 346/70| 5/71 347/71 338/71| 7/72 77/72 79/72| 7/73 78/73 5/73| 463/74 81/74 462/74| 463/75 80/75 82/75| 89/76 464/76 465/76| 90/77 80/77 89/77| 90/78 81/78 82/78| 466/79 84/79 462/79| 47/80 88/80 46/80| 47/81 87/81 86/81| 24/82 465/82 461/82| 31/83 89/83 24/83| 31/84 91/84 90/84| 460/85 88/85 466/85| 55/86 93/86 92/86| 55/87 96/87 54/87| 54/44 97/44 57/44| 56/88 94/88 93/88| 59/89 94/89 58/89| 59/90 97/90 95/90| 42/91 101/91 100/91| 42/92 98/92 43/92| 43/93 99/93 11/93| 41/94 102/94 101/94| 13/95 102/95 15/95| 13/96 99/96 103/96| 108/97 106/97 105/97| 108/98 104/98 107/98| 113/99 107/99 104/99| 114/100 104/100 105/100| 114/101 106/101 115/101| 115/102 109/102 112/102| 100/103 112/103 111/103| 100/104 110/104 98/104| 98/105 113/105 54/105| 55/106 113/106 114/106| 55/107 115/107 56/107| 101/108 115/108 112/108| 123/109 33/109 32/109| 116/110 34/110 33/110| 34/111 118/111 35/111| 118/112 36/112 35/112| 119/113 37/113 36/113| 37/114 121/114 38/114| 122/115 32/115 39/115| 121/116 39/116 38/116| 336/0 61/0 60/0| 61/1 338/1 62/1| 354/117 351/117 356/117| 354/118 353/118 352/118| 342/119 60/119 67/119| 341/120 67/120 66/120| 71/121 344/121 72/121| 344/122 73/122 72/122| 77/123 345/123 70/123| 347/124 71/124 76/124| 9/70 346/70 77/70| 338/71 76/71 62/71| 351/125 349/125 348/125| 349/126 353/126 350/126| 358/127 350/127 357/127| 358/128 348/128 349/128| 357/129 353/129 355/129| 359/130 351/130 348/130| 339/131 354/131 356/131| 340/132 355/132 354/132| 65/133 357/133 66/133| 65/134 359/134 358/134| 66/135 355/135 341/135| 64/136 356/136 359/136| 402/137 406/137 405/137| 402/138 407/138 403/138| 409/139 403/139 407/139| 410/140 404/140 412/140| 413/141 404/141 402/141| 413/142 403/142 411/142| 40/143 410/143 41/143| 40/144 409/144 408/144| 3/145 409/145 47/145| 15/146 410/146 412/146| 1/147 412/147 413/147| 1/148 411/148 3/148| 40/18 293/18 461/18| 42/149 293/149 41/149| 42/150 457/150 456/150| 474/151 470/151 471/151| 474/152 472/152 473/152| 45/153 460/153 459/153| 84/74 463/74 462/74| 83/154 463/154 85/154| 465/155 83/155 87/155| 91/156 462/156 81/156| 461/157 87/157 40/157| 30/158 466/158 91/158| 468/159 470/159 467/159| 468/160 472/160 471/160| 473/161 469/161 476/161| 475/162 467/162 470/162| 478/163 469/163 468/163| 478/164 467/164 477/164| 458/165 475/165 474/165| 458/166 473/166 459/166| 45/167 473/167 476/167| 457/168 477/168 475/168| 44/169 476/169 478/169| 44/170 477/170 43/170| 1/0 3/0 337/0| 337/1 3/1 5/1| 75/171 76/171 71/171| 75/172 72/172 73/172| 9/4 11/4 340/4| 340/5 11/5 13/5| 25/173 23/173 16/173| 342/174 15/174 1/174| 13/175 15/175 342/175| 14/9 0/9 2/9| 2/9 4/9 6/9| 6/9 8/9 10/9| 10/9 12/9 14/9| 14/9 2/9 6/9| 18/176 17/176 16/176| 16/177 23/177 22/177| 22/178 21/178 20/178| 20/179 19/179 18/179| 18/180 16/180 20/180| 25/181 26/181 22/181| 27/182 21/182 22/182| 28/183 20/183 21/183| 29/184 19/184 20/184| 29/185 30/185 18/185| 31/186 17/186 18/186| 31/187 24/187 16/187| 293/188 25/188 24/188| 456/189 26/189 25/189| 456/190 457/190 27/190| 458/191 28/191 27/191| 458/192 459/192 29/192| 459/193 460/193 30/193| 86/194 85/194 84/194| 87/195 83/195 85/195| 0/26 32/26 33/26| 33/196 34/196 4/196| 4/197 34/197 35/197| 6/198 35/198 36/198| 36/30 37/30 10/30| 37/199 38/199 12/199| 39/32 32/32 0/32| 38/200 39/200 14/200| 408/201 405/201 406/201| 92/86 93/86 51/86| 92/202 52/202 53/202| 11/203 9/203 44/203| 7/204 45/204 44/204| 7/205 5/205 46/205| 5/206 3/206 47/206| 408/207 409/207 407/207| 49/208 52/208 51/208| 49/209 48/209 53/209| 96/210 53/210 48/210| 93/88 94/88 50/88| 95/211 49/211 50/211| 95/90 97/90 48/90| 111/212 112/212 109/212| 111/213 108/213 107/213| 98/214 54/214 57/214| 101/215 102/215 58/215| 103/216 59/216 58/216| 103/217 99/217 57/217| 60/218 61/218 116/218| 116/219 61/219 62/219| 117/220 62/220 63/220| 63/221 64/221 119/221| 119/222 64/222 65/222| 120/223 65/223 66/223| 67/224 60/224 123/224| 66/225 67/225 122/225| 68/226 69/226 344/226| 344/227 69/227 70/227| 346/228 74/228 73/228| 78/229 68/229 343/229| 79/230 77/230 70/230| 79/231 69/231 68/231| 63/232 62/232 76/232| 63/233 75/233 74/233| 339/70 64/70 74/70| 5/71 78/71 347/71| 7/234 9/234 77/234| 7/235 79/235 78/235| 463/236 82/236 81/236| 463/237 464/237 80/237| 89/238 80/238 464/238| 90/239 82/239 80/239| 90/240 91/240 81/240| 466/241 88/241 84/241| 47/242 86/242 88/242| 47/243 40/243 87/243| 24/244 89/244 465/244| 31/245 90/245 89/245| 31/246 30/246 91/246| 460/247 46/247 88/247| 55/248 56/248 93/248| 55/249 92/249 96/249| 54/44 96/44 97/44| 56/88 58/88 94/88| 59/46 95/46 94/46| 59/90 57/90 97/90| 42/250 41/250 101/250| 42/251 100/251 98/251| 43/252 98/252 99/252| 41/253 15/253 102/253| 13/254 103/254 102/254| 13/255 11/255 99/255| 108/256 109/256 106/256| 108/257 105/257 104/257| 113/258 110/258 107/258| 114/259 113/259 104/259| 114/260 105/260 106/260| 115/261 106/261 109/261| 100/262 101/262 112/262| 100/263 111/263 110/263| 98/264 110/264 113/264| 55/265 54/265 113/265| 55/266 114/266 115/266| 101/267 56/267 115/267| 123/109 116/109 33/109| 116/110 117/110 34/110| 34/268 117/268 118/268| 118/269 119/269 36/269| 119/113 120/113 37/113| 37/270 120/270 121/270| 122/115 123/115 32/115| 121/271 122/271 39/271| 336/0 337/0 61/0| 61/1 337/1 338/1| 354/272 352/272 351/272| 354/273 355/273 353/273| 342/7 336/7 60/7| 341/274 342/274 67/274| 71/275 343/275 344/275| 344/276 345/276 73/276| 77/277 346/277 345/277| 347/278 343/278 71/278| 9/70 339/70 346/70| 338/71 347/71 76/71| 351/279 352/279 349/279| 349/126 352/126 353/126| 358/280 349/280 350/280| 358/281 359/281 348/281| 357/282 350/282 353/282| 359/283 356/283 351/283| 339/284 340/284 354/284| 340/285 341/285 355/285| 65/286 358/286 357/286| 65/287 64/287 359/287| 66/288 357/288 355/288| 64/289 339/289 356/289| 402/290 404/290 406/290| 402/291 405/291 407/291| 409/139 411/139 403/139| 410/140 406/140 404/140| 413/292 412/292 404/292| 413/293 402/293 403/293| 40/294 408/294 410/294| 40/295 47/295 409/295| 3/145 411/145 409/145| 15/146 41/146 410/146| 1/147 15/147 412/147| 1/296 413/296 411/296| 40/297 41/297 293/297| 42/298 456/298 293/298| 42/299 43/299 457/299| 474/300 475/300 470/300| 474/301 471/301 472/301| 45/302 46/302 460/302| 84/303 85/303 463/303| 83/304 464/304 463/304| 465/305 464/305 83/305| 91/306 466/306 462/306| 461/307 465/307 87/307| 30/308 460/308 466/308| 468/309 471/309 470/309| 468/310 469/310 472/310| 473/311 472/311 469/311| 475/312 477/312 467/312| 478/313 476/313 469/313| 478/314 468/314 467/314| 458/315 457/315 475/315| 458/316 474/316 473/316| 45/167 459/167 473/167| 457/317 43/317 477/317| 44/318 45/318 476/318| 44/319 478/319 477/319| + Material.001 + 124/320 137/320 136/320| 125/321 137/321 139/321| 124/322 136/322 141/322| 124/323 141/323 143/323| 124/324 143/324 140/324| 125/325 139/325 146/325| 126/326 138/326 148/326| 127/327 142/327 150/327| 128/328 144/328 152/328| 129/329 145/329 154/329| 125/330 146/330 149/330| 126/331 148/331 151/331| 127/332 150/332 153/332| 128/333 152/333 155/333| 129/334 154/334 147/334| 130/335 156/335 161/335| 131/336 157/336 163/336| 132/337 158/337 164/337| 133/338 159/338 165/338| 134/339 160/339 162/339| 136/340 138/340 126/340| 136/341 137/341 138/341| 137/342 125/342 138/342| 139/343 140/343 129/343| 139/344 137/344 140/344| 137/345 124/345 140/345| 141/346 142/346 127/346| 141/347 136/347 142/347| 136/348 126/348 142/348| 143/349 144/349 128/349| 143/350 141/350 144/350| 141/351 127/351 144/351| 140/352 145/352 129/352| 140/353 143/353 145/353| 143/354 128/354 145/354| 146/355 147/355 134/355| 146/356 139/356 147/356| 139/357 129/357 147/357| 148/358 149/358 130/358| 148/359 138/359 149/359| 138/360 125/360 149/360| 150/361 151/361 131/361| 150/362 142/362 151/362| 142/363 126/363 151/363| 152/364 153/364 132/364| 152/365 144/365 153/365| 144/366 127/366 153/366| 154/367 155/367 133/367| 154/368 145/368 155/368| 145/369 128/369 155/369| 149/370 156/370 130/370| 149/371 146/371 156/371| 146/372 134/372 156/372| 151/373 157/373 131/373| 151/374 148/374 157/374| 148/375 130/375 157/375| 153/376 158/376 132/376| 153/377 150/377 158/377| 150/378 131/378 158/378| 155/379 159/379 133/379| 155/380 152/380 159/380| 152/381 132/381 159/381| 147/382 160/382 134/382| 147/383 154/383 160/383| 154/384 133/384 160/384| 161/385 162/385 135/385| 161/386 156/386 162/386| 156/387 134/387 162/387| 163/388 161/388 135/388| 163/389 157/389 161/389| 157/390 130/390 161/390| 164/391 163/391 135/391| 164/392 158/392 163/392| 158/393 131/393 163/393| 165/394 164/394 135/394| 165/395 159/395 164/395| 159/396 132/396 164/396| 162/397 165/397 135/397| 162/398 160/398 165/398| 160/399 133/399 165/399| 166/400 179/400 178/400| 167/401 179/401 181/401| 166/402 178/402 183/402| 166/403 183/403 185/403| 166/404 185/404 182/404| 167/405 181/405 188/405| 168/406 180/406 190/406| 169/407 184/407 192/407| 170/408 186/408 194/408| 171/409 187/409 196/409| 167/410 188/410 191/410| 168/411 190/411 193/411| 169/412 192/412 195/412| 170/413 194/413 197/413| 171/414 196/414 189/414| 172/415 198/415 203/415| 173/416 199/416 205/416| 174/417 200/417 206/417| 175/418 201/418 207/418| 176/419 202/419 204/419| 178/420 180/420 168/420| 178/421 179/421 180/421| 179/422 167/422 180/422| 181/423 182/423 171/423| 181/424 179/424 182/424| 179/425 166/425 182/425| 183/426 184/426 169/426| 183/427 178/427 184/427| 178/428 168/428 184/428| 185/429 186/429 170/429| 185/430 183/430 186/430| 183/431 169/431 186/431| 182/432 187/432 171/432| 182/433 185/433 187/433| 185/434 170/434 187/434| 188/435 189/435 176/435| 188/436 181/436 189/436| 181/437 171/437 189/437| 190/438 191/438 172/438| 190/439 180/439 191/439| 180/440 167/440 191/440| 192/441 193/441 173/441| 192/442 184/442 193/442| 184/443 168/443 193/443| 194/444 195/444 174/444| 194/445 186/445 195/445| 186/446 169/446 195/446| 196/447 197/447 175/447| 196/448 187/448 197/448| 187/449 170/449 197/449| 191/450 198/450 172/450| 191/451 188/451 198/451| 188/452 176/452 198/452| 193/453 199/453 173/453| 193/454 190/454 199/454| 190/455 172/455 199/455| 195/456 200/456 174/456| 195/457 192/457 200/457| 192/458 173/458 200/458| 197/459 201/459 175/459| 197/460 194/460 201/460| 194/461 174/461 201/461| 189/462 202/462 176/462| 189/463 196/463 202/463| 196/464 175/464 202/464| 203/465 204/465 177/465| 203/466 198/466 204/466| 198/467 176/467 204/467| 205/468 203/468 177/468| 205/469 199/469 203/469| 199/470 172/470 203/470| 206/471 205/471 177/471| 206/472 200/472 205/472| 200/473 173/473 205/473| 207/474 206/474 177/474| 207/475 201/475 206/475| 201/476 174/476 206/476| 204/477 207/477 177/477| 204/478 202/478 207/478| 202/479 175/479 207/479| 251/480 264/480 263/480| 252/481 264/481 266/481| 251/482 263/482 268/482| 251/483 268/483 270/483| 251/484 270/484 267/484| 252/485 266/485 273/485| 253/486 265/486 275/486| 254/487 269/487 277/487| 255/488 271/488 279/488| 256/489 272/489 281/489| 252/490 273/490 276/490| 253/491 275/491 278/491| 254/492 277/492 280/492| 255/493 279/493 282/493| 256/494 281/494 274/494| 257/495 283/495 288/495| 258/496 284/496 290/496| 259/497 285/497 291/497| 260/498 286/498 292/498| 261/499 287/499 289/499| 263/500 265/500 253/500| 263/501 264/501 265/501| 264/502 252/502 265/502| 266/503 267/503 256/503| 266/504 264/504 267/504| 264/505 251/505 267/505| 268/506 269/506 254/506| 268/507 263/507 269/507| 263/508 253/508 269/508| 270/509 271/509 255/509| 270/510 268/510 271/510| 268/511 254/511 271/511| 267/512 272/512 256/512| 267/513 270/513 272/513| 270/514 255/514 272/514| 273/515 274/515 261/515| 273/516 266/516 274/516| 266/517 256/517 274/517| 275/518 276/518 257/518| 275/519 265/519 276/519| 265/520 252/520 276/520| 277/521 278/521 258/521| 277/522 269/522 278/522| 269/523 253/523 278/523| 279/524 280/524 259/524| 279/525 271/525 280/525| 271/526 254/526 280/526| 281/527 282/527 260/527| 281/528 272/528 282/528| 272/529 255/529 282/529| 276/530 283/530 257/530| 276/531 273/531 283/531| 273/532 261/532 283/532| 278/533 284/533 258/533| 278/534 275/534 284/534| 275/535 257/535 284/535| 280/536 285/536 259/536| 280/537 277/537 285/537| 277/538 258/538 285/538| 282/539 286/539 260/539| 282/540 279/540 286/540| 279/541 259/541 286/541| 274/542 287/542 261/542| 274/543 281/543 287/543| 281/544 260/544 287/544| 288/545 289/545 262/545| 288/546 283/546 289/546| 283/547 261/547 289/547| 290/548 288/548 262/548| 290/549 284/549 288/549| 284/550 257/550 288/550| 291/551 290/551 262/551| 291/552 285/552 290/552| 285/553 258/553 290/553| 292/554 291/554 262/554| 292/555 286/555 291/555| 286/556 259/556 291/556| 289/557 292/557 262/557| 289/558 287/558 292/558| 287/559 260/559 292/559| + Material.002 + 209/560 222/560 221/560| 210/561 222/561 224/561| 209/562 221/562 226/562| 209/563 226/563 228/563| 209/564 228/564 225/564| 210/565 224/565 231/565| 211/566 223/566 233/566| 212/567 227/567 235/567| 213/568 229/568 237/568| 214/569 230/569 239/569| 210/570 231/570 234/570| 211/571 233/571 236/571| 212/572 235/572 238/572| 213/573 237/573 240/573| 214/574 239/574 232/574| 215/575 241/575 246/575| 216/576 242/576 248/576| 217/577 243/577 249/577| 218/578 244/578 250/578| 219/579 245/579 247/579| 221/580 223/580 211/580| 221/581 222/581 223/581| 222/582 210/582 223/582| 224/583 225/583 214/583| 224/584 222/584 225/584| 222/585 209/585 225/585| 226/586 227/586 212/586| 226/587 221/587 227/587| 221/588 211/588 227/588| 228/589 229/589 213/589| 228/590 226/590 229/590| 226/591 212/591 229/591| 225/592 230/592 214/592| 225/593 228/593 230/593| 228/594 213/594 230/594| 231/595 232/595 219/595| 231/596 224/596 232/596| 224/597 214/597 232/597| 233/598 234/598 215/598| 233/599 223/599 234/599| 223/600 210/600 234/600| 235/601 236/601 216/601| 235/602 227/602 236/602| 227/603 211/603 236/603| 237/604 238/604 217/604| 237/605 229/605 238/605| 229/606 212/606 238/606| 239/607 240/607 218/607| 239/608 230/608 240/608| 230/609 213/609 240/609| 234/610 241/610 215/610| 234/611 231/611 241/611| 231/612 219/612 241/612| 236/613 242/613 216/613| 236/614 233/614 242/614| 233/615 215/615 242/615| 238/616 243/616 217/616| 238/617 235/617 243/617| 235/618 216/618 243/618| 240/619 244/619 218/619| 240/620 237/620 244/620| 237/621 217/621 244/621| 232/622 245/622 219/622| 232/623 239/623 245/623| 239/624 218/624 245/624| 246/625 247/625 220/625| 246/626 241/626 247/626| 241/627 219/627 247/627| 248/628 246/628 220/628| 248/629 242/629 246/629| 242/630 215/630 246/630| 249/631 248/631 220/631| 249/632 243/632 248/632| 243/633 216/633 248/633| 250/634 249/634 220/634| 250/635 244/635 249/635| 244/636 217/636 249/636| 247/637 250/637 220/637| 247/638 245/638 250/638| 245/639 218/639 250/639| 294/640 307/640 306/640| 295/641 307/641 309/641| 294/642 306/642 311/642| 294/643 311/643 313/643| 294/644 313/644 310/644| 295/645 309/645 316/645| 296/646 308/646 318/646| 297/647 312/647 320/647| 298/648 314/648 322/648| 299/649 315/649 324/649| 295/650 316/650 319/650| 296/651 318/651 321/651| 297/652 320/652 323/652| 298/653 322/653 325/653| 299/654 324/654 317/654| 300/655 326/655 331/655| 301/656 327/656 333/656| 302/657 328/657 334/657| 303/658 329/658 335/658| 304/659 330/659 332/659| 306/660 308/660 296/660| 306/661 307/661 308/661| 307/662 295/662 308/662| 309/663 310/663 299/663| 309/664 307/664 310/664| 307/665 294/665 310/665| 311/666 312/666 297/666| 311/667 306/667 312/667| 306/668 296/668 312/668| 313/669 314/669 298/669| 313/670 311/670 314/670| 311/671 297/671 314/671| 310/672 315/672 299/672| 310/673 313/673 315/673| 313/674 298/674 315/674| 316/675 317/675 304/675| 316/676 309/676 317/676| 309/677 299/677 317/677| 318/678 319/678 300/678| 318/679 308/679 319/679| 308/680 295/680 319/680| 320/681 321/681 301/681| 320/682 312/682 321/682| 312/683 296/683 321/683| 322/684 323/684 302/684| 322/685 314/685 323/685| 314/686 297/686 323/686| 324/687 325/687 303/687| 324/688 315/688 325/688| 315/689 298/689 325/689| 319/690 326/690 300/690| 319/691 316/691 326/691| 316/692 304/692 326/692| 321/693 327/693 301/693| 321/694 318/694 327/694| 318/695 300/695 327/695| 323/696 328/696 302/696| 323/697 320/697 328/697| 320/698 301/698 328/698| 325/699 329/699 303/699| 325/700 322/700 329/700| 322/701 302/701 329/701| 317/702 330/702 304/702| 317/703 324/703 330/703| 324/704 303/704 330/704| 331/705 332/705 305/705| 331/706 326/706 332/706| 326/707 304/707 332/707| 333/708 331/708 305/708| 333/709 327/709 331/709| 327/710 300/710 331/710| 334/711 333/711 305/711| 334/712 328/712 333/712| 328/713 301/713 333/713| 335/714 334/714 305/714| 335/715 329/715 334/715| 329/716 302/716 334/716| 332/717 335/717 305/717| 332/718 330/718 335/718| 330/719 303/719 335/719| 479/720 492/720 491/720| 480/721 492/721 494/721| 479/722 491/722 496/722| 479/723 496/723 498/723| 479/724 498/724 495/724| 480/725 494/725 501/725| 481/726 493/726 503/726| 482/727 497/727 505/727| 483/728 499/728 507/728| 484/729 500/729 509/729| 480/730 501/730 504/730| 481/731 503/731 506/731| 482/732 505/732 508/732| 483/733 507/733 510/733| 484/734 509/734 502/734| 485/735 511/735 516/735| 486/736 512/736 518/736| 487/737 513/737 519/737| 488/738 514/738 520/738| 489/739 515/739 517/739| 491/740 493/740 481/740| 491/741 492/741 493/741| 492/742 480/742 493/742| 494/743 495/743 484/743| 494/744 492/744 495/744| 492/745 479/745 495/745| 496/746 497/746 482/746| 496/747 491/747 497/747| 491/748 481/748 497/748| 498/749 499/749 483/749| 498/750 496/750 499/750| 496/751 482/751 499/751| 495/752 500/752 484/752| 495/753 498/753 500/753| 498/754 483/754 500/754| 501/755 502/755 489/755| 501/756 494/756 502/756| 494/757 484/757 502/757| 503/758 504/758 485/758| 503/759 493/759 504/759| 493/760 480/760 504/760| 505/761 506/761 486/761| 505/762 497/762 506/762| 497/763 481/763 506/763| 507/764 508/764 487/764| 507/765 499/765 508/765| 499/766 482/766 508/766| 509/767 510/767 488/767| 509/768 500/768 510/768| 500/769 483/769 510/769| 504/770 511/770 485/770| 504/771 501/771 511/771| 501/772 489/772 511/772| 506/773 512/773 486/773| 506/774 503/774 512/774| 503/775 485/775 512/775| 508/776 513/776 487/776| 508/777 505/777 513/777| 505/778 486/778 513/778| 510/779 514/779 488/779| 510/780 507/780 514/780| 507/781 487/781 514/781| 502/782 515/782 489/782| 502/783 509/783 515/783| 509/784 488/784 515/784| 516/785 517/785 490/785| 516/786 511/786 517/786| 511/787 489/787 517/787| 518/788 516/788 490/788| 518/789 512/789 516/789| 512/790 485/790 516/790| 519/791 518/791 490/791| 519/792 513/792 518/792| 513/793 486/793 518/793| 520/794 519/794 490/794| 520/795 514/795 519/795| 514/796 487/796 519/796| 517/797 520/797 490/797| 517/798 515/798 520/798| 515/799 488/799 520/799| + Material.003 + 360/800 373/800 372/800| 361/801 373/801 375/801| 360/802 372/802 377/802| 360/803 377/803 379/803| 360/804 379/804 376/804| 361/805 375/805 382/805| 362/806 374/806 384/806| 363/807 378/807 386/807| 364/808 380/808 388/808| 365/809 381/809 390/809| 361/810 382/810 385/810| 362/811 384/811 387/811| 363/812 386/812 389/812| 364/813 388/813 391/813| 365/814 390/814 383/814| 366/815 392/815 397/815| 367/816 393/816 399/816| 368/817 394/817 400/817| 369/818 395/818 401/818| 370/819 396/819 398/819| 372/820 374/820 362/820| 372/821 373/821 374/821| 373/822 361/822 374/822| 375/823 376/823 365/823| 375/824 373/824 376/824| 373/825 360/825 376/825| 377/826 378/826 363/826| 377/827 372/827 378/827| 372/828 362/828 378/828| 379/829 380/829 364/829| 379/830 377/830 380/830| 377/831 363/831 380/831| 376/832 381/832 365/832| 376/833 379/833 381/833| 379/834 364/834 381/834| 382/835 383/835 370/835| 382/836 375/836 383/836| 375/837 365/837 383/837| 384/838 385/838 366/838| 384/839 374/839 385/839| 374/840 361/840 385/840| 386/841 387/841 367/841| 386/842 378/842 387/842| 378/843 362/843 387/843| 388/844 389/844 368/844| 388/845 380/845 389/845| 380/846 363/846 389/846| 390/847 391/847 369/847| 390/848 381/848 391/848| 381/849 364/849 391/849| 385/850 392/850 366/850| 385/851 382/851 392/851| 382/852 370/852 392/852| 387/853 393/853 367/853| 387/854 384/854 393/854| 384/855 366/855 393/855| 389/856 394/856 368/856| 389/857 386/857 394/857| 386/858 367/858 394/858| 391/859 395/859 369/859| 391/860 388/860 395/860| 388/861 368/861 395/861| 383/862 396/862 370/862| 383/863 390/863 396/863| 390/864 369/864 396/864| 397/865 398/865 371/865| 397/866 392/866 398/866| 392/867 370/867 398/867| 399/868 397/868 371/868| 399/869 393/869 397/869| 393/870 366/870 397/870| 400/871 399/871 371/871| 400/872 394/872 399/872| 394/873 367/873 399/873| 401/874 400/874 371/874| 401/875 395/875 400/875| 395/876 368/876 400/876| 398/877 401/877 371/877| 398/878 396/878 401/878| 396/879 369/879 401/879| 414/880 427/880 426/880| 415/881 427/881 429/881| 414/882 426/882 431/882| 414/883 431/883 433/883| 414/884 433/884 430/884| 415/885 429/885 436/885| 416/886 428/886 438/886| 417/887 432/887 440/887| 418/888 434/888 442/888| 419/889 435/889 444/889| 415/890 436/890 439/890| 416/891 438/891 441/891| 417/892 440/892 443/892| 418/893 442/893 445/893| 419/894 444/894 437/894| 420/895 446/895 451/895| 421/896 447/896 453/896| 422/897 448/897 454/897| 423/898 449/898 455/898| 424/899 450/899 452/899| 426/900 428/900 416/900| 426/901 427/901 428/901| 427/902 415/902 428/902| 429/903 430/903 419/903| 429/904 427/904 430/904| 427/905 414/905 430/905| 431/906 432/906 417/906| 431/907 426/907 432/907| 426/908 416/908 432/908| 433/909 434/909 418/909| 433/910 431/910 434/910| 431/911 417/911 434/911| 430/912 435/912 419/912| 430/913 433/913 435/913| 433/914 418/914 435/914| 436/915 437/915 424/915| 436/916 429/916 437/916| 429/917 419/917 437/917| 438/918 439/918 420/918| 438/919 428/919 439/919| 428/920 415/920 439/920| 440/921 441/921 421/921| 440/922 432/922 441/922| 432/923 416/923 441/923| 442/924 443/924 422/924| 442/925 434/925 443/925| 434/926 417/926 443/926| 444/927 445/927 423/927| 444/928 435/928 445/928| 435/929 418/929 445/929| 439/930 446/930 420/930| 439/931 436/931 446/931| 436/932 424/932 446/932| 441/933 447/933 421/933| 441/934 438/934 447/934| 438/935 420/935 447/935| 443/936 448/936 422/936| 443/937 440/937 448/937| 440/938 421/938 448/938| 445/939 449/939 423/939| 445/940 442/940 449/940| 442/941 422/941 449/941| 437/942 450/942 424/942| 437/943 444/943 450/943| 444/944 423/944 450/944| 451/945 452/945 425/945| 451/946 446/946 452/946| 446/947 424/947 452/947| 453/948 451/948 425/948| 453/949 447/949 451/949| 447/950 420/950 451/950| 454/951 453/951 425/951| 454/952 448/952 453/952| 448/953 421/953 453/953| 455/954 454/954 425/954| 455/955 449/955 454/955| 449/956 422/956 454/956| 452/957 455/957 425/957| 452/958 450/958 455/958| 450/959 423/959 455/959| +Physics: + Cylinder + radius:0.25 + size:2.0 + origin:0.0117903 0.0311268 0.962411 + mass:6.25 + Sphere + radius:1.3350000381469727 + origin:-0.093534 -0.0233787 2.81849 + mass:237.92705789594712 + +Materials:Material.001 + Ns 96.078431 + Ka 0.000000 0.000000 0.000000 + Kd 0.277363 0.446672 0.072673 + Ks 0.500000 0.500000 0.500000 + Ni 1.000000 + d 1.000000 + illum 2 +Materials:Material.002 + Ns 96.078431 + Ka 0.000000 0.000000 0.000000 + Kd 0.223115 0.223115 0.018523 + Ks 0.500000 0.500000 0.500000 + Ni 1.000000 + d 1.000000 + illum 2 +Materials:Material.003 + Ns 96.078431 + Ka 0.000000 0.000000 0.000000 + Kd 0.640000 0.640000 0.640000 + Ks 0.500000 0.500000 0.500000 + Ni 1.000000 + d 1.000000 + illum 2 +Materials:troc + Ns 96.078431 + Ka 0.000000 0.000000 0.000000 + Kd 0.046244 0.031637 0.010962 + Ks 0.500000 0.500000 0.500000 + Ni 1.000000 + d 1.000000 + illum 2