Exemple #1
0
def writeBone(file,bone,armObj,recurse):
	pose = armObj.getPose()
	file.write('\t\t<bonedef name="%s">\n' % bone.name)
	
	flipMat = Matrix([1,0,0,0],[0,0,-1,0],[0,1,0,0],[0,0,0,1])
	
	# Write each frame
	for f in range(Blender.Get('staframe'),Blender.Get('endframe')+1):
		Blender.Set('curframe',f)
		
		posebone = pose.bones[bone.name]

		poseMatrix = armObj.matrixWorld.copy().invert() * posebone.localMatrix * armObj.matrixWorld
		
		file.write('\t\t\t<frame num="%d"\n' % f)
		
		file.write('\t\t\t\tm00="%.6f" m01="%.6f" m02="%.6f" m03="%.6f"\n' % tuple(poseMatrix[0]))
		file.write('\t\t\t\tm10="%.6f" m11="%.6f" m12="%.6f" m13="%.6f"\n' % tuple(poseMatrix[1]))
		file.write('\t\t\t\tm20="%.6f" m21="%.6f" m22="%.6f" m23="%.6f"\n' % tuple(poseMatrix[2]))
		file.write('\t\t\t\tm30="%.6f" m31="%.6f" m32="%.6f" m33="%.6f"\n' % tuple(poseMatrix[3]))

		file.write('\t\t\t/>\n')

		# Skip bone weight for now, it doesn't seem to affect anything
	
	file.write('\t\t</bonedef>\n')

	if recurse and bone.hasChildren():
		for child in bone.getAllChildren():
			writeBone(file,child,armObj,False)
def write_header(file, filename, scn, worldTable):
    print "Write Header"

    context = scn.getRenderingContext()

    file.write("*3DSMAX_ASCIIEXPORT%s200\n" % (Tab))
    file.write("*COMMENT \"Exported from Blender %s - %s\"\n" %
               (Blender.Get('version'), time.asctime(time.localtime())))
    file.write("*SCENE {\n")
    #file.write("%s*SCENE_FILENAME \"%s\"\n" % (Tab, os.path.basename(Blender.Get('filename'))))
    name = Blender.Get('filename').split('/')[-1].split('\\')[
        -1]  #Blender 2.44
    file.write("%s*SCENE_FILENAME \"%s\"\n" % (Tab, name))

    file.write("%s*SCENE_FIRSTFRAME %d\n" % (Tab, context.startFrame()))
    file.write("%s*SCENE_LASTFRAME %d\n" % (Tab, context.endFrame()))
    file.write("%s*SCENE_FRAMESPEED %d\n" % (Tab, context.framesPerSec()))
    file.write("%s*SCENE_TICKSPERFRAME 160\n" % (Tab))  #Blender has no Ticks?

    file.write(
        "%s*SCENE_BACKGROUND_STATIC %.4f %.4f %.4f\n" %
        (Tab, worldTable['horR'], worldTable['horG'], worldTable['horB']))
    file.write(
        "%s*SCENE_AMBIENT_STATIC %.4f %.4f %.4f\n" %
        (Tab, worldTable['ambR'], worldTable['ambG'], worldTable['ambB']))
    file.write("}\n")
Exemple #3
0
    def __init__(self, **kvargs):
        self.dir = Blender.Get('uscriptsdir')
        self.file = ''
        self.x_zoom = 1.0
        self.y_zoom = 1.0
        self.x_clip = 0
        self.y_clip = 0
        self.clip_width = -1
        self.clip_height = -1
        self.image_block = None
        super(Image, self).__init__(**kvargs)

        # TODO: it would be safer to check the file header
        if self.file.endswith('svg'):
            self.dir = get_icons_dir()

            source_dir = Blender.Get('uscriptsdir')
            svg_path = find_file_path(source_dir, self.file)

            png_name = change_extension(self.file, 'png')
            png_path = os.path.join(self.dir, png_name)

            convert_svg_to_png(svg_path, png_path, self.width, self.height)

            self.file = png_name  # use png version from now on

        self.image_block = load_image(self.dir, self.file)
        self.set_element_dimensions()
def write(filename, objects):
    def veckey3d(v):
        return round(v.x, 6), round(v.y, 6), round(v.z, 6)

    def veckey2d(v):
        return round(v.x, 6), round(v.y, 6)

    print 'OBJ Export path: "%s"' % filename
    temp_mesh_name = '~tmp-mesh'

    time1 = sys.time()
    scn = Scene.GetCurrent()

    file = open(filename, "w")

    # Write Header
    file.write('# Blender3D v%s EOL Armature File: %s\n' %
               (Blender.Get('version'),
                Blender.Get('filename').split('/')[-1].split('\\')[-1]))
    file.write('# www.blender3d.org\n')

    # Get all armatures
    for ob_main in objects:
        for ob, ob_mat in BPyObject.getDerivedObjects(ob_main):
            write_armature(file, ob)
            write_poses(file, ob)

    file.close()

    print "Armature Export time: %.2f" % (sys.time() - time1)
Exemple #5
0
    def getOutputFilename(self, frameNumber, useDate=True):
        scene = self.scene
        render = scene.getRenderingContext()
        if frameNumber == None:
            outDir = Blender.Get("renderdir")
            if outDir == None: outDir = tempfile.gettempdir()
            if useDate:
                from datetime import datetime
                dt = datetime.now()
                outputFile = os.path.join(
                    outDir, 'yafaray-' + dt.strftime("%Y-%m-%d_%H%M%S"))
            else:
                outputFile = os.path.join(outDir, 'yafarayRender')
        # animation, need to determine path + filename
        else:
            outPath = render.renderPath
            if len(outPath) > 0:
                padCount = outPath.count('#')

                if padCount > 0:
                    formatStr = "%0" + str(padCount) + "d"
                    formatStr = formatStr % (frameNumber)
                    outPath = outPath.replace('#', formatStr, 1)
                    outPath = outPath.replace('#', '')
                else:
                    formatStr = "%05d" % (frameNumber)
                    outPath += formatStr
                outputFile = outPath % {'fn': frameNumber}
            else:
                outDir = Blender.Get("renderdir")
                if outDir == None: outDir = tempfile.gettempdir()
                outputFile = os.path.join(
                    outDir, 'yafaray-%(fn)05d' % {'fn': frameNumber})
        outputFile = os.path.abspath(outputFile)
        return outputFile
Exemple #6
0
def button_event(evt):  # gui button events

    global SCREEN, START_SCREEN, SCRIPT_SCREEN
    global BEVT_LINK, BEVT_EMAIL, BEVT_GMENU, BUT_GMENU, SCRIPT_INFO
    global SCROLL_DOWN, FMODE

    if evt >= 100:  # group menus
        for i in range(len(BUT_GMENU)):
            if evt == BEVT_GMENU[i]:
                group = AllGroups[i]
                index = BUT_GMENU[i].val - 1
                if index < 0: return  # user didn't pick a menu entry
                script = group.get_scripts()[BUT_GMENU[i].val - 1]
                if parse_help_info(script):
                    SCREEN = SCRIPT_SCREEN
                    BEVT_LINK = range(20, len(SCRIPT_INFO.d['__url__']) + 20)
                    BEVT_EMAIL = range(50,
                                       len(SCRIPT_INFO.d['__email__']) + 50)
                    Draw.Redraw()
                else:
                    res = Draw.PupMenu(
                        "No help available%t|View Source|Cancel")
                    if res == 1:
                        load_script_text(script)
    elif evt >= 20:
        if not WEBBROWSER:
            Draw.PupMenu(
                'Missing standard Python module%t|You need module "webbrowser" to access the web'
            )
            return

        if evt >= 50:  # script screen email buttons
            email = SCRIPT_INFO.d['__email__'][evt - 50][1]
            webbrowser.open("mailto:%s" % email)
        else:  # >= 20: script screen link buttons
            link = SCRIPT_INFO.d['__url__'][evt - 20][1]
            webbrowser.open(link)
    elif evt == BEVT_VIEWSOURCE:
        if SCREEN == SCRIPT_SCREEN: load_script_text(SCRIPT_INFO.script)
    elif evt == BEVT_EXIT:
        Draw.Exit()
        return
    elif evt == BEVT_BACK:
        if SCREEN == SCRIPT_SCREEN and not FMODE:
            SCREEN = START_SCREEN
            SCRIPT_INFO = None
            SCROLL_DOWN = 0
            Draw.Redraw()
    elif evt == BEVT_EXEC:  # Execute script
        exec_line = ''
        if SCRIPT_INFO.script.userdir:
            exec_line = bsys.join(Blender.Get('uscriptsdir'),
                                  SCRIPT_INFO.script.fname)
        else:
            exec_line = bsys.join(Blender.Get('scriptsdir'),
                                  SCRIPT_INFO.script.fname)

        Blender.Run(exec_line)
Exemple #7
0
def choreoExport(scene, normalize=True):
    SelectedObjects = Blender.Object.GetSelected()
    listeners = Acoustic.getListeners()
    sources = []
    target = None
    buffer = ""
    for source in Acoustic.getSources():
        if source.sel == 1:
            sources.append(source)
    for listener in listeners:
        if listener.sel == 1:
            target = listener
            break
    if target == None or not sources:
        Blender.Draw.PupMenu(
            'You have to select one listener and at least one source objects!')
        return
    allAcousticObjects = Acoustic.getAcousticObjects(scene)
    # print list(allAcousticObjects)
    #TODO: refactor this (checked three times!)
    if normalize == True:
        normalizationOffset, normalizationScale = getNormalizationParameters(
            allAcousticObjects)
    for frame in range(Blender.Get('staframe'), Blender.Get('endframe')):
        Blender.Set('curframe', frame)

        sourceOrientationMatrix = target.mat
        if target.type == 'Camera':  # if the listener is a camera, do a proper rotation acording to conventions: azimuth 0: seeing at x+
            rotationMatrix = Blender.Mathutils.Euler(
                90, 0, -90).toMatrix().invert().resize4x4()
            sourceOrientationMatrix = rotationMatrix * sourceOrientationMatrix

        roll, descention, azimuth = sourceOrientationMatrix.toEuler()

        targetElevation = (-descention) % 360
        if targetElevation > 180:
            targetElevation = targetElevation - 360
        targetRoll = (roll) % 360
        targetAzimuth = (azimuth) % 360
        if normalize == True:
            targetX, targetY, targetZ = normalizePosition(
                listener.mat.translationPart(), normalizationOffset,
                normalizationScale, False)
        else:
            targetX, targetY, targetZ = listener.mat.translationPart()
        sourcesPositions = ""
        for source in sources:
            if source.sel == 1:
                if normalize == True:
                    sourceX, sourceY, sourceZ = normalizePosition(
                        source.mat.translationPart(), normalizationOffset,
                        normalizationScale, False)
                else:
                    sourceX, sourceY, sourceZ = source.mat.translationPart()
                sourcesPositions += " %f\t%f\t%f" % (sourceX, sourceY, sourceZ)
        buffer += ChoreoLineTemplate % vars()
    return buffer
Exemple #8
0
 def writeHeader(self):
     bfile = sys.expandpath(Blender.Get('filename'))
     self.file.write("#VRML V2.0 utf8\n\n")
     self.file.write("# This file was authored with Blender " \
         "(http://www.blender.org/)\n")
     self.file.write("# Blender version %s\n" % Blender.Get('version'))
     self.file.write("# Blender file %s\n" % sys.basename(bfile))
     self.file.write("# Exported using VRML97 exporter " \
         "v1.55 (2006/01/17)\n\n")
def fill_md2_tags(md2_tags, object):
    global g_scale
    Blender.Window.DrawProgressBar(0.0, "Filling MD2 Data")

    # Set header information.
    md2_tags.ident = 844121162
    md2_tags.version = 1
    md2_tags.num_tags += 1

    # Add a name node to the tagnames data structure.
    md2_tags.names.append(md2_tagname(object.name))  # TODO: cut to 64 chars

    # Add a (empty) list of tags-positions (for each frame).
    tag_frames = []

    progress = 0.0
    progressIncrement = 1.0 / md2_tags.num_frames

    # Store currently set frame
    previous_curframe = Blender.Get("curframe")

    frame_counter = 0
    # Fill in each tag with its positions per frame
    print "Blender startframe:", Blender.Get('staframe')
    print "Blender endframe:", Blender.Get('endframe')
    for current_frame in range(Blender.Get('staframe'),
                               Blender.Get('endframe') + 1):
        #print current_frame, "(", frame_counter, ")" # DEBUG
        progress += progressIncrement
        Blender.Window.DrawProgressBar(
            progress,
            "Tag:" + str(md2_tags.num_tags) + " Frame:" + str(frame_counter))

        #add a frame
        tag_frames.append(md2_tag())

        #set blender to the correct frame (so the objects have their new positions)
        Blender.Set("curframe", current_frame - 1)

        # Set first coordiantes to the location of the empty.
        tag_frames[frame_counter].origin = object.getLocation('worldspace')
        # print tag_frames[frame_counter].origin[0], " ",tag_frames[frame_counter].origin[1]," ",tag_frames[frame_counter].origin[2] # Useful for DEBUG (slowdown!)

        matrix = object.getMatrix('worldspace')
        tag_frames[frame_counter].axis1 = (matrix[0][0], matrix[0][1],
                                           matrix[0][2])
        tag_frames[frame_counter].axis2 = (matrix[1][0], matrix[1][1],
                                           matrix[1][2])
        tag_frames[frame_counter].axis3 = (matrix[2][0], matrix[2][1],
                                           matrix[2][2])
        frame_counter += 1

    # Restore curframe from before the calculation.
    Blender.Set("curframe", previous_curframe)

    md2_tags.tags.append(tag_frames)
Exemple #10
0
 def register(self,classObject,Object=None,**kw):
     blenderUIDialog._store("upy_plugin",{self.plugin_name:Object})
     prefdir = Blender.Get('uscriptsdir')
     if prefdir is None:
         prefdir = Blender.Get('scriptsdir')    
     #need to wrote the script as a text file that will be link to the object/scene
     blenderHelper.addTextFile(name=Object.plugin_name,
                             text=self.string_representation)
     scene = blenderHelper.getCurrentScene()
     #should load the script for scene update...
     scene.addScriptLink(Object.plugin_name, "FrameChanged")
Exemple #11
0
 def getFullFileName(self, filename):
     fullFileName = Blender.sys.expandpath(filename)
     if not Blender.sys.exists(fullFileName):
         # Try the sound directory
         baseFilename = Blender.sys.basename(filename)
         fullFileName = Blender.Get('soundsdir') + Blender.sys.sep + baseFilename
         if not Blender.sys.exists(fullFileName):
             # Look in the same directory as the .blend file
             blendfile = Blender.Get('filename')
             fullFileName = Blender.sys.dirname(blendfile) + Blender.sys.sep + baseFilename
             if not Blender.sys.exists(fullFileName):
                 fullFileName = None
     return fullFileName
    def __init__(self):
        self.user_input = ''
        self.current_file = ''
        self.search_dirs = []

        dir = Blender.Get('texturesdir')
        if dir != None and dir != '':
            self.search_dirs.append(dir)

        dir = Blender.sys.dirname(Blender.Get('filename'))
        if dir != None and dir != '':
            print dir
            self.search_dirs.append(dir)
Exemple #13
0
 def fLaunch(dummy):
     if self.error is False:
         print os.path.join(Blender.Get('scriptsdir'), EXPORTER_NAME)
         Blender.Run(
             os.path.join(Blender.Get('scriptsdir'), EXPORTER_NAME))
     else:
         if self.error is True:
             word = "corrected"
         elif self.error is None:
             word = "validated"
         Draw.PupMenu(
             'Launch Error%s|Cannot launch until configuration is %s' %
             ('%t', word))
Exemple #14
0
    def _convertAnimations(self, fixUpAxis):
        if (len(self.animationList) > 0):
            # store current settings
            frameAtExportTime = Blender.Get('curframe')
            actionAtExportTime = self.bArmatureObject.getAction()

            # frames per second
            fps = Blender.Scene.GetCurrent().getRenderingContext(
            ).framesPerSec()

            animationNameList = []
            for animation in self.animationList:
                # warn on morph animation name clash
                animationName = animation.getName()
                if animationName in animationNameList:
                    Log.getSingleton().logWarning("Duplicate animation name \"%s\" for skeleton \"%s\"!" \
                      % (animationName, self.getName()))
                animationNameList.append(animationName)
                # export
                animation.export(fixUpAxis, self, fps)

            # restore current settings
            Blender.Set('curframe', frameAtExportTime)
            if (actionAtExportTime is not None):
                actionAtExportTime.setActive(self.bArmatureObject)
            else:
                self.bArmatureObject.action = None
        return
Exemple #15
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
Exemple #16
0
    def bakeFrames(self, tobake):
        myipoName = tobake.getName()
        debug('Baking frames for scene %s material %s to ipo %s' %
              (bpy.data.scenes.active.getName(), self.material.getName(),
               myipoName))
        ipos = self.getCurves(tobake)
        #TODO: Gui setup idea: myOffset
        # reset action to start at frame 1 or at location
        myOffset = 0  #=1-staframe
        #loop through frames in the animation. Often, there is rollup and the mocap starts late
        staframe, endframe, curframe = getRangeFromIpo(self.material.getIpo())
        for frame in range(staframe, endframe + 1):
            #tell Blender to advace to frame
            Blender.Set(
                'curframe', frame
            )  # computes the constrained location of the 'real' objects

            #using the constrained Loc Rot of the object, set the location of the unconstrained clone. Yea! Clones are FreeMen
            key = self.getColor(
                self.material
            )  #a key is a set of specifed exact channel values (LocRotScale) for a certain frame
            myframe = frame + myOffset
            Blender.Set('curframe', myframe)

            time = Blender.Get('curtime')  #for BezTriple
            ipos = addPoint(time, key,
                            ipos)  #add this data at this time to the ipos
            debug('%s %i %.3f %.2f %.2f %.2f %.2f' %
                  (myipoName, myframe, time, key[0], key[1], key[2], key[3]))
        Blender.Set('curframe', staframe)
        return tobake
Exemple #17
0
 def synchronize(self):
     prefdir = Blender.Get('uscriptsdir')
     if prefdir is None:
         prefdir = Blender.Get('scriptsdir')
     self.helper.addTextFile(name="epmv_synchro",
                             file=prefdir + os.sep +
                             "epmv_blender_update.py")
     scene = self.helper.getCurrentScene()
     #should load the script for scene update...
     if self.synchro_realtime:
         if not hasattr(self, "epmv_synchro") or not self.epmv_synchro:
             scene.addScriptLink("epmv_synchro", "FrameChanged")
             self.epmv_synchro = True
     else:
         scene.clearScriptLinks()
         self.epmv_synchro = False
Exemple #18
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
Exemple #19
0
def load_sculptie(filename):
    time1 = Blender.sys.time()
    Blender.SaveUndoState("Import Sculptie")
    #print "--------------------------------"
    print 'Importing "%s"' % filename
    scene = Blender.Scene.GetCurrent()
    for ob in scene.objects.selected:
        ob.sel = False
    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
    f, e = Blender.sys.splitext(filename)
    e = e.lower()
    if e == '.dae':
        import_collada(filename)
    elif e == '.obj':
        import_obj(filename)
    else:
        try:
            ob = sculpty.open(filename)
        except:
            Blender.Draw.PupBlock(
                "Sculptie Import Error",
                ["Unsupported file type", "Use .dae or an image file"])
    if in_editmode:
        Blender.Window.EditMode(1)
    Blender.Redraw()
    print 'Loaded Sculptmap "%s" in %.4f sec.' % (filename,
                                                  (Blender.sys.time() - time1))
Exemple #20
0
def bakeFrames(ob,myipo): #bakes an object in a scene, returning the IPO containing the curves
	myipoName = myipo.getName()
	debug(20,'Baking frames for scene %s object %s to ipo %s' % (scn.getName(),ob.getName(),myipoName))
	ipos = getCurves(myipo)
	#TODO: Gui setup idea: myOffset
	# reset action to start at frame 1 or at location
	myOffset=0 #=1-staframe
	#loop through frames in the animation. Often, there is rollup and the mocap starts late
	staframe,endframe,curframe = getRenderInfo()
	for frame in range(staframe, endframe+1):
		debug(80,'Baking Frame %i' % frame)
		#tell Blender to advace to frame
		Blender.Set(CURFRAME,frame) # computes the constrained location of the 'real' objects
		if not BATCH: Blender.Redraw() # no secrets, let user see what we are doing
			
		#using the constrained Loc Rot of the object, set the location of the unconstrained clone. Yea! Clones are FreeMen
		key = getLocRot(ob,usrCoord) #a key is a set of specifed exact channel values (LocRotScale) for a certain frame
		key = [a+b for a,b in zip(key, usrDelta)] #offset to the new location

		myframe= frame+myOffset
		Blender.Set(CURFRAME,myframe)
		
		time = Blender.Get('curtime') #for BezTriple
		ipos = addPoint(time,key,ipos) #add this data at this time to the ipos
		debug(100,'%s %i %.3f %.2f %.2f %.2f %.2f %.2f %.2f' % (myipoName, myframe, time, key[0], key[1], key[2], key[3], key[4], key[5]))
	# eye-candy - smoothly rewind the animation, showing now how the clone match moves
	if endframe-staframe <400 and not BATCH:
		for frame in range (endframe,staframe,-1): #rewind
			Blender.Set(CURFRAME,frame) # computes the constrained location of the 'real' objects
			Blender.Redraw()
	Blender.Set(CURFRAME,staframe)
	Blender.Redraw()

	return ipos
Exemple #21
0
def tstMoveOb(ob): # makes a simple LocRot animation of object in the scene
	anim = [
		#Loc      Rot/10
		#
		( 0,0,0, 0, 0, 0), #frame 1 origin
		( 1,0,0, 0, 0, 0), #frame 2
		( 1,1,0, 0, 0, 0),
		( 1,1,1, 0, 0, 0),
		( 1,1,1,4.5,  0,  0),
		( 1,1,1,4.5,4.5,  0),
		( 1,1,1,4.5,4.5,4.5)
		]
	space = COORD_LOCAL
	ipo = createIpo(ob) #create an Ipo and curves for this object
	ipos = getCurves(ipo)
	
	# span this motion over the currently set anim range
	# to set points, i need time but do not know how it is computed, so will have to advance the animation
	staframe,endframe,curframe = getRenderInfo()

	frame = staframe #x position of new ipo datapoint. set to staframe if you want a match
	frameDelta=(endframe-staframe)/(len(anim)) #accomplish the animation in frame range
	for key in anim: #effectively does a getLocRot()
		#tell Blender to advace to frame
		Blender.Set('curframe',frame) # computes the constrained location of the 'real' objects
		time = Blender.Get('curtime')

		ipos = addPoint(time,key,ipos) #add this data at this time to the ipos

		debug(100,'%s %i %.3f %.2f %.2f %.2f %.2f %.2f %.2f' % (ipo.name, frame, time, key[0], key[1], key[2], key[3], key[4], key[5]))
		frame += frameDelta
	Blender.Set(CURFRAME,curframe) # reset back to where we started
	return
Exemple #22
0
def mdd_export_ui(filepath):
    # Dont overwrite
    if not BPyMessages.Warning_SaveOver(filepath):
        return

    scn = bpy.data.scenes.active
    ob_act = scn.objects.active
    if not ob_act or ob_act.type != 'Mesh':
        BPyMessages.Error_NoMeshActive()

    ctx = scn.getRenderingContext()
    orig_frame = Blender.Get('curframe')
    PREF_STARTFRAME = Blender.Draw.Create(int(ctx.startFrame()))
    PREF_ENDFRAME = Blender.Draw.Create(int(ctx.endFrame()))
    PREF_FPS = Blender.Draw.Create(ctx.fps)

    block = [\
    ("Start Frame: ", PREF_STARTFRAME, 1, 30000, "Start Bake from what frame?: Default 1"),\
    ("End Frame: ", PREF_ENDFRAME, 1, 30000, "End Bake on what Frame?"),\
    ("FPS: ", PREF_FPS, 1, 100, "Frames per second")\
    ]

    if not Blender.Draw.PupBlock("Export MDD", block):
        return

    PREF_STARTFRAME, PREF_ENDFRAME=\
     min(PREF_STARTFRAME.val, PREF_ENDFRAME.val),\
     max(PREF_STARTFRAME.val, PREF_ENDFRAME.val)

    print(filepath, ob_act, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS.val)
    mdd_export(filepath, ob_act, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS.val)
    Blender.Set('curframe', orig_frame)
Exemple #23
0
def mdd_import_ui(filepath):

    if BPyMessages.Error_NoFile(filepath):
        return

    scn = Scene.GetCurrent()
    ob_act = scn.objects.active

    if ob_act == None or ob_act.type != 'Mesh':
        BPyMessages.Error_NoMeshActive()
        return

    PREF_IPONAME = Blender.Draw.Create(
        filepath.split('/')[-1].split('\\')[-1].split('.')[0])
    PREF_START_FRAME = Blender.Draw.Create(1)
    PREF_JUMP = Blender.Draw.Create(1)

    block = [\
    ("Ipo Name: ", PREF_IPONAME, 0, 30, "Ipo name for the new shape key"),\
    ("Start Frame: ", PREF_START_FRAME, 1, 3000, "Start frame for the animation"),\
    ("Key Skip: ", PREF_JUMP, 1, 100, "KeyReduction, Skip every Nth Frame")\
    ]

    if not Blender.Draw.PupBlock("Import MDD", block):
        return
    orig_frame = Blender.Get('curframe')
    mdd_import(filepath, ob_act, PREF_IPONAME.val, PREF_START_FRAME.val,
               PREF_JUMP.val)
    Blender.Set('curframe', orig_frame)
def getImageSourcePath(source, filePath):

    # Try and load our texture from 'filePath' (local .dae import path)
    texturesDir = filePath + '/'
    texturesDir = texturesDir.replace('\\', '/')  # Bill Gates!!!
    splitPath = source.split('/')
    if (len(splitPath) > 0):
        fileName = splitPath[len(splitPath) - 1]
        mupp = texturesDir + fileName
        if (Blender.sys.exists(mupp) == 1):
            return mupp

    # File does not exist to try and remove characters from string and see if file exists
    source = source.replace('file://', '')
    if (Blender.sys.exists(source) == 1):
        return source

    source = source.replace('file://.', '')
    if (Blender.sys.exists(source) == 1):
        return source

    # File did not exists so try and load our texture from 'texturesdir'
    texturesDir = Blender.Get('texturesdir')
    texturesDir = texturesDir.replace('\\', '/')  # Bill Gates!!!
    splitPath = source.split('/')
    if (len(splitPath) > 0):
        fileName = splitPath[len(splitPath) - 1]
        source = texturesDir + fileName
        if (Blender.sys.exists(source) == 1):
            return source

    return None
Exemple #25
0
def GetDefaultFilename():
    filename = Blender.Get("filename")

    filename = filename.replace(".blend", "")
    filename += "." + GetExtension()

    return filename
Exemple #26
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)
	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)
Exemple #28
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)
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
Exemple #30
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)