# HG changeset patch # User John Tsiombikas # Date 1381165377 -10800 # Node ID 60f2037680eeb45f72293500918adbb3bf82a34d # Parent d259a5094390a85fae8f318eb3de63db86eb76c7 split the exporter into two files to make it more readable (and maybe make an importer too at some point?) diff -r d259a5094390 -r 60f2037680ee .hgignore --- a/.hgignore Sun Oct 06 17:42:43 2013 +0300 +++ b/.hgignore Mon Oct 07 20:02:57 2013 +0300 @@ -15,3 +15,4 @@ goatprim$ goatview$ ass2goat$ +__pycache__ diff -r d259a5094390 -r 60f2037680ee exporters/blendgoat/Makefile --- a/exporters/blendgoat/Makefile Sun Oct 06 17:42:43 2013 +0300 +++ b/exporters/blendgoat/Makefile Mon Oct 07 20:02:57 2013 +0300 @@ -1,5 +1,6 @@ +name = blendgoat scriptfile = blendgoat.py -scriptfile_path := $(shell pwd)/src/$(scriptfile) +srcpath := $(shell pwd)/src ifeq ($(shell uname -s), Darwin) cfgpath = $(HOME)/Library/Application\ Support/Blender @@ -16,18 +17,25 @@ install: @cd $(cfgpath) && \ for i in *; do \ - echo "installing src/$(scriptfile) -> $(cfgpath)/$$i/scripts/addons/$(scriptfile)"; \ - mkdir -p $$i/scripts/addons; \ - rm -f $$i/scripts/addons/$(scriptfile); \ - cp $(scriptfile_path) $$i/scripts/addons/$(scriptfile); \ + echo "installing to $(cfgpath)/$$i/scripts/addons/$(name)"; \ + rm -f $$i/scripts/addons/$(name)/*; \ + mkdir -p $$i/scripts/addons/$(name); \ + cp $(srcpath)/*.py $$i/scripts/addons/$(name)/; \ done .PHONY: link link: + @cd $(cfgpath) && \ + for i in *; do \ + echo "linking to $(cfgpath)/$$i/scripts/addons/$(name)"; \ + mkdir -p $$i/scripts/addons; \ + rm -rf $$i/scripts/addons/$(name); \ + ln -s $(srcpath) $$i/scripts/addons/$(name); \ + done + +.PHONY: uninstall +uninstall: cd $(cfgpath) && \ for i in *; do \ - echo "linking src/$(scriptfile) to $(cfgpath)/$$i/scripts/addons/$(scriptfile)"; \ - mkdir -p $$i/scripts/addons; \ - rm -f $$i/scripts/addons/$(scriptfile); \ - ln -s $(scriptfile_path) $$i/scripts/addons/$(scriptfile); \ + rm -rf $$i/scripts/addons/$(name); \ done diff -r d259a5094390 -r 60f2037680ee exporters/blendgoat/src/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporters/blendgoat/src/__init__.py Mon Oct 07 20:02:57 2013 +0300 @@ -0,0 +1,44 @@ +bl_info = { + "name": "Goat3D scene", + "author": "John Tsiombikas", + "version": (0, 1), + "location": "File > Import-Export", + "description": "Mutant Stargoat, Goat3D scene file format: http://code.google.com/p/goat3d/", + "category": "Import-Export" +} + +if "bpy" in locals(): + import imp + if "export_goat" in locals(): + imp.reload(export_goat) + +import bpy +from bpy_extras.io_utils import ExportHelper + +class ExportGoat3D(bpy.types.Operator, ExportHelper): + bl_idname = "export_scene.goat3d" + bl_label = "Export Goat3D Scene" + bl_options = {'PRESET'} + filename_ext = ".goatsce" + filter_glob = bpy.props.StringProperty(default="*.goatsce", options={'HIDDEN'}) + + def execute(self, ctx): + from . import export_goat + if not export_goat.export(self, ctx, self.filepath): + return {'CANCELLED'} + return {'FINISHED'} + +def menu_func(self, ctx): + self.layout.operator_context = 'INVOKE_DEFAULT' + self.layout.operator(ExportGoat3D.bl_idname, text="Goat3D scene export (.goatsce)") + +def register(): + bpy.utils.register_module(__name__) + bpy.types.INFO_MT_file_export.append(menu_func) + +def unregister(): + bpy.utils.unregister_module(__name__) + bpy.types.INFO_MT_file_export.remove(menu_func) + +if __name__ == "__main__": + register() diff -r d259a5094390 -r 60f2037680ee exporters/blendgoat/src/blendgoat.py --- a/exporters/blendgoat/src/blendgoat.py Sun Oct 06 17:42:43 2013 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -# Goat3D Blender >2.5 exporter -import bpy; -from bpy_extras.io_utils import ExportHelper -import ctypes -from ctypes import * -from ctypes.util import find_library -import os - -bl_info = { - "name": "Goat3D scene", - "author": "John Tsiombikas", - "version": (0, 1), - "location": "File > Import-Export", - "description": "Mutant Stargoat, Goat3D scene file format: http://code.google.com/p/goat3d/", - "category": "Import-Export" -} - -class ExportGoat3D(bpy.types.Operator, ExportHelper): - bl_idname = "export_scene.goat3d" - bl_label = "Export Goat3D Scene" - bl_options = {'PRESET'} - filename_ext = ".goatsce" - filter_glob = bpy.props.StringProperty(default="*.goatsce", options={'HIDDEN'}) - - @classmethod - def poll(cls, ctx): - return ctx.object is not None - - def execute(self, ctx): - libname = find_library("goat3d") - if not libname: - self.report({'ERROR'}, "Could not find the goat3d library! make sure it's installed.") - return {'CANCELLED'} - - libgoat = CDLL(libname) - if not libgoat: - self.report({'ERROR'}, "Could not open goat3d library!") - return {'CANCELLED'} - - goat3d_create = libgoat.goat3d_create - goat3d_create.argtypes = None - goat3d_create.restype = c_void_p - - goat3d_free = libgoat.goat3d_free - goat3d_free.argtypes = [c_void_p] - goat3d_free.restype = None - - goat3d_save = libgoat.goat3d_save - goat3d_save.argtypes = [c_void_p, c_char_p] - - print("Exporting goat3d file: " + self.filepath) - - goat = goat3d_create() - if not goat: - self.report({'ERROR'}, "Failed to create goat3d object") - return {'CANCELLED'} - - print(type(goat)) - print(type(self.filepath)) - goat3d_save(goat, c_char_p(self.filepath)) - goat3d_free(goat) - return {'FINISHED'} - -def menu_func(self, ctx): - self.layout.operator_context = 'INVOKE_DEFAULT' - self.layout.operator(ExportGoat3D.bl_idname, text="Goat3D scene export (.goatsce)") - -def register(): - bpy.utils.register_module(__name__) - bpy.types.INFO_MT_file_export.append(menu_func) - -def unregister(): - bpy.utils.unregister_module(__name__) - bpy.types.INFO_MT_file_export.remove(menu_func) - -if __name__ == "__main__": - register() diff -r d259a5094390 -r 60f2037680ee exporters/blendgoat/src/export_goat.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporters/blendgoat/src/export_goat.py Mon Oct 07 20:02:57 2013 +0300 @@ -0,0 +1,130 @@ +# Goat3D Blender >2.5 exporter +import bpy; +import ctypes +from ctypes import * +from ctypes.util import find_library + + +def export(oper, ctx, fname): + print("Exporting goat3d file: " + fname) + + # load all relevant functions from libgoat3d + libname = find_library("goat3d") + if not libname: + oper.report({'ERROR'}, "Could not find the goat3d library! make sure it's installed.") + return False + + libgoat = CDLL(libname) + if not libgoat: + oper.report({'ERROR'}, "Could not open goat3d library!") + return False + + goat3d_create = libgoat.goat3d_create + goat3d_create.argtypes = None + goat3d_create.restype = c_void_p + + goat3d_free = libgoat.goat3d_free + goat3d_free.argtypes = [c_void_p] + goat3d_free.restype = None + + goat3d_set_name = libgoat.goat3d_set_name + goat3d_set_name.argtypes = [c_void_p, c_char_p] + + goat3d_set_ambient3f = libgoat.goat3d_set_ambient3f + goat3d_set_ambient3f.argtypes = [c_void_p, c_float, c_float, c_float] + goat3d_set_ambient3f.restype = None + + goat3d_add_mtl = libgoat.goat3d_add_mtl + goat3d_add_mtl.argtypes = [c_void_p, c_void_p] + goat3d_add_mtl.restype = None + + goat3d_create_mtl = libgoat.goat3d_create_mtl + goat3d_create_mtl.argtypes = None + goat3d_create_mtl.restype = c_void_p + + goat3d_set_mtl_name = libgoat.goat3d_set_mtl_name + goat3d_set_mtl_name.argtypes = [c_void_p, c_char_p] + goat3d_set_mtl_name.restype = None + + goat3d_set_mtl_attrib4f = libgoat.goat3d_set_mtl_attrib4f + goat3d_set_mtl_attrib4f.argtypes = [c_void_p, c_char_p, c_float, c_float, c_float, c_float] + goat3d_set_mtl_attrib4f.restype = None + + goat3d_set_mtl_attrib_map = libgoat.goat3d_set_mtl_attrib_map + goat3d_set_mtl_attrib_map.argtypes = [c_void_p, c_char_p, c_char_p] + goat3d_set_mtl_attrib_map.restype = None + + goat3d_add_mesh = libgoat.goat3d_add_mesh + goat3d_add_mesh.argtypes = [c_void_p, c_void_p] + goat3d_add_mesh.restype = None + + goat3d_create_mesh = libgoat.goat3d_create_mesh + goat3d_create_mesh.argtypes = None + goat3d_create_mesh.restype = c_void_p + + goat3d_set_mesh_name = libgoat.goat3d_set_mesh_name + goat3d_set_mesh_name.argtypes = [c_void_p, c_char_p] + goat3d_set_mesh_name.restype = None + + goat3d_set_mesh_mtl = libgoat.goat3d_set_mesh_mtl + goat3d_set_mesh_mtl.argtypes = [c_void_p, c_void_p] + goat3d_set_mesh_mtl.restype = None + + goat3d_set_mesh_attribs = libgoat.goat3d_set_mesh_attribs + goat3d_set_mesh_attribs.argtypes = [c_void_p, c_int, c_void_p, c_int] + goat3d_set_mesh_attribs.restype = None + + goat3d_set_mesh_faces = libgoat.goat3d_set_mesh_faces + goat3d_set_mesh_faces.argtypes = [c_void_p, c_void_p, c_int] + goat3d_set_mesh_faces.restype = None + + goat3d_add_node = libgoat.goat3d_add_node + goat3d_add_node.argtypes = [c_void_p, c_void_p] + goat3d_add_node.restype = None + + goat3d_create_node = libgoat.goat3d_create_node + goat3d_create_node.argtypes = None + goat3d_create_node.restype = c_void_p + + goat3d_set_node_name = libgoat.goat3d_set_node_name + goat3d_set_node_name.argtypes = [c_void_p, c_char_p] + goat3d_set_node_name.restype = None + + goat3d_set_node_object = libgoat.goat3d_set_node_object + goat3d_set_node_object.argtypes = [c_void_p, c_int, c_void_p] + goat3d_set_node_object.restype = None + + goat3d_add_node_child = libgoat.goat3d_add_node_child + goat3d_add_node_child.argtypes = [c_void_p, c_void_p] + goat3d_add_node_child.restype = None + + goat3d_set_node_position = libgoat.goat3d_set_node_position + goat3d_set_node_position.argtypes = [c_void_p, c_float, c_float, c_float, c_long] + goat3d_set_node_position.restype = None + + goat3d_set_node_rotation = libgoat.goat3d_set_node_rotation + goat3d_set_node_rotation.argtypes = [c_void_p, c_float, c_float, c_float, c_float, c_long] + goat3d_set_node_rotation.restype = None + + goat3d_set_node_scaling = libgoat.goat3d_set_node_scaling + goat3d_set_node_scaling.argtypes = [c_void_p, c_float, c_float, c_float, c_long] + goat3d_set_node_scaling.restype = None + + goat3d_set_node_pivot = libgoat.goat3d_set_node_pivot + goat3d_set_node_pivot.argtypes = [c_void_p, c_float, c_float, c_float] + goat3d_set_node_pivot.restype = None + + goat3d_save = libgoat.goat3d_save + goat3d_save.argtypes = [c_void_p, c_char_p] + + # initiaize a goat3d object and start filling it up with data + goat = goat3d_create() + if not goat: + oper.report({'ERROR'}, "Failed to create goat3d object") + return False + + goat3d_save(goat, fname.encode('utf-8')) + goat3d_free(goat) + return True + +