using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.EventSystems; namespace RimWorldAnimationStudio { public class ActorBodyPart : MonoBehaviour, IPointerClickHandler, IDragHandler, IEndDragHandler { public SpriteRenderer bodyPartRenderer; public ActorBody parent; public bool isHead = false; public bool isSelected = false; public void Update() { if ((Workspace.actorID == parent.actorID && Workspace.selectedBodyPart == null) || Workspace.selectedBodyPart == this) { bodyPartRenderer.color = Constants.ColorGreen; } else { bodyPartRenderer.color = Constants.ColorWhite; } } public void OnPointerClick(PointerEventData eventData) { if (eventData.pointerCurrentRaycast.gameObject.GetComponent() == null) { return; } Activate(); } public void OnDrag(PointerEventData eventData) { Activate(); PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); if (keyframe == null) { Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; } Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); if (isHead) { if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { Vector3 headOffset = new Vector3(0f, 0.34f, 0f); headOffset = Quaternion.Euler(0, 0, keyframe.bodyAngle) * headOffset; float distance = Vector2.Dot(parent.transform.up, (Vector2)(mousePosition - parent.transform.position - headOffset)); keyframe.headBob = distance; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); keyframe.headAngle = 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.headFacing = facing; } } else { if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position); keyframe.genitalAngle = angle; Workspace.animationDef.actors[Workspace.actorID].controlGenitalAngle = Workspace.animationDef.animationStages.Any(x => x.animationClips[Workspace.actorID].keyframes.Any(y => y.genitalAngle != 0)); } } PawnAnimationClip clip = Workspace.Instance.GetPawnAnimationClip(parent.actorID); clip.BuildSimpleCurves(); } public void OnEndDrag(PointerEventData eventData) { Workspace.Instance.RecordEvent("Actor position / orientation"); } public void Activate() { Workspace.actorID = parent.actorID; Workspace.selectedBodyPart = this; } } }