public void Destroy() { if (device != IntPtr.Zero) { PhononCore.iplDestroyComputeDevice(ref device); } }
public void RemoveAllAdditiveScenes() { var additiveSceneMeshes = managerData.gameEngineState.additiveSceneMeshes; var additiveScenes = managerData.gameEngineState.additiveScenes; var activeScene = managerData.gameEngineState.Scene().GetScene(); if (additiveSceneMeshes != null) { foreach (var additiveMesh in additiveSceneMeshes) { IntPtr sceneMesh = additiveMesh.Value; PhononCore.iplRemoveInstancedMesh(activeScene, sceneMesh); PhononCore.iplDestroyInstancedMesh(ref sceneMesh); } additiveSceneMeshes.Clear(); } if (additiveScenes != null) { foreach (var additiveScene in additiveScenes) { IntPtr scene = additiveScene.Value; PhononCore.iplDestroyScene(ref scene); } additiveScenes.Clear(); } }
public void Destroy() { if (scene != IntPtr.Zero) { PhononCore.iplDestroyScene(ref scene); } }
public Error Create(ComputeDevice computeDevice, SimulationSettings simulationSettings, IntPtr globalContext) { if (simulationSettings.sceneType == SceneType.Custom) { if (materialBuffer == IntPtr.Zero) { materialBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Material))); } var error = PhononCore.iplCreateScene(globalContext, computeDevice.GetDevice(), simulationSettings.sceneType, 0, null, RayTracer.ClosestHit, RayTracer.AnyHit, null, null, IntPtr.Zero, ref scene); return(error); } else { string fileName = SceneFileName(); if (!File.Exists(fileName)) { return(Error.Fail); } byte[] data = File.ReadAllBytes(fileName); var error = PhononCore.iplLoadScene(globalContext, simulationSettings.sceneType, data, data.Length, computeDevice.GetDevice(), null, ref scene); return(error); } }
public void DeleteBakedDataByIdentifier(BakedDataIdentifier identifier) { SteamAudioManager steamAudioManager = null; IntPtr probeBox = IntPtr.Zero; try { steamAudioManager = FindObjectOfType <SteamAudioManager>(); if (steamAudioManager == null) { throw new Exception("Phonon Manager Settings object not found in the scene! Click Window > Phonon"); } steamAudioManager.Initialize(GameEngineStateInitReason.EditingProbes); var context = steamAudioManager.GameEngineState().Context(); byte[] probeBoxData = LoadData(); PhononCore.iplLoadProbeBox(context, probeBoxData, probeBoxData.Length, ref probeBox); PhononCore.iplDeleteBakedDataByIdentifier(probeBox, identifier); RemoveLayer(identifier); int probeBoxSize = PhononCore.iplSaveProbeBox(probeBox, null); probeBoxData = new byte[probeBoxSize]; PhononCore.iplSaveProbeBox(probeBox, probeBoxData); SaveData(probeBoxData); steamAudioManager.Destroy(); } catch (Exception e) { Debug.LogError(e.Message); } }
public void Destroy() { if (environment != IntPtr.Zero) { PhononCore.iplDestroyEnvironment(ref environment); } }
public void DeleteBakedDataByName(string name, string prefix) { SteamAudioManager steamAudioManager = null; IntPtr probeBox = IntPtr.Zero; try { steamAudioManager = FindObjectOfType <SteamAudioManager>(); if (steamAudioManager == null) { throw new Exception("Phonon Manager Settings object not found in the scene! Click Window > Phonon"); } var context = steamAudioManager.GameEngineState().Context(); PhononCore.iplLoadProbeBox(context, probeBoxData, probeBoxData.Length, ref probeBox); PhononCore.iplDeleteBakedDataByName(probeBox, Common.HashStringForIdentifierWithPrefix(name, prefix)); UpdateProbeDataMapping(name, prefix, -1); int probeBoxSize = PhononCore.iplSaveProbeBox(probeBox, null); probeBoxData = new byte[probeBoxSize]; PhononCore.iplSaveProbeBox(probeBox, probeBoxData); } catch (Exception e) { Debug.LogError(e.Message); } }
public void Destroy() { if (editorAdditiveSceneMeshes != null) { for (int i = 0; i < editorAdditiveSceneMeshes.Count; ++i) { IntPtr additiveMesh = editorAdditiveSceneMeshes[i]; PhononCore.iplRemoveInstancedMesh(scene.GetScene(), additiveMesh); PhononCore.iplDestroyInstancedMesh(ref additiveMesh); } editorAdditiveSceneMeshes.Clear(); editorAdditiveSceneMeshes = null; } if (editorAdditiveScenes != null) { for (int i = 0; i < editorAdditiveScenes.Count; ++i) { IntPtr additiveScene = editorAdditiveScenes[i]; PhononCore.iplDestroyScene(ref additiveScene); } editorAdditiveScenes.Clear(); editorAdditiveScenes = null; } environment.Destroy(); probeManager.Destroy(); scene.Destroy(); computeDevice.Destroy(); PhononCore.iplDestroyContext(ref context); }
public void Destroy() { environment.Destroy(); probeManager.Destroy(); scene.Destroy(); computeDevice.Destroy(); PhononCore.iplDestroyContext(ref context); }
public void DestroyInstancedMesh(ref IntPtr instancedMesh) { if (instancedMesh == IntPtr.Zero) { return; } PhononCore.iplDestroyInstancedMesh(ref instancedMesh); }
public void CreateInstancedMesh(string assetFileName, Transform instanceTransform, ref IntPtr instancedMesh) { var status = Error.None; var serializedData = File.ReadAllBytes(Application.streamingAssetsPath + "/" + assetFileName); if (serializedData == null || serializedData.Length == 0) { return; } var context = managerData.gameEngineState.Context(); var computeDevice = managerData.gameEngineState.ComputeDevice().GetDevice(); var simulationSettings = managerData.gameEngineState.SimulationSettings(); var scene = managerData.gameEngineState.Scene().GetScene(); if (simulationSettings.sceneType != SceneType.Embree) { Debug.LogWarning("Dynamic Objects are only supported with Embree."); return; } var instancedScenes = managerData.gameEngineState.instancedScenes; var instancedScene = IntPtr.Zero; if (instancedScenes != null && instancedScenes.ContainsKey(assetFileName)) { instancedScene = instancedScenes[assetFileName]; } else { status = PhononCore.iplLoadScene(context, simulationSettings, serializedData, serializedData.Length, computeDevice, null, ref instancedScene); if (status != Error.None) { throw new Exception(); } } var transformMatrix = Common.ConvertTransform(instanceTransform); status = PhononCore.iplCreateInstancedMesh(scene, instancedScene, transformMatrix, ref instancedMesh); if (status != Error.None) { throw new Exception(); } if (instancedScenes == null) { managerData.gameEngineState.instancedScenes = new Dictionary <string, IntPtr>(); } if (!managerData.gameEngineState.instancedScenes.ContainsKey(assetFileName)) { managerData.gameEngineState.instancedScenes.Add(assetFileName, instancedScene); } }
void Update() { audioEngineSource.GetParameters(this); var requiresScene = (occlusionMode != OcclusionMode.NoOcclusion || reflections); var sceneExported = (managerData.gameEngineState.Scene().GetScene() != IntPtr.Zero); if (requiresScene && !sceneExported) { Debug.LogError("Scene not found. Make sure to pre-export the scene."); return; } var environment = managerData.gameEngineState.Environment().GetEnvironment(); var listener = GameObject.FindObjectOfType <AudioListener>(); if (!listener) { return; } var listenerPosition = Common.ConvertVector(listener.transform.position); var listenerAhead = Common.ConvertVector(listener.transform.forward); var listenerUp = Common.ConvertVector(listener.transform.up); var source = new Source(); source.position = Common.ConvertVector(transform.position); source.ahead = Common.ConvertVector(transform.forward); source.up = Common.ConvertVector(transform.up); source.right = Common.ConvertVector(transform.right); source.directivity = new Directivity(); source.directivity.dipoleWeight = dipoleWeight; source.directivity.dipolePower = dipolePower; source.directivity.callback = IntPtr.Zero; source.distanceAttenuationModel = distanceAttenuationModel; source.airAbsorptionModel = airAbsorptionModel; directPath = PhononCore.iplGetDirectSoundPath(environment, listenerPosition, listenerAhead, listenerUp, source, sourceRadius, occlusionSamples, occlusionMode, occlusionMethod); audioEngineSource.UpdateParameters(this); if (audioEngineSource.ShouldSendIdentifier(this)) { audioEngineSource.SendIdentifier(this, GetIdentifierToSend()); } if (reflections && simulationType == SourceSimulationType.BakedStaticSource && (bakedDataSize == 0)) { Debug.LogWarning("Steam Audio Source (" + uniqueIdentifier + ") with " + "Baked Static Source setting does not have any baked data."); } }
public void CancelBake() { // Ensures partial baked data is not serialized and that bake is properly canceled for multiple // probe boxes. cancelBake = true; PhononCore.iplCancelBake(); EndBake(); oneBakeActive = false; cancelBake = false; }
public void UpdateInstancedMeshTransform(IntPtr instancedMesh, Transform instanceTransform) { if (instancedMesh == IntPtr.Zero) { return; } var transformMatrix = Common.ConvertTransform(instanceTransform); PhononCore.iplUpdateInstancedMeshTransform(instancedMesh, transformMatrix); }
public void DisableInstancedMesh(IntPtr instancedMesh) { if (instancedMesh == IntPtr.Zero) { return; } var scene = managerData.gameEngineState.Scene().GetScene(); PhononCore.iplRemoveInstancedMesh(scene, instancedMesh); }
public Error Create(ComputeDevice computeDevice, SimulationSettings simulationSettings, Scene scene, ProbeManager probeManager, IntPtr globalContext) { var error = PhononCore.iplCreateEnvironment(globalContext, computeDevice.GetDevice(), simulationSettings, scene.GetScene(), probeManager.GetProbeManager(), ref environment); if (error != Error.None) { throw new Exception("Unable to create environment [" + error.ToString() + "]"); } return(error); }
public void Destroy() { if (materialBuffer != IntPtr.Zero) { Marshal.FreeHGlobal(materialBuffer); materialBuffer = IntPtr.Zero; } if (scene != IntPtr.Zero) { PhononCore.iplDestroyScene(ref scene); } }
public Error Create(IntPtr context) { var error = PhononCore.iplCreateProbeBatch(context, ref probeBatch); if (error != Error.None) { throw new Exception("Unable to create probe batch."); } error = PhononCore.iplCreateProbeManager(context, ref probeManager); if (error != Error.None) { throw new Exception("Unable to create probe batch."); } //Add all probes from all probe boxes to the probe batch. SteamAudioProbeBox[] allProbeBoxes = GameObject.FindObjectsOfType <SteamAudioProbeBox>() as SteamAudioProbeBox[]; foreach (SteamAudioProbeBox probeBox in allProbeBoxes) { var probeBoxData = probeBox.LoadData(); if (probeBoxData == null || probeBoxData.Length == 0) { continue; } IntPtr probeBoxPtr = IntPtr.Zero; try { PhononCore.iplLoadProbeBox(context, probeBoxData, probeBoxData.Length, ref probeBoxPtr); } catch (Exception e) { Debug.LogError(e.Message); } int numProbes = PhononCore.iplGetProbeSpheres(probeBoxPtr, null); for (int i = 0; i < numProbes; ++i) { PhononCore.iplAddProbeToBatch(probeBatch, probeBoxPtr, i); } PhononCore.iplDestroyProbeBox(ref probeBoxPtr); } //Add probe batch to probe manager. PhononCore.iplAddProbeBatch(probeManager, probeBatch); PhononCore.iplFinalizeProbeBatch(probeBatch); return(error); }
public void Destroy() { if (probeBatch != IntPtr.Zero) { PhononCore.iplDestroyProbeBatch(ref probeBatch); probeBatch = IntPtr.Zero; } if (probeManager != IntPtr.Zero) { PhononCore.iplDestroyProbeManager(ref probeManager); probeManager = IntPtr.Zero; } }
public void RemoveAllInstancedScenes() { var instancedScenes = managerData.gameEngineState.instancedScenes; if (instancedScenes != null) { foreach (var item in instancedScenes) { var instancedScene = item.Value; PhononCore.iplDestroyScene(ref instancedScene); } instancedScenes.Clear(); } }
void Update() { audioEngineSource.GetParameters(this); var requiresScene = (occlusionMode != OcclusionMode.NoOcclusion || reflections); var sceneExported = (managerData.gameEngineState.Scene().GetScene() != IntPtr.Zero); if (requiresScene && !sceneExported) { Debug.LogError("Scene not found. Make sure to pre-export the scene."); return; } var environment = managerData.gameEngineState.Environment().GetEnvironment(); var listener = GameObject.FindObjectOfType <AudioListener>(); var listenerPosition = Common.ConvertVector(listener.transform.position); var listenerAhead = Common.ConvertVector(listener.transform.forward); var listenerUp = Common.ConvertVector(listener.transform.up); var sourcePosition = Common.ConvertVector(transform.position); var sourceAhead = Common.ConvertVector(transform.forward); var sourceUp = Common.ConvertVector(transform.up); var sourceRight = Common.ConvertVector(transform.right); var source = new Source { position = sourcePosition, ahead = sourceAhead, up = sourceUp, right = sourceRight, directivity = new Directivity { dipoleWeight = this.dipoleWeight, dipolePower = this.dipolePower, callback = IntPtr.Zero, userData = IntPtr.Zero } }; directPath = PhononCore.iplGetDirectSoundPath(environment, listenerPosition, listenerAhead, listenerUp, source, sourceRadius, occlusionMode, occlusionMethod); audioEngineSource.UpdateParameters(this); if (audioEngineSource.ShouldSendIdentifier(this)) { audioEngineSource.SendIdentifier(this, GetIdentifierToSend()); } }
public Error Create(IntPtr globalContext, bool useOpenCL, ComputeDeviceType deviceType, int numComputeUnits) { var error = Error.None; if (useOpenCL) { error = PhononCore.iplCreateComputeDevice(globalContext, deviceType, numComputeUnits, ref device); if (error != Error.None) { throw new Exception("Unable to create OpenCL compute device (" + deviceType.ToString() + ", " + numComputeUnits.ToString() + " CUs): [" + error.ToString() + "]"); } } return(error); }
public Error Create(ComputeDevice computeDevice, SimulationSettings simulationSettings, IntPtr globalContext) { string fileName = SceneFileName(); if (!File.Exists(fileName)) { return(Error.Fail); } byte[] data = File.ReadAllBytes(fileName); var error = PhononCore.iplLoadFinalizedScene(globalContext, simulationSettings, data, data.Length, computeDevice.GetDevice(), null, ref scene); return(error); }
public Error Create(IntPtr globalContext, bool useOpenCL, ComputeDeviceFilter deviceFilter) { var error = Error.None; if (useOpenCL) { error = PhononCore.iplCreateComputeDevice(globalContext, deviceFilter, ref device); if (error != Error.None) { throw new Exception("Unable to create OpenCL compute device (" + deviceFilter.type.ToString() + ", " + deviceFilter.maxCUsToReserve.ToString() + " max CUs, " + deviceFilter.fractionCUsForIRUpdate.ToString("0.00") + " fraction of IR Update CUs): [" + error.ToString() + "]"); } } return(error); }
void OnApplicationQuit() { var instancedScenes = managerData.gameEngineState.instancedScenes; if (instancedScenes != null) { foreach (var item in instancedScenes) { var instancedScene = item.Value; PhononCore.iplDestroyScene(ref instancedScene); } instancedScenes.Clear(); } PhononUnityNative.iplUnityResetAudioEngine(); PhononCore.iplCleanup(); }
public void DeleteBakedDataByName(string name, string prefix) { IntPtr probeBox = IntPtr.Zero; try { PhononCore.iplLoadProbeBox(probeBoxData, probeBoxData.Length, ref probeBox); PhononCore.iplDeleteBakedDataByName(probeBox, Common.HashStringForIdentifierWithPrefix(name, prefix)); UpdateProbeDataMapping(name, prefix, -1); int probeBoxSize = PhononCore.iplSaveProbeBox(probeBox, null); probeBoxData = new byte[probeBoxSize]; PhononCore.iplSaveProbeBox(probeBox, probeBoxData); } catch (Exception e) { Debug.LogError(e.Message); } }
public Error AddAdditiveScene(UnityEngine.SceneManagement.Scene unityScene, IntPtr activeScene, ComputeDevice computeDevice, SimulationSettings simulationSettings, IntPtr globalContext, out IntPtr addedScene, out IntPtr addedMesh) { addedScene = IntPtr.Zero; addedMesh = IntPtr.Zero; if (simulationSettings.sceneType != SceneType.Embree) { Debug.LogWarning("Additive scenes are only supported with Embree."); return(Error.Fail); } string fileName = SceneFileName(unityScene.name); if (!File.Exists(fileName)) { return(Error.Fail); } byte[] data = File.ReadAllBytes(fileName); var error = PhononCore.iplLoadScene(globalContext, simulationSettings.sceneType, data, data.Length, computeDevice.GetDevice(), null, ref addedScene); var transformMatrix = new Matrix4x4 { m00 = 1.0f, m01 = 0.0f, m02 = 0.0f, m03 = 0.0f, m10 = 0.0f, m11 = 1.0f, m12 = 0.0f, m13 = 0.0f, m20 = 0.0f, m21 = 0.0f, m22 = 1.0f, m23 = 0.0f, m30 = 0.0f, m31 = 0.0f, m32 = 0.0f, m33 = 1.0f }; error = PhononCore.iplCreateInstancedMesh(activeScene, addedScene, transformMatrix, ref addedMesh); if (error != Error.None) { return(error); } PhononCore.iplAddInstancedMesh(activeScene, addedMesh); return(error); }
public void RemoveAdditiveScene(UnityEngine.SceneManagement.Scene unityScene) { var additiveSceneMeshes = managerData.gameEngineState.additiveSceneMeshes; var additiveScenes = managerData.gameEngineState.additiveScenes; var activeScene = managerData.gameEngineState.Scene().GetScene(); if (additiveSceneMeshes != null && additiveSceneMeshes.ContainsKey(unityScene)) { IntPtr sceneMesh = additiveSceneMeshes[unityScene]; PhononCore.iplRemoveInstancedMesh(activeScene, sceneMesh); PhononCore.iplDestroyInstancedMesh(ref sceneMesh); additiveSceneMeshes.Remove(unityScene); } if (additiveScenes != null && additiveScenes.ContainsKey(unityScene)) { IntPtr scene = additiveScenes[unityScene]; PhononCore.iplDestroyScene(ref scene); additiveScenes.Remove(unityScene); } }
public Error Export(ComputeDevice computeDevice, MaterialValue defaultMaterial, IntPtr globalContext, bool exportOBJ = false) { var error = Error.None; SceneType sceneType = SceneType.Phonon; // Scene type should always be Phonon when exporting. var objects = SceneExporter.GetStaticGameObjectsForExport(SceneManager.GetActiveScene()); Vector3[] vertices = null; Triangle[] triangles = null; int[] materialIndices = null; Material[] materials = null; SceneExporter.GetGeometryAndMaterialBuffers(objects, ref vertices, ref triangles, ref materialIndices, ref materials, false, exportOBJ); if (vertices.Length == 0 || triangles.Length == 0 || materialIndices.Length == 0 || materials.Length == 0) { throw new Exception( "No Steam Audio Geometry tagged. Attach Steam Audio Geometry to one or more GameObjects that " + "contain Mesh or Terrain geometry."); } error = PhononCore.iplCreateScene(globalContext, computeDevice.GetDevice(), sceneType, materials.Length, materials, null, null, null, null, IntPtr.Zero, ref scene); if (error != Error.None) { throw new Exception("Unable to create scene for export (" + materials.Length.ToString() + " materials): [" + error.ToString() + "]"); } var staticMesh = IntPtr.Zero; error = PhononCore.iplCreateStaticMesh(scene, vertices.Length, triangles.Length, vertices, triangles, materialIndices, ref staticMesh); if (error != Error.None) { throw new Exception("Unable to create static mesh for export (" + vertices.Length.ToString() + " vertices, " + triangles.Length.ToString() + " triangles): [" + error.ToString() + "]"); } #if UNITY_EDITOR if (!Directory.Exists(Application.streamingAssetsPath)) { UnityEditor.AssetDatabase.CreateFolder("Assets", "StreamingAssets"); } #endif if (exportOBJ) { PhononCore.iplSaveSceneAsObj(scene, Common.ConvertString(ObjFileName())); Debug.Log("Scene exported to " + ObjFileName() + "."); } else { var dataSize = PhononCore.iplSaveScene(scene, null); var data = new byte[dataSize]; PhononCore.iplSaveScene(scene, data); var fileName = SceneFileName(); File.WriteAllBytes(fileName, data); Debug.Log("Scene exported to " + fileName + "."); } PhononCore.iplDestroyStaticMesh(ref staticMesh); PhononCore.iplDestroyScene(ref scene); return(error); }
public void BakeEffectThread() { BakingSettings bakeSettings; bakeSettings.bakeConvolution = bakeConvolution ? Bool.True : Bool.False; bakeSettings.bakeParametric = bakeParameteric ? Bool.True : Bool.False; #if UNITY_EDITOR totalObjects = duringBakeObjects.Length; objectBakingCurrently = 0; #endif for (int i = 0; i < duringBakeObjects.Length; ++i) { bakingGameObjectName = "reverb"; if (duringBakeIdentifiers[i].type == BakedDataType.StaticListener) { bakingGameObjectName = duringBakeObjectNames[i]; } else if (duringBakeIdentifiers[i].type == BakedDataType.StaticSource) { bakingGameObjectName = duringBakeObjectNames[i]; } Debug.Log("START: Baking effect for " + bakingGameObjectName + "."); ++objectBakingCurrently; #if UNITY_EDITOR totalProbeBoxes = duringBakeProbeBoxes[i].Length; #endif probeBoxBakingCurrently = 0; var atLeastOneProbeBoxHasProbes = false; foreach (SteamAudioProbeBox probeBox in duringBakeProbeBoxes[i]) { if (cancelBake) { return; } if (probeBox == null) { Debug.LogError("Probe Box specified in list of Probe Boxes to bake is null."); continue; } var probeBoxData = probeBox.LoadData(); if (probeBoxData == null || probeBoxData.Length == 0) { Debug.LogError("Skipping probe box, because probes have not been generated for it."); probeBoxBakingCurrently++; continue; } atLeastOneProbeBoxHasProbes = true; var context = steamAudioManager.GameEngineState().Context(); IntPtr probeBoxPtr = IntPtr.Zero; try { PhononCore.iplLoadProbeBox(context, probeBoxData, probeBoxData.Length, ref probeBoxPtr); probeBoxBakingCurrently++; } catch (Exception e) { Debug.LogError(e.Message); } var environment = steamAudioManager.GameEngineState().Environment().GetEnvironment(); if (duringBakeIdentifiers[i].type == BakedDataType.Reverb) { PhononCore.iplBakeReverb(environment, probeBoxPtr, bakeSettings, bakeCallback); } else if (duringBakeIdentifiers[i].type == BakedDataType.StaticListener) { PhononCore.iplBakeStaticListener(environment, probeBoxPtr, duringBakeSpheres[i], duringBakeIdentifiers[i], bakeSettings, bakeCallback); } else if (duringBakeIdentifiers[i].type == BakedDataType.StaticSource) { PhononCore.iplBakePropagation(environment, probeBoxPtr, duringBakeSpheres[i], duringBakeIdentifiers[i], bakeSettings, bakeCallback); } if (cancelBake) { PhononCore.iplDestroyProbeBox(ref probeBoxPtr); Debug.Log("CANCELLED: Baking."); return; } int probeBoxSize = PhononCore.iplSaveProbeBox(probeBoxPtr, null); probeBoxData = new byte[probeBoxSize]; PhononCore.iplSaveProbeBox(probeBoxPtr, probeBoxData); probeBox.SaveData(probeBoxData); int probeBoxEffectSize = PhononCore.iplGetBakedDataSizeByIdentifier(probeBoxPtr, duringBakeIdentifiers[i]); probeBox.AddOrUpdateLayer(duringBakeIdentifiers[i], duringBakeNames[i], probeBoxEffectSize); PhononCore.iplDestroyProbeBox(ref probeBoxPtr); } if (duringBakeProbeBoxes[i].Length == 0) { Debug.LogError("Probe Box component not attached or no probe boxes selected for " + bakingGameObjectName); } else if (atLeastOneProbeBoxHasProbes) { Debug.Log("COMPLETED: Baking effect for " + bakingGameObjectName + "."); } } bakeStatus = BakeStatus.Complete; }