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
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
def geometryExport(scene,typeOfGeometry='geometry',skipOthersGeometries=False): buffer=_geometryHeader actors=[] actors=Acoustic.getActors() # print "---------- acoustic actors: %s" % list(actors) # for object in scene.objects: # print "---------- acoustic objects: %s" % list(Acoustic.getAcousticObjects(scene)) for object in Acoustic.getAcousticObjects(scene): if skipOthersGeometries and Acoustic.getObjectSoundTypeGameProperty(object) != typeOfGeometry: continue impedance=None diffusion=None materialName="" print "Reading object: %s" % object.name # data=bpy.data.meshes[object.getData().name] if type(object.getData())!=Blender.Types.NMeshType: print "no mesh, skipping..." continue if actors.count(object)!=0: print "%s is an actor, skipping" % object.name continue materials=Acoustic.getObjectMaterials(object) if (materials==None or materials==[]): print "\tdoesn't contains acoustic materials,", if Acoustic.getObjectSoundTypeGameProperty(object) != typeOfGeometry: print 'no game object property "sound_type"=="%s", skipping...' % typeOfGeometry continue #if doesnt have any acoustic (by name) material, doesnt export print 'WARNING: setting material as "%s", with default acoustic properties (impedance: %s, diff.: %s)' % (_defaultMaterialName,str(_defaultImpedance),str(_defaultDiffusion)) impedance=_defaultImpedance diffusion=_defaultDiffusion materialName=_defaultMaterialName BPyNMesh.ApplySizeAndRotation(object) data=object.getData(False,True) # get mesh instead name or NMesh (name_only=False / mesh=True) print "Exporting %s..."%object.name bufferObject= "<%s>\n" % object.name bufferObject+= "<VERTS>\n" location=object.mat.translationPart() for vert in data.verts: bufferObject+="%f %f %f\n" % (vert.co[0]+location[0],vert.co[1]+location[1],vert.co[2]+location[2]) bufferObject+="<FACES>\n" if impedance==None and diffusion==None: # it doesn't have assigned the default material # use first linked material with acoustic properties for material in materials: print material.name impedance=Acoustic.getImpedance(material) if (impedance==None): continue diffusion=Acoustic.getDiffusion(material) if (diffusion==None): continue materialName=material.name break if (impedance==None) or (diffusion==None): print "any material have acoustic parameters, skipping..." continue impedanceReal=impedance.real impedanceImag=impedance.imag if _convertToTriangles==True: print "Converting mesh to triangles..." Blender.Mesh.Mode(3) # select faces Blender.Window.EditMode(0) # non-edit mode! data.quadToTriangle(0) for face in data.faces: verts="" vertCount=0 for vert in face.verts: vertCount+=1 verts+="%s " % str(vert.index+1) if vertCount>3: print "WARNING!! Object %s have more than 3 verts (%i) per face!!!" % (object.name,vertCount) bufferObject+=FaceLineTemplate % vars() buffer+=bufferObject print "Added Object: %s" % object.name return buffer
def geometryExport(scene, typeOfGeometry='geometry', skipOthersGeometries=False): buffer = _geometryHeader actors = [] actors = Acoustic.getActors() # print "---------- acoustic actors: %s" % list(actors) # for object in scene.objects: # print "---------- acoustic objects: %s" % list(Acoustic.getAcousticObjects(scene)) for object in Acoustic.getAcousticObjects(scene): if skipOthersGeometries and Acoustic.getObjectSoundTypeGameProperty( object) != typeOfGeometry: continue impedance = None diffusion = None materialName = "" print "Reading object: %s" % object.name # data=bpy.data.meshes[object.getData().name] if type(object.getData()) != Blender.Types.NMeshType: print "no mesh, skipping..." continue if actors.count(object) != 0: print "%s is an actor, skipping" % object.name continue materials = Acoustic.getObjectMaterials(object) if (materials == None or materials == []): print "\tdoesn't contains acoustic materials,", if Acoustic.getObjectSoundTypeGameProperty( object) != typeOfGeometry: print 'no game object property "sound_type"=="%s", skipping...' % typeOfGeometry continue #if doesnt have any acoustic (by name) material, doesnt export print 'WARNING: setting material as "%s", with default acoustic properties (impedance: %s, diff.: %s)' % ( _defaultMaterialName, str(_defaultImpedance), str(_defaultDiffusion)) impedance = _defaultImpedance diffusion = _defaultDiffusion materialName = _defaultMaterialName BPyNMesh.ApplySizeAndRotation(object) data = object.getData( False, True ) # get mesh instead name or NMesh (name_only=False / mesh=True) print "Exporting %s..." % object.name bufferObject = "<%s>\n" % object.name bufferObject += "<VERTS>\n" location = object.mat.translationPart() for vert in data.verts: bufferObject += "%f %f %f\n" % (vert.co[0] + location[0], vert.co[1] + location[1], vert.co[2] + location[2]) bufferObject += "<FACES>\n" if impedance == None and diffusion == None: # it doesn't have assigned the default material # use first linked material with acoustic properties for material in materials: print material.name impedance = Acoustic.getImpedance(material) if (impedance == None): continue diffusion = Acoustic.getDiffusion(material) if (diffusion == None): continue materialName = material.name break if (impedance == None) or (diffusion == None): print "any material have acoustic parameters, skipping..." continue impedanceReal = impedance.real impedanceImag = impedance.imag if _convertToTriangles == True: print "Converting mesh to triangles..." Blender.Mesh.Mode(3) # select faces Blender.Window.EditMode(0) # non-edit mode! data.quadToTriangle(0) for face in data.faces: verts = "" vertCount = 0 for vert in face.verts: vertCount += 1 verts += "%s " % str(vert.index + 1) if vertCount > 3: print "WARNING!! Object %s have more than 3 verts (%i) per face!!!" % ( object.name, vertCount) bufferObject += FaceLineTemplate % vars() buffer += bufferObject print "Added Object: %s" % object.name return buffer