Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions Assets/GothicVR/Editor/Scripts/Builds/UnityBuilderAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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);
Expand All @@ -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);
}
Expand All @@ -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);
Expand All @@ -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);
}
Expand All @@ -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);
Expand Down
98 changes: 68 additions & 30 deletions Assets/GothicVR/Editor/Scripts/Tools/FeatureFlagTool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class FeatureFlagTool : EditorWindow
/// <summary>
/// FieldName, FieldType, Value
/// </summary>
private static readonly List<Tuple<string, Type, object>> ProductionFlags = new()
private static readonly List<(string name, Type type, object value)> ProductionFlags = new()
{
// Booleans
new (nameof(FeatureFlags.createWorldMesh), typeof(bool), true),
Expand Down Expand Up @@ -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<FeatureFlags>();

var featureFlags = GameObject.Find("FeatureFlags").GetComponent<FeatureFlags>();
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<int>), new List<int>{1, 100, 233})
});

Debug.Log("FeatureFlags successfully set to >NpcTest<.");
}

/// <summary>
/// We reset all flags to a default value. It's expected, that e.g. a bool=false is default.
/// </summary>
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<int>)field.GetValue(featureFlags)).Clear();
((List<int>)field.GetValue(_featureFlags)).Clear();
break;
case nameof(VirtualObjectType):
((List<VirtualObjectType>)field.GetValue(featureFlags)).Clear();
((List<VirtualObjectType>)field.GetValue(_featureFlags)).Clear();
break;
default:
Debug.LogError($"Unsupported field type >{field.FieldType.GenericTypeArguments[0].Name}<");
Expand All @@ -126,22 +145,41 @@ private static void ResetFlags(FeatureFlags featureFlags, FieldInfo[] fields)
/// <summary>
/// Pick the ProductionFlags and set values to demanded values.
/// </summary>
private static void SetProductionFlags(FeatureFlags featureFlags)
private static void SetProductionFlags()
{
SetFlags(ProductionFlags);
}

/// <summary>
/// Set whatever flags we want.
/// </summary>
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;
}
}
Expand Down