Code refactor

This commit is contained in:
AbstractConcept 2022-10-31 00:44:53 -05:00
parent 5ca7e486f8
commit e14a12f2ab
310 changed files with 4875 additions and 4102 deletions

View file

@ -99,7 +99,7 @@ namespace RimWorldAnimationStudio
dragDelta = Vector3.zero;
}
public ActorBodyPart GetBodyPart(string bodyPart)
public ActorBodyPart GetActorBodyPart(string bodyPart)
{
return GetComponentsInChildren<ActorBodyPart>(true)?.FirstOrDefault(x => x.bodyPart.ToLower() == bodyPart);
}

View file

@ -64,6 +64,7 @@ namespace RimWorldAnimationStudio
PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true);
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePosition = new Vector3(mousePosition.x, mousePosition.y, 0f);
if (dragDelta == Vector3.zero)
{ dragDelta = mousePosition - transform.position; }
@ -114,8 +115,8 @@ namespace RimWorldAnimationStudio
if (Workspace.actorManipulationMode == ActorManipulationMode.Pan)
{
ActorBody anchoringActorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren<ActorBody>()?.FirstOrDefault(x => x.actorID == addon.AnchoringActor);
Vector3 anchor = PawnUtility.GetBodyPartAnchor(anchoringActorBody, addon.addonName);
transform.position = new Vector3(mousePosition.x, mousePosition.y, 0f);
Vector3 anchor = PawnUtility.GetBodyPartAnchor(anchoringActorBody, addon.anchorName);
transform.position = mousePosition - dragDelta;
addonKeyframe.PosX = transform.position.x - anchor.x;
addonKeyframe.PosZ = transform.position.y - anchor.y;

View file

@ -0,0 +1,19 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
namespace RimWorldAnimationStudio
{
public class AddonAnchorDropdown : MonoBehaviour
{
private void Start()
{
Dropdown dropdown = GetComponent<Dropdown>();
dropdown.ClearOptions();
dropdown.AddOptions(Constants.bodyPartAnchorNames.Values.ToList());
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6a0ca236433ad584998f9c7a96dc3af8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -34,6 +34,12 @@ namespace RimWorldAnimationStudio
UpdateGUI();
}
public void ClearKeyframeSliders()
{
foreach (KeyframeSlider slider in GetComponentsInChildren<KeyframeSlider>())
{ Destroy(slider.gameObject); }
}
public void UpdateGUI()
{
if (actorID < 0) return;
@ -43,8 +49,7 @@ namespace RimWorldAnimationStudio
clip.BuildSimpleCurves();
foreach (KeyframeSlider slider in GetComponentsInChildren<KeyframeSlider>())
{ RemovePawnKeyFrame(slider.keyframeID); }
ClearKeyframeSliders();
foreach (PawnKeyframe keyframe in clip.Keyframes)
{ AddPawnKeyFrame(keyframe.keyframeID); }

View file

@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
namespace RimWorldAnimationStudio
{
public class ActorAddonCard : MonoBehaviour
{
public string addonName;
public Text label;
public Toggle toggle;
public Dropdown anchorDropdown;
public InputField anchoringPawnField;
public Dropdown layerDropdown;
public ActorAddonKeyframeCard actorAddonKeyframeCard;
private ActorAddonDef actorAddonDef;
private PawnAnimationClip clip { get { return Workspace.GetCurrentPawnAnimationClip(); } }
private void Start()
{
}
public void Initialize(ActorAddonDef actorAddonDef, ActorAddonKeyframeCard actorAddonKeyframeCard)
{
this.actorAddonDef = actorAddonDef;
this.actorAddonKeyframeCard = actorAddonKeyframeCard;
addonName = actorAddonDef.addonName;
label.text = actorAddonDef.label;
EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); });
UpdateGUI();
}
public void UpdateGUI()
{
if (Workspace.animationDef == null || string.IsNullOrEmpty(addonName)) return;
if (clip?.GetActorAddon(addonName) != null)
{
int i = Constants.bodyPartAnchorNames.Keys.ToList().IndexOf(clip.GetActorAddon(addonName).AnchorName);
anchorDropdown.SetValueWithoutNotify(i);
layerDropdown.SetValueWithoutNotify(layerDropdown.options.IndexOf(layerDropdown.options.First(x => x.text == clip.GetActorAddon(addonName).Layer)));
anchoringPawnField.SetTextWithoutNotify(clip.GetActorAddon(addonName).AnchoringActor.ToString());
toggle.SetIsOnWithoutNotify(clip.IsActorAddonVisible(addonName));
}
}
public void OnToggleChanged()
{
if (clip?.GetActorAddon(addonName) != null)
{ clip.GetActorAddon(addonName).render = toggle.isOn; }
EventsManager.OnPawnKeyframeChanged(null);
UpdateGUI();
}
public void OnAnchorChanged()
{
if (clip?.GetActorAddon(addonName) != null)
{ clip.GetActorAddon(addonName).AnchorName = Constants.bodyPartAnchorNames.Keys.ElementAt(anchorDropdown.value); }
UpdateGUI();
}
public void OnLayerChanged()
{
if (clip?.GetActorAddon(addonName) != null)
{ clip.GetActorAddon(addonName).Layer = layerDropdown.options[layerDropdown.value].text; }
UpdateGUI();
}
public void OnAnchoringPawnChanged()
{
if (clip?.GetActorAddon(addonName) != null)
{
int i = int.Parse(anchoringPawnField.text);
if (i < 0) { i = clip.GetOwningActorID(); }
i = Mathf.Clamp(i, 0, Workspace.animationDef.Actors.Count - 1);
clip.GetActorAddon(addonName).AnchoringActor = i;
anchoringPawnField.SetTextWithoutNotify(i.ToString());
}
UpdateGUI();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 919aed3c4b9671c4e8dc109c7d608683
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -11,16 +11,30 @@ namespace RimWorldAnimationStudio
public class ActorAddonKeyframeCard : MonoBehaviour
{
public string addonName;
public Text label;
public InputField xOffsetField;
public InputField zOffsetField;
public InputField rotationField;
private ActorAddonDef actorAddonDef;
public void Start()
{
}
public void Initialize(ActorAddonDef actorAddonDef)
{
this.actorAddonDef = actorAddonDef;
this.addonName = actorAddonDef.addonName;
label.text = actorAddonDef.label + ":";
EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onStageIDChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onStageTickChanged.AddListener(delegate { Debug.Log("stagetick"); UpdateGUI(); });
EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onStageTickChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onPawnKeyframeChanged.AddListener(delegate { UpdateGUI(); });
xOffsetField.onEndEdit.AddListener(delegate { OnValueChanged(); });
zOffsetField.onEndEdit.AddListener(delegate { OnValueChanged(); });
@ -38,17 +52,20 @@ namespace RimWorldAnimationStudio
keyframe.GetAddonKeyframe(addonName).Rotation = float.Parse(rotationField.text);
Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves();
Workspace.RecordEvent("Actor addon position / orientation");
UpdateGUI();
}
public void UpdateGUI()
{
PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip();
xOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosX.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString());
zOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosZ.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString());
rotationField.SetTextWithoutNotify(clip.GetActorAddon(addonName).Rotation.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString());
xOffsetField.SetTextWithoutNotify(string.Format("{0:0.000}", clip.GetActorAddon(addonName).PosX.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize)));
zOffsetField.SetTextWithoutNotify(string.Format("{0:0.000}", clip.GetActorAddon(addonName).PosZ.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize)));
rotationField.SetTextWithoutNotify(string.Format("{0:0.000}", clip.GetActorAddon(addonName).Rotation.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize)));
gameObject.SetActive(clip.GetActorAddon(addonName).render == true);
}
}
}

View file

@ -7,7 +7,7 @@ using UnityEngine.UI;
namespace RimWorldAnimationStudio
{
public class ActorKeyframeCard : Singleton<ActorKeyframeCard>
{
{
public InputField positionXField;
public InputField positionZField;
public InputField rotationField;
@ -15,6 +15,14 @@ namespace RimWorldAnimationStudio
public InputField headRotationField;
public InputField appendageRotationField;
public ActorAddonCard actorAddonCardPrefab;
public ActorAddonKeyframeCard actorAddonKeyframeCardPrefab;
public Transform actorAddonCards;
public Transform actorKeyframeCards;
public SelectActorAddonsDialog selectActorAddonsDialog;
private Actor actor { get { return Workspace.GetCurrentActor(); } }
private void Start()
@ -33,6 +41,17 @@ namespace RimWorldAnimationStudio
headRotationField.onEndEdit.AddListener(delegate { OnValueChanged(); });
appendageRotationField.onEndEdit.AddListener(delegate { OnValueChanged(); });
foreach (ActorAddonDef actorAddonDef in ActorAddonDefs.allDefs)
{
ActorAddonKeyframeCard actorAddonKeyframeCard = Instantiate(actorAddonKeyframeCardPrefab, actorKeyframeCards);
actorAddonKeyframeCard.Initialize(actorAddonDef);
ActorAddonCard actorAddonCard = Instantiate(actorAddonCardPrefab, actorAddonCards);
actorAddonCard.Initialize(actorAddonDef, actorAddonKeyframeCard);
selectActorAddonsDialog.AddActorAddonCard(actorAddonCard);
}
UpdateGUI();
}

View file

@ -13,7 +13,7 @@ namespace RimWorldAnimationStudio
{
public List<GameObject> cloneObjects;
public void OnEnable()
protected virtual void OnEnable()
{
Initialize();
}

View file

@ -17,6 +17,14 @@ namespace RimWorldAnimationStudio
public Toggle isHumanoidToggle;
public InputField scaleField;
protected override void OnEnable()
{
raceSelectDropdown.ClearOptions();
raceSelectDropdown.AddOptions(PawnRaceDefs.allDefs.Select(x => x.defName).ToList());
base.OnEnable();
}
public override void Initialize(bool addedNewTag = false)
{
Reset();
@ -78,12 +86,12 @@ namespace RimWorldAnimationStudio
AddCloneObjectToParent(raceSettingsWindow, 3);
}
scaleField.text = string.Format("{0:0.000}", pawnRaceDef.scale.ToString());
scaleField.text = string.Format("{0:0.000}", pawnRaceDef.scale);
}
public void Reset()
{
RemoveCloneObjectsFromParent(raceSettingsWindow);
RemoveCloneObjectsFromParent(raceSettingsWindow);
}
public void SetIsHumanoid()
@ -134,7 +142,9 @@ namespace RimWorldAnimationStudio
if (pawnRaceDef == null) return;
float scale = float.Parse(scaleField.text);
pawnRaceDef.scale = Mathf.Clamp(scale, 0.05f, 100f);
pawnRaceDef.scale = Mathf.Clamp(scale, 0.01f, 100f);
scaleField.text = string.Format("{0:0.000}", pawnRaceDef.scale);
}
}
}

View file

@ -10,204 +10,11 @@ namespace RimWorldAnimationStudio
{
public class SelectActorAddonsDialog : DialogBox
{
public class AddonDef
private List<ActorAddonCard> actorAddonCards = new List<ActorAddonCard>();
public void AddActorAddonCard(ActorAddonCard actorAddonCard)
{
public string addonName;
public Toggle toggle;
public Dropdown anchor;
public InputField anchoringPawn;
public Dropdown layer;
public GameObject controls;
public AddonDef(string addonName, Toggle toggle, Dropdown anchor, InputField anchoringPawn, Dropdown layer, GameObject controls)
{
this.addonName = addonName;
this.toggle = toggle;
this.anchor = anchor;
this.anchoringPawn = anchoringPawn;
this.layer = layer;
this.controls = controls;
}
}
private List<AddonDef> addonDefs = new List<AddonDef>();
public Toggle handLeftToggle;
public Toggle handRightToggle;
public Toggle sexToyToggle;
public Dropdown handLeftAnchor;
public Dropdown handRightAnchor;
public Dropdown sexToyAnchor;
public InputField handLeftAnchoringPawn;
public InputField handRightAnchoringPawn;
public InputField sexToyAnchoringPawn;
public Dropdown handLeftLayer;
public Dropdown handRightLayer;
public Dropdown sexToyLayer;
public GameObject handLeftControls;
public GameObject handRightControls;
public GameObject sexToyControls;
private PawnAnimationClip clip { get { return Workspace.GetCurrentPawnAnimationClip(); } }
private void Start()
{
EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); });
EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); });
InitializeAddonDefs();
UpdateGUI();
}
// temp code
public void InitializeAddonDefs()
{
if (addonDefs.NotNullOrEmpty()) return;
addonDefs.Add(new AddonDef("left hand", handLeftToggle, handLeftAnchor, handLeftAnchoringPawn, handLeftLayer, handLeftControls));
addonDefs.Add(new AddonDef("right hand", handRightToggle, handRightAnchor, handRightAnchoringPawn, handRightLayer, handRightControls));
addonDefs.Add(new AddonDef("dildo", sexToyToggle, sexToyAnchor, sexToyAnchoringPawn, sexToyLayer, sexToyControls));
}
public override void Initialize(bool addedNewTag = false)
{
InitializeAddonDefs();
}
public void UpdateGUI()
{
if (Workspace.animationDef == null) return;
Debug.Log("Actor: " + clip.GetOwningActorID());
foreach (AddonDef addonDef in addonDefs)
{
if (clip?.GetActorAddon(addonDef.addonName) != null)
{
switch (clip.GetActorAddon(addonDef.addonName).AnchorName)
{
case "torso": addonDef.anchor.SetValueWithoutNotify(1); break;
case "head": addonDef.anchor.SetValueWithoutNotify(2); break;
case "groin": addonDef.anchor.SetValueWithoutNotify(3); break;
case "left breast": addonDef.anchor.SetValueWithoutNotify(4); break;
case "right breast": addonDef.anchor.SetValueWithoutNotify(5); break;
default: addonDef.anchor.SetValueWithoutNotify(0); break;
}
addonDef.layer.SetValueWithoutNotify(addonDef.layer.options.IndexOf(addonDef.layer.options.First(x => x.text == clip.GetActorAddon(addonDef.addonName).Layer)));
addonDef.anchoringPawn.SetTextWithoutNotify(clip.GetActorAddon(addonDef.addonName).AnchoringActor.ToString());
addonDef.toggle.SetIsOnWithoutNotify(clip.IsActorAddonVisible(addonDef.addonName));
}
}
}
public void OnToggleChanged()
{
clip.ShowOrHideActorAddon("left hand", handLeftToggle.isOn);
clip.ShowOrHideActorAddon("right hand", handRightToggle.isOn);
clip.ShowOrHideActorAddon("dildo", sexToyToggle.isOn);
UpdateGUI();
}
public void OnValueChanged()
{
if (clip?.GetActorAddon("left hand") != null)
{
switch (handLeftAnchor.value)
{
case 1: clip.GetActorAddon("left hand").AnchorName = "torso"; break;
case 2: clip.GetActorAddon("left hand").AnchorName = "head"; break;
case 3: clip.GetActorAddon("left hand").AnchorName = "groin"; break;
case 4: clip.GetActorAddon("left hand").AnchorName = "left breast"; break;
case 5: clip.GetActorAddon("left hand").AnchorName = "right breast"; break;
default: clip.GetActorAddon("left hand").AnchorName = null; break;
}
}
if (clip?.GetActorAddon("right hand") != null)
{
switch (handRightAnchor.value)
{
case 1: clip.GetActorAddon("right hand").AnchorName = "torso"; break;
case 2: clip.GetActorAddon("right hand").AnchorName = "head"; break;
case 3: clip.GetActorAddon("right hand").AnchorName = "groin"; break;
case 4: clip.GetActorAddon("right hand").AnchorName = "left breast"; break;
case 5: clip.GetActorAddon("right hand").AnchorName = "right breast"; break;
default: clip.GetActorAddon("right hand").AnchorName = null; break;
}
}
if (clip?.GetActorAddon("dildo") != null)
{
switch (sexToyAnchor.value)
{
case 1: clip.GetActorAddon("dildo").AnchorName = "torso"; break;
case 2: clip.GetActorAddon("dildo").AnchorName = "head"; break;
case 3: clip.GetActorAddon("dildo").AnchorName = "groin"; break;
case 4: clip.GetActorAddon("dildo").AnchorName = "left breast"; break;
case 5: clip.GetActorAddon("dildo").AnchorName = "right breast"; break;
default: clip.GetActorAddon("dildo").AnchorName = null; break;
}
}
UpdateGUI();
}
public void OnLayerChanged()
{
if (clip?.GetActorAddon("left hand") != null)
{ clip.GetActorAddon("left hand").Layer = handLeftLayer.options[handLeftLayer.value].text; }
if (clip?.GetActorAddon("right hand") != null)
{ clip.GetActorAddon("right hand").Layer = handRightLayer.options[handRightLayer.value].text; }
if (clip?.GetActorAddon("dildo") != null)
{ clip.GetActorAddon("dildo").Layer = sexToyLayer.options[sexToyLayer.value].text; }
UpdateGUI();
}
public void OnAnchoringPawnChanged()
{
if (clip?.GetActorAddon("left hand") != null)
{
int i = int.Parse(handLeftAnchoringPawn.text);
if (i < 0) { i = clip.GetOwningActorID(); }
i = Mathf.Clamp(i, 0, Workspace.animationDef.Actors.Count - 1);
clip.GetActorAddon("left hand").AnchoringActor = i;
handLeftAnchoringPawn.SetTextWithoutNotify(i.ToString());
}
if (clip?.GetActorAddon("right hand") != null)
{
int i = int.Parse(handRightAnchoringPawn.text);
if (i < 0) { i = clip.GetOwningActorID(); }
i = Mathf.Clamp(i, 0, Workspace.animationDef.Actors.Count - 1);
clip.GetActorAddon("right hand").AnchoringActor = i;
handRightAnchoringPawn.SetTextWithoutNotify(i.ToString());
}
if (clip?.GetActorAddon("dildo") != null)
{
int i = int.Parse(sexToyAnchoringPawn.text);
if (i < 0) { i = clip.GetOwningActorID(); }
i = Mathf.Clamp(i, 0, Workspace.animationDef.Actors.Count - 1);
clip.GetActorAddon("dildo").AnchoringActor = i;
sexToyAnchoringPawn.SetTextWithoutNotify(i.ToString());
}
UpdateGUI();
actorAddonCards.Add(actorAddonCard);
}
}
}

View file

@ -66,6 +66,8 @@ namespace RimWorldAnimationStudio
for (int i = 0; i < Mathf.Max(requiredGhosts, currentGhostCount); i++)
{
if (clip == null || keyframe == null) continue;
int targetTick = (int)(i * clip.duration + keyframe.atTick);
if (ghostSliders.childCount <= i)