コード例 #1
0
 public void Destroy()
 {
     if (device != IntPtr.Zero)
     {
         PhononCore.iplDestroyComputeDevice(ref device);
     }
 }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
ファイル: Scene.cs プロジェクト: bllueace/-A-typical
 public void Destroy()
 {
     if (scene != IntPtr.Zero)
     {
         PhononCore.iplDestroyScene(ref scene);
     }
 }
コード例 #4
0
ファイル: Scene.cs プロジェクト: FearTheRpr/Sandbox
        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);
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
 public void Destroy()
 {
     if (environment != IntPtr.Zero)
     {
         PhononCore.iplDestroyEnvironment(ref environment);
     }
 }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        public void Destroy()
        {
            environment.Destroy();
            probeManager.Destroy();
            scene.Destroy();
            computeDevice.Destroy();

            PhononCore.iplDestroyContext(ref context);
        }
コード例 #10
0
        public void DestroyInstancedMesh(ref IntPtr instancedMesh)
        {
            if (instancedMesh == IntPtr.Zero)
            {
                return;
            }

            PhononCore.iplDestroyInstancedMesh(ref instancedMesh);
        }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
        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.");
            }
        }
コード例 #13
0
ファイル: Baker.cs プロジェクト: 8ude/AudioSpatialization
 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;
 }
コード例 #14
0
        public void UpdateInstancedMeshTransform(IntPtr instancedMesh, Transform instanceTransform)
        {
            if (instancedMesh == IntPtr.Zero)
            {
                return;
            }

            var transformMatrix = Common.ConvertTransform(instanceTransform);

            PhononCore.iplUpdateInstancedMeshTransform(instancedMesh, transformMatrix);
        }
コード例 #15
0
        public void DisableInstancedMesh(IntPtr instancedMesh)
        {
            if (instancedMesh == IntPtr.Zero)
            {
                return;
            }

            var scene = managerData.gameEngineState.Scene().GetScene();

            PhononCore.iplRemoveInstancedMesh(scene, instancedMesh);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
ファイル: Scene.cs プロジェクト: FearTheRpr/Sandbox
        public void Destroy()
        {
            if (materialBuffer != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(materialBuffer);
                materialBuffer = IntPtr.Zero;
            }

            if (scene != IntPtr.Zero)
            {
                PhononCore.iplDestroyScene(ref scene);
            }
        }
コード例 #18
0
        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);
        }
コード例 #19
0
        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;
            }
        }
コード例 #20
0
        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();
            }
        }
コード例 #21
0
        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());
            }
        }
コード例 #22
0
        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);
        }
コード例 #23
0
ファイル: Scene.cs プロジェクト: bllueace/-A-typical
        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);
        }
コード例 #24
0
ファイル: ComputeDevice.cs プロジェクト: LAGonauta/SARooms
        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);
        }
コード例 #25
0
        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();
        }
コード例 #26
0
        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);
            }
        }
コード例 #27
0
ファイル: Scene.cs プロジェクト: djr5851/Banana-Bop
        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);
        }
コード例 #28
0
        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);
            }
        }
コード例 #29
0
ファイル: Scene.cs プロジェクト: FearTheRpr/Sandbox
        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);
        }
コード例 #30
0
ファイル: Baker.cs プロジェクト: 8ude/AudioSpatialization
        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;
        }