Exemplo n.º 1
0
 def __init__(self):
     self.credentials = PasswordManager("b2rex")
     self.path = os.path.dirname(Blender.Get('filename'))
     self.pack = 'pack'
     self.username = ''
     self.password = ''
     self.server_url = 'http://delirium:9000'
     self.export_dir = ''
     self.locX = BoundedValueModel(-10000.0, 10000.0, 128.0)
     self.locY = BoundedValueModel(-10000.0, 10000.0, 128.0)
     self.locZ = BoundedValueModel(-1000.0, 1000.0, 20.0)
     self.regenMaterials = True
     self.regenObjects = False
     self.regenTextures = False
     self.regenMeshes = False
     self.kbytesPerSecond = 100
     self.agent_libs_path = ""
     self.pool_workers = 5
     self.rt_budget = 20
     self.next_chat = ""
     self.tools_path = ""
     self.rt_sec_budget = 500
     self.terrainLOD = 1
     self.load()
     return
Exemplo n.º 2
0
def LoadDefaultVals():
	global toggleLookAt, toggleBakeMatrix, toggleSampleAnimation, toggleNewScene, \
	toggleClearScene, toggleTriangles, togglePolygons, toggleExportSelection, \
	scriptsLocation, doImport, defaultFilename, fileButton, valsLoaded, \
	togglePhysics, toggleExportCurrentScene, toggleExportRelativePaths, \
	toggleUseUV, toggleOnlyMainScene, toggleApplyModifiers

	if valsLoaded:
		return None

	colladaReg = Blender.Registry.GetKey('collada',True)
	if not (colladaReg is None):
		fileButton.val = colladaReg.get('path', '')
		fileParts = []
		filePath = "";
		fileParts = fileButton.val.split("\\");
		partCount = len(fileParts);
		if partCount > 0 :
			for i in range(partCount):
				if i == 0:
					filePath = fileParts[i];
				else :
					if i != partCount - 1:
						filePath = filePath + "\\" + fileParts[i];
					else:
						filePath = filePath + "\\";

		blenderFilename = Blender.Get('filename');
		fileParts = []
		fileParts = blenderFilename.split("\\");
		partCount = len(fileParts);
		if partCount > 0 :
			blenderFileOnlyName = fileParts[partCount -1];
			blenderFileOnlyName = blenderFileOnlyName.replace(".blend", ".dae");
			filePath = filePath + blenderFileOnlyName;
		else :
			filePath = filePath + "untitled.dae";


		if len(filePath) > 0 :
			fileButton.val = filePath;

		if doImport:
			toggleOnlyMainScene.val = colladaReg.get('onlyMainScene', False)
			toggleNewScene.val = colladaReg.get('newScene', False)
			toggleClearScene.val = colladaReg.get('clearScene', False)
		else:
			##toggleLookAt.val = colladaReg.get('lookAt', False)
			toggleBakeMatrix.val = colladaReg.get('bakeMatrices', False)
			toggleTriangles.val = colladaReg.get('useTriangles', False)
			togglePolygons.val = colladaReg.get('usePolygons', False)
			toggleExportSelection.val = colladaReg.get('exportSelection', False)
			togglePhysics.val = not colladaReg.get('usePhysics', True)
			toggleExportCurrentScene.val = colladaReg.get('exportCurrentScene', False)
			toggleExportRelativePaths.val = colladaReg.get('exportRelativePaths', True)
			toggleSampleAnimation.val = colladaReg.get('sampleAnimation', False)
			toggleUseUV.val = colladaReg.get('useUV', False)
			#TODO: "toggleOnlyMainScene" left out intentionally by the original plugin author?
			toggleApplyModifiers.val = colladaReg.get('applyModifiers', True)
	valsLoaded = True
Exemplo n.º 3
0
def import_billboard(path):
    '''
    Parse the billboard(.bb) file and construct the rectangular frame one by one
    '''
    # parse file and get the vertex array, texture array and texture's path
    input = open(path, 'r')
    verts, texs, tex_path = parse_file(input)
    input.close()

    # load the tiled texture
    img = Image.Load(tex_path)

    # add frames to current scene
    scn = Scene.GetCurrent()

    # 4 verts and 4 tex per frame
    if False:
        for i in xrange(len(verts) / 4):
            name = 'frame_%d' % i
            frame = construct_frame(name, verts[i * 4:i * 4 + 4],
                                    texs[i * 4:i * 4 + 4], img)
            ob = scn.objects.new(frame, name)

    if True:
        name = Blender.sys.makename(path, strip=1)
        foilage = construct_foilage(name, verts, texs, img)
        ob = scn.objects.new(foilage, name)

    Blender.Redraw()
Exemplo n.º 4
0
    def import_all(self, scene):
        root = self.getRoot()

        reflist1 = []
        # 1st pass - objects containing lights...
        for ref in self.SceneObjects.vector:
            o = root.findref(ref)

            LightInfo = False

            for r in o.data.data1.vector:
                if r.Key.object_type in [0x55, 0x56, 0x57]:
                    LightInfo = True

            if LightInfo:
                o.data.import_all(scene)
            else:
                reflist1.append(ref)

        # 2nd pass - other objects
        for ref in reflist1:
            o = root.findref(ref)
            o.data.import_all(scene)

        Blender.Redraw()
Exemplo n.º 5
0
def fileselection_callback(filename):
    log("Reading mesh file %s..." % filename)

    # is this a mesh file instead of an xml file?
    if (filename.lower().find('.xml') == -1):
        # No. Use the xml converter to fix this
        log("No mesh.xml file. Trying to convert it from binary mesh format.")
        convert_meshfile(filename)
        filename += '.xml'

    dirname = Blender.sys.dirname(filename)
    basename = Blender.sys.basename(filename)

    # parse material files and make up a dictionary: {mat_name:material, ..}
    materials = collect_materials(dirname)

    # prepare the SAX parser and parse the file using our own content handler
    parser = xml.sax.make_parser()
    handler = OgreMeshSaxHandler()
    parser.setContentHandler(handler)
    parser.parse(open(filename))

    # create the mesh from the parsed data and link it to a fresh object
    scene = Blender.Scene.GetCurrent()
    meshname = basename[0:basename.lower().find('.mesh.xml')]
    object = CreateBlenderMesh(meshname, handler.mesh, materials)
    scene.link(object)
    object.select(True)

    log("import completed.")

    Blender.Redraw()
Exemplo n.º 6
0
def new_from_children(parent, processed_objects, image_dict, offset):

    report = ""
    new_children = []
    all_children = []

    siblings = obChildren(parent)
    for ob in siblings:
        allready_processed_object = processed_objects.get(ob.getName())
        if allready_processed_object == None:
            processed_objects[ob.getName()] = ob
            ac, children, creport = new_from_children(ob, processed_objects,
                                                      image_dict, offset)
            if creport != "":
                report = report + creport
            if sculpty.check(ob):
                #print "Copy from ", ob.getName()
                new_object, log = new_from_object(ob, image_dict, offset)
                if new_object != None:
                    if len(children) > 0:
                        Blender.Redraw()
                        new_object.makeParent(children)
                        all_children.extend(ac)
                    new_object.select(False)
                    new_children.append(new_object)
                #else:
                #    print "Warn: copy of [", ob.getName(), "] failed."
            else:
                log = "Warn: Not a sculptie [" + ob.getName(
                ) + "]  (Object not copied)|"

            if log != "":
                print log
                report = report + log
    return all_children, new_children, report
Exemplo n.º 7
0
def bevel():
    """ The main function, which creates the bevel """
    global me, NV, NV_ext, NE, NC, old_faces, old_dist

    ob = act_mesh_ob()
    if not ob: return

    Window.WaitCursor(1)  # Change the Cursor
    t = Blender.sys.time()
    is_editmode = Window.EditMode()
    if is_editmode: Window.EditMode(0)

    me = ob.data

    NV = {}
    #PY23 NO SETS# NV_ext = set()
    NV_ext = {}
    NE = {}
    NC = {}
    old_faces = []

    make_faces()
    make_edges()
    make_corners()
    clear_old()

    old_dist = dist.val
    print '\tbevel in %.6f sec' % (Blender.sys.time() - t)
    me.update(1)
    if is_editmode: Window.EditMode(1)
    Window.WaitCursor(0)
    Blender.Redraw()
Exemplo n.º 8
0
def applyPosesFromLibrary(path, n=0, meshName=None, onlyRot=False):

    mainDir = os.path.dirname(path)
    poseFiles = os.listdir(mainDir)
    homedir = os.path.expanduser('~')

    saveDir = os.path.join(homedir, "poseLibBlender")
    if not os.path.isdir(saveDir):
        os.mkdir(saveDir)

    for poseFile in poseFiles:

        blendFile = os.path.join(saveDir, poseFile + ".blend")

        startEditing()
        vertices = getVertices(n, name=meshName)
        pPath = os.path.join(mainDir, poseFile)
        maketargetlib.loadPoseFromFile(vertices, pPath, 1.00, onlyRot)
        updateVertices(vertices, n, name=meshName)
        endEditing()

        Blender.Save(blendFile)

        startEditing()
        vertices = getVertices(n, name=meshName)
        pPath = os.path.join(mainDir, poseFile)
        maketargetlib.loadPoseFromFile(vertices, pPath, -1.00, onlyRot)
        updateVertices(vertices, n, name=meshName)
        endEditing()
Exemplo n.º 9
0
    def writeAnimationObj(self, obj):
        point_list = []
        ip = obj.ipo
        poi = ip.getCurves()
        for po in poi[0].getPoints():
            a = po.getPoints()
            point_list.append(int(a[0]))

        self.file.write(" Animation {\n")
        self.file.write("  { ")
        self.file.write("%s }\n" % (make_legal_name(obj.name)))
        self.file.write("   AnimationKey { \n")
        self.file.write("   4;\n")
        self.file.write("   %d; \n" % (len(point_list)))
        for fr in point_list:
            self.file.write("   %d;" % (fr))
            self.file.write("16;")
            Blender.Set('curframe', fr)

            #mat_new = self.getLocMat(obj)
            mat_new = obj.matrixLocal
            self.writeFrames(mat_new)

            if fr == point_list[len(point_list) - 1]:
                self.file.write(";\n")
            else:
                self.file.write(",\n")
        self.file.write("   }\n")
        self.file.write("  }\n")
Exemplo n.º 10
0
def main():
    scene = Blender.Scene.GetCurrent()
    ob = scene.objects.active
    Blender.Window.EditMode(0)
    scale_map_uv(ob, False)
    Blender.Window.EditMode(1)
    Blender.Redraw()
Exemplo n.º 11
0
def read(filename):
    '''Read points in x, y, z format from file'''
	#start = time.clock()
	file = open(filename, "rb")
	objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
	me = NMesh.GetRaw()	
	# Collect data from RAW format
	for line in file.readlines():
		try:
			try:
				f1, f2, f3, f4  = map(float, line.split())
			except: # raw triangle so take first three only 
				#f1, f2, f3, f4, f5, f6, f7, f8, f9 = map(float, line.split())
				f1, f2, f3 = map(float, line.split())
			v = NMesh.Vert(f1, f2, f3)
			me.verts.append(v)
		except:
			continue
	NMesh.PutRaw(me, objname)
	Blender.Object.GetSelected()[0].name = objname
	Blender.Redraw()
	Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
	file.close()
	#end = time.clock()
	#seconds = " in %.2f %s" % (end-start, "seconds")
	message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
	meshtools.print_boxed(message)
Exemplo n.º 12
0
def BUTTON(evt):
    global PARAM, alignment, O, stringlist, CVS
    if (evt == 1):
        Exit()
    elif (evt == 2):
        rename()
    elif (evt == 3):
        PARAM, stringlist = renew()

    elif (evt in [5, 6, 7, 8]):
        for k in alignment.iterkeys():
            if alignment[k][1] != evt:
                alignment[k][0].val = 0

    elif (evt in stringlist[0]):
        O[PARAM[stringlist[1][(evt - 9) / 2]][2]].setName(
            PARAM[stringlist[1][(evt - 9) / 2]][4].val)
        PARAM, stringlist = renew()

    elif (evt in stringlist[2]):
        try:
            O[PARAM[stringlist[1][(evt - 9) / 2]][2]].select(
                PARAM[stringlist[1][(evt - 9) / 2]][0].val)
        except:
            pass

    Blender.Redraw()
Exemplo n.º 13
0
 def export(self, bObject, submeshManager, poseManager):
     Log.getSingleton().logInfo(
         "Exporting pose animation \"%s\" of mesh \"%s\"" %
         (self.name, bObject.getData(True)))
     ## submeshes to tracks
     self.trackList = []
     trackList = []
     for submesh in submeshManager:
         trackList.append(PoseAnimationTrack(submesh, poseManager))
     ## frames to times
     frameNumberDict = self._createFrameNumberDict()
     ## export
     timeList = frameNumberDict.keys()
     timeList.sort()
     for time in timeList:
         Blender.Set('curframe', frameNumberDict[time])
         for track in trackList:
             track.addKeyframe(time)
     for track in trackList:
         if (track.nKeyframes() > 0):
             self.trackList.append(track)
     # at least one track?
     if (len(self.trackList) == 0):
         # no pose offsets
         Log.getSingleton().logWarning(
             "Pose animation \"%s\" does not differ from restpose." %
             self.name)
     return
Exemplo n.º 14
0
def write_theme(filename):
	"Write the current theme as a bpython script"

	if not filename.endswith('.py'): filename += '.py'

	fout = file(filename, "w")

	fout.write("""#!BPY

# \"\"\"
# Name: '%s'
# Blender: 242
# Group: 'Themes'
# Tooltip: 'Change current theme'
# \"\"\"

__%s__ = "????"
__%s__ = "2.43"
__%s__ = ["blender"]
__%s__ = \"\"\"\\
You can edit this section to write something about your script that can
be read then with the Scripts Help Browser script in Blender.

Remember to also set author, version and possibly url(s) above.  You can also
define an __email__ tag, check some bundled script's source for examples.
\"\"\"

# This script was automatically generated by the save_theme.py bpython script.
# By default, these generated scripts are released as Public Domain, but you
# are free to change the license of the scripts you generate with
# save_theme.py before releasing them.

import Blender
from Blender.Window import Theme

theme = Theme.New('%s')
""" % (theme.name, "author", "version", "url", "bpydoc", theme.name))

	for tsp in theme.get(): # 
		command = "\n%s = theme.get('%s')" % (tsp, tsp)
		fout.write(command + "\n")
		exec(command)
		exec("vars = dir(%s)" % tsp)
		vars.remove('theme')

		for var in vars:
			v = "%s.%s" % (tsp, var)
			exec("value = %s" % v)
			if type(value) == str:
				fout.write("%s = '%s'\n" % (v, value))
			else:
				fout.write("%s = %s\n" % (v, value))

	fout.write('\nBlender.Redraw(-1)')
	fout.close()
	try:
		Blender.UpdateMenus()
	except:
		Blender.Draw.PupMenu("Warning - check console!%t|Menus could not be automatically updated")
Exemplo n.º 15
0
	def __init__(self, filename):
		cursor = Blender.Window.GetCursorPos()
		self.file = open(filename, "w")
		self.write('<?xml version="1.0"?>\n')
		self.write("<!-- project: %s -->\n" % Blender.Get("filename"))
		self.write("<!-- cursor: %0.12f %0.12f %0.12f -->\n\n" % (cursor[0], cursor[1], cursor[2]))
		self.write("<PropertyList>\n")
		self.write("\t<path>%s.ac</path>\n\n" % BASENAME)
Exemplo n.º 16
0
def getRenderInfo():
	context=scn.getRenderingContext() 
	staframe = context.startFrame()
	endframe = context.endFrame()
	if endframe<staframe: endframe=staframe
	curframe = Blender.Get(CURFRAME)
	debug(90,'Scene is on frame %i and frame range is %i to %i' % (curframe,staframe,endframe))
	return (staframe,endframe,curframe)
Exemplo n.º 17
0
def bevent(evt):
    """
	Handles GUI events.
	"""

    global EVENT_NOEVENT, EVENT_TOGGLE_NORMALS, EVENT_EXPORT, EVENT_EXIT

    if (evt == EVENT_EXIT):
        Exit()

    elif (evt == EVENT_TOGGLE_NORMALS):
        Blender.Redraw()

    elif (evt == EVENT_EXPORT):
        conductExport()
        Blender.Redraw()
        Exit()
Exemplo n.º 18
0
    def WritePoses(self, file, poses=None):
        if poses == None:
            poses = []

        # Write poses
        lastFrame = Blender.Get('curframe')
        for pose in poses:
            Blender.Set('curframe', pose)
            Blender.Redraw()

            # Write frame time to file
            time = (pose - poses[0]) * nMillisecondsPerFrame
            file.write(pack(cByteOrder + "i", time))

            # Write bones to file
            self.WritePose(file)
        Blender.Set('curframe', lastFrame)
Exemplo n.º 19
0
def Select_All_Cameras(evt=None, val=None):
    """ Selects all cameras in the scene, deselects everything else. """
    for ob in scene.objects:
        if ob.type == 'Camera':
            ob.select(True);
        else:
            ob.select(False);
    Blender.Redraw()
Exemplo n.º 20
0
def clearCameras():
    """ Removes all cameras from the scene. """
    cameras = [cam for cam in scene.objects if cam.type == 'Camera']
    
    for cam in cameras:
        scene.objects.unlink(cam)
    
    Blender.Redraw()
def bevent(evt):
    if evt == 1:  #exit
        Exit()

    elif evt == 2:  #button
        makeCameraBoss(levels.val, degrees.val, size.val, capbuffer.val)

    Blender.Redraw()
Exemplo n.º 22
0
 def deiconify(self):
     Blender.Redraw()
     Tkinter.Tk.deiconify(self)
     if self.grab_status() is None:
         if platform == "win32":
             self.grab_set()
         else:
             self.grab_set_global()
Exemplo n.º 23
0
 def writeMatrixOffset(self, bon):
     global chld_obj
     Blender.Set('curframe', 1)
     pose = chld_obj.getPose()
     pos_b = pose.bones[bon.name]
     mat_b = pos_b.poseMatrix
     mat_c = Matrix(mat_b)
     mat_c.invert()
     return mat_c
Exemplo n.º 24
0
def main():
    in_editmode = Blender.Window.EditMode()
    # MUST leave edit mode before changing an active mesh:
    if in_editmode:
        Blender.Window.EditMode(0)
    else:
        try:
            in_editmode = Blender.Get('add_editmode')
        except:
            pass
    image = Blender.Image.GetCurrent()
    if image:
        ob = new_from_map(image, False)
    else:
        Blender.Draw.PupBlock("Can't add Sculptie", ["No current image"])
    if in_editmode:
        Blender.Window.EditMode(1)
    Blender.Redraw()
Exemplo n.º 25
0
def InterfaceDraw():
    Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT)
    Blender.BGL.glEnable(Blender.BGL.GL_BLEND)
    Blender.BGL.glBlendFunc(Blender.BGL.GL_SRC_ALPHA,
                            Blender.BGL.GL_ONE_MINUS_SRC_ALPHA)

    UI[0] = Blender.Draw.String("Author's Name: ", EV_AUTHOR, 5, 25, 400, 20,
                                EXPORTS[0], 255,
                                "The author's name; goes into $MODEL.cfg.")

    UI[1] = Blender.Draw.String("Prepend Name: ", EV_PREPEND, 5, 45, 400, 20,
                                EXPORTS[1], 255,
                                "Prepend all model files with this string.")

    UI[2] = Blender.Draw.Toggle(
        "Export OpenGL", EV_EXPORTGL, 5, 65, 140, 20, EXPORTS[2],
        "Change the up direction to Y; useful for some engines.")

    UI[3] = Blender.Draw.Toggle("Calculate LODS", EV_LOD, 5, 85, 140, 20,
                                EXPORTS[3],
                                "Calculate Cal3D Level Of Detail steps.")

    UI[4] = Blender.Draw.Toggle("Extra Data", EV_EXTRADATA, 5, 105, 140, 20,
                                EXPORTS[4],
                                "Add date, time, etc. into $MODEL.cfg.")

    UI[5] = Blender.Draw.Number(
        "XML Indent:      ", EV_XMLINDENT, 5, 125, 200, 20, EXPORTS[5], 0, 10,
        "Use this level of indentation in the XML files.")

    UI[6] = Blender.Draw.Number(
        "Float Precision: ", EV_FLOATPRE, 5, 145, 200, 20, EXPORTS[6], 3, 20,
        "Use this level of float/double precision (significant digits).")

    UI[7] = Blender.Draw.Number("Animation FPS:   ", EV_ANIMFPS, 5, 165, 200,
                                20, EXPORTS[7], 1, 100, "Frames Per Second")

    UI[8] = Blender.Draw.PushButton(
        "View Stats", EV_VIEW, 5, 5, 200, 20,
        "View the objects and groups the exporter will be aware of.")

    UI[9] = Blender.Draw.PushButton("Quit", EV_CANCEL, 205, 5, 100, 20,
                                    "Oh nos!")

    UI[10] = Blender.Draw.PushButton("WRITE", EV_WRITE, 305, 5, 100, 20,
                                     "Weee!")

    global IMAGE
    if not IMAGE:
        # Don't load the logo if used in non-GUI mode
        IMAGE = Blender.Image.Load(
            os.path.join(Blender.Get("scriptsdir"), "blendercal", "logo.png"))


#    Blender.Draw.Image(IMAGE, 145, 65)

    Blender.BGL.glDisable(Blender.BGL.GL_BLEND)
Exemplo n.º 26
0
 def from_mesh(self, mesh_obj, num_frames=1):
     for i in range(num_frames):
         Blender.Set('curframe', i)
         frame = joe_frame()
         frame.from_mesh(mesh_obj)
         self.frames.append(frame)
     self.num_frames = num_frames
     self.num_faces = len(self.frames[0].faces)
     return self
def doQuit():
    """
    Exactly what happens in here varies from app to app
    """
    if inBlender:
        Blender.Quit()
    else:
        # the catch-all
        sys.exit()
Exemplo n.º 28
0
def export_native(class_name, mesh, ob):
    s = "var BlenderExport = {};\n"
    s += "BlenderExport.%s = {};\n" % (class_name)
    
    vertices = "BlenderExport.%s.vertices = [" % (class_name)
    indices = "BlenderExport.%s.indices = [" % (class_name)
    indexcount = 0;
    
    for f in mesh.faces:
        vertices += "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f," % (f.verts[0].co.x, f.verts[0].co.y, f.verts[0].co.z,f.verts[1].co.x, f.verts[1].co.y, f.verts[1].co.z,f.verts[2].co.x, f.verts[2].co.y, f.verts[2].co.z)
        indexcount += 3
    
    indices += "];\n";
    vertices += "];\n";

    s += vertices
    s += indices
    
    s += "for(var i=0;i<%s;i++) BlenderExport.%s.indices.push(i);\n" % (indexcount, class_name)
    
    if(exp_normals == 1):
        s += "BlenderExport.%s.normals = [" % (class_name)
        for v in mesh.verts: 
            s += "%.6f, %.6f, %.6f," % (v.no.x, v.no.y, v.no.z)
    
        s += "];\n"
    if (mesh.vertexColors):
        s += "BlenderExport.%s.colors = [" % (class_name)
        for face in mesh.faces:
            for (vert, color) in zip(face.verts, face.col):
                s += "%.6f,%.6f,%.6f,%.6f," % ( color.r / 255.0, color.g / 255.0, color.b / 255.0, color.a / 255.0)
        s += "];\n"
    if (mesh.faceUV):
        s += "BlenderExport.%s.texCoords = [" % (class_name)
        for face in mesh.faces:
            s += "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f," % (face.uv[0][0], face.uv[0][1], face.uv[1][0], face.uv[1][1], face.uv[2][0], face.uv[2][1])
        s += "];\n"

    if animation_button.val:
        s += "BlenderExport.%s.frames = [" % (class_name)
        matrix = ob.getMatrix('worldspace')

        for frame in xrange(animation_start.val, animation_end.val):
            Blender.Set('curframe', frame)
            tmpMesh = Mesh.New()
            tmpMesh.getFromObject(ob.name)
            tmpMesh.transform(matrix)
            s+= "["
            for f in tmpMesh.faces:
                for v in f.verts:
                    s += "%.6f,%.6f,%.6f," % (v.co.x, v.co.y, v.co.z)
            
            s += "],"
        s += "];"
    
    return s
Exemplo n.º 29
0
	def export(self, dir=None, file=None, copyTextures=False):
		exportDir = dir or self.dir
		exportFile = file or self.file
		Log.getSingleton().logInfo("Exporting materials \"%s\"" % exportFile)
		f = open(Blender.sys.join(exportDir, exportFile), "w")

		if self.customMaterial :
			# set of material import lines.
			templateImportSet = set()
			# map of template strings.
			templateStringDict = {}
			for material in self.materialsDict.values():
				if isinstance(material, CustomMaterial):
					try:
						template = material.properties['template']
						if type(template) is not str:
							Log.getSingleton().logWarning("Material \"%s\" not assigned to a valid template!" % material.getName())
						else:
							if not(templateStringDict.has_key(template)) :
								Log.getSingleton().logInfo("Loading template \"%s\"" % template)
								templateFile = Blender.sys.join(self.customMaterialTplPath, template + '.tpl')
								if not(Blender.sys.exists(templateFile) == 1):
									Log.getSingleton().logWarning("Material \"%s\" assigned to unknown template \"%s\"!" % (material.getName(), template))
									Log.getSingleton().logWarning("The template file \"%s\" does not exist." % templateFile)
									templateStringDict[template] = ''
								else:
									t = open(templateFile, 'r')
									templateImportSet.add(t.readline())
									templateStringDict[template] = t.read()
									t.close()
							material.setupTemplate(templateStringDict[template])
					except KeyError:
						Log.getSingleton().logWarning("Material \"%s\" is not assigned to a template! It will not be exported!" % (material.getName()))
			# write import lines.
			for importString in templateImportSet:
				f.write(importString)

		for material in self.materialsDict.values():
			material.write(f)
		f.close()
		if copyTextures and os.path.exists(dir):
			baseDirname = os.path.dirname(Blender.Get("filename"))
			for path in self.textureFilesDict.values():
				# convert Blender's relative paths "//" to absolute path
				if (path[0:2] == "//"):
					Log.getSingleton().logInfo("Converting relative image name \"%s\"" % path)
					path = os.path.join(baseDirname, path[2:])
				if os.path.exists(path):
					# copy texture to dir
					Log.getSingleton().logInfo("Copying texture \"%s\"" % path)
					try:
						shutil.copy(path, dir)
					except (IOError, OSError), detail:
						Log.getSingleton().logError("Error copying \"%s\": %s" % (path, str(detail)))
				else:
					Log.getSingleton().logWarning("Can't copy texture \"%s\" because file does not exists!" % path)
def GetAnim():
    global metrices
    global poses

    print "Extracting animation data..."
    crntFra = Blender.Get("curframe")

    MoveToFrame(1)

    pose_bone_names = obj.getPose().bones.keys()

    for pb_nam in pose_bone_names:  # for every pose bone

        poses[pb_nam] = range(GetFramesNum())
        matrices[pb_nam] = []

        for f in range(GetFirstFrame(),
                       GetFramesNum() + 1):  # for every frame of that bone
            MoveToFrame(f)

            pb = obj.getPose().bones[pb_nam]

            found = 0
            i = -1  # set it as -1 cause in case of not exec of the below for
            for i in range(0, len(
                    matrices[pb_nam])):  # for all matrices of tha bone
                if IdenticalMatrices(matrices[pb_nam][i], pb.localMatrix) == 1:
                    found = 1
                    break

            if not found:
                ide_mat = NewMatrix()
                # if the local matrix is the identity matrix then put -1 to save space
                if IdenticalMatrices(pb.localMatrix, ide_mat):
                    i = -1
                else:
                    tmp = NewMatrix()
                    CopyMatrix(pb.localMatrix, tmp)
                    matrices[pb_nam].append(tmp)
                    i = i + 1

            poses[pb_nam][f - 1] = i
        # } end for every frame

        # now do a check
        # check if the bone has moved at all
        ide_mat = NewMatrix()
        if len(matrices[pb_nam]) == 0:
            del poses[pb_nam]

        MoveToFrame(1)
    # end for every bone

    MoveToFrame(crntFra)
    print "Done!\n"
    return 1