Net.Like.Xue.Tokyo/Assets/Plugins/Draw XXL/scripts/components/internal utilities/VisualizerScreenspaceParent.cs

116 lines
5.9 KiB
C#

namespace DrawXXL
{
using UnityEngine;
[HelpURL("https://www.symphonygames.net/drawxxldocumentation/index.html")]
[AddComponentMenu("Draw XXL/Internal Not For Manual Creation/Visualizer Screenspace Parent")]
[DefaultExecutionOrder(31000)] //negative numers are early, positive numbers are late. Range is till 32000 to both negative and positive direction.
public class VisualizerScreenspaceParent : VisualizerParent
{
public enum ScreenspaceDefiningCameras { cameraAtThisGameobject, manuallyAssignedCamera, automaticallySearchForMainGameViewCamera, sceneViewCamera };
[SerializeField] public ScreenspaceDefiningCameras screenspaceDefiningCamera = ScreenspaceDefiningCameras.cameraAtThisGameobject;
ScreenspaceDefiningCameras screenspaceDefiningCamera_duringLastCall = ScreenspaceDefiningCameras.cameraAtThisGameobject;
Camera cameraComponentOnThisGameobject;
Camera sceneViewCamera_thatStaysEvenIfTheFocusChangesToAnotherSceneViewWindow;
[SerializeField] public Camera manuallyAssignedCamera;
[SerializeField] public bool alwaysChangeToCurrentlyActiveSceneView_insteadOfStayingAtTheSelectedOne = false;
Camera usedCamera;
[SerializeField] public bool usedCameraIsAvailable;
public Vector2 positionInsideViewport0to1 = new Vector2(0.5f, 0.5f);
public Vector2 positionInsideViewport0to1_v2 = new Vector2(0.5f, 0.5f);
public void TryFetchCamOnThisGO_andDecideScreenspaceDefiningCamera()
{
//-> is also called when components or gameobjects (containing this component) get copied und therefore the reference is updated to the new camera component on the new gameobject
if (screenspaceDefiningCamera == ScreenspaceDefiningCameras.cameraAtThisGameobject)
{
this.TryGetComponent(out cameraComponentOnThisGameobject);
if (cameraComponentOnThisGameobject == null)
{
screenspaceDefiningCamera = ScreenspaceDefiningCameras.automaticallySearchForMainGameViewCamera;
screenspaceDefiningCamera_duringLastCall = ScreenspaceDefiningCameras.automaticallySearchForMainGameViewCamera;
}
}
}
public Camera Get_usedCamera(string nameOfComponentForErrorLog)
{
switch (screenspaceDefiningCamera)
{
case ScreenspaceDefiningCameras.cameraAtThisGameobject:
if (cameraComponentOnThisGameobject == null)
{
//this is for the case when a camera component is created at the gameobject AFTER the drawer component has been created
//it is accepted to call "TryGetComponent" here frequently (per Update-loop), because it is anyway only during an invalid case ("no camera found") on which the user gets notified to fix it via inspector help box.
this.TryGetComponent(out cameraComponentOnThisGameobject);
}
usedCamera = cameraComponentOnThisGameobject;
break;
case ScreenspaceDefiningCameras.manuallyAssignedCamera:
usedCamera = manuallyAssignedCamera;
break;
case ScreenspaceDefiningCameras.automaticallySearchForMainGameViewCamera:
UtilitiesDXXL_Screenspace.GetAutomaticCameraForDrawing(out usedCamera, nameOfComponentForErrorLog, true);
break;
case ScreenspaceDefiningCameras.sceneViewCamera:
#if UNITY_EDITOR
if (UnityEditor.SceneView.lastActiveSceneView != null)
{
if (sceneViewCamera_thatStaysEvenIfTheFocusChangesToAnotherSceneViewWindow == null) { sceneViewCamera_thatStaysEvenIfTheFocusChangesToAnotherSceneViewWindow = UnityEditor.SceneView.lastActiveSceneView.camera; }
if ((screenspaceDefiningCamera_duringLastCall != ScreenspaceDefiningCameras.sceneViewCamera) || (alwaysChangeToCurrentlyActiveSceneView_insteadOfStayingAtTheSelectedOne == true))
{
sceneViewCamera_thatStaysEvenIfTheFocusChangesToAnotherSceneViewWindow = UnityEditor.SceneView.lastActiveSceneView.camera;
}
if (alwaysChangeToCurrentlyActiveSceneView_insteadOfStayingAtTheSelectedOne == false)
{
usedCamera = sceneViewCamera_thatStaysEvenIfTheFocusChangesToAnotherSceneViewWindow;
}
else
{
usedCamera = UnityEditor.SceneView.lastActiveSceneView.camera;
}
}
else
{
usedCamera = null;
}
#else
UtilitiesDXXL_Screenspace.GetAutomaticCameraForDrawing(out usedCamera, nameOfComponentForErrorLog, true);
#endif
break;
default:
usedCamera = null;
break;
}
screenspaceDefiningCamera_duringLastCall = screenspaceDefiningCamera;
usedCameraIsAvailable = (usedCamera != null);
return usedCamera;
}
public bool CheckIf_usedCameraIsActiveAndEnabled()
{
if (usedCamera != null)
{
bool isSceneViewCamera = false;
#if UNITY_EDITOR
if (UnityEditor.SceneView.lastActiveSceneView != null)
{
isSceneViewCamera = (usedCamera == UnityEditor.SceneView.lastActiveSceneView.camera);
}
#endif
return (isSceneViewCamera || usedCamera.isActiveAndEnabled);
}
else
{
return false;
}
}
}
}