summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2012-09-03 22:38:43 +0200
committerPiotr Dziwinski <piotrdz@gmail.com>2012-09-03 22:38:43 +0200
commitdbeb9af45532b3b6cff32747b4a21865dcfe3338 (patch)
treeb5b293d5a5b667c80f7053dd453d65449ad58595 /tools
parent08f1b68ffd3fa0239e9533d5de6a6fe886083756 (diff)
downloadcolobot-dbeb9af45532b3b6cff32747b4a21865dcfe3338.tar.gz
colobot-dbeb9af45532b3b6cff32747b4a21865dcfe3338.tar.bz2
colobot-dbeb9af45532b3b6cff32747b4a21865dcfe3338.zip
Blender script to export models
Diffstat (limited to 'tools')
-rw-r--r--tools/blender-export.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/tools/blender-export.py b/tools/blender-export.py
new file mode 100644
index 0000000..fbaca57
--- /dev/null
+++ b/tools/blender-export.py
@@ -0,0 +1,132 @@
+#
+# Script for exporting Blender models (meshes) to Colobot model files
+# (text format)
+#
+# Copyright (C) 2012, PPC (Polish Portal of Colobot)
+#
+
+import bpy
+import struct
+import array
+
+
+class ExportColobot(bpy.types.Operator):
+ """Exporter to Colobot text format"""
+ bl_idname = "export.colobot"
+ bl_label = "Export to Colobot"
+
+ # Version of format
+ FORMAT_VERSION = 1
+
+ # TODO: set the following in some user-friendly way
+ # or better, read them from custom, per-polygon data
+ # For now, you must make any changes here, as appropriate
+
+ # Render state
+ STATE = 0
+ # Min & max LOD
+ MIN = 0.0
+ MAX = 0.0
+ # Variable tex2
+ VAR_TEX2 = False
+
+ filepath = bpy.props.StringProperty(subtype="FILE_PATH")
+
+ @classmethod
+ def poll(cls, context):
+ return context.object is not None
+
+ def execute(self, context):
+ self.write(context.object, context.scene)
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+ context.window_manager.fileselect_add(self)
+ return {'RUNNING_MODAL'}
+
+ def write(self, object, scene):
+ if (object.type != 'MESH'):
+ self.report({'ERROR'}, 'Only mesh objects can be exported!')
+ return
+
+ for poly in object.data.polygons:
+ if (poly.loop_total > 3):
+ self.report({'ERROR'}, 'Cannot export polygons with > 3 vertices!')
+ return
+
+ file = open(self.filepath, 'w')
+
+
+ file.write('# Colobot text model\n')
+ file.write('\n')
+
+ triangleCount = len(object.data.polygons) * 3
+
+ file.write('### HEAD\n')
+ file.write('version ' + str(ExportColobot.FORMAT_VERSION) + '\n')
+ file.write('total_triangles ' + str(triangleCount) + '\n')
+ file.write('\n')
+ file.write('### TRIANGLES\n')
+
+
+ for poly in object.data.polygons:
+
+ i = 0
+ for loop_index in poly.loop_indices:
+ v = object.data.vertices[object.data.loops[loop_index].vertex_index]
+
+ i = i + 1
+
+ file.write('p' + str(i))
+ file.write(' c ' + str(v.co[0]) + ' ' + str(v.co[1]) + ' ' + str(v.co[2]))
+ file.write(' n ' + str(v.normal[0]) + ' ' + str(v.normal[1]) + ' ' + str(v.normal[2]))
+
+ uv1 = array.array('f', [0.0, 0.0])
+ uv2 = array.array('f', [0.0, 0.0])
+
+ if (len(object.data.uv_layers) >= 1):
+ uv1 = object.data.uv_layers[0].data[loop_index].uv
+ if (len(object.data.uv_layers) >= 2):
+ uv2 = object.data.uv_layers[1].data[loop_index].uv
+
+ file.write(' t1 ' + str(uv1[0]) + ' ' + str(uv1[1]))
+ file.write(' t2 ' + str(uv2[0]) + ' ' + str(uv2[1]))
+ file.write('\n')
+
+ mat = object.data.materials[poly.material_index]
+
+ file.write('mat')
+ file.write(' dif ' + str(mat.diffuse_color[0]) + ' ' + str(mat.diffuse_color[1]) + ' ' + str(mat.diffuse_color[2]))
+ amb = scene.world.ambient_color * mat.ambient
+ file.write(' amb ' + str(amb[0]) + ' ' + str(amb[1]) + ' ' + str(amb[2]))
+ file.write(' spc ' + str(mat.specular_color[0]) + ' ' + str(mat.specular_color[1]) + ' ' + str(mat.specular_color[2]))
+ file.write('\n')
+
+ tex1 = ''
+ tex2 = ''
+
+ if (len(object.data.uv_textures) >= 1):
+ tex1 = bpy.path.basename(object.data.uv_textures[0].data[0].image.filepath)
+ if (len(object.data.uv_textures) >= 2):
+ tex2 = bpy.path.basename(object.data.uv_textures[1].data[0].image.filepath)
+
+ file.write('tex1 ' + tex1 + '\n')
+ file.write('tex2 ' + tex2 + '\n')
+ file.write('var_tex2 ' + 'Y' if ExportColobot.VAR_TEX2 else 'N' + '\n')
+ file.write('min ' + str(ExportColobot.MIN) + '\n')
+ file.write('max ' + str(ExportColobot.MAX) + '\n')
+ file.write('state ' + str(ExportColobot.STATE) + '\n')
+ file.write('\n')
+
+ file.close()
+ self.report({'INFO'}, 'Export OK')
+
+
+# For menu item
+def menu_func(self, context):
+ self.layout.operator_context = 'INVOKE_DEFAULT'
+ self.layout.operator(ExportColobot.bl_idname, text="Colobot (Text Format)")
+
+# Register and add to the file selector
+bpy.utils.register_class(ExportColobot)
+bpy.types.INFO_MT_file_export.append(menu_func)