Browse Source

added UVs and Normals to exported mesh and set mesh name as Classname instead of full path

kikko 15 years ago
parent
commit
eaea61c306
1 changed files with 46 additions and 29 deletions
  1. 46 29
      utils/export_threejs.py

+ 46 - 29
utils/export_threejs.py

@@ -10,11 +10,9 @@ import bpy
 def rvec3d(v):
 def rvec3d(v):
     return round(v[0], 6), round(v[1], 6), round(v[2], 6)
     return round(v[0], 6), round(v[1], 6), round(v[2], 6)
 
 
-
 def rvec2d(v):
 def rvec2d(v):
     return round(v[0], 6), round(v[1], 6)
     return round(v[0], 6), round(v[1], 6)
 
 
-
 def write(filename, scene, ob, \
 def write(filename, scene, ob, \
         EXPORT_APPLY_MODIFIERS=True,\
         EXPORT_APPLY_MODIFIERS=True,\
         EXPORT_NORMALS=True,\
         EXPORT_NORMALS=True,\
@@ -24,6 +22,8 @@ def write(filename, scene, ob, \
     if not filename.lower().endswith('.js'):
     if not filename.lower().endswith('.js'):
         filename += '.js'
         filename += '.js'
 
 
+    classname = ob.name
+
     if not ob:
     if not ob:
         raise Exception("Error, Select the object to export")
         raise Exception("Error, Select the object to export")
         return
         return
@@ -70,9 +70,9 @@ def write(filename, scene, ob, \
             active_col_layer = active_col_layer.data
             active_col_layer = active_col_layer.data
 
 
     # incase
     # incase
-    color = uvcoord = uvcoord_key = normal = normal_key = None
+    color = uvcoord = uvcoord_key = normal = normal_key = None      
 
 
-    file.write('var %s = function () {\n\n' % filename)
+    file.write('var %s = function () {\n\n' % classname)
 
 
     file.write('\tvar scope = this;\n\n')
     file.write('\tvar scope = this;\n\n')
 
 
@@ -80,23 +80,36 @@ def write(filename, scene, ob, \
 
 
     for v in mesh.verts:
     for v in mesh.verts:
         file.write('\tv( %.6f, %.6f, %.6f );\n' % (v.co.x, v.co.z, -v.co.y)) # co
         file.write('\tv( %.6f, %.6f, %.6f );\n' % (v.co.x, v.co.z, -v.co.y)) # co
-        """
-        if EXPORT_NORMALS:
-            file.write('%.6f %.6f %.6f ' % v[1]) # no
-        if EXPORT_UV:
-            file.write('%.6f %.6f ' % v) # uv
-        if EXPORT_COLORS:
-            file.write('%u %u %u' % v[3]) # col
-        """
 
 
     file.write('\n')
     file.write('\n')
-
-    for f in mesh.faces:
-        if len(f.verts) == 3:
-            file.write('\tf3( %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2]))
-        else:
-            file.write('\tf4( %d, %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2], f.verts[3]))
-
+    
+    if EXPORT_NORMALS:
+        for f in mesh.faces:
+            if len(f.verts) == 3:
+                file.write('\tf3n( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0], f.verts[1], f.verts[2], f.normal[0], f.normal[1], f.normal[2]))
+            else:
+                file.write('\tf3n( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[3], f.verts[1], f.verts[2], f.normal[0], f.normal[1], f.normal[2]))
+                file.write('\tf3n( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[1], f.verts[3], f.verts[0], f.normal[0], f.normal[1], f.normal[2]))
+    else:
+        for f in mesh.faces:
+            if len(f.verts) == 3:
+                file.write('\tf3( %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2]))
+            else:
+                file.write('\tf3( %d, %d, %d );\n' % (f.verts[2], f.verts[1], f.verts[3]))
+                file.write('\tf3( %d, %d, %d );\n' % (f.verts[0], f.verts[3], f.verts[1]))
+               
+    face_index_pairs = [ (face, index) for index, face in enumerate(mesh.faces)]
+            
+    if EXPORT_UV:
+        file.write('\n')
+        for f, f_index in face_index_pairs:
+            tface = mesh.uv_textures[0].data[f_index]
+            if len(f.verts) == 3:
+                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1]))
+            else:
+                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv4[0], 1.0-tface.uv4[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1]))
+                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv2[0], 1.0-tface.uv2[1], tface.uv4[0], 1.0-tface.uv4[1], tface.uv1[0], 1.0-tface.uv1[1]))
+            
     file.write('\n')
     file.write('\n')
 
 
     file.write('\tfunction v( x, y, z ) {\n\n')
     file.write('\tfunction v( x, y, z ) {\n\n')
@@ -107,14 +120,22 @@ def write(filename, scene, ob, \
     file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c ) );\n\n')
     file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c ) );\n\n')
     file.write('\t}\n\n')
     file.write('\t}\n\n')
 
 
-    file.write('\tfunction f4( a, b, c, d ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face4( a, b, c, d ) );\n\n')
+    file.write('\tfunction f3n( a, b, c, nx, ny, nz ) {\n\n')
+    file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c, new THREE.Vector3( nx, ny, nz ) ) );\n\n')
+    file.write('\t}\n\n')
+
+    file.write('\tfunction uv( u1, v1, u2, v2, u3, v3 ) {\n\n')
+    file.write('\t\tscope.uvs.push( [ \n\n')
+    file.write('\t\t\t new THREE.Vector2( u1, v1 ), \n')
+    file.write('\t\t\t new THREE.Vector2( u2, v2 ), \n')
+    file.write('\t\t\t new THREE.Vector2( u3, v3 ) \n')
+    file.write('\t\t]);\n')
     file.write('\t}\n\n')
     file.write('\t}\n\n')
 
 
     file.write('}\n\n')
     file.write('}\n\n')
 
 
-    file.write('%s.prototype = new THREE.Geometry();\n' % filename)
-    file.write('%s.prototype.constructor = %s;' % (filename, filename))
+    file.write('%s.prototype = new THREE.Geometry();\n' % classname)
+    file.write('%s.prototype.constructor = %s;' % (classname, classname))
 
 
     file.close()
     file.close()
 
 
@@ -134,7 +155,6 @@ class ExportTHREEJS(bpy.types.Operator):
     # List of operator properties, the attributes will be assigned
     # List of operator properties, the attributes will be assigned
     # to the class instance from the operator settings before calling.
     # to the class instance from the operator settings before calling.
 
 
-
     path = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen=1024, default="")
     path = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen=1024, default="")
     check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
     check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
     use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
     use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
@@ -146,7 +166,7 @@ class ExportTHREEJS(bpy.types.Operator):
         return context.active_object != None
         return context.active_object != None
 
 
     def execute(self, context):
     def execute(self, context):
-        # print("Selected: " + context.active_object.name)
+        print("Selected: " + context.active_object.name)
 
 
         if not self.properties.path:
         if not self.properties.path:
             raise Exception("filename not set")
             raise Exception("filename not set")
@@ -176,20 +196,17 @@ class ExportTHREEJS(bpy.types.Operator):
         row.prop(props, "use_uvs")
         row.prop(props, "use_uvs")
         row.prop(props, "use_colors")
         row.prop(props, "use_colors")
 
 
-
 def menu_func(self, context):
 def menu_func(self, context):
     default_path = bpy.data.filename.replace(".blend", ".js")
     default_path = bpy.data.filename.replace(".blend", ".js")
     self.layout.operator(ExportTHREEJS.bl_idname, text="three.js (.js)").path = default_path
     self.layout.operator(ExportTHREEJS.bl_idname, text="three.js (.js)").path = default_path
 
 
-
 def register():
 def register():
     bpy.types.register(ExportTHREEJS)
     bpy.types.register(ExportTHREEJS)
     bpy.types.INFO_MT_file_export.append(menu_func)
     bpy.types.INFO_MT_file_export.append(menu_func)
 
 
-
 def unregister():
 def unregister():
     bpy.types.unregister(ExportTHREEJS)
     bpy.types.unregister(ExportTHREEJS)
     bpy.types.INFO_MT_file_export.remove(menu_func)
     bpy.types.INFO_MT_file_export.remove(menu_func)
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
-    register()
+    register()