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; | |||
|  |     } | |||
|  | } |