Exemple #1
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }