public void UpdateScale(PartModel part) { if (part.scaleRepresentations) { if (part.root.point) { foreach (KeyValuePair <string, ReprModel> entry in part.root.point.reprs) { Transform tsf = entry.Value.transformRef; if (tsf) { tsf.localScale = Vector3.one * part.totalScale; } } } else { Debug.LogError("Part " + part.name + " cannot be scaled as its root, " + part.root.name + ", does not have any point"); } } else { if (part.root.transformRef) { part.root.transformRef.localScale = Vector3.one * part.totalScale; } } if (part is HandModel) { (part as HandModel).fingers.ForEach(f => f.length = GetFingerLength(f)); } }
void UpdatePart(PartModel part) { if (part is HandModel) { UpdateHand(part as HandModel); } if (part is FingerModel) { UpdateFinger(part as FingerModel); } part.bones.ForEach(b => { if (b.gameObject.activeSelf) { UpdateBone(b); } }); // Update registered controllers if (HPTK.core.controlsUpdateCalls) { part.registry.ForEach((c) => { if (c.gameObject.activeSelf) { c.ControllerUpdate(); } }); } }
public override sealed void Awake() { base.Awake(); GetView(); if (!parent) { parent = transform.parent.GetComponent <PartModel>(); } if (!body) { body = transform.parent.GetComponent <BodyModel>(); } parts.RemoveAll(p => p == null); bones.RemoveAll(b => b == null); if (parent) { if (!parent.parts.Contains(this)) { parent.parts.Add(this); } } else { if (!body) { Debug.LogError("Part without parent is interpreted as root part and it requires a body. Move " + transform.name + " as child of a BodyModel in hierarchy"); } else if (body.root != null && body.root != this) { Debug.LogWarning("Multiple body roots were found. Preserving original root"); } else { body.root = this; } } _registry = registry; PartAwake(); }
public override sealed void Awake() { base.Awake(); children.RemoveAll(c => c == null); points.RemoveAll(p => p == null); if (!part) { part = GetComponent <PartModel>(); } if (!part) { part = transform.parent.GetComponent <PartModel>(); } if (!parent) { int siblingIndex = transform.GetSiblingIndex(); if (siblingIndex > 0) { parent = transform.parent.GetChild(siblingIndex - 1).GetComponent <BoneModel>(); if (parent != null && !parent.children.Contains(this)) { parent.children.Add(this); } } else if (!part.root) { part.root = this; } else if (part.root != this) { Debug.LogWarning("Multiple roots found for part " + part.name + ": bones " + transform.name + " and " + part.root.name); } } if (!part.bones.Contains(this)) { part.bones.Add(this); } BoneAwake(); }
public void SetPartVisuals(PartModel part, string key, bool enabled) { if (!part.root.reprs.ContainsKey(key)) { Debug.LogWarning("Part " + part.name + " root does not have a " + key + " representation"); return; } SkinnedMeshRenderer smr = part.root.reprs[key].skinnedMeshRenderer; if (smr) { smr.enabled = enabled; } else { Debug.LogWarning("Part " + part.name + " root does not have a SkinnedMeshRenderer referenced on its " + key + " representation"); } }
public override sealed void Awake() { base.Awake(); model = GetComponent <PartModel>(); }
void StartPart(PartModel part) { if (part.body.parts.Contains(part)) { return; } part.body.parts.Add(part); if (part == part.body.root && part.root.parent) { // Main root bone should have no parents part.root.parent.children.Remove(part.root); part.root.parent = null; Debug.LogWarning("Root bone of root part should have no parent. Parent removed for bone " + part.root.name); } else if (part.parent != null) { // Move to the upper element in hierarchy until you reach a bone or body.root BoneModel upperBone = null; PartModel upperPart = null; Transform tsf = part.transform; int siblingIndex; for (int i = 0; i < 50; i++) { if (upperBone != null || upperPart == part.body.root) { break; } siblingIndex = tsf.GetSiblingIndex(); if (siblingIndex > 0) { tsf = tsf.parent.GetChild(siblingIndex - 1); } else { tsf = tsf.parent; } upperBone = tsf.GetComponent <BoneModel>(); upperPart = tsf.GetComponent <PartModel>(); } // Connect part.root.parent with some part.parent.bones if (upperBone) { part.root.parent = upperBone; if (!upperBone.children.Contains(part.root)) { upperBone.children.Add(part.root); } } else { Debug.LogWarning("Part " + part.name + " has a parent but any upper bone was found to which connect its root bone " + part.root.name); } } else if (part != part.body.root) { Debug.LogWarning(part.name + " has no parent but it's not the root part of " + part.body.name + ". The root part of that body is " + part.body.root.name); } // Recursive part.parts.ForEach(p => { if (p.gameObject.activeSelf) { p.body = part.body; StartPart(p); } }); if (part is HandModel) { HandStart(part as HandModel); } if (part is FingerModel) { FingerStart(part as FingerModel); } part.registry.ForEach((c) => { if (c.gameObject.activeSelf) { c.ControllerStart(); } }); // Scaling UpdateScale(part); }