Пример #1
0
 //
 // Copies data from another object.
 //
 public void CopyFrom(SimulationSettingsValue other)
 {
     RealtimeRays          = other.RealtimeRays;
     RealtimeBounces       = other.RealtimeBounces;
     RealtimeSecondaryRays = other.RealtimeSecondaryRays;
     BakeRays          = other.BakeRays;
     BakeSecondaryRays = other.BakeSecondaryRays;
     BakeBounces       = other.BakeBounces;
     Duration          = other.Duration;
     AmbisonicsOrder   = other.AmbisonicsOrder;
     MaxSources        = other.MaxSources;
 }
Пример #2
0
 //
 // Copies data from another object.
 //
 public void CopyFrom(SimulationSettingsValue other)
 {
     RealtimeRays              = other.RealtimeRays;
     RealtimeBounces           = other.RealtimeBounces;
     RealtimeSecondaryRays     = other.RealtimeSecondaryRays;
     RealtimeThreadsPercentage = other.RealtimeThreadsPercentage;
     BakeRays              = other.BakeRays;
     BakeSecondaryRays     = other.BakeSecondaryRays;
     BakeBounces           = other.BakeBounces;
     BakeThreadsPercentage = other.BakeThreadsPercentage;
     Duration              = other.Duration;
     AmbisonicsOrder       = other.AmbisonicsOrder;
     MaxSources            = other.MaxSources;
     IrradianceMinDistance = other.IrradianceMinDistance;
 }
        //
        // Draws the inspector.
        //
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            // Audio Engine
            GUI.enabled = !EditorApplication.isPlayingOrWillChangePlaymode;
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Audio Engine Integration", EditorStyles.boldLabel);
            string[] engines             = { "Unity", "FMOD Studio" };
            var      audioEngineProperty = serializedObject.FindProperty("audioEngine");

            audioEngineProperty.enumValueIndex = EditorGUILayout.Popup("Audio Engine",
                                                                       audioEngineProperty.enumValueIndex, engines);

            // Scene Settings
            SteamAudioManager steamAudioManager = ((SteamAudioManager)target);

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Global Material Settings", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("materialPreset"));
            if (serializedObject.FindProperty("materialPreset").enumValueIndex < 11)
            {
                MaterialValue actualValue = steamAudioManager.materialValue;
                actualValue.CopyFrom(MaterialPresetList.PresetValue(
                                         serializedObject.FindProperty("materialPreset").enumValueIndex));
            }
            else
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("materialValue"));
            }

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Scene Export", EditorStyles.boldLabel);
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel(" ");
            if (GUILayout.Button("Export to OBJ"))
            {
                steamAudioManager.ExportScene(true);
            }
            if (GUILayout.Button("Pre-Export Scene"))
            {
                steamAudioManager.ExportScene(false);
            }
            EditorGUILayout.EndHorizontal();

            // Simulation Settings
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Simulation Settings", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("simulationPreset"));
            if (serializedObject.FindProperty("simulationPreset").enumValueIndex < 3)
            {
                SimulationSettingsValue actualValue = steamAudioManager.simulationValue;
                actualValue.CopyFrom(SimulationSettingsPresetList.PresetValue(
                                         serializedObject.FindProperty("simulationPreset").enumValueIndex));
            }
            else
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("simulationValue"));

                SimulationSettingsValue actualValue = steamAudioManager.simulationValue;

                if (actualValue.AmbisonicsOrder > 2)
                {
                    var numChannels = (actualValue.AmbisonicsOrder + 1) * (actualValue.AmbisonicsOrder + 1);
                    EditorGUILayout.HelpBox("Ambisonics order " + actualValue.AmbisonicsOrder.ToString() +
                                            " uses " + numChannels.ToString() + " channels per source for processing indirect sound. " +
                                            "This may significantly increase CPU usage. Consider reducing this value unless necessary.",
                                            MessageType.Warning);
                }

                if (Application.isEditor && EditorApplication.isPlayingOrWillChangePlaymode)
                {
                    IntPtr environment = steamAudioManager.GameEngineState().Environment().GetEnvironment();
                    if (environment != IntPtr.Zero)
                    {
                        PhononCore.iplSetNumBounces(environment, actualValue.RealtimeBounces);
                    }
                }
            }

            // Fold Out for Advanced Settings
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
            serializedObject.FindProperty("showLoadTimeOptions").boolValue =
                EditorGUILayout.Foldout(serializedObject.FindProperty("showLoadTimeOptions").boolValue,
                                        "Per Frame Query Optimization");

            if (steamAudioManager.showLoadTimeOptions)
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("updateComponents"));

                var updateComponents = serializedObject.FindProperty("updateComponents").boolValue;
                if (!updateComponents)
                {
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("currentAudioListener"));
                }
            }

            serializedObject.FindProperty("showMassBakingOptions").boolValue =
                EditorGUILayout.Foldout(serializedObject.FindProperty("showMassBakingOptions").boolValue,
                                        "Consolidated Baking Options");
            if (steamAudioManager.showMassBakingOptions)
            {
                bool noSettingMessage = false;
                noSettingMessage = ProbeGenerationGUI() || noSettingMessage;
                noSettingMessage = BakeAllGUI() || noSettingMessage;
                noSettingMessage = BakedSourcesGUI(steamAudioManager) || noSettingMessage;
                noSettingMessage = BakedStaticListenerNodeGUI(steamAudioManager) || noSettingMessage;
                noSettingMessage = BakedReverbGUI(steamAudioManager) || noSettingMessage;

                if (!noSettingMessage)
                {
                    EditorGUILayout.LabelField("Scene does not contain any baking related components.");
                }
            }

            GUI.enabled = true;
            EditorGUILayout.HelpBox("Do not manually add Steam Audio Manager component. " +
                                    "Click Window > Steam Audio.", MessageType.Info);

            EditorGUILayout.Space();
            serializedObject.ApplyModifiedProperties();
        }
Пример #4
0
        public void Initialize(SimulationSettingsValue settings, ComponentCache componentCache,
                               GameEngineStateInitReason reason)
        {
            PhononCore.iplCreateContext(LogMessage, IntPtr.Zero, IntPtr.Zero, ref context);

            var customSettings = componentCache.SteamAudioCustomSettings();

            var useOpenCL         = false;
            var computeDeviceType = ComputeDeviceType.Any;
            var numComputeUnits   = 0;

            if (customSettings)
            {
                convolutionType = customSettings.convolutionOption;

                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(context);
            }

            if (reason != GameEngineStateInitReason.ExportingScene &&
                reason != GameEngineStateInitReason.GeneratingProbes)
            {
                try
                {
                    environment.Create(computeDevice, simulationSettings, scene, probeManager, context);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
Пример #5
0
        public void Initialize(SimulationSettingsValue settings, ComponentCache componentCache,
                               GameEngineStateInitReason reason)
        {
            PhononCore.iplCreateContext(LogMessage, IntPtr.Zero, IntPtr.Zero, ref context);

            if (reason != GameEngineStateInitReason.EditingProbes)
            {
                var customSettings = componentCache.SteamAudioCustomSettings();

                var useOpenCL         = false;
                var computeDeviceType = ComputeDeviceType.Any;
                var requiresTan       = false;
                var minReservableCUs  = 0;
                var maxCUsToReserve   = 0;

                if (customSettings)
                {
                    convolutionType = customSettings.ConvolutionType();

                    if (convolutionType == ConvolutionOption.TrueAudioNext)
                    {
                        useOpenCL         = true;
                        requiresTan       = true;
                        computeDeviceType = ComputeDeviceType.GPU;
                        minReservableCUs  = customSettings.minComputeUnitsToReserve;
                        maxCUsToReserve   = customSettings.maxComputeUnitsToReserve;
                    }
                    else if (customSettings.RayTracerType() == SceneType.RadeonRays)
                    {
                        useOpenCL = true;
                    }
                }

                try
                {
                    var deviceFilter = new ComputeDeviceFilter
                    {
                        type = computeDeviceType,
                        requiresTrueAudioNext = (requiresTan) ? Bool.True : Bool.False,
                        minReservableCUs      = minReservableCUs,
                        maxCUsToReserve       = maxCUsToReserve
                    };

                    computeDevice.Create(context, useOpenCL, deviceFilter);
                }
                catch (Exception e)
                {
                    Debug.LogWarning(String.Format("Unable to initialize TrueAudio Next: {0}. Using Phonon convolution.",
                                                   e.Message));

                    convolutionType = ConvolutionOption.Phonon;
                }

                var inEditor = !SteamAudioManager.IsAudioEngineInitializing();

                var maxSources = settings.MaxSources;
                if (customSettings && convolutionType == ConvolutionOption.TrueAudioNext)
                {
                    maxSources = customSettings.MaxSources;
                }
                if (customSettings && customSettings.RayTracerType() == SceneType.RadeonRays && reason == GameEngineStateInitReason.Baking)
                {
                    maxSources = customSettings.BakingBatchSize;
                }

                var rayTracer = SceneType.Phonon;
                if (customSettings)
                {
                    if (customSettings.RayTracerType() != SceneType.RadeonRays ||
                        reason != GameEngineStateInitReason.Playing)
                    {
                        rayTracer = customSettings.RayTracerType();
                    }
                }

                simulationSettings = new SimulationSettings
                {
                    sceneType             = rayTracer,
                    occlusionSamples      = settings.OcclusionSamples,
                    rays                  = (inEditor) ? settings.BakeRays : settings.RealtimeRays,
                    secondaryRays         = (inEditor) ? settings.BakeSecondaryRays : settings.RealtimeSecondaryRays,
                    bounces               = (inEditor) ? settings.BakeBounces : settings.RealtimeBounces,
                    threads               = (inEditor) ? (int)Mathf.Max(1, (settings.BakeThreadsPercentage * SystemInfo.processorCount) / 100.0f) : (int)Mathf.Max(1, (settings.RealtimeThreadsPercentage * SystemInfo.processorCount) / 100.0f),
                    irDuration            = (customSettings && convolutionType == ConvolutionOption.TrueAudioNext) ? customSettings.Duration : settings.Duration,
                    ambisonicsOrder       = (customSettings && convolutionType == ConvolutionOption.TrueAudioNext) ? customSettings.AmbisonicsOrder : settings.AmbisonicsOrder,
                    maxConvolutionSources = maxSources,
                    bakingBatchSize       = (customSettings && customSettings.RayTracerType() == SceneType.RadeonRays) ? customSettings.BakingBatchSize : 1
                };

#if UNITY_EDITOR
                if (customSettings)
                {
                    if (customSettings.RayTracerType() == SceneType.Embree)
                    {
                        if (!File.Exists(Directory.GetCurrentDirectory() + "/Assets/Plugins/x86_64/embree.dll"))
                        {
                            throw new Exception(
                                      "Steam Audio configured to use Embree, but Embree support package not installed. " +
                                      "Please import SteamAudio_Embree.unitypackage in order to use Embree support for " +
                                      "Steam Audio.");
                        }
                    }
                    else if (customSettings.RayTracerType() == SceneType.RadeonRays)
                    {
                        if (!File.Exists(Directory.GetCurrentDirectory() + "/Assets/Plugins/x86_64/RadeonRays.dll"))
                        {
                            throw new Exception(
                                      "Steam Audio configured to use Radeon Rays, but Radeon Rays support package not " +
                                      "installed. Please import SteamAudio_RadeonRays.unitypackage in order to use Radeon " +
                                      "Rays support for Steam Audio.");
                        }
                    }

                    if (customSettings.ConvolutionType() == ConvolutionOption.TrueAudioNext)
                    {
                        if (!File.Exists(Directory.GetCurrentDirectory() + "/Assets/Plugins/x86_64/tanrt64.dll"))
                        {
                            throw new Exception(
                                      "Steam Audio configured to use TrueAudio Next, but TrueAudio Next support package " +
                                      "not installed. Please import SteamAudio_TrueAudioNext.unitypackage in order to use " +
                                      "TrueAudio Next support for Steam Audio.");
                        }
                    }
                }
#endif

                if (reason != GameEngineStateInitReason.ExportingScene)
                {
                    scene.Create(computeDevice, simulationSettings, context);
                }

                if (reason == GameEngineStateInitReason.Playing)
                {
                    probeManager.Create(context);
                }

                if (reason != GameEngineStateInitReason.ExportingScene &&
                    reason != GameEngineStateInitReason.GeneratingProbes)
                {
                    try
                    {
                        environment.Create(computeDevice, simulationSettings, scene, probeManager, context);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }
        }
Пример #6
0
        public void Initialize(GameEngineStateInitReason reason, AudioEngine audioEngine, SimulationSettingsValue simulationValue, string[] sofaFileNames)
        {
            if (referenceCount == 0)
            {
                componentCache.Initialize();
                gameEngineState.Initialize(simulationValue, componentCache, reason);

                if (reason == GameEngineStateInitReason.Playing)
                {
                    audioEngineState = AudioEngineStateFactory.Create(audioEngine);
                    audioEngineState.Initialize(componentCache, gameEngineState, sofaFileNames);
                }
            }

            ++referenceCount;
        }
Пример #7
0
        public void Initialize(GameEngineStateInitReason reason, AudioEngine audioEngine, SimulationSettingsValue simulationValue)
        {
            if (referenceCount == 0)
            {
                componentCache.Initialize();
                gameEngineState.Initialize(simulationValue, componentCache, reason);

                if (reason == GameEngineStateInitReason.Playing)
                {
                    audioEngineState.Initialize(audioEngine, componentCache, gameEngineState);
                }
            }

            ++referenceCount;
        }
Пример #8
0
        public void Initialize(SimulationSettingsValue settings, ComponentCache componentCache,
            GameEngineStateInitReason reason)
        {
            PhononCore.iplCreateContext(LogMessage, IntPtr.Zero, IntPtr.Zero, ref context);

            if (reason != GameEngineStateInitReason.EditingProbes)
            {
                var customSettings = componentCache.SteamAudioCustomSettings();

                var useOpenCL = false;
                var computeDeviceType = ComputeDeviceType.Any;
                var requiresTan = false;
                var minReservableCUs = 0;
                var maxCUsToReserve = 0;

                if (customSettings)
                {
                    convolutionType = customSettings.convolutionOption;

                    if (customSettings.convolutionOption == ConvolutionOption.TrueAudioNext)
                    {
                        useOpenCL = true;
                        requiresTan = true;
                        computeDeviceType = ComputeDeviceType.GPU;
                        minReservableCUs = customSettings.minComputeUnitsToReserve;
                        maxCUsToReserve = customSettings.maxComputeUnitsToReserve;
                    }
                    else if (customSettings.rayTracerOption == SceneType.RadeonRays)
                    {
                        useOpenCL = true;
                    }
                }

                try
				{
                    var deviceFilter = new ComputeDeviceFilter
                    {
                        type = computeDeviceType,
                        requiresTrueAudioNext = (requiresTan) ? Bool.True : Bool.False,
                        minReservableCUs = minReservableCUs,
                        maxCUsToReserve = maxCUsToReserve
                    };

                    computeDevice.Create(context, useOpenCL, deviceFilter);
				}
                catch (Exception e)
                {
                    Debug.LogWarning(String.Format("Unable to initialize TrueAudio Next: {0}. Using Phonon convolution.",
                        e.Message));

                    customSettings.convolutionOption = ConvolutionOption.Phonon;
                }

                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              = (customSettings && customSettings.convolutionOption == ConvolutionOption.TrueAudioNext) ? customSettings.Duration : settings.Duration,
                    ambisonicsOrder         = (customSettings && customSettings.convolutionOption == ConvolutionOption.TrueAudioNext) ? customSettings.AmbisonicsOrder : settings.AmbisonicsOrder,
                    maxConvolutionSources   = (customSettings && customSettings.convolutionOption == ConvolutionOption.TrueAudioNext) ? customSettings.MaxSources : settings.MaxSources
                };

                if (reason != GameEngineStateInitReason.ExportingScene)
                    scene.Create(computeDevice, simulationSettings, context);

                if (reason == GameEngineStateInitReason.Playing)
                    probeManager.Create(context);

                if (reason != GameEngineStateInitReason.ExportingScene &&
                    reason != GameEngineStateInitReason.GeneratingProbes)
                {
                    try
                    {
                        environment.Create(computeDevice, simulationSettings, scene, probeManager, context);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }
        }
        //
        // Draws the inspector.
        //
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            // Audio Engine
            GUI.enabled = !EditorApplication.isPlayingOrWillChangePlaymode;
            EditorGUILayout.Space();
            EditorGUILayout.HelpBox("Do not manually add Steam Audio Manager component. " +
                                    "Click Window > Steam Audio.", MessageType.Info);
            EditorGUILayout.LabelField("Audio Engine Integration", EditorStyles.boldLabel);
            string[] engines             = { "Unity", "FMOD Studio" };
            var      audioEngineProperty = serializedObject.FindProperty("audioEngine");

            audioEngineProperty.enumValueIndex = EditorGUILayout.Popup("Audio Engine",
                                                                       audioEngineProperty.enumValueIndex, engines);

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("HRTF Settings", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("sofaFiles"), new GUIContent("SOFA Files"), true);

            SteamAudioManager steamAudioManager = (SteamAudioManager)target;

            var wasGUIEnabled = GUI.enabled;

            GUI.enabled = true;

            var sofaFiles = steamAudioManager.GetSOFAFileNames();

            if (sofaFiles != null)
            {
                var sofaFileNames = new string[sofaFiles.Length];
                for (var i = 0; i < sofaFileNames.Length; ++i)
                {
                    sofaFileNames[i] = sofaFiles[i];
                    if (sofaFileNames[i].Length == 0 || sofaFileNames[i] == "")
                    {
                        sofaFileNames[i] = "Default";
                    }
                }
                var currentSOFAFileProperty = serializedObject.FindProperty("currentSOFAFile");
                if (currentSOFAFileProperty.intValue >= sofaFiles.Length)
                {
                    currentSOFAFileProperty.intValue = 0;
                }
                currentSOFAFileProperty.intValue = EditorGUILayout.Popup("Current SOFA File",
                                                                         currentSOFAFileProperty.intValue, sofaFileNames);
            }

            GUI.enabled = wasGUIEnabled;

            // Scene Settings
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Global Material Settings", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("materialPreset"));
            if (serializedObject.FindProperty("materialPreset").enumValueIndex < 11)
            {
                MaterialValue actualValue = steamAudioManager.materialValue;
                actualValue.CopyFrom(MaterialPresetList.PresetValue(
                                         serializedObject.FindProperty("materialPreset").enumValueIndex));
            }
            else
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("materialValue"));
            }

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Scene Export", EditorStyles.boldLabel);
            if (GUILayout.Button("Pre-Export Scene"))
            {
                steamAudioManager.ExportScene(false);
            }
            if (GUILayout.Button("Export All Dynamic Objects"))
            {
                ExportAllDynamicObjects();
            }
            if (GUILayout.Button("Export to OBJ"))
            {
                steamAudioManager.ExportScene(true);
            }

            // Simulation Settings
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Simulation Settings", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("simulationPreset"));
            if (serializedObject.FindProperty("simulationPreset").enumValueIndex < 3)
            {
                SimulationSettingsValue actualValue = steamAudioManager.simulationValue;
                actualValue.CopyFrom(SimulationSettingsPresetList.PresetValue(
                                         serializedObject.FindProperty("simulationPreset").enumValueIndex));

                EditorGUILayout.Space();
                UnityRayTracerGUI(true);
            }
            else
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("simulationValue"));

                SimulationSettingsValue actualValue = steamAudioManager.simulationValue;

                if (actualValue.AmbisonicsOrder > 2)
                {
                    var numChannels = (actualValue.AmbisonicsOrder + 1) * (actualValue.AmbisonicsOrder + 1);
                    EditorGUILayout.HelpBox("Ambisonics order " + actualValue.AmbisonicsOrder.ToString() +
                                            " uses " + numChannels.ToString() + " channels per source for processing indirect sound. " +
                                            "This may significantly increase CPU usage. Consider reducing this value unless necessary.",
                                            MessageType.Warning);
                }

                UnityRayTracerGUI(false);

                if (Application.isEditor && EditorApplication.isPlayingOrWillChangePlaymode)
                {
                    IntPtr environment = steamAudioManager.GameEngineState().Environment().GetEnvironment();
                    if (environment != IntPtr.Zero)
                    {
                        PhononCore.iplSetNumBounces(environment, actualValue.RealtimeBounces);
                    }
                }
            }

            // Display information message about CPU usage.
            int    realTimeThreads = (int)Mathf.Max(1, (steamAudioManager.simulationValue.RealtimeThreadsPercentage * SystemInfo.processorCount) / 100.0f);
            int    bakingThreads   = (int)Mathf.Max(1, (steamAudioManager.simulationValue.BakeThreadsPercentage * SystemInfo.processorCount) / 100.0f);
            string realTimeString  = (realTimeThreads == 1) ? "1 of " + SystemInfo.processorCount + " logical processor" :
                                     realTimeThreads + " of " + SystemInfo.processorCount + " logical processors";
            string bakingString = (bakingThreads == 1) ? "1 of " + SystemInfo.processorCount + " logical processor" :
                                  bakingThreads + " of " + SystemInfo.processorCount + " logical processors";

            EditorGUILayout.HelpBox("On this machine setting realtime CPU cores to " + steamAudioManager.simulationValue.RealtimeThreadsPercentage +
                                    "% will use " + realTimeString + " and setting baking CPU cores to " + steamAudioManager.simulationValue.BakeThreadsPercentage +
                                    "% will use " + bakingString + ". The number of logical processors used on an end user's machine might be different.", MessageType.Info);

            // Fold Out for Advanced Settings
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
            serializedObject.FindProperty("showLoadTimeOptions").boolValue =
                EditorGUILayout.Foldout(serializedObject.FindProperty("showLoadTimeOptions").boolValue,
                                        "Per Frame Query Optimization");

            if (steamAudioManager.showLoadTimeOptions)
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("updateComponents"));

                var updateComponents = serializedObject.FindProperty("updateComponents").boolValue;
                if (!updateComponents)
                {
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("currentAudioListener"));
                }
            }

            serializedObject.FindProperty("showMassBakingOptions").boolValue =
                EditorGUILayout.Foldout(serializedObject.FindProperty("showMassBakingOptions").boolValue,
                                        "Consolidated Baking Options");
            if (steamAudioManager.showMassBakingOptions)
            {
                bool noSettingMessage = false;
                noSettingMessage = ProbeGenerationGUI() || noSettingMessage;
                noSettingMessage = BakeAllGUI() || noSettingMessage;
                noSettingMessage = BakedSourcesGUI(steamAudioManager) || noSettingMessage;
                noSettingMessage = BakedStaticListenerNodeGUI(steamAudioManager) || noSettingMessage;
                noSettingMessage = BakedReverbGUI(steamAudioManager) || noSettingMessage;

                if (!noSettingMessage)
                {
                    EditorGUILayout.LabelField("Scene does not contain any baking related components.");
                }
            }

            GUI.enabled = true;
            EditorGUILayout.Space();
            serializedObject.ApplyModifiedProperties();
        }
Пример #10
0
 //
 // Copy constructor.
 //
 public SimulationSettingsValue(SimulationSettingsValue other)
 {
     CopyFrom(other);
 }
Пример #11
0
        public void Initialize(SimulationSettingsValue settings, ComponentCache componentCache,
                               GameEngineStateInitReason reason)
        {
            PhononCore.iplCreateContext(LogMessage, IntPtr.Zero, IntPtr.Zero, ref context);

            if (reason != GameEngineStateInitReason.EditingProbes)
            {
                var customSettings = componentCache.SteamAudioCustomSettings();

                var useOpenCL              = false;
                var computeDeviceType      = ComputeDeviceType.Any;
                var maxCUsToReserve        = 0;
                var fractionCUsForIRUpdate = .0f;

                convolutionType = ConvolutionOption.Phonon;
                var rayTracer = SceneType.Phonon;

                // TAN is enabled for realtime.
                if (customSettings && customSettings.ConvolutionType() == ConvolutionOption.TrueAudioNext &&
                    reason == GameEngineStateInitReason.Playing)
                {
                    convolutionType = customSettings.ConvolutionType();

                    useOpenCL              = true;
                    computeDeviceType      = ComputeDeviceType.GPU;
                    maxCUsToReserve        = customSettings.maxComputeUnitsToReserve;
                    fractionCUsForIRUpdate = customSettings.fractionComputeUnitsForIRUpdate;
                }

                // Enable some settings which are commong whether Radeon Rays is enabled for baking or realtime.
                if (customSettings &&
                    (reason == GameEngineStateInitReason.Baking ||
                     reason == GameEngineStateInitReason.GeneratingProbes ||
                     reason == GameEngineStateInitReason.Playing))
                {
                    if (customSettings.RayTracerType() != SceneType.RadeonRays)
                    {
                        rayTracer = customSettings.RayTracerType();
                    }
                    else
                    {
                        useOpenCL         = true;
                        rayTracer         = SceneType.RadeonRays;
                        computeDeviceType = ComputeDeviceType.GPU;
                    }
                }

                // Enable additional settings when Radeon Rays is enabled for realtime but TAN is not.
                if (customSettings && customSettings.RayTracerType() == SceneType.RadeonRays &&
                    customSettings.ConvolutionType() != ConvolutionOption.TrueAudioNext &&
                    reason == GameEngineStateInitReason.Playing)
                {
                    maxCUsToReserve        = customSettings.maxComputeUnitsToReserve;
                    fractionCUsForIRUpdate = 1.0f;
                }

                try
                {
                    var deviceFilter = new ComputeDeviceFilter
                    {
                        type                   = computeDeviceType,
                        maxCUsToReserve        = maxCUsToReserve,
                        fractionCUsForIRUpdate = fractionCUsForIRUpdate
                    };

                    computeDevice.Create(context, useOpenCL, deviceFilter);
                }
                catch (Exception e)
                {
                    if (customSettings && convolutionType == ConvolutionOption.TrueAudioNext)
                    {
                        var eInEditor = !SteamAudioManager.IsAudioEngineInitializing();
                        if (eInEditor && (!File.Exists(Directory.GetCurrentDirectory() + "/Assets/Plugins/x86_64/tanrt64.dll")))
                        {
                            throw new Exception(
                                      "Steam Audio configured to use TrueAudio Next, but TrueAudio Next support package " +
                                      "not installed. Please import SteamAudio_TrueAudioNext.unitypackage in order to use " +
                                      "TrueAudio Next support for Steam Audio.");
                        }
                        else
                        {
                            Debug.LogWarning(String.Format("Unable to create compute device: {0}. Using Phonon convolution and raytracer.",
                                                           e.Message));
                        }
                    }
                    else
                    {
                        Debug.LogWarning(String.Format("Unable to create compute device: {0}. Using Phonon convolution and raytracer.",
                                                       e.Message));
                    }

                    convolutionType = ConvolutionOption.Phonon;
                    rayTracer       = SceneType.Phonon;
                }

                var inEditor = !SteamAudioManager.IsAudioEngineInitializing();

                var maxSources = settings.MaxSources;
                if (customSettings && convolutionType == ConvolutionOption.TrueAudioNext)
                {
                    maxSources = customSettings.MaxSources;
                }
                if (rayTracer == SceneType.RadeonRays && reason == GameEngineStateInitReason.Baking)
                {
                    maxSources = customSettings.BakingBatchSize;
                }

                simulationSettings = new SimulationSettings
                {
                    sceneType           = rayTracer,
                    maxOcclusionSamples = settings.MaxOcclusionSamples,
                    rays                  = (inEditor) ? settings.BakeRays : settings.RealtimeRays,
                    secondaryRays         = (inEditor) ? settings.BakeSecondaryRays : settings.RealtimeSecondaryRays,
                    bounces               = (inEditor) ? settings.BakeBounces : settings.RealtimeBounces,
                    threads               = (inEditor) ? (int)Mathf.Max(1, (settings.BakeThreadsPercentage * SystemInfo.processorCount) / 100.0f) : (int)Mathf.Max(1, (settings.RealtimeThreadsPercentage * SystemInfo.processorCount) / 100.0f),
                    irDuration            = (customSettings && convolutionType == ConvolutionOption.TrueAudioNext) ? customSettings.Duration : settings.Duration,
                    ambisonicsOrder       = (customSettings && convolutionType == ConvolutionOption.TrueAudioNext) ? customSettings.AmbisonicsOrder : settings.AmbisonicsOrder,
                    maxConvolutionSources = maxSources,
                    bakingBatchSize       = (rayTracer == SceneType.RadeonRays) ? customSettings.BakingBatchSize : 1,
                    irradianceMinDistance = settings.IrradianceMinDistance
                };

#if UNITY_EDITOR
                if (customSettings)
                {
                    if (rayTracer == SceneType.RadeonRays)
                    {
                        if (!File.Exists(Directory.GetCurrentDirectory() + "/Assets/Plugins/x86_64/RadeonRays.dll"))
                        {
                            throw new Exception(
                                      "Steam Audio configured to use Radeon Rays, but Radeon Rays support package not " +
                                      "installed. Please import SteamAudio_RadeonRays.unitypackage in order to use Radeon " +
                                      "Rays support for Steam Audio.");
                        }
                    }

                    if (convolutionType == ConvolutionOption.TrueAudioNext)
                    {
                        if (!File.Exists(Directory.GetCurrentDirectory() + "/Assets/Plugins/x86_64/tanrt64.dll"))
                        {
                            throw new Exception(
                                      "Editor: Steam Audio configured to use TrueAudio Next, but TrueAudio Next support package " +
                                      "not installed. Please import SteamAudio_TrueAudioNext.unitypackage in order to use " +
                                      "TrueAudio Next support for Steam Audio.");
                        }
                    }
                }
#endif

                if (reason != GameEngineStateInitReason.ExportingScene)
                {
                    scene.Create(computeDevice, simulationSettings, context);
                }

                // Add other scenes in the hierarchy
                if (scene.GetScene() != IntPtr.Zero &&
                    (reason == GameEngineStateInitReason.GeneratingProbes || reason == GameEngineStateInitReason.Baking))
                {
                    for (int i = 0; i < SceneManager.sceneCount; ++i)
                    {
                        var unityScene = SceneManager.GetSceneAt(i);
                        if (!unityScene.isLoaded)
                        {
                            continue;
                        }

                        if (unityScene == SceneManager.GetActiveScene())
                        {
                            continue;
                        }

                        IntPtr additiveScene, additiveMesh;
                        var    error = scene.AddAdditiveScene(unityScene, scene.GetScene(),
                                                              computeDevice, simulationSettings, context, out additiveScene, out additiveMesh);

                        if (error != Error.None)
                        {
                            continue;
                        }

                        if (additiveScenes == null)
                        {
                            editorAdditiveScenes = new List <IntPtr>();
                        }
                        editorAdditiveScenes.Add(additiveScene);

                        if (editorAdditiveSceneMeshes == null)
                        {
                            editorAdditiveSceneMeshes = new List <IntPtr>();
                        }
                        editorAdditiveSceneMeshes.Add(additiveMesh);
                    }

                    PhononCore.iplCommitScene(scene.GetScene());
                }

                if (reason == GameEngineStateInitReason.Playing)
                {
                    probeManager.Create(context);
                }

                if (reason != GameEngineStateInitReason.ExportingScene &&
                    reason != GameEngineStateInitReason.GeneratingProbes)
                {
                    try
                    {
                        environment.Create(computeDevice, simulationSettings, scene, probeManager, context);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }
        }