Skip to content

Commit

Permalink
Merge pull request masterprompt#4 from alejodaraio/master
Browse files Browse the repository at this point in the history
Fixes logic on AddChild and add Multiple SkinnedMeshRenderer
  • Loading branch information
masterprompt authored May 16, 2017
2 parents 260a54f + 3847266 commit 5c0f023
Show file tree
Hide file tree
Showing 7 changed files with 447 additions and 201 deletions.
140 changes: 76 additions & 64 deletions Assets/Scripts/Stitcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,84 +3,96 @@

public class Stitcher
{
/// <summary>
/// Stitch clothing onto an avatar. Both clothing and avatar must be instantiated however clothing may be destroyed after.
/// </summary>
/// <param name="sourceClothing"></param>
/// <param name="targetAvatar"></param>
/// <returns>Newly created clothing on avatar</returns>
public GameObject Stitch (GameObject sourceClothing, GameObject targetAvatar)
{
var boneCatalog = new TransformCatalog (targetAvatar.transform);
var skinnedMeshRenderers = sourceClothing.GetComponentsInChildren<SkinnedMeshRenderer> ();
var targetClothing = AddChild (sourceClothing, targetAvatar.transform);
foreach (var sourceRenderer in skinnedMeshRenderers) {
var targetRenderer = AddSkinnedMeshRenderer (sourceRenderer, targetClothing);
targetRenderer.bones = TranslateTransforms (sourceRenderer.bones, boneCatalog);
}
return targetClothing;
}
/// <summary>
/// Stitch clothing onto an avatar. Both clothing and avatar must be instantiated however clothing may be destroyed after.
/// </summary>
/// <param name="sourceClothing"></param>
/// <param name="targetAvatar"></param>
/// <returns>Newly created clothing on avatar</returns>
public GameObject Stitch(GameObject sourceClothing, GameObject targetAvatar)
{
var boneCatalog = new TransformCatalog(targetAvatar.transform);
var skinnedMeshRenderers = sourceClothing.GetComponentsInChildren<SkinnedMeshRenderer>();
var targetClothing = AddChild(sourceClothing, targetAvatar.transform);

private GameObject AddChild (GameObject source, Transform parent)
{
var target = new GameObject (source.name);
target.transform.parent = parent;
target.transform.localPosition = source.transform.localPosition;
target.transform.localRotation = source.transform.localRotation;
target.transform.localScale = source.transform.localScale;
return target;
}

private SkinnedMeshRenderer AddSkinnedMeshRenderer (SkinnedMeshRenderer source, GameObject parent)
{
var target = parent.AddComponent<SkinnedMeshRenderer> ();
target.sharedMesh = source.sharedMesh;
target.materials = source.materials;
return target;
}
foreach (var sourceRenderer in skinnedMeshRenderers)
{
var targetRenderer = AddSkinnedMeshRenderer(sourceRenderer, targetClothing);
targetRenderer.bones = TranslateTransforms(sourceRenderer.bones, boneCatalog);
}
return targetClothing;
}

private Transform[] TranslateTransforms (Transform[] sources, TransformCatalog transformCatalog)
{
var targets = new Transform[sources.Length];
for (var index = 0; index < sources.Length; index++)
targets [index] = DictionaryExtensions.Find (transformCatalog, sources [index].name);
return targets;
}
private GameObject AddChild(GameObject source, Transform parent)
{
source.transform.parent = parent;

foreach (Transform child in source.transform)
{
Object.Destroy(child.gameObject);
}

return source;
}

private SkinnedMeshRenderer AddSkinnedMeshRenderer(SkinnedMeshRenderer source, GameObject parent)
{
GameObject meshObject = new GameObject(source.name);
meshObject.transform.parent = parent.transform;

var target = meshObject.AddComponent<SkinnedMeshRenderer>();
target.sharedMesh = source.sharedMesh;
target.materials = source.materials;
return target;
}

private Transform[] TranslateTransforms(Transform[] sources, TransformCatalog transformCatalog)
{
var targets = new Transform[sources.Length];
for (var index = 0; index < sources.Length; index++)
targets[index] = DictionaryExtensions.Find(transformCatalog, sources[index].name);
return targets;
}

#region TransformCatalog
private class TransformCatalog : Dictionary<string, Transform>
{
private class TransformCatalog : Dictionary<string, Transform>
{
#region Constructors
public TransformCatalog (Transform transform)
{
Catalog (transform);
}
public TransformCatalog(Transform transform)
{
Catalog(transform);
}
#endregion

#region Catalog
private void Catalog (Transform transform)
{
Add (transform.name, transform);
foreach (Transform child in transform)
Catalog (child);
}
private void Catalog(Transform transform)
{
if (ContainsKey(transform.name))
{
Remove(transform.name);
Add(transform.name, transform);
}
else
Add(transform.name, transform);
foreach (Transform child in transform)
Catalog(child);
}
#endregion
}
}
#endregion


#region DictionaryExtensions
private class DictionaryExtensions
{
public static TValue Find<TKey, TValue> (Dictionary<TKey, TValue> source, TKey key)
{
TValue value;
source.TryGetValue (key, out value);
return value;
}
}
private class DictionaryExtensions
{
public static TValue Find<TKey, TValue>(Dictionary<TKey, TValue> source, TKey key)
{
TValue value;
source.TryGetValue(key, out value);
return value;
}
}
#endregion

}

}
5 changes: 2 additions & 3 deletions Assets/Scripts/Tester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,14 @@ private void RemoveWorn ()
{
if (wornClothing == null)
return;
GameObject.Destroy (wornClothing);
Destroy (wornClothing);
}

private void Wear (GameObject clothing)
{
if (clothing == null)
return;
clothing = (GameObject)GameObject.Instantiate (clothing);
clothing = Instantiate (clothing);
wornClothing = stitcher.Stitch (clothing, avatar);
GameObject.Destroy (clothing);
}
}
6 changes: 6 additions & 0 deletions ProjectSettings/ClusterInputManager.asset
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!236 &1
ClusterInputManager:
m_ObjectHideFlags: 0
m_Inputs: []
Loading

0 comments on commit 5c0f023

Please sign in to comment.