nuclear@39: # Goat3D Blender >2.63 exporter nuclear@33: import bpy; nuclear@36: import ctypes nuclear@36: from ctypes import * nuclear@36: from ctypes.util import find_library nuclear@33: nuclear@33: nuclear@38: def export(oper, ctx, fname): nuclear@38: print("Exporting goat3d file: " + fname) nuclear@33: nuclear@39: lib = init_libgoat() nuclear@39: if not lib: nuclear@39: return False nuclear@39: nuclear@39: # initiaize a goat3d object and start filling it up with data nuclear@39: goat = lib.goat3d_create() nuclear@39: if not goat: nuclear@39: oper.report({'ERROR'}, "Failed to create goat3d object") nuclear@39: return False nuclear@39: nuclear@39: lib.goat3d_set_name(goat, fname.encode('utf-8')) nuclear@39: nuclear@39: export_env(ctx, goat, lib) nuclear@39: export_materials(ctx, goat, lib) nuclear@39: export_meshes(ctx, goat, lib) nuclear@39: export_nodes(ctx, goat, lib) nuclear@39: nuclear@39: lib.goat3d_save(goat, fname.encode('utf-8')) nuclear@39: lib.goat3d_free(goat) nuclear@39: return True nuclear@39: nuclear@39: def export_env(ctx, goat, lib): nuclear@39: return False nuclear@39: nuclear@39: def export_materials(ctx, goat, lib): nuclear@39: return False nuclear@39: nuclear@39: def export_meshes(ctx, goat, lib): nuclear@39: print("exporting " + str(len(ctx.scene.objects)) + " objects") nuclear@39: for obj in ctx.scene.objects: nuclear@39: if obj.type != 'MESH': nuclear@39: continue nuclear@39: nuclear@39: mesh = obj.data nuclear@39: # make sure we get a tesselated mesh nuclear@39: mesh.update(calc_tessface = True) nuclear@39: nuclear@39: triangles = [] nuclear@39: for idx, face in enumerate(mesh.tessfaces): nuclear@39: fverts = face.vertices nuclear@39: triangles.append(fverts[0]) nuclear@39: triangles.append(fverts[1]) nuclear@39: triangles.append(fverts[2]) nuclear@39: nuclear@39: print("creating native array of " + str(len(triangles)) + " triangles") nuclear@39: IndexArrayType = c_int * len(triangles) nuclear@39: indices = IndexArrayType(triangles) nuclear@39: return False nuclear@39: nuclear@39: nuclear@39: def export_nodes(ctx, goat, lib): nuclear@39: return False nuclear@39: nuclear@39: def init_libgoat(): nuclear@38: # load all relevant functions from libgoat3d nuclear@38: libname = find_library("goat3d") nuclear@38: if not libname: nuclear@38: oper.report({'ERROR'}, "Could not find the goat3d library! make sure it's installed.") nuclear@39: return None nuclear@33: nuclear@39: lib = CDLL(libname) nuclear@39: if not lib: nuclear@38: oper.report({'ERROR'}, "Could not open goat3d library!") nuclear@39: return None nuclear@37: nuclear@39: lib.goat3d_create.argtypes = None nuclear@39: lib.goat3d_create.restype = c_void_p nuclear@36: nuclear@39: lib.goat3d_free.argtypes = [c_void_p] nuclear@39: lib.goat3d_free.restype = None nuclear@36: nuclear@39: lib.goat3d_set_name.argtypes = [c_void_p, c_char_p] nuclear@36: nuclear@39: lib.goat3d_set_ambient3f.argtypes = [c_void_p, c_float, c_float, c_float] nuclear@39: lib.goat3d_set_ambient3f.restype = None nuclear@36: nuclear@39: lib.goat3d_add_mtl.argtypes = [c_void_p, c_void_p] nuclear@39: lib.goat3d_add_mtl.restype = None nuclear@36: nuclear@39: lib.goat3d_create_mtl.argtypes = None nuclear@39: lib.goat3d_create_mtl.restype = c_void_p nuclear@36: nuclear@39: lib.goat3d_set_mtl_name.argtypes = [c_void_p, c_char_p] nuclear@39: lib.goat3d_set_mtl_name.restype = None nuclear@33: nuclear@39: lib.goat3d_set_mtl_attrib4f.argtypes = [c_void_p, c_char_p, c_float, c_float, c_float, c_float] nuclear@39: lib.goat3d_set_mtl_attrib4f.restype = None nuclear@33: nuclear@39: lib.goat3d_set_mtl_attrib_map.argtypes = [c_void_p, c_char_p, c_char_p] nuclear@39: lib.goat3d_set_mtl_attrib_map.restype = None nuclear@33: nuclear@39: lib.goat3d_add_mesh.argtypes = [c_void_p, c_void_p] nuclear@39: lib.goat3d_add_mesh.restype = None nuclear@33: nuclear@39: lib.goat3d_create_mesh.argtypes = None nuclear@39: lib.goat3d_create_mesh.restype = c_void_p nuclear@38: nuclear@39: lib.goat3d_set_mesh_name.argtypes = [c_void_p, c_char_p] nuclear@39: lib.goat3d_set_mesh_name.restype = None nuclear@38: nuclear@39: lib.goat3d_set_mesh_mtl.argtypes = [c_void_p, c_void_p] nuclear@39: lib.goat3d_set_mesh_mtl.restype = None nuclear@38: nuclear@39: lib.goat3d_set_mesh_attribs.argtypes = [c_void_p, c_int, c_void_p, c_int] nuclear@39: lib.goat3d_set_mesh_attribs.restype = None nuclear@38: nuclear@39: lib.goat3d_set_mesh_faces.argtypes = [c_void_p, c_void_p, c_int] nuclear@39: lib.goat3d_set_mesh_faces.restype = None nuclear@38: nuclear@39: lib.goat3d_add_node.argtypes = [c_void_p, c_void_p] nuclear@39: lib.goat3d_add_node.restype = None nuclear@38: nuclear@39: lib.goat3d_create_node.argtypes = None nuclear@39: lib.goat3d_create_node.restype = c_void_p nuclear@38: nuclear@39: lib.goat3d_set_node_name.argtypes = [c_void_p, c_char_p] nuclear@39: lib.goat3d_set_node_name.restype = None nuclear@38: nuclear@39: lib.goat3d_set_node_object.argtypes = [c_void_p, c_int, c_void_p] nuclear@39: lib.goat3d_set_node_object.restype = None nuclear@38: nuclear@39: lib.goat3d_add_node_child.argtypes = [c_void_p, c_void_p] nuclear@39: lib.goat3d_add_node_child.restype = None nuclear@38: nuclear@39: lib.goat3d_set_node_position.argtypes = [c_void_p, c_float, c_float, c_float, c_long] nuclear@39: lib.goat3d_set_node_position.restype = None nuclear@38: nuclear@39: lib.goat3d_set_node_rotation.argtypes = [c_void_p, c_float, c_float, c_float, c_float, c_long] nuclear@39: lib.goat3d_set_node_rotation.restype = None nuclear@38: nuclear@39: lib.goat3d_set_node_scaling.argtypes = [c_void_p, c_float, c_float, c_float, c_long] nuclear@39: lib.goat3d_set_node_scaling.restype = None nuclear@38: nuclear@39: lib.goat3d_set_node_pivot.argtypes = [c_void_p, c_float, c_float, c_float] nuclear@39: lib.goat3d_set_node_pivot.restype = None nuclear@38: nuclear@39: lib.goat3d_save.argtypes = [c_void_p, c_char_p] nuclear@39: return lib