public Error Create(ComputeDevice computeDevice, SimulationSettings simulationSettings, GlobalContext 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 Export(ComputeDevice computeDevice, SimulationSettings simulationSettings, MaterialValue defaultMaterial, GlobalContext globalContext, bool exportOBJ = false) { var error = Error.None; var objects = GameObject.FindObjectsOfType <SteamAudioGeometry>(); var totalNumVertices = 0; var totalNumTriangles = 0; var totalNumMaterials = 1; // Global material. for (var i = 0; i < objects.Length; ++i) { totalNumVertices += objects[i].GetNumVertices(); totalNumTriangles += objects[i].GetNumTriangles(); totalNumMaterials += objects[i].GetNumMaterials(); } simulationSettings.sceneType = SceneType.Phonon; // Scene type should always be Phonon when exporting. error = PhononCore.iplCreateScene(globalContext, computeDevice.GetDevice(), simulationSettings, totalNumMaterials, ref scene); if (error != Error.None) { throw new Exception("Unable to create scene for export (" + objects.Length.ToString() + " materials): [" + error.ToString() + "]"); } var staticMesh = IntPtr.Zero; error = PhononCore.iplCreateStaticMesh(scene, totalNumVertices, totalNumTriangles, ref staticMesh); if (error != Error.None) { throw new Exception("Unable to create static mesh for export (" + totalNumVertices.ToString() + " vertices, " + totalNumTriangles.ToString() + " triangles): [" + error.ToString() + "]"); } var vertices = new Vector3[totalNumVertices]; var triangles = new Triangle[totalNumTriangles]; var materialIndices = new int[totalNumTriangles]; var materials = new Material[totalNumMaterials + 1]; // Offset added to avoid creating Material // for each object and then copying it. var vertexOffset = 0; var triangleOffset = 0; var materialOffset = 1; materials[0].absorptionHigh = defaultMaterial.HighFreqAbsorption; materials[0].absorptionMid = defaultMaterial.MidFreqAbsorption; materials[0].absorptionLow = defaultMaterial.LowFreqAbsorption; materials[0].scattering = defaultMaterial.Scattering; materials[0].transmissionHigh = defaultMaterial.HighFreqTransmission; materials[0].transmissionMid = defaultMaterial.MidFreqTransmission; materials[0].transmissionLow = defaultMaterial.LowFreqTransmission; for (var i = 0; i < objects.Length; ++i) { objects[i].GetGeometry(vertices, ref vertexOffset, triangles, ref triangleOffset, materials, materialIndices, ref materialOffset); } for (var i = 0; i < totalNumMaterials; ++i) { PhononCore.iplSetSceneMaterial(scene, i, materials[i]); } PhononCore.iplSetStaticMeshVertices(scene, staticMesh, vertices); PhononCore.iplSetStaticMeshTriangles(scene, staticMesh, triangles); PhononCore.iplSetStaticMeshMaterials(scene, staticMesh, materialIndices); PhononCore.iplFinalizeScene(scene, null); #if UNITY_EDITOR if (!Directory.Exists(Application.streamingAssetsPath)) { UnityEditor.AssetDatabase.CreateFolder("Assets", "StreamingAssets"); } #endif if (exportOBJ) { PhononCore.iplDumpSceneToObjFile(scene, Common.ConvertString(ObjFileName())); Debug.Log("Scene dumped to " + ObjFileName() + "."); } else { var dataSize = PhononCore.iplSaveFinalizedScene(scene, null); var data = new byte[dataSize]; PhononCore.iplSaveFinalizedScene(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 Initialize(SimulationSettingsValue settings, ComponentCache componentCache, GameEngineStateInitReason reason) { context = new GlobalContext { logCallback = LogMessage, allocateCallback = IntPtr.Zero, freeCallback = IntPtr.Zero }; var customSettings = componentCache.SteamAudioCustomSettings(); var useOpenCL = false; var computeDeviceType = ComputeDeviceType.Any; var numComputeUnits = 0; if (customSettings) { if (customSettings.convolutionOption == ConvolutionOption.TrueAudioNext) { useOpenCL = true; computeDeviceType = ComputeDeviceType.GPU; numComputeUnits = customSettings.numComputeUnits; } else if (customSettings.rayTracerOption == SceneType.RadeonRays) { useOpenCL = true; } } try { computeDevice.Create(context, useOpenCL, computeDeviceType, numComputeUnits); } catch (Exception e) { throw e; } var inEditor = !SteamAudioManager.IsAudioEngineInitializing(); simulationSettings = new SimulationSettings { sceneType = (customSettings) ? customSettings.rayTracerOption : SceneType.Phonon, rays = (inEditor) ? settings.BakeRays : settings.RealtimeRays, secondaryRays = (inEditor) ? settings.BakeSecondaryRays : settings.RealtimeSecondaryRays, bounces = (inEditor) ? settings.BakeBounces : settings.RealtimeBounces, irDuration = settings.Duration, ambisonicsOrder = settings.AmbisonicsOrder, maxConvolutionSources = settings.MaxSources }; if (reason != GameEngineStateInitReason.ExportingScene) { scene.Create(computeDevice, simulationSettings, context); } if (reason == GameEngineStateInitReason.Playing) { probeManager.Create(); } if (reason != GameEngineStateInitReason.ExportingScene && reason != GameEngineStateInitReason.GeneratingProbes) { try { environment.Create(computeDevice, simulationSettings, scene, probeManager, context); } catch (Exception e) { throw e; } } }