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
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
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()
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()
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()
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
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()
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()
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")
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()
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)
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()
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
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")
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)
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 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()
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)
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()
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()
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()
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
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()
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 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()
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
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