Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge development for 1.2.0.0 release #1

Merged
merged 3 commits into from
Jun 26, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file modified GameData/KerbalAnimationSuite/KerbalAnimationSuite.dll
Binary file not shown.
24 changes: 13 additions & 11 deletions KerbalAnimationSuite.userprefs
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
<Properties StartupItem="KerbalAnimationSuite\KerbalAnimationSuite.csproj" GitUserInfo="UsingGIT">
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
<MonoDevelop.Ide.Workbench ActiveDocument="KerbalAnimationSuite\Utils\EditableAnimationClip.cs">
<MonoDevelop.Ide.Workbench ActiveDocument="KerbalAnimationSuite\KerbalDebugging.cs">
<Files>
<File FileName="KerbalAnimationSuite\KAS_AnimationPlayerModule.cs" Line="37" Column="37" />
<File FileName="KerbalAnimationSuite\API\KerbalAnimationClip.cs" Line="34" Column="34" />
<File FileName="KerbalAnimationSuite\Utils\EditableAnimationClip.cs" Line="4" Column="4" />
<File FileName="KerbalAnimationSuite\KerbalAnimationSuite.cs" Line="12" Column="12" />
<File FileName="KerbalAnimationSuite\Utils\SelectedKerbalEVA.cs" Line="24" Column="24" />
<File FileName="KerbalAnimationSuite\Utils\SelectedBone.cs" Line="2" Column="2" />
<File FileName="KerbalAnimationSuite\GUI\AnimationWindow.cs" Line="34" Column="34" />
<File FileName="KerbalAnimationSuite\GUI\AnimationPropertiesWindow.cs" Line="7" Column="7" />
<File FileName="KerbalAnimationSuite\AnimationPlayerModule.cs" Line="101" Column="6" />
<File FileName="KerbalAnimationSuite\GUI\AnimationPlayerWindow.cs" Line="18" Column="17" />
<File FileName="KerbalAnimationSuite\Utils\EditableAnimationClip.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\KerbalAnimationSuite.cs" Line="21" Column="54" />
<File FileName="KerbalAnimationSuite\Utils\SelectedKerbalEVA.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\GUI\AnimationWindow.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\GUI\AnimationPropertiesWindow.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\GUI\HierarchyWindow.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\GUI\ManipulationWindow.cs" Line="41" Column="41" />
<File FileName="KerbalAnimationSuite\GUI\Colors.cs" Line="40" Column="40" />
<File FileName="KerbalAnimationSuite\GUI\ManipulationWindow.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\GUI\MasterWindow.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\KerbalDebugging.cs" Line="64" Column="49" />
<File FileName="KerbalAnimationSuite\Utils\DebugUtil.cs" Line="1" Column="1" />
<File FileName="KerbalAnimationSuite\GUI\GUIHider.cs" Line="1" Column="1" />
</Files>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints>
Expand Down
23 changes: 18 additions & 5 deletions KerbalAnimationSuite/API/KerbalAnimationClip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,28 @@ public class KerbalAnimationClip
public static Dictionary<string, string> AnimationNames = null;

//constructors
protected KerbalAnimationClip()
public KerbalAnimationClip()
{
}
public KerbalAnimationClip(string url, bool fullPath = false)

//loading
public void LoadFromURL(string url)
{
if(!url.EndsWith(".anim"))
url += ".anim";
if (!fullPath)
url = KSPUtil.ApplicationRootPath + "GameData/" + url;
ConfigNode node = ConfigNode.Load (url);
string fullPath = KSPUtil.ApplicationRootPath + "GameData/" + url;
ConfigNode node = ConfigNode.Load (fullPath);
LoadAndBuild (node);
}
public void LoadFromPath(string fullPath)
{
if(!fullPath.EndsWith(".anim"))
fullPath += ".anim";
ConfigNode node = ConfigNode.Load (fullPath);
LoadAndBuild (node);
}
public void LoadFromConfig(ConfigNode node)
{
LoadAndBuild (node);
}
protected void LoadAndBuild(ConfigNode node)
Expand Down Expand Up @@ -160,6 +172,7 @@ protected void RemoveMixingTransform(string name)
protected AnimationClip BuildAnimationClip()
{
clip = new AnimationClip ();
clip.legacy = true;
clip.wrapMode = WrapMode.Loop;

//populate dictionaries with curves
Expand Down
145 changes: 145 additions & 0 deletions KerbalAnimationSuite/AnimationPlayerModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using System;
using System.IO;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace KerbalAnimation
{
[KSPAddon(KSPAddon.Startup.MainMenu, true)]
public class EVAModuleAdder : MonoBehaviour
{
void Start()
{
KerbalEVAUtility.AddPartModule ("AnimationPlayerModule");
}
}

[KSPAddon(KSPAddon.Startup.Flight, false)]
public class AnimationPlayerWindowHost : MonoBehaviour
{
public static AnimationPlayerWindowHost Instance
{get; private set;}

public AnimationPlayerWindow Player;
public static bool GUIOpen = false;

//events
public EventData<List<KerbalAnimationClip>> OnReloadAnimationClips = new EventData<List<KerbalAnimationClip>>("OnReloadAnimationClips");

private void Awake()
{
Instance = this;
}
private void Start()
{
Player = new AnimationPlayerWindow ();
}
private void OnGUI()
{
//return if we are not in a valid state to draw
if (!GUIHider.ShowUI)
return;
if (!HighLogic.LoadedSceneIsFlight || !FlightGlobals.ActiveVessel.isEVA)
return;
if (KerbalAnimationSuite.Instance.IsAnimating)
return;

if (GUIOpen)
{
Player.Draw ();
}
}
private void Update()
{
//return if we are not in a valid state to update
if (!HighLogic.LoadedSceneIsFlight || !FlightGlobals.ActiveVessel.isEVA)
return;
if (KerbalAnimationSuite.Instance.IsAnimating)
return;

Player.Update ();
}
}

public class AnimationPlayerModule : PartModule
{
public string OpenGUIName = "Open Animation Player";
public string CloseGUIName = "Close Animation Player";

private Animation _animation;
public Animation animation
{
get
{
if (_animation == null)
{
_animation = GetComponent<Animation> ();
}
return _animation;
}
}

//lifetime
public override void OnStart (StartState state)
{
AnimationPlayerWindowHost.Instance.OnReloadAnimationClips.Add (OnReloadAnimationClips);
}
public override void OnUpdate ()
{
Events ["ToggleGUI"].guiName = AnimationPlayerWindowHost.GUIOpen ? CloseGUIName : OpenGUIName;

for(int i = 0; i < 10; i++)
{
string buttonName = (i + 1).ToString ();
if (i >= 9)
buttonName = "0";
if (Input.GetKey (buttonName))
{
bool shift = Input.GetKey (KeyCode.LeftShift);

if(!shift && FlightGlobals.ActiveVessel != vessel)
{
continue;
}
var clip = AnimationPlayerWindowHost.Instance.Player.GetNumberKeyClip (i);
if(clip != null && !animation.IsPlaying(clip.Name))
{
if (AnimationPlayerWindow.Loop)
PlayAnimation (clip.Name, WrapMode.Loop);
else
PlayAnimation (clip.Name, WrapMode.Once);
}
}
}
}

public void PlayAnimation(string name, WrapMode wrapMode)
{
var state = animation [name];
if (state == null || animation.GetClip(name) == null)
return;
state.wrapMode = wrapMode;
animation.CrossFade (name, 0.2f * state.length, PlayMode.StopSameLayer);
}

//events
private void OnReloadAnimationClips (List<KerbalAnimationClip> clips)
{
//initialize all of the clips with this kerbal
foreach (var clip in clips)
{
clip.Initialize (animation, transform);
}
}

//KSPEvents
[KSPEvent(guiName = "Open GUI", guiActiveUnfocused = false, guiActive = true)]
public void ToggleGUI()
{
AnimationPlayerWindowHost.GUIOpen = !AnimationPlayerWindowHost.GUIOpen;
}
}
}

141 changes: 141 additions & 0 deletions KerbalAnimationSuite/GUI/AnimationPlayerWindow.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;

using UnityEngine;

namespace KerbalAnimation
{
public class AnimationPlayerWindow : Window
{
//constructor
public AnimationPlayerWindow ()
{
WindowTitle = "Animation Player";
WindowRect = new Rect (Screen.width - 325f, 25f, 280f, 0f);
ExpandHeight = true;
Loop = false;
}

//animations
private List<KerbalAnimationClip> Clips = null;
public KerbalAnimationClip GetNumberKeyClip(int index)
{
if (index >= Clips.Count)
return null;
else
return Clips [NumberKeyClips [index]];
}

//gui values
private Dictionary<string, string> textBoxValues = new Dictionary<string, string>();
private Vector2 scroll;
public static bool Loop
{
get;
private set;
}

public int[] NumberKeyClips = new int[10];

protected override void DrawWindow ()
{
if (Clips.Count > 0)
{
scroll = GUILayout.BeginScrollView (scroll, GUILayout.Height (320f), GUILayout.ExpandWidth(true));
for (int i = 0; i < Clips.Count; i++)
{
int nameValue = i + 1;
if (nameValue > 9)
nameValue = 0;
NumberKeyClips [i] = DrawClipSelector ("NumberKey" + nameValue.ToString(), nameValue.ToString(), NumberKeyClips [i]);
}

GUILayout.Label ("<color=" + Colors.Information + ">Press the numbers 0-9 (not on the numpad) to play the selected animations. Hold left shift to play the animation on all kerbals instead of just the active one</color>");

GUILayout.EndScrollView ();
}
Loop = GUILayout.Toggle (Loop, "Loop?");
if (GUILayout.Button ("Reload Animations"))
{
ReloadAnimations ();
}
}
public override void Update ()
{
if(Clips == null)
ReloadAnimations ();
}

//gui methods
private int DrawClipSelector(string uniqueName, string name, int index)
{
if (!textBoxValues.ContainsKey (uniqueName))
textBoxValues.Add (uniqueName, Clips[index].Name);

string textBoxControlName = "ClipSelector_" + uniqueName;

GUILayout.BeginHorizontal ();

GUILayout.Label ("<color=" + Colors.Information + ">" + name + ":</color>", GUILayout.Width (30f));

bool buttonPressed = false;
int buttonValue = index;
int buttonIncrement = 1;
if (GUILayout.Button ("<<", GUILayout.MaxWidth(40f), GUILayout.Height(24f)))
{
buttonValue -= buttonIncrement;
buttonPressed = true;
}

//text field
GUI.SetNextControlName (textBoxControlName);
GUILayout.TextField (textBoxValues [uniqueName], GUILayout.Width(160f));

if (GUILayout.Button (">>", GUILayout.MaxWidth(40f), GUILayout.Height(24f)))
{
buttonValue += buttonIncrement;
buttonPressed = true;
}
if (buttonPressed)
{
if (buttonValue < 0)
buttonValue = Clips.Count - 1;
else if (buttonValue >= Clips.Count)
buttonValue = 0;

textBoxValues [uniqueName] = Clips[buttonValue].Name;
GUI.FocusControl ("");
}

GUILayout.EndHorizontal ();

return buttonValue;
}

//utility methods
public void ReloadAnimations()
{
Clips = new List<KerbalAnimationClip> ();
foreach (var path in Directory.GetFiles(KSPUtil.ApplicationRootPath + "GameData/", "*.anim", SearchOption.AllDirectories))
{
KerbalAnimationClip clip = new KerbalAnimationClip ();
clip.LoadFromPath (path);
Clips.Add (clip);
Debug.Log ("KerbalAnimationClip " + clip.Name + " loaded from " + path);
}

int length = 10;
if (Clips.Count < 10)
length = Clips.Count;
for (int i = 0; i < length; i++)
{
NumberKeyClips [i] = i;
}

AnimationPlayerWindowHost.Instance.OnReloadAnimationClips.Fire (Clips);
}
}
}

1 change: 1 addition & 0 deletions KerbalAnimationSuite/GUI/AnimationWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ private void OnNewAnimationClip (EditableAnimationClip clip)
{
//set defaults
clip.WrapMode = WrapMode.ClampForever;
clip.Duration = 1f;

UpdateAnimationClip ();
}
Expand Down