generated from krampus/template-godot4
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Godot;
 | |
| 
 | |
| #nullable enable
 | |
| 
 | |
| namespace PhantomCamera;
 | |
| 
 | |
| public enum InterpolationMode
 | |
| {
 | |
|     Auto,
 | |
|     Idle,
 | |
|     Physics
 | |
| }
 | |
| 
 | |
| public static class PhantomCameraHostExtensions
 | |
| {
 | |
|     public static PhantomCameraHost AsPhantomCameraHost(this Node node)
 | |
|     {
 | |
|         return new PhantomCameraHost(node);
 | |
|     }
 | |
| }
 | |
| 
 | |
| public class PhantomCameraHost()
 | |
| {
 | |
|     public Node Node { get; } = null!;
 | |
| 
 | |
|     public PhantomCameraHost(Node node) : this()
 | |
|     {
 | |
|         Node = node;
 | |
| 
 | |
|         _callablePCamBecameActive = Callable.From<Node>(pCam => PCamBecameActive?.Invoke(pCam));
 | |
|         _callablePCamBecameInactive = Callable.From<Node>(pCam => PCamBecameInactive?.Invoke(pCam));
 | |
| 
 | |
|         Node.Connect(SignalName.PCamBecameActive, _callablePCamBecameActive);
 | |
|         Node.Connect(SignalName.PCamBecameInactive, _callablePCamBecameInactive);
 | |
|     }
 | |
| 
 | |
|     ~PhantomCameraHost()
 | |
|     {
 | |
|         Node.Disconnect(SignalName.PCamBecameActive, _callablePCamBecameActive);
 | |
|         Node.Disconnect(SignalName.PCamBecameInactive, _callablePCamBecameInactive);
 | |
|     }
 | |
| 
 | |
|     public delegate void PCamBecameActiveEventHandler(Node pCam);
 | |
|     public delegate void PCamBecameInactiveEventHandler(Node pCam);
 | |
| 
 | |
|     public event PCamBecameActiveEventHandler? PCamBecameActive;
 | |
|     public event PCamBecameInactiveEventHandler? PCamBecameInactive;
 | |
| 
 | |
| 
 | |
|     private readonly Callable _callablePCamBecameActive;
 | |
|     private readonly Callable _callablePCamBecameInactive;
 | |
|     // For when Godot becomes the minimum version
 | |
|     // public InterpolationMode InterpolationMode
 | |
|     // {
 | |
|     //      get => (InterpolationMode)(int)Node.Call(MethodName.GetInterpolationMode);
 | |
|     //      set => Node.Call(MethodName.SetInterpolationMode, (int)value);
 | |
|     // }
 | |
| 
 | |
|     public int HostLayers
 | |
|     {
 | |
|         get => (int)Node.Call(PhantomCamera.MethodName.GetHostLayers);
 | |
|         set => Node.Call(PhantomCamera.MethodName.SetHostLayers, value);
 | |
|     }
 | |
| 
 | |
|     public void SetHostLayersValue(int layer, bool value) => Node.Call(MethodName.SetHostLayersValue, layer, value);
 | |
| 
 | |
|     public Camera2D? Camera2D => (Camera2D?)Node.Get(PropertyName.Camera2D);
 | |
| 
 | |
|     public Camera3D? Camera3D => (Camera3D?)Node.Get(PropertyName.Camera3D);
 | |
| 
 | |
|     public InterpolationMode InterpolationMode
 | |
|     {
 | |
|         get => (InterpolationMode)(int)Node.Call(MethodName.GetInterpolationMode);
 | |
|         set => Node.Call(MethodName.SetInterpolationMode, (int)value);
 | |
|     }
 | |
| 
 | |
|     public bool TriggerPhantomCameraTween => (bool)Node.Call(MethodName.GetTriggerPhantomCameraTween);
 | |
| 
 | |
|     public ActivePhantomCameraQueryResult? GetActivePhantomCamera()
 | |
|     {
 | |
|         var result = Node.Call(MethodName.GetActivePhantomCamera);
 | |
|         return result.VariantType == Variant.Type.Nil ? null : new ActivePhantomCameraQueryResult(result.AsGodotObject());
 | |
|     }
 | |
| 
 | |
|     public static class PropertyName
 | |
|     {
 | |
|         public const string Camera2D = "camera_2d";
 | |
|         public const string Camera3D = "camera_3d";
 | |
|     }
 | |
| 
 | |
|     public static class MethodName
 | |
|     {
 | |
|         public const string GetActivePhantomCamera = "get_active_pcam";
 | |
|         public const string GetTriggerPhantomCameraTween = "get_trigger_pcam_tween";
 | |
| 
 | |
|         public const string GetInterpolationMode = "get_interpolation_mode";
 | |
|         public const string SetInterpolationMode = "set_interpolation_mode";
 | |
| 
 | |
|         public const string SetHostLayersValue = "set_host_layers_value";
 | |
|     }
 | |
| 
 | |
|     public static class SignalName
 | |
|     {
 | |
|         public const string PCamBecameActive = "pcam_became_active";
 | |
|         public const string PCamBecameInactive = "pcam_became_inactive";
 | |
|     }
 | |
| }
 | |
| 
 | |
| public class ActivePhantomCameraQueryResult(GodotObject godotObject)
 | |
| {
 | |
|     public bool Is2D => godotObject.IsClass("Node2D") || ((Node)godotObject).Name.ToString().Contains("PhantomCamera2D")
 | |
|                                                || ((Node)godotObject).Name.ToString().Contains("PCam2D")
 | |
|                                                || ((Node)godotObject).Name.ToString().Contains("2D");
 | |
| 
 | |
|     public bool Is3D => godotObject.IsClass("Node3D") || ((Node)godotObject).Name.ToString().Contains("PhantomCamera3D")
 | |
|                                                || ((Node)godotObject).Name.ToString().Contains("PCam3D")
 | |
|                                                || ((Node)godotObject).Name.ToString().Contains("3D");
 | |
| 
 | |
|     public PhantomCamera2D? AsPhantomCamera2D()
 | |
|     {
 | |
|         return Is2D ? new PhantomCamera2D(godotObject) : null;
 | |
|     }
 | |
| 
 | |
|     public PhantomCamera3D? AsPhantomCamera3D()
 | |
|     {
 | |
|         return Is3D ? new PhantomCamera3D(godotObject) : null;
 | |
|     }
 | |
| }
 |