Files
Simulation/Assets/Scripts/RTGController.cs
2025-07-07 09:57:13 +09:00

196 lines
6.7 KiB
C#

using RTG;
using System.Collections.Generic;
using UnityEngine;
using Octopus.Simulator;
public class RTGController : UnitySingleton<RTGController>
{
public enum GizmoId
{
None = 0,
Move,
Rotate,
Scale,
Universal,
}
private ObjectTransformGizmo objectMoveGizmo;
private ObjectTransformGizmo objectRotationGizmo;
private ObjectTransformGizmo objectScaleGizmo;
private ObjectTransformGizmo objectUniversalGizmo;
private GizmoId workGizmoId;
private ObjectTransformGizmo workGizmo;
public List<GameObject> selectedObjects = new List<GameObject>();
public System.Action onTransformBegin;
public System.Action<List<GameObject>> onTransformChanged;
Panel_SimulationUI simulationUI;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
objectMoveGizmo = RTGizmosEngine.Get.CreateObjectMoveGizmo();
objectRotationGizmo = RTGizmosEngine.Get.CreateObjectRotationGizmo();
objectScaleGizmo = RTGizmosEngine.Get.CreateObjectScaleGizmo();
objectUniversalGizmo = RTGizmosEngine.Get.CreateObjectUniversalGizmo();
objectMoveGizmo.Gizmo.SetEnabled(false);
objectMoveGizmo.Gizmo.MoveGizmo.SetSnapEnabled(false);
objectMoveGizmo.Gizmo.MoveGizmo.SetVertexSnapEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
objectMoveGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectRotationGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectScaleGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectUniversalGizmo.Gizmo.PreDragBegin += OnGizmoDragBegin;
objectMoveGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectRotationGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectScaleGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectUniversalGizmo.Gizmo.PostDragUpdate += OnGizmoDragUpdate;
objectMoveGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
objectRotationGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
objectScaleGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
objectUniversalGizmo.Gizmo.PostDragEnd += OnGizmoDragEnd;
workGizmo = objectMoveGizmo;
workGizmoId = GizmoId.None;
simulationUI = FindAnyObjectByType<Panel_SimulationUI>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Delete)&& !simulationUI.isplaying)
{
Destroy(selectedObjects[0]);
}
}
public void SetWorkGizmoId(GizmoId gizmoId)
{
objectMoveGizmo.Gizmo.SetEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
workGizmoId = gizmoId;
if (gizmoId == GizmoId.None)
return;
else if (gizmoId == GizmoId.Move)
workGizmo = objectMoveGizmo;
else if (gizmoId == GizmoId.Rotate)
workGizmo = objectRotationGizmo;
else if (gizmoId == GizmoId.Scale)
workGizmo = objectScaleGizmo;
else if (gizmoId == GizmoId.Universal)
workGizmo = objectUniversalGizmo;
if (selectedObjects.Count != 0)
{
workGizmo.Gizmo.SetEnabled(true);
workGizmo.RefreshPositionAndRotation();
}
}
public void SetWorkGizmoId(string gizmoId)
{
objectMoveGizmo.Gizmo.SetEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
if (gizmoId == "None")
{
workGizmoId = GizmoId.None;
return;
}
else if (gizmoId == "Move")
{
workGizmoId = GizmoId.Move;
workGizmo = objectMoveGizmo;
}
else if (gizmoId == "Rotate")
{
workGizmoId = GizmoId.Rotate;
workGizmo = objectRotationGizmo;
}
else if (gizmoId == "Scale")
{
workGizmoId = GizmoId.Scale;
workGizmo = objectScaleGizmo;
}
else if (gizmoId == "Universal")
{
workGizmoId = GizmoId.Universal;
workGizmo = objectUniversalGizmo;
}
if (selectedObjects.Count != 0)
{
workGizmo.Gizmo.SetEnabled(true);
workGizmo.RefreshPositionAndRotation();
}
}
private void OnSelectionChanged()
{
if (selectedObjects.Count != 0)
{
workGizmo.Gizmo.SetEnabled(true);
workGizmo.RefreshPositionAndRotation();
}
else
{
objectMoveGizmo.Gizmo.SetEnabled(false);
objectRotationGizmo.Gizmo.SetEnabled(false);
objectScaleGizmo.Gizmo.SetEnabled(false);
objectUniversalGizmo.Gizmo.SetEnabled(false);
}
}
public void AddGizmoTargetObject(GameObject obj)
{
selectedObjects.Add(obj);
objectMoveGizmo.SetTargetObjects(selectedObjects);
objectRotationGizmo.SetTargetObjects(selectedObjects);
objectScaleGizmo.SetTargetObjects(selectedObjects);
objectUniversalGizmo.SetTargetObjects(selectedObjects);
}
public void SetGizmoTargetObject(GameObject obj)
{
selectedObjects.Clear();
selectedObjects.Add(obj);
objectMoveGizmo.SetTargetObjects(selectedObjects);
objectRotationGizmo.SetTargetObjects(selectedObjects);
objectScaleGizmo.SetTargetObjects(selectedObjects);
objectUniversalGizmo.SetTargetObjects(selectedObjects);
}
public void SetGizmoTargetObjects(List<GameObject> objects)
{
selectedObjects.Clear();
selectedObjects.AddRange(objects);
objectMoveGizmo.SetTargetObjects(selectedObjects);
objectRotationGizmo.SetTargetObjects(selectedObjects);
objectScaleGizmo.SetTargetObjects(selectedObjects);
objectUniversalGizmo.SetTargetObjects(selectedObjects);
}
public void ClearGizmoTargetObjects()
{
selectedObjects.Clear();
objectMoveGizmo.SetTargetObjects(selectedObjects);
objectRotationGizmo.SetTargetObjects(selectedObjects);
objectScaleGizmo.SetTargetObjects(selectedObjects);
objectUniversalGizmo.SetTargetObjects(selectedObjects);
}
private void OnGizmoDragBegin(Gizmo gizmo, int t)
{
onTransformBegin?.Invoke();
}
private void OnGizmoDragUpdate(Gizmo gizmo, int t)
{
onTransformChanged?.Invoke(selectedObjects);
}
private void OnGizmoDragEnd(Gizmo gizmo, int t)
{
onTransformChanged?.Invoke(selectedObjects);
}
}