Ejemplo n.º 1
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
Ejemplo n.º 2
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
Ejemplo n.º 3
0
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	
Ejemplo n.º 4
0
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