using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.EventSystems; namespace RimWorldAnimationStudio { public class ActorBody : MonoBehaviour, IPointerClickHandler, IDragHandler, IEndDragHandler { public int actorID; public bool isSelected = false; public SpriteRenderer bodyRenderer; public SpriteRenderer headRenderer; public SpriteRenderer appendageRenderer; private Vector3 delta = new Vector3(); public bool actorBodyPartSelected { get { return GetComponentsInChildren().Any(x => x.isSelected); } } public void Initialize(int actorID) { this.actorID = actorID; } public void Update() { if (Workspace.ActorID == actorID && Workspace.selectedBodyPart == null) { bodyRenderer.color = Constants.ColorGreen; } else { bodyRenderer.color = Constants.ColorWhite; } foreach (ActorAddon addon in Workspace.GetCurrentAnimationStage().AnimationClips[actorID].Addons) { ActorBodyPart bodyPart = GetComponentsInChildren(true).FirstOrDefault(x => x.addonName == addon.AddonName); bodyPart?.gameObject?.SetActive(addon.Render); } } public void OnPointerClick(PointerEventData eventData) { if (eventData.pointerCurrentRaycast.gameObject.GetComponent()) { return; } Activate(); } public void OnDrag(PointerEventData eventData) { Activate(); PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); if (keyframe == null) { Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; } Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); if (delta == Vector3.zero) { delta = mousePosition - transform.position; } if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { keyframe.BodyOffsetX = mousePosition.x - delta.x - Workspace.animationDef.Actors[actorID].GetFinalTransformOffset().x; keyframe.BodyOffsetZ = mousePosition.y - delta.y - Workspace.animationDef.Actors[actorID].GetFinalTransformOffset().y; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); keyframe.BodyAngle = angle; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Face) { float angle = Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position); int facing = -Mathf.RoundToInt(angle / 90f ); facing = facing < 0 ? facing + 4 : facing; keyframe.BodyFacing = facing; } PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); clip.BuildSimpleCurves(); } public void OnEndDrag(PointerEventData eventData) { Workspace.RecordEvent("Actor position / orientation"); delta = Vector3.zero; } public void Activate() { Workspace.ActorID = actorID; Workspace.selectedBodyPart = null; } } }