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 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 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 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 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 Error Export(ComputeDevice computeDevice, SimulationSettings simulationSettings, MaterialValue defaultMaterial, IntPtr 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. 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); } error = PhononCore.iplCreateScene(globalContext, computeDevice.GetDevice(), simulationSettings, materials.Length, materials, null, null, null, null, IntPtr.Zero, 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, vertices, triangles, materialIndices, ref staticMesh); if (error != Error.None) { throw new Exception("Unable to create static mesh for export (" + totalNumVertices.ToString() + " vertices, " + totalNumTriangles.ToString() + " triangles): [" + error.ToString() + "]"); } #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); }