rimworld-animation-studio/Assets/Scripts/GUI/Actors/ActorBodyPart.cs

161 lines
7.2 KiB
C#
Raw Normal View History

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 string addonName;
public bool isSelected = false;
2022-09-26 04:10:41 +00:00
private Vector3 delta = new Vector3();
2022-10-27 05:56:04 +00:00
public void Start()
{
//Workspace.onActorChanged.AddListener(delegate { });
}
public void Update()
{
2022-10-27 05:56:04 +00:00
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<ActorBodyPart>() == null)
{ return; }
Activate();
}
public void OnDrag(PointerEventData eventData)
{
Activate();
2022-10-27 05:56:04 +00:00
PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true);
2022-09-18 06:52:54 +00:00
if (keyframe == null)
2022-09-18 06:52:54 +00:00
{ Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; }
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
2022-09-26 04:10:41 +00:00
if (delta == Vector3.zero)
{ delta = mousePosition - transform.position; }
if (addonName != null && addonName != "")
{
AddonKeyframe addonKeyframe = keyframe.GetAddonKeyframe(addonName);
2022-10-27 05:56:04 +00:00
ActorAddon addon = Workspace.GetCurrentPawnAnimationClip().GetActorAddon(addonName);
if (Workspace.actorManipulationMode == ActorManipulationMode.Pan)
{
Vector3 anchor;
2022-10-27 05:56:04 +00:00
ActorBody anchoringActorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren<ActorBody>()?.FirstOrDefault(x => x.actorID == addon.AnchoringActor);
Vector3 bodyPos = new Vector3(anchoringActorBody.transform.position.x, anchoringActorBody.transform.position.y, 0);
2022-10-27 05:56:04 +00:00
PawnRaceDef pawnRaceDef = Workspace.animationDef.Actors[addon.AnchoringActor].GetPawnRaceDef();
Actor anchoringActor = Workspace.animationDef.Actors[addon.AnchoringActor];
int bodyFacing = (int)Workspace.GetCurrentAnimationStage().AnimationClips[addon.AnchoringActor].BodyFacing.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize);
2022-10-27 05:56:04 +00:00
switch (addon.AnchorName)
{
case "torso": anchor = bodyPos; break;
case "head": anchor = new Vector3(anchoringActorBody.transform.Find("ActorHead").position.x, anchoringActorBody.transform.Find("ActorHead").position.y, 0); break;
case "groin": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.GroinOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break;
case "left breast": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.BreastLeftOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break;
case "right breast": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.BreastRightOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break;
default: anchor = new Vector3(); break;
}
transform.position = new Vector3(mousePosition.x, mousePosition.y, 0f);
2022-10-27 05:56:04 +00:00
addonKeyframe.PosX = transform.position.x - anchor.x;
addonKeyframe.PosZ = transform.position.y - anchor.y;
ActorKeyframeCard.Instance.transform.GetComponentsInChildren<ActorAddonCard>()?.FirstOrDefault(x => x.addonName == addonName)?.OnKeyframeValueChanged();
}
else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate)
{
float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position);
2022-10-27 05:56:04 +00:00
addonKeyframe.Rotation = 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 (isHead)
{
if (Workspace.actorManipulationMode == ActorManipulationMode.Pan)
{
2022-09-24 19:12:18 +00:00
// It's stupid but it works
Vector3 localPosA = transform.localPosition;
2022-09-26 04:10:41 +00:00
transform.position = mousePosition - delta;
2022-09-24 19:12:18 +00:00
Vector3 localPosB = transform.localPosition;
transform.localPosition = localPosA;
2022-10-27 05:56:04 +00:00
keyframe.HeadBob += localPosB.y - localPosA.y;
}
else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate)
{
2022-09-24 07:17:40 +00:00
float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position);
2022-10-27 05:56:04 +00:00
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;
2022-10-27 05:56:04 +00:00
keyframe.HeadFacing = facing;
}
}
else
{
if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate)
{
2022-09-27 05:56:35 +00:00
float angle = -Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position);
2022-10-27 05:56:04 +00:00
keyframe.GenitalAngle = angle;
2022-09-21 21:15:25 +00:00
2022-10-27 05:56:04 +00:00
Workspace.GetCurrentActor().ControlGenitalAngle = Workspace.animationDef.AnimationStages.Any(x => x.AnimationClips[Workspace.ActorID].Keyframes.Any(y => y.GenitalAngle != 0));
}
}
2022-10-27 05:56:04 +00:00
PawnAnimationClip clip = Workspace.GetPawnAnimationClip(parent.actorID);
clip.BuildSimpleCurves();
}
public void OnEndDrag(PointerEventData eventData)
{
2022-10-27 05:56:04 +00:00
Workspace.RecordEvent("Actor position / orientation");
2022-09-26 04:10:41 +00:00
delta = Vector3.zero;
}
public void Activate()
{
2022-10-27 05:56:04 +00:00
Workspace.ActorID = parent.actorID;
Workspace.selectedBodyPart = this;
}
}
}