diff --git a/Assets/GothicVR/Editor/Scripts/Builds/UnityBuilderAction.cs b/Assets/GothicVR/Editor/Scripts/Builds/UnityBuilderAction.cs index adb70b78c..c46305680 100644 --- a/Assets/GothicVR/Editor/Scripts/Builds/UnityBuilderAction.cs +++ b/Assets/GothicVR/Editor/Scripts/Builds/UnityBuilderAction.cs @@ -37,7 +37,7 @@ static void PerformQuestBuild() { string target_path = TARGET_DIR + "/Quest/" + APP_NAME + ".apk"; SetQuestSettings(); - FeatureFlagTool.SetFeatureFlags(); + FeatureFlagTool.SetFeatureFlagsProduction(); EditorSceneManager.SaveScene(SceneManager.GetSceneByName("Bootstrap")); GenericBuild(SCENES, target_path, BuildTargetGroup.Android, BuildTarget.Android, BuildOptions.None); } @@ -48,7 +48,7 @@ static void PerformQuestBuild(bool resetFeatureFlags = true) SetQuestSettings(); if (resetFeatureFlags) { - FeatureFlagTool.SetFeatureFlags(); + FeatureFlagTool.SetFeatureFlagsProduction(); EditorSceneManager.SaveScene(SceneManager.GetSceneByName("Bootstrap")); } GenericBuild(SCENES, target_path, BuildTargetGroup.Android, BuildTarget.Android, BuildOptions.None); @@ -69,7 +69,7 @@ static void PerformPicoBuild() { string target_path = TARGET_DIR + "/Pico/" + APP_NAME + ".apk"; SetPicoSettings(); - FeatureFlagTool.SetFeatureFlags(); + FeatureFlagTool.SetFeatureFlagsProduction(); EditorSceneManager.SaveScene(SceneManager.GetSceneByName("Bootstrap")); GenericBuild(SCENES, target_path, BuildTargetGroup.Android, BuildTarget.Android, BuildOptions.None); } @@ -79,7 +79,7 @@ static void PerformPicoBuild(bool resetFeatureFlags = true) SetPicoSettings(); if (resetFeatureFlags) { - FeatureFlagTool.SetFeatureFlags(); + FeatureFlagTool.SetFeatureFlagsProduction(); EditorSceneManager.SaveScene(SceneManager.GetSceneByName("Bootstrap")); } GenericBuild(SCENES, target_path, BuildTargetGroup.Android, BuildTarget.Android, BuildOptions.None); @@ -99,7 +99,7 @@ static void PerformLocalWindows64Build() static void PerformWindows64Build() { string target_path = TARGET_DIR + "/Windows64/" + APP_NAME + ".exe"; - FeatureFlagTool.SetFeatureFlags(); + FeatureFlagTool.SetFeatureFlagsProduction(); EditorSceneManager.SaveScene(SceneManager.GetSceneByName("Bootstrap")); GenericBuild(SCENES, target_path, BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64, BuildOptions.None); } @@ -108,7 +108,7 @@ static void PerformWindows64Build(bool resetFeatureFlags = true) string target_path = TARGET_DIR + "/Windows64/" + APP_NAME + ".exe"; if (resetFeatureFlags) { - FeatureFlagTool.SetFeatureFlags(); + FeatureFlagTool.SetFeatureFlagsProduction(); EditorSceneManager.SaveScene(SceneManager.GetSceneByName("Bootstrap")); } GenericBuild(SCENES, target_path, BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64, BuildOptions.None); diff --git a/Assets/GothicVR/Editor/Scripts/Tools/FeatureFlagTool.cs b/Assets/GothicVR/Editor/Scripts/Tools/FeatureFlagTool.cs index e8035779b..0c9c264ce 100644 --- a/Assets/GothicVR/Editor/Scripts/Tools/FeatureFlagTool.cs +++ b/Assets/GothicVR/Editor/Scripts/Tools/FeatureFlagTool.cs @@ -16,7 +16,7 @@ public class FeatureFlagTool : EditorWindow /// /// FieldName, FieldType, Value /// - private static readonly List> ProductionFlags = new() + private static readonly List<(string name, Type type, object value)> ProductionFlags = new() { // Booleans new (nameof(FeatureFlags.createWorldMesh), typeof(bool), true), @@ -50,66 +50,85 @@ public class FeatureFlagTool : EditorWindow new Color(1, .87f, .44f, 1)) }; - - [MenuItem("GothicVR/Tools/FeatureFlags - Set Production ready state", priority = 1)] - public static void SetFeatureFlags() + private static Scene _bootstrapScene { - var scene = SceneManager.GetSceneByName("Bootstrap"); - - if (scene == default) + get { - Debug.LogError(">Bootstrap< scene needs to be loaded."); - return; + var scene = SceneManager.GetSceneByName("Bootstrap"); + if (scene == default) + Debug.LogError(">Bootstrap< scene needs to be loaded."); + return scene; } + } + private static FeatureFlags _featureFlags => GameObject.Find("FeatureFlags").GetComponent(); - var featureFlags = GameObject.Find("FeatureFlags").GetComponent(); - var fields = featureFlags.GetType().GetFields(); - ResetFlags(featureFlags, fields); - SetProductionFlags(featureFlags); + [MenuItem("GothicVR/Tools/FeatureFlags - Production", priority = 1)] + public static void SetFeatureFlagsProduction() + { + var fields = _featureFlags.GetType().GetFields(); - EditorSceneManager.MarkSceneDirty(scene); + ResetFlags(fields); + SetProductionFlags(); - Debug.Log("FeatureFlags successfully set to production values."); + EditorSceneManager.MarkSceneDirty(_bootstrapScene); + + Debug.Log("FeatureFlags successfully set to >production<."); + } + + [MenuItem("GothicVR/Tools/FeatureFlags - NpcTest", priority = 2)] + public static void SetFeatureFlagsNpcTest() + { + SetFeatureFlagsProduction(); + + SetFlags(new List<(string, Type, object)> + { + new (nameof(FeatureFlags.createOcNpcs), typeof(bool), true), + new (nameof(FeatureFlags.enableNpcRoutines), typeof(bool), true), + // 1 - Diego, 100 - Gomez, 233 - Blodwyn + new (nameof(FeatureFlags.npcToSpawn), typeof(List), new List{1, 100, 233}) + }); + + Debug.Log("FeatureFlags successfully set to >NpcTest<."); } /// /// We reset all flags to a default value. It's expected, that e.g. a bool=false is default. /// - private static void ResetFlags(FeatureFlags featureFlags, FieldInfo[] fields) + private static void ResetFlags(FieldInfo[] fields) { foreach (var field in fields) { switch (field.FieldType.Name) { case "Boolean": - field.SetValue(featureFlags, false); + field.SetValue(_featureFlags, false); break; case "Int32": case "Single": // float case "SunMovementPerformance": - field.SetValue(featureFlags, 0); + field.SetValue(_featureFlags, 0); break; case "LogLevel": - field.SetValue(featureFlags, LogLevel.Error); + field.SetValue(_featureFlags, LogLevel.Error); break; case "String": - field.SetValue(featureFlags, ""); + field.SetValue(_featureFlags, ""); break; case "Color": - field.SetValue(featureFlags, Color.white); + field.SetValue(_featureFlags, Color.white); break; case "VobCullingGroupSetting": - field.SetValue(featureFlags, new FeatureFlags.VobCullingGroupSetting()); + field.SetValue(_featureFlags, new FeatureFlags.VobCullingGroupSetting()); break; case "List`1": switch (field.FieldType.GenericTypeArguments[0].Name) { case "Int32": - ((List)field.GetValue(featureFlags)).Clear(); + ((List)field.GetValue(_featureFlags)).Clear(); break; case nameof(VirtualObjectType): - ((List)field.GetValue(featureFlags)).Clear(); + ((List)field.GetValue(_featureFlags)).Clear(); break; default: Debug.LogError($"Unsupported field type >{field.FieldType.GenericTypeArguments[0].Name}<"); @@ -126,22 +145,41 @@ private static void ResetFlags(FeatureFlags featureFlags, FieldInfo[] fields) /// /// Pick the ProductionFlags and set values to demanded values. /// - private static void SetProductionFlags(FeatureFlags featureFlags) + private static void SetProductionFlags() + { + SetFlags(ProductionFlags); + } + + /// + /// Set whatever flags we want. + /// + private static void SetFlags(List<(string name, Type type, object value)> flags) { - foreach (var flag in ProductionFlags) + foreach (var flag in flags) { - switch (flag.Item2.Name) + var field = _featureFlags.GetType().GetField(flag.name); + switch (flag.type.Name) { case "Boolean": case "Int32": case "Single": // float case "Color": case "VobCullingGroupSetting": - var field = featureFlags.GetType().GetField(flag.Item1); - field.SetValue(featureFlags, flag.Item3); + field.SetValue(_featureFlags, flag.value); + break; + case "List`1": + switch (field.FieldType.GenericTypeArguments[0].Name) + { + case "Int32": + field.SetValue(_featureFlags, flag.value); + break; + default: + Debug.LogError($"Unsupported field type >{field.FieldType.GenericTypeArguments[0].Name}<"); + break; + } break; default: - Debug.LogError($"Unsupported/Untested field type >{flag.Item2.Name}< for >{flag.Item1}<"); + Debug.LogError($"Unsupported/Untested field type >{flag.type.Name}< for >{flag.name}<"); break; } }