def addCustomScriptLink(): """ Adds a custom script link to the scene so that all script windows are redrawn whenever the scene is redrawn. """ txt = Text.New(SCRIPTLINK_NAME) txt.write('import Blender\n') txt.write('from Blender import Window\n') txt.write('Window.Redraw(Window.Types.SCRIPT)\n') Scene.GetCurrent().addScriptLink(SCRIPTLINK_NAME, 'Redraw') # do a full scene update Scene.GetCurrent().update(1)
def __init__(self, scene=None, objects=None): self.scene = None self.objects = None try: self.scene = Scene.Get(scene) self.objects = self.scene.objects except (NameError, TypeError): pass if type(scene) == type(Scene.GetCurrent()): self.scene = scene if objects: self.objects = objects
def load_point_set(filename): """Read a point set and duplicate obj for each location. Insert every created object in sc """ Window.WaitCursor(True) sc = Scene.GetCurrent() ref_obj = sc.getActiveObject() #unselect everything except ref for obj in Object.GetSelected(): obj.sel = 0 ref_obj.sel = 1 #read points pts = load(open(filename, 'rb')) for pid, vec in pts.iteritems(): Object.Duplicate() obj = sc.getActiveObject() obj.setLocation(*vec) #return Window.RedrawAll()
def delRegion(self, img): r = self.isRegion(img) if not r: return False (n, x1, y1, width, height) = r mesh = self.obj.getData(mesh=True) panelimage = mesh.faces[0].image try: (pwidth, pheight) = panelimage.size xoff = float(x1) / pwidth yoff = float(y1) / pheight xscale = float(width) / pwidth yscale = float(height) / pheight except: xoff = yoff = 0 xscale = yscale = 1 # Reassign UV mappings back to panel image for obj in Scene.GetCurrent().objects: if obj != self.obj and obj.getType() == "Mesh": mesh2 = obj.getData(mesh=True) if mesh2.faceUV: for face in mesh2.faces: if face.image == img: face.image = panelimage face.uv = [ Vector( [xoff + v.x * xscale, yoff + v.y * yscale]) for v in face.uv ] mesh2.update() mesh.faces[n].image = panelimage img.reload() # blank old region self.obj.removeProperty('x%d' % n) self.obj.removeProperty('y%d' % n) return True
def main(): scn = Scene.GetCurrent() if not scn.objects.context: return PREF_LOC = Draw.Create(0.0) PREF_SIZE = Draw.Create(0.0) PREF_ROT = Draw.Create(0.0) PREF_LINK_AXIS = Draw.Create(0) PREF_X_AXIS = Draw.Create(1) PREF_Y_AXIS = Draw.Create(1) PREF_Z_AXIS = Draw.Create(1) pup_block = [\ ('loc:', PREF_LOC, 0.0, 100.0, 'Amount to randomize the location'),\ ('size:', PREF_SIZE, 0.0, 100.0, 'Amount to randomize the size'),\ ('rot:', PREF_ROT, 0.0, 360.0, 'Amount to randomize the rotation'),\ '',\ ('Link Axis', PREF_LINK_AXIS, 'Use the same random value for each objects XYZ'),\ ('X Axis', PREF_X_AXIS, 'Enable X axis randomization'),\ ('Y Axis', PREF_Y_AXIS, 'Enable Y axis randomization'),\ ('Z Axis', PREF_Z_AXIS, 'Enable Z axis randomization'),\ ] if not Draw.PupBlock('Object Randomize', pup_block): return randomize(scn.objects.context, PREF_LOC.val, PREF_SIZE.val, PREF_ROT.val, PREF_LINK_AXIS.val, PREF_X_AXIS.val, PREF_Y_AXIS.val, PREF_Z_AXIS.val)
def assign_all_objects_to_layer(layer): scn = Scene.GetCurrent() for ob in scn.objects: ob.layers = [ layer, ]
def layer_objects_constraint(root_layout): object_filter = ObjectFilter(scene=Scene.GetCurrent()) layers = root_layout.find_child(name='layers') assign_all_objects_to_layer(layer=20) for layer in layers.children: filtered_objects = None filters = layer.find_child(name='filters') layer_number = layer.find_child(name='layer_number') for child in filters.children: if child.name == 'filter': filter_type = child.find_child(name='filter_type') filter_name = child.find_child(name='filter_name') if filter_type.value == 1: print 'filter data' filtered_objects = object_filter.data( filter_name.value) if filter_type.value == 2: print 'filter name. TO BE IMPLEMENTED' #filtered_objects = object_filter.name_is(filter_name.value) if filter_type.value == 3: print 'filter group. TO BE IMPLEMENTED' try: for ob in filtered_objects: layers = ob.layers layers.append(int(layer_number.label)) ob.layers = layers except TypeError: pass
def main(): scn = Scene.GetCurrent() ob = scn.objects.active if not ob or ob.type != 'Mesh': Draw.PupMenu('Error, no active mesh object, aborting.') return me = ob.getData(mesh=1) PREF_PEAKWEIGHT = Draw.Create(1.0) PREF_ACTIVE_ONLY = Draw.Create(1) PREF_KEEP_PROPORTION = Draw.Create(1) PREF_ARMATURE_ONLY = Draw.Create(0) pup_block= [\ ('Peak Weight:', PREF_PEAKWEIGHT, 0.01, 1.0, 'Upper weight for normalizing.'),\ ('Active Only', PREF_ACTIVE_ONLY, 'Only Normalize groups that have matching bones in an armature (when an armature is used).'),\ ('Proportional', PREF_KEEP_PROPORTION, 'Scale other weights so verts (Keep weights with other groups in proportion).'),\ ('Armature Only', PREF_ARMATURE_ONLY, 'Only Normalize groups that have matching bones in an armature (when an armature is used).'),\ ] if not Draw.PupBlock('Clean Selected Meshes...', pup_block): return actWeightNormalize(me, ob, PREF_PEAKWEIGHT.val, PREF_ACTIVE_ONLY.val, PREF_ARMATURE_ONLY.val, PREF_KEEP_PROPORTION.val)
def main(param_file): Window.WaitCursor(1) camera_parameters = load_camera(param_file) emode = int(Window.EditMode()) if emode: Window.EditMode(0) scene = Scene.GetCurrent() camera_data = create_camera(camera_parameters) scene.objects.new(camera_data) camera = Object.Get(camera_data.name) pose_camera(camera, camera_parameters) scene.objects.camera = camera context = scene.getRenderingContext() context.imageSizeX(int(camera_parameters.getroot().get('Width'))) context.imageSizeY(int(camera_parameters.getroot().get('Height'))) scene.update() Window.RedrawAll() if emode: Window.EditMode(1) Window.WaitCursor(0)
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)
def write_poses(file,ob): if ob.getType() != "Armature": return scn = Scene.GetCurrent() context = scn.getRenderingContext() scene_frames = xrange(context.startFrame(), context.endFrame()+1) file.write('framecount %i\n' % len(scene_frames)) for frame in scene_frames: Blender.Set('curframe', frame) file.write('frame: %i\n' % frame) pose = ob.getPose() for b in pose.bones.values(): file.write('posebone: %s\n' % b.name) for i in b.localMatrix: file.write('lm: %.6f %.6f %.6f %.6f\n' % tuple(i)) file.write('scale: %.6f %.6f %.6f\n' % tuple(b.size)) # file.write('keyframes: %s\n' % ob.name) # for ipo in Blender.Ipo.Get(): # if ipo.getNcurves() == 0: # continue # # adapted from the ogre 3D exporter # # too bad, there is no clean way to get the ipo for a bone :( # file.write('Ipo: %s\n' % ipo.name) # ipoName = ipo.getName() # for c in ipo.curves: # file.write('curve type: %s\n' % c.name) file.write('\n')
def main(): scn = Scene.GetCurrent() ob = scn.objects.active if not ob or ob.type != 'Mesh': Draw.PupMenu('Error, no active mesh object, aborting.') return me = ob.getData(mesh=1) act_group = me.activeGroup PREF_NAME = Draw.Create(act_group + '_copy') PREF_SEL_ONLY = Draw.Create(0) pup_block= [\ ('', PREF_NAME, 0, 31, 'Name of group copy.'),\ ('Only Selected', PREF_SEL_ONLY, 'Only include selected faces in the new grop.'),\ ] if not Draw.PupBlock('New Name...', pup_block): return PREF_NAME = PREF_NAME.val PREF_SEL_ONLY = PREF_SEL_ONLY.val copy_act_vgroup(me, PREF_NAME, PREF_SEL_ONLY) try: me.activeGroup = PREF_NAME except: pass
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 main(): scn= Scene.GetCurrent() ob= scn.objects.active if not ob or ob.type != 'Mesh': Draw.PupMenu('Error, no active mesh object, aborting.') return me= ob.getData(mesh=1) PREF_MAXDIST= Draw.Create(0.0) PREF_STRENGTH= Draw.Create(1.0) PREF_MODE= Draw.Create(0) PREF_ITERATIONS= Draw.Create(1) pup_block= [\ ('Bleed Dist:', PREF_MAXDIST, 0.0, 1.0, 'Set a distance limit for bleeding.'),\ ('Bleed Strength:', PREF_STRENGTH, 0.01, 1.0, 'Bleed strength between adjacent verts weight. 1:full, 0:None'),\ ('Iterations', PREF_ITERATIONS, 1, 20, 'Number of times to run the blending calculation.'),\ ('Contract (Shrink)', PREF_MODE, 'Shrink instead of growing.'),\ ] if not Draw.PupBlock('Grow/Shrink...', pup_block): return actWeightNormalize(me, PREF_MODE.val, PREF_MAXDIST.val, PREF_STRENGTH.val, PREF_ITERATIONS.val)
def main(): # Gets the current scene, there can be many scenes in 1 blend file. sce = Scene.GetCurrent() # Get the active object, there can only ever be 1 # and the active object is always the editmode object. ob_act = sce.objects.active me = ob_act.getData(mesh=1) if not ob_act or ob_act.type != 'Mesh' or not me.faceUV: BPyMessages.Error_NoMeshUvActive() return # Saves the editmode state and go's out of # editmode if its enabled, we cant make # changes to the mesh data while in editmode. is_editmode = Window.EditMode() if is_editmode: Window.EditMode(0) Window.WaitCursor(1) t = sys.time() # Run the mesh editing function seams_from_islands(me) if is_editmode: Window.EditMode(1) # Timing the script is a good way to be aware on any speed hits when scripting print 'UV Seams from Islands finished in %.2f seconds' % (sys.time() - t) Window.WaitCursor(0)
def sc_to_blender(sc): """Export each shape in the scene as a new object :Parameters: - `sc` (Scene) - the scene to transform :Returns Type: None """ bldsc = Scene.GetCurrent() #fill with shapes t = time.time() d = Discretizer() for ind, shp in enumerate(sc): if ind % 10 == 0: print ind, sys.stdout.flush() ob = shp_to_blender(shp, d) bldsc.link(ob) ob.sel = True print print 'Time :', time.time() - t #return print "created" bldsc.update(1) Blender.Redraw() return ob
def __init__(self): self.obj = None try: self.obj = Object.Get(PanelRegionHandler.NAME) # Suppress regeneration of panels in v3.0x Scene.GetCurrent().clearScriptLinks(PanelRegionHandler.NAME) except: pass
def getparents(): global lookup, hierarchy, firstlevel, has_sim, armature, bones, theobject if Window.EditMode(): objects = [Scene.GetCurrent().objects.active] else: objects = Object.GetSelected() for theobject in objects: parent = theobject.parent if not parent or parent.getType() != 'Armature': Draw.PupMenu('Object "%s" is not a child of a bone.' % theobject.name) return None bonename = theobject.getParentBoneName() if not bonename: Draw.PupMenu( 'Object "%s" is the child of an armature. It should be the child of a bone.' % theobject.name) return None thisbones = parent.getData().bones if bonename in thisbones.keys(): bone = thisbones[bonename] else: Draw.PupMenu('Object "%s" has a deleted bone as its parent.' % theobject.name) return None if armature and (parent != armature or bone != bones[0]): Draw.PupMenu( 'You have selected multiple objects with different parents.') return None else: armature = parent bones = [bone] if not bones: return bone = bones[0] while bone.parent: bones.append(bone.parent) bone = bone.parent try: has_sim = False (lookup, hierarchy) = getDatarefs() firstlevel = [] for key in lookup: if lookup[key]: (path, n) = lookup[key] ref = path.split('/') if not ref[0] in firstlevel: firstlevel.append(ref[0]) if len(firstlevel) == 1: firstlevel = hierarchy['sim'].keys() has_sim = True firstlevel.sort(lambda x, y: -cmp(x.lower(), y.lower())) except IOError, e: Draw.PupMenu(str(e)) return None
def render(self): scene = Scene.GetCurrent() script = imp.load_source(self.args['script'], self.args['script_path']) blender_initializer = script.BlenderInitializer() blender_initializer.set_up_render(self.args, scene) self.set_up_render_context(scene) blender_initializer.clean_up()
def addRegion(self, xoff, yoff, width, height): mesh = self.obj.getData(mesh=True) panelimage = mesh.faces[0].image name = 'PanelRegion' for img in Image.get(): # try to re-use existing deleted panel region if img.size == [ width, height ] and img.source == Image.Sources.GENERATED and img.filename == name and not self.isRegion( img): break else: img = Image.New(name, width, height, 24) for y in range(height): for x in range(width): rgba = panelimage.getPixelI(xoff + x, yoff + y) if not rgba[3]: img.setPixelI(x, y, (102, 102, 255, 255)) # hilite transparent else: img.setPixelI(x, y, rgba[:3] + [255]) img.pack() for n in range(1, PanelRegionHandler.REGIONCOUNT + 1): if mesh.faces[n].image == panelimage: mesh.faces[n].image = img self.obj.addProperty('x%d' % n, xoff) self.obj.addProperty('y%d' % n, yoff) (width, height) = img.size (pwidth, pheight) = panelimage.size xoff = float(xoff) / pwidth yoff = float(yoff) / pheight xscale = float(pwidth) / width yscale = float(pheight) / height # Assign UV mappings from panel image for obj in Scene.GetCurrent().objects: if obj != self.obj and obj.getType() == "Mesh": mesh2 = obj.getData(mesh=True) if mesh2.faceUV: for face in mesh2.faces: if face.image == panelimage: uv = [] for v in face.uv: x = (v.x - xoff) * xscale y = (v.y - yoff) * yscale if not -UV.LIMIT <= x <= 1 + UV.LIMIT or not -UV.LIMIT <= y <= 1 + UV.LIMIT: break uv.append( Vector(min(max(x, 0), 1), min(max(y, 0), 1))) else: face.uv = uv face.image = img mesh2.update() break return img
def create_topomesh(filename): Window.WaitCursor(True) #current object sc = Scene.GetCurrent() ref_obj = sc.getActiveObject() save_topomesh(filename, ref_obj.data) Window.RedrawAll()
def setSubsurf(): scn = Scene.GetCurrent() # link object to current scene for potential_ob in scn.objects: if potential_ob.name == 'myObj': ob = potential_ob break mods = ob.modifiers mod = mods.append(Modifier.Types.SUBSURF) mod[Modifier.Settings.LEVELS] = 1 mod[Modifier.Settings.RENDLEVELS] = 2
def NewObject(flag): global ob, me, sc if flag == 1: DumpData() DeselectAllObjects() sc = Scene.GetCurrent() cursorpos = Window.GetCursorPos() ob = Object.New('Mesh', 'Cyl_') me = NMesh.New('MyCylMesh') ob.setLocation(cursorpos) ob.link(me) sc.link(ob)
def act_mesh_ob(): scn = Scene.GetCurrent() ob = scn.objects.active if ob == None or ob.type != 'Mesh': BPyMessages.Error_NoMeshActive() return if ob.getData(mesh=1).multires: BPyMessages.Error_NoMeshMultiresEdit() return return ob
def write_ui(filePath): Window.EditMode(0) slashPos = filePath.rfind('\\') directory = filePath[:slashPos + 1] filename = filePath[slashPos + 1:] if not filename.lower().endswith('.drk'): filename += '.drk' if not BPyMessages.Warning_SaveOver(filePath): return context = Scene.GetCurrent().getRenderingContext() orig_frame = Blender.Get('curframe') Blender.Set('curframe', context.startFrame()) write(directory, filename, Scene.GetCurrent().objects) Blender.Set('curframe', orig_frame) # Restore old active scene. Window.WaitCursor(0)
def create_topomesh(filename): Window.WaitCursor(True) #link to object obj = Object.New('Mesh', 'myObj') #link to scene sc = Scene.GetCurrent() sc.link(obj) me = load_topomesh(filename, obj) Window.RedrawAll()
def render(path="//myRenderdir/", imageName="001.tga"): scn = Scene.GetCurrent() context = scn.getRenderingContext() Render.EnableDispWin() context.extensions = True context.renderPath = path context.sizePreset(Render.PC) context.imageType = Render.TARGA context.render() context.saveRenderedImage(imageName) Render.CloseRenderWindow()
def loadmodel(file, words, data): def nwprop(file, words, data): data['nwnprops'].write('SCENE.%s=%s\n'%(words[0], words[1])) modeldict={'beginmodelgeom': loadgeometry, 'donemodel': linereaderbreak, 'classification': nwprop, 'supermodel': nwprop, 'newanim': loadanim} data={'scene': Scene.getCurrent(), 'nwnprops': Text.New('nwnprops'), 'animnextframe': 2, 'nwnanims': Text.New('nwnanims'), 'fps': 30} raise ExitLineReader(linereader(file, modeldict, data)) # Seems I can't modify the frame settings. #data['scene'].startFrame(1) #data['scene'].currentFrame(1) #data['scene'].endFrame(data['animnextframe']-1) data['scene'].update()
def removeCustomScriptLink(): """ Removes the custom script link (if it is present) from the scene. """ try: txt = Text.Get(SCRIPTLINK_NAME) except NameError: # script link not found return scene = Scene.GetCurrent() slinks = scene.getScriptLinks('Redraw') if slinks is not None: scene.clearScriptLinks() if SCRIPTLINK_NAME in slinks: slinks.remove(SCRIPTLINK_NAME) for link in slinks: scene.addScriptLink(link, 'Redraw') Text.unlink(txt) # do a full scene update Scene.GetCurrent().update(1)
def export(filename): trace("Exporting to file: '" + filename) verbose("Configuration:") indent() verbose("_rotationLimit='%f'" % _rotationLimit) verbose("_quaternionWLimit='%f'" % _quaternionWLimit) unindent() exporter = XamlExporter() fileout = open(filename, 'w') try: exporter.writeScene(Scene.GetCurrent(), fileout) finally: fileout.close()
def saveblend(): """ Save the current .blend file as a temporary file. @returns: (scn,context,scenename,name) scn is the current scene object context the current rendering context scenename the name of the current scene name the name of the temporary file @warning: sideeffect: sets displaymode to 0 (=rendering in imagewindow) to prevent rendering window popping up """ Blender.PackAll() from tempfile import mkstemp fd,name = mkstemp(suffix = '.blend') os.close(fd) Blender.Set('compressfile',True) Blender.Save(name,1) scn = Scene.getCurrent() scenename = scn.getName() context = scn.getRenderingContext() context.displayMode=0 #to prevent an additional render window popping up return (scn,context,scenename,name)
for line in lines[1:i-1] : lineSplit = line.split() orientationTimeStamp.append( float(lineSplit[0]) / 1000000000.0 ) orientationXValues.append( float(lineSplit[1]) ) orientationYValues.append( float(lineSplit[2]) ) orientationZValues.append( float(lineSplit[3]) ) for line in lines[i+1:] : lineSplit = line.split() accelerationTimeStamp.append( float(lineSplit[0]) / 1000000000.0 ) accelerationXValues.append( float(lineSplit[1]) ) accelerationYValues.append( float(lineSplit[2]) ) accelerationZValues.append( float(lineSplit[3]) ) #Create the camera cur = Scene.getCurrent() cam = Camera.New('persp') cam.lens = 35.0 cam.setDrawSize(1.0) obj = Object.New('Camera') obj.name = "imported_camera" obj.link(cam) cur.link(obj) cur.setCurrentCamera(obj) ipo = Blender.Ipo.New('Object','camera_ipo') obj.setIpo(ipo) locx = ipo.addCurve('LocX') locx.setInterpolation('Linear')
# Get properties from the 'nwnprops' text. Props.parse() # Get logging. logfile = Props.getlogfile() if logfile: openlogfile(logfile) # Some banner stuff right here... putlog(NBLog.SPAM, "NeverBlender Blender->MDL export script") putlog(NBLog.SPAM, "by Urpo Lankinen, 2003") # Get the scene, and figure out which objects are whose children. geometry = Props.getgeometry() if(not geometry): scn = Scene.getCurrent() else: putlog(NBLog.INFO, "Getting geometry from %s" % geometry) scn = Scene.Get(geometry) if(not scn): putlog(NBLog.CRITICAL, "Error: Can't find the scene with the geometry.") exit scnobjchilds = SceneHelpers.scenechildren(scn) # Get the base object name. model = Props.getbaseobjectname() putlog(NBLog.INFO, "Base object: %s" % model) # Some sanity checking... if not scnobjchilds.has_key(model): putlog(NBLog.CRITICAL,
def exporter(self, strNomFichierXML): print "----- debut export ----" # Récupération du fichier XML à patcher et vérification de son existence if not os.path.isfile(strNomFichierXML): strM = "Attention|Le fichier XML n'existe pas (%s)" % (strNomFichierXML) Draw.PupMenu(strM) print strM return # Récupération de réglages complémentaires EXPORT_FICHIERS_OBJ_VISU = Draw.Create(0) EXPORT_FICHIERS_OBJ_COLLISION = Draw.Create(0) # Récupération des options de l'utilisateur pup_block = [] pup_block.append("Choix des informations à exporter :") pup_block.append( ( "Maillages visualisation", EXPORT_FICHIERS_OBJ_VISU, "Enregistrer les maillages dans le dossier de visualisation", ) ) pup_block.append( ( "Maillages collision", EXPORT_FICHIERS_OBJ_COLLISION, "Enregistrer les maillages dans le dossier de collision", ) ) if not Draw.PupBlock("Choix des informations à exporter", pup_block): return # Parcours de la scène à la recherche des objets à traiter Window.WaitCursor(1) scene = Scene.getCurrent() lst_obj = scene.objects fxStr = Xstring() fxFichier = Xfile() fxExportFichiers3D = CExport_fichiers3D() # - parcours des objets de la scène et mise à jour du fichier XML solide = Solide() solide.setParametresXML(strNomFichierXML) for obj in lst_obj: # obj = lst_obj[0] if obj.getType() == "Mesh": strNom = obj.getName() print strNom solide.setParametresObjet(obj) solide.afficher() strNomFichierObj_visuel = fxFichier.concatenerChemins(self.strChemin_modeles_visuels_, strNom + ".obj") strNomFichierObj_collision = fxFichier.concatenerChemins( self.strChemin_modeles_collision_, strNom + ".obj" ) if EXPORT_FICHIERS_OBJ_VISU.val == 1: fxExportFichiers3D.writeObj(obj, strNomFichierObj_visuel) else: print 'Pas d\'enregistrement du fichier "%s"' % (strNomFichierObj_visuel) if EXPORT_FICHIERS_OBJ_COLLISION.val == 1: fxExportFichiers3D.writeObj(obj, strNomFichierObj_collision) else: print 'Pas d\'enregistrement du fichier "%s"' % (strNomFichierObj_collision) # - Patch du fichier XML (positions, couleurs, min et max pour les "regular grid") solide.mettre_fichier_XML_a_jour() # ---->>>>>>>> Window.WaitCursor(0) return
def G3DLoader(filename): #Main Import Routine global imported, sceneID print "\nNow Importing File : " + filename fileID = open(filename,"rb") header = G3DHeader(fileID) print "\nHeader ID : " + header.id print "Version : " + str(header.version) if header.id != "G3D": print "This is Not a G3D Model File" fileID.close return if header.version not in (3, 4): print "The Version of this G3D File is not Supported" fileID.close return in_editmode = Blender.Window.EditMode() #Must leave Editmode when active if in_editmode: Blender.Window.EditMode(0) sceneID=Scene.getCurrent() #Get active Scene scenecontext=sceneID.getRenderingContext() #To Access the Start/Endframe its so hidden i searched till i got angry :-) basename=str(Blender.sys.makename(filename,"",1)) #Generate the Base Filename without Path + extension imported = [] maxframe=0 if header.version == 3: modelheader = G3DModelHeaderv3(fileID) print "Number of Meshes : " + str(modelheader.meshcount) for x in xrange(modelheader.meshcount): meshheader = G3DMeshHeaderv3(fileID) meshheader.isv4 = False print "\nMesh Number : " + str(x+1) print "framecount : " + str(meshheader.framecount) print "normalframecount : " + str(meshheader.normalframecount) print "texturecoordframecount: " + str(meshheader.texturecoordframecount) print "colorframecount : " + str(meshheader.colorframecount) print "pointcount : " + str(meshheader.vertexcount) print "indexcount : " + str(meshheader.indexcount) print "texturename : " + str(meshheader.texturefilename) print "hastexture : " + str(meshheader.hastexture) print "istwosided : " + str(meshheader.istwosided) print "customalpha : " + str(meshheader.customalpha) meshheader.meshname = basename+str(x+1) #Generate Meshname because V3 has none if meshheader.framecount > maxframe: maxframe = meshheader.framecount #Evaluate the maximal animationsteps meshdata = G3DMeshdataV3(fileID,meshheader) createMesh(filename,meshheader,meshdata) fileID.close print "Imported Objects: ",imported scenecontext.startFrame(1) #Yeah finally found this Options :-) scenecontext.endFrame(maxframe) #Set it correctly to the last Animationstep :-)))) Blender.Set("curframe",1) #Why the Heck are the above Options not here accessible ???? anchor = Object.New("Empty",basename) #Build an "empty" to Parent all meshes to it for easy handling sceneID.link(anchor) #Link it to current Scene anchor.makeParent(imported) #Make it Parent for all imported Meshes anchor.sel = 1 #Select it if in_editmode: Blender.Window.EditMode(1) # Be nice and restore Editmode when was active return if header.version == 4: modelheader = G3DModelHeaderv4(fileID) print "Number of Meshes : " + str(modelheader.meshcount) for x in xrange(modelheader.meshcount): meshheader = G3DMeshHeaderv4(fileID) meshheader.isv4 = False print "\nMesh Number : " + str(x+1) print "meshname : " + str(meshheader.meshname) print "framecount : " + str(meshheader.framecount) print "vertexcount : " + str(meshheader.vertexcount) print "indexcount : " + str(meshheader.indexcount) print "diffusecolor : %1.6f %1.6f %1.6f" %meshheader.diffusecolor print "specularcolor : %1.6f %1.6f %1.6f" %meshheader.specularcolor print "specularpower : %1.6f" %meshheader.specularpower print "opacity : %1.6f" %meshheader.opacity print "properties : " + str(meshheader.properties) print "textures : " + str(meshheader.textures) print "texturename : " + str(meshheader.texturefilename) if len(meshheader.meshname) ==0: #When no Meshname in File Generate one meshheader.meshname = basename+str(x+1) if meshheader.framecount > maxframe: maxframe = meshheader.framecount #Evaluate the maximal animationsteps meshdata = G3DMeshdataV4(fileID,meshheader) createMesh(filename,meshheader,meshdata) fileID.close scenecontext.startFrame(1) #Yeah finally found this Options :-) scenecontext.endFrame(maxframe) #Set it correctly to the last Animationstep :-)))) Blender.Set("curframe",1) #Why the Heck are the above Options not here accessible ???? anchor = Object.New("Empty",basename) #Build an "empty" to Parent all meshes to it for easy handling sceneID.link(anchor) #Link it to current Scene anchor.makeParent(imported) #Make it Parent for all imported Meshes anchor.sel = 1 #Select it if in_editmode: Blender.Window.EditMode(1) # Be nice and restore Editmode when was active print "Created a empty Object as 'Grip' where all imported Objects are parented to" print "To move the complete Meshes only select this empty Object and move it" print "All Done, have a good Day :-)\n\n" return
def Import(fileName): log.info("Starting ...") log.info("Importing MD3 model: %s", fileName) pathName = StripGamePath(StripModel(fileName)) log.info("Shader path name: %s", pathName) modelName = StripExtension(StripPath(fileName)) log.info("Model name: %s", modelName) # read the file in file = open(fileName,"rb") md3 = md3Object() md3.Load(file, log) md3.Dump(log) file.close() scene = Scene.getCurrent() for k in range(0, md3.numSurfaces): surface = md3.surfaces[k] # create a new mesh mesh = Mesh.New(surface.name) #uv = [] uvList = [] # make the verts for i in range(0, surface.numVerts): mesh.verts.extend( [surface.verts[i].xyz] ) # make the faces for i in range(0, surface.numTriangles): mesh.faces.extend( surface.triangles[i].indexes ) # use faceUV mesh.faceUV=True # extend ignores redundant faces log.info("Redundant faces for %s: %i", surface.name , surface.numTriangles-len(mesh.faces) ) # make the UV list for tex_coord in surface.uv: u = tex_coord.u v = tex_coord.v uv = Mathutils.Vector([u,v]) uvList.append(uv) # import uv log.info("uv") for i in range(0, len(mesh.faces)): uvData = [] uvData.append(uvList[surface.triangles[i].indexes[0]]) uvData.append(uvList[surface.triangles[i].indexes[1]]) uvData.append(uvList[surface.triangles[i].indexes[2]]) mesh.faces[i].uv = uvData # set smooth mesh.faces[i].smooth=1 # add object log.info("addobj") meshObject = Object.New('Mesh',surface.name) meshObject.link(mesh) scene.link(meshObject) # animate the verts through keyframe animation log.info("anim") for i in range(0, surface.numFrames): # update the vertices for j in range(0, surface.numVerts): # i*sufrace.numVerts+j=where in the surface vertex list the vert position for this frame is #x = surface.verts[(i * surface.numVerts) + j].xyz[0] #y = surface.verts[(i * surface.numVerts) + j].xyz[1] #z = surface.verts[(i * surface.numVerts) + j].xyz[2] # put the vertex in the right spot #mesh.verts[j].co[0] = x #mesh.verts[j].co[1] = y #mesh.verts[j].co[2] = z xyz = Mathutils.Vector(surface.verts[(i * surface.numVerts) + j].xyz) mesh.verts[j].co = xyz meshObject.insertShapeKey() #select all and remove doubles mesh.sel=1 mesh.remDoubles(0.0) # create materials for surface log.info("shade") for i in range(0, surface.numShaders): # create new material if necessary matName = StripExtension(StripPath(surface.shaders[i].name)) if matName == "" : matName = "no_texture" try: mat = Material.Get(matName) except: log.info("Creating new material: %s", matName) mat = Material.New(matName) # create new texture texture = Texture.New(matName) texture.setType('Image') # try .tga by default imageName = StripExtension(GAMEDIR + surface.shaders[i].name) + '.tga' try: image = Image.Load(imageName) texture.image = image except: try: imageName = StripExtension(imageName) + '.png' image = Image.Load(imageName) texture.image = image except: try: imageName = StripExtension(imageName) + '.jpg' image = Image.Load(imageName) texture.image = image except: log.warning("Unable to load image: %s", imageName) # texture to material mat.setTexture(0, texture, Texture.TexCo.UV, Texture.MapTo.COL) # append material to the mesh's list of materials mesh.materials += [mat] mesh.update() for key in Key.Get() : key.ipo = Ipo.New('Key', "bleh" + "_ipo") index = 1 for curveName in key.ipo.curveConsts : # print curveName key.ipo.addCurve(curveName) key.ipo[curveName].interpolation = IpoCurve.InterpTypes.CONST key.ipo[curveName].addBezier((0, 0)) key.ipo[curveName].addBezier((index, 1)) key.ipo[curveName].addBezier((index + 1, 0)) index+=1 #for key in Key.Get() : # print key.ipo.curveConsts log.info("tags") # create tags for i in range(0, md3.numTags): tag = md3.tags[i] # this should be an Empty object blenderTag = Object.New("Empty", tag.name); # set ipo ipo = Ipo.New('Object', tag.name + "_ipo") locX = ipo.addCurve('LocX') locY = ipo.addCurve('LocY') locZ = ipo.addCurve('LocZ') rotX = ipo.addCurve('RotX') rotY = ipo.addCurve('RotY') rotZ = ipo.addCurve('RotZ') locX.interpolation=IpoCurve.InterpTypes.LINEAR locY.interpolation=IpoCurve.InterpTypes.LINEAR locZ.interpolation=IpoCurve.InterpTypes.LINEAR rotX.interpolation=IpoCurve.InterpTypes.LINEAR rotY.interpolation=IpoCurve.InterpTypes.LINEAR rotZ.interpolation=IpoCurve.InterpTypes.LINEAR #set ipo for tag blenderTag.setIpo(ipo) scene.link(blenderTag) blenderTag.setLocation(tag.origin) # FIXME this imports only the baseframe tags for i in range(0, md3.numFrames): for j in range(0, md3.numTags): tag = md3.tags[i * md3.numTags + j] #Blender.Set("curframe", i) #tagName = tag.name# + '_' + str(i) #blenderTag = Object.New("Empty", tagName); #tags.append(blenderTag) #scene.link(blenderTag) #blenderTag = tags[j] blenderTag = Object.Get(tag.name) ipo = Ipo.Get(tag.name + "_ipo") locX = ipo[Ipo.OB_LOCX] locY = ipo[Ipo.OB_LOCY] locZ = ipo[Ipo.OB_LOCZ] rotX = ipo[Ipo.OB_ROTX] rotY = ipo[Ipo.OB_ROTY] rotZ = ipo[Ipo.OB_ROTZ] # Note: Quake3 uses left-hand geometry forward = [tag.axis[0], tag.axis[1], tag.axis[2]] left = [tag.axis[3], tag.axis[4], tag.axis[5]] up = [tag.axis[6], tag.axis[7], tag.axis[8]] transform = MatrixSetupTransform(forward, left, up, tag.origin) transform2 = Blender.Mathutils.Matrix(transform[0], transform[1], transform[2], transform[3]) rotation = Blender.Mathutils.Matrix(forward, left, up) rot_Euler = rotation.toEuler() #rot_Euler.unique() #blenderTag.setMatrix(transform2) #print "org: ", tag.origin locX.addBezier((i+1, tag.origin[0])) locY.addBezier((i+1, tag.origin[1])) locZ.addBezier((i+1, tag.origin[2])) rotX.addBezier((i+1, DEG2RAD(rot_Euler.x))) rotY.addBezier((i+1, DEG2RAD(rot_Euler.y))) rotZ.addBezier((i+1, DEG2RAD(rot_Euler.z))) #blenderTag.setLocation(tag.origin) #blenderTag.insertKey(i,"relative") # locate the Object containing the mesh at the cursor location if md3.numSurfaces: cursorPos = Blender.Window.GetCursorPos() #meshObject.setLocation(float(cursorPos[0]), float(cursorPos[1]), float(cursorPos[2])) meshObject.setLocation(float(cursorPos[0]), float(cursorPos[1]), float(cursorPos[2]))