forked from SP4R0W/Shooting-Gallery
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
28 changed files
with
3,563 additions
and
155 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<Project Sdk="Godot.NET.Sdk/4.2.1"> | ||
<PropertyGroup> | ||
<TargetFramework>net6.0</TargetFramework> | ||
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net7.0</TargetFramework> | ||
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'ios' ">net8.0</TargetFramework> | ||
<EnableDynamicLoading>true</EnableDynamicLoading> | ||
</PropertyGroup> | ||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
Microsoft Visual Studio Solution File, Format Version 12.00 | ||
# Visual Studio 2012 | ||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShootingGallery", "ShootingGallery.csproj", "{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}" | ||
EndProject | ||
Global | ||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
Debug|Any CPU = Debug|Any CPU | ||
ExportDebug|Any CPU = ExportDebug|Any CPU | ||
ExportRelease|Any CPU = ExportRelease|Any CPU | ||
EndGlobalSection | ||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU | ||
{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU | ||
{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU | ||
{CBAC2DA1-37AD-4D33-9024-10E691C21FC6}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU | ||
EndGlobalSection | ||
EndGlobal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,318 @@ | ||
using Godot; | ||
using System; | ||
|
||
namespace ComposerLib | ||
{ | ||
public partial class Composer : Node | ||
{ | ||
[Signal] | ||
public delegate void SceneBeganLoadedEventHandler(string sceneName); | ||
|
||
[Signal] | ||
public delegate void SceneLoadedEventHandler(string sceneName); | ||
|
||
[Signal] | ||
public delegate void SceneLoadingProcessUpdatedEventHandler(string sceneName, float progress); | ||
|
||
[Signal] | ||
public delegate void SceneCreatedEventHandler(string sceneName); | ||
|
||
[Signal] | ||
public delegate void SceneEnabledEventHandler(string sceneName); | ||
|
||
[Signal] | ||
public delegate void SceneDisabledEventHandler(string sceneName); | ||
|
||
[Signal] | ||
public delegate void SceneRemovedEventHandler(string sceneName); | ||
|
||
[Signal] | ||
public delegate void SceneDisposedEventHandler(string sceneName); | ||
|
||
|
||
public Godot.Collections.Dictionary<string, Scene> Scenes = new(); | ||
internal ComposerGD ComposerGD {get; set;} = null; | ||
private readonly CreateSettings DefaultCreateSettings = new(){SceneParent = ((SceneTree)Engine.GetMainLoop()).Root}; | ||
private readonly Loader Loader = new(); | ||
|
||
public override void _EnterTree() | ||
{ | ||
AddChild(Loader,true); | ||
Loader.LoaderStarted += OnSceneBeganLoading; | ||
Loader.LoaderLoadingUpdated += OnLoadingUpdated; | ||
} | ||
|
||
public Scene GetScene(string name) | ||
{ | ||
if (!Scenes.TryGetValue(name, out Scene scene)) | ||
{ | ||
GD.PrintErr($"GetScene error: Scene {name} doesn't exist in memory."); | ||
return null; | ||
} | ||
|
||
return scene; | ||
} | ||
|
||
public void AddScene(string name, string path, AddSettings settings = null) | ||
{ | ||
if (Scenes.ContainsKey(name)) | ||
{ | ||
GD.PrintErr($"AddScene error: Scene {name} already exists in memory."); | ||
return; | ||
} | ||
|
||
var scene = new Scene(name, path); | ||
scene.FinishedLoading += OnSceneLoaded; | ||
scene.FinishedCreating += OnSceneCreated; | ||
|
||
if (settings != null) VerifyPreAddSettings(name, settings); | ||
|
||
Scenes.Add(name,scene); | ||
|
||
if (settings != null) VerifyPostAddSettings(name, settings); | ||
} | ||
|
||
public void AddScene(string name, PackedScene resource, AddSettings settings = null, string path = "") | ||
{ | ||
if (Scenes.ContainsKey(name)) | ||
{ | ||
GD.PrintErr($"AddScene error: Scene {name} already exists in memory."); | ||
return; | ||
} | ||
|
||
var scene = new Scene(name, resource, path); | ||
scene.FinishedLoading += OnSceneLoaded; | ||
scene.FinishedCreating += OnSceneCreated; | ||
|
||
if (settings != null) VerifyPreAddSettings(name, settings); | ||
|
||
Scenes.Add(name,scene); | ||
|
||
if (settings != null) VerifyPostAddSettings(name, settings); | ||
} | ||
|
||
public void AddScene(Scene scene, AddSettings settings = null) | ||
{ | ||
if (Scenes.ContainsKey(scene.InternalName)) | ||
{ | ||
GD.PrintErr($"AddScene error: Scene {scene.InternalName} already exists in memory."); | ||
return; | ||
} | ||
|
||
scene.FinishedLoading += OnSceneLoaded; | ||
scene.FinishedCreating += OnSceneCreated; | ||
|
||
if (settings != null) VerifyPreAddSettings(scene.InternalName, settings); | ||
|
||
Scenes.Add(scene.InternalName,scene); | ||
|
||
if (settings != null) VerifyPostAddSettings(scene.InternalName, settings); | ||
} | ||
|
||
public async void LoadScene(string name, LoadSettings settings = null) | ||
{ | ||
var scene = GetScene(name); | ||
|
||
if (scene == null) | ||
{ | ||
GD.PrintErr($"LoadScene error: Scene {name} doesn't exist in memory."); | ||
return; | ||
} | ||
|
||
if (settings != null) VerifyPreLoadSettings(name, settings); | ||
|
||
if (settings != null) | ||
scene.Load(settings.UseSubthreads, settings.CacheMode); | ||
else | ||
scene.Load(); | ||
|
||
await ToSignal(scene,Scene.SignalName.FinishedLoading); | ||
|
||
if (settings != null) VerifyPostLoadSettings(name, settings); | ||
} | ||
|
||
public async void CreateScene(string name, CreateSettings settings = null) | ||
{ | ||
settings ??= DefaultCreateSettings; | ||
var scene = GetScene(name); | ||
|
||
if (scene == null) | ||
{ | ||
GD.PrintErr($"CreateScene error: Scene {name} doesn't exist in memory."); | ||
return; | ||
} | ||
|
||
if (settings != null) VerifyPreCreateSettings(name, settings); | ||
|
||
scene.Create(settings.SceneParent); | ||
|
||
await ToSignal(scene, Scene.SignalName.FinishedCreating); | ||
|
||
if (settings != null) VerifyPostCreateSettings(name, settings); | ||
} | ||
|
||
public void ReplaceScene(string sceneToRemove, string sceneToAdd, Node parent) | ||
{ | ||
RemoveScene(sceneToRemove); | ||
CreateScene(sceneToAdd, new CreateSettings{ | ||
SceneParent = parent | ||
}); | ||
} | ||
|
||
public void ReloadScene(string name) | ||
{ | ||
var scene = GetScene(name); | ||
|
||
if (scene.Instance == null) | ||
{ | ||
GD.PrintErr($"ReloadScene error: Scene {name} doesn't have an instance."); | ||
return; | ||
} | ||
|
||
var parent = scene.Instance.GetParent(); | ||
RemoveScene(name); | ||
CreateScene(name, new(){ | ||
SceneParent = parent | ||
}); | ||
} | ||
|
||
public void EnableScene(string name) | ||
{ | ||
var scene = GetScene(name); | ||
|
||
if (scene == null) | ||
{ | ||
GD.PrintErr($"EnableScene error: Scene {name} doesn't exist in memory."); | ||
return; | ||
} | ||
|
||
scene.Enable(); | ||
EmitSignal(SignalName.SceneEnabled, name); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneEnabled, name); | ||
} | ||
|
||
public void DisableScene(string name) | ||
{ | ||
var scene = GetScene(name); | ||
|
||
if (scene == null) | ||
{ | ||
GD.PrintErr($"EnableScene error: Scene {name} doesn't exist in memory."); | ||
return; | ||
} | ||
|
||
scene.Disable(); | ||
EmitSignal(SignalName.SceneDisabled, name); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneDisabled, name); | ||
} | ||
|
||
public void RemoveScene(string name) | ||
{ | ||
var scene = GetScene(name); | ||
|
||
if (scene == null) | ||
{ | ||
GD.PrintErr($"RemoveScene error: Scene {name} doesn't exist in memory."); | ||
return; | ||
} | ||
|
||
scene.Remove(); | ||
EmitSignal(SignalName.SceneRemoved, name); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneRemoved, name); | ||
} | ||
|
||
public void DisposeScene(string name) | ||
{ | ||
var scene = GetScene(name); | ||
|
||
if (scene == null) | ||
{ | ||
GD.PrintErr($"DisposeScene error: Scene {name} doesn't exist in memory."); | ||
return; | ||
} | ||
|
||
scene.FinishedLoading -= OnSceneLoaded; | ||
scene.FinishedCreating -= OnSceneCreated; | ||
scene.Dispose(); | ||
Scenes.Remove(name); | ||
|
||
EmitSignal(SignalName.SceneDisposed, name); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneDisposed, name); | ||
} | ||
|
||
private void VerifyPreAddSettings(string name, AddSettings settings) | ||
{ | ||
|
||
} | ||
|
||
private void VerifyPostAddSettings(string name, AddSettings settings) | ||
{ | ||
if (settings.InstantLoad) | ||
{ | ||
LoadScene(name,new LoadSettings{ | ||
SceneParent = settings.SceneParent, | ||
InstantCreate = settings.InstantCreate | ||
}); | ||
} | ||
} | ||
|
||
private void VerifyPreLoadSettings(string name, LoadSettings settings) | ||
{ | ||
|
||
} | ||
|
||
private void VerifyPostLoadSettings(string name, LoadSettings settings) | ||
{ | ||
if (settings.SceneParent != null) | ||
{ | ||
if (settings.InstantCreate) | ||
{ | ||
CreateScene(name,new CreateSettings{ | ||
SceneParent = settings.SceneParent | ||
}); | ||
} | ||
} | ||
} | ||
|
||
private void VerifyPreCreateSettings(string name, CreateSettings settings) | ||
{ | ||
if (!IsInstanceValid(settings.SceneParent)) | ||
{ | ||
throw new ArgumentException($"Invalid SceneParent argument for CreateScene, scene {name}"); | ||
} | ||
} | ||
|
||
private void VerifyPostCreateSettings(string name, CreateSettings settings) | ||
{ | ||
if (settings.DisableProcessing) | ||
{ | ||
GetScene(name).Disable(); | ||
} | ||
} | ||
|
||
private void OnSceneCreated(string sceneName) | ||
{ | ||
EmitSignal(SignalName.SceneCreated, sceneName); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneCreated, sceneName); | ||
} | ||
|
||
private void OnSceneBeganLoading(Scene scene) | ||
{ | ||
EmitSignal(SignalName.SceneBeganLoaded, scene.InternalName); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneBeganLoading, scene.InternalName); | ||
} | ||
|
||
private void OnLoadingUpdated(Scene scene, float progress) | ||
{ | ||
EmitSignal(SignalName.SceneLoadingProcessUpdated, scene.InternalName, progress); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneLoadingProcessUpdated, scene.InternalName, progress); | ||
} | ||
|
||
private void OnSceneLoaded(string sceneName) | ||
{ | ||
EmitSignal(SignalName.SceneLoaded, sceneName); | ||
ComposerGD?.EmitSignal(ComposerGD.SignalName.SceneLoaded, sceneName); | ||
} | ||
} | ||
} | ||
|
Oops, something went wrong.