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 string bodyType = "Male"; 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; } appendageRenderer.gameObject.SetActive(Workspace.animationDef.actors[actorID].requiredGenitals.Any(x => x == "Penis") || Workspace.animationDef.actors[actorID].isFucking); } public void OnPointerClick(PointerEventData eventData) { if (eventData.pointerCurrentRaycast.gameObject.GetComponent()) { 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 (delta == Vector3.zero) { delta = mousePosition - transform.position; } if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { keyframe.bodyOffsetX = mousePosition.x - delta.x - Workspace.animationDef.actors[actorID].GetAlienRaceOffset().x; keyframe.bodyOffsetZ = mousePosition.y - delta.y - Workspace.animationDef.actors[actorID].GetAlienRaceOffset().z; } 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.Instance.GetPawnAnimationClip(actorID); clip.BuildSimpleCurves(); } public void OnEndDrag(PointerEventData eventData) { Workspace.Instance.RecordEvent("Actor position / orientation"); delta = Vector3.zero; } public void Activate() { Workspace.actorID = actorID; Workspace.selectedBodyPart = null; } } }