public static void OnRemoveBoneRenderer(BoneRenderer obj) { s_BoneRendererComponents.Remove(obj); }
public static void OnAddBoneRenderer(BoneRenderer obj) { s_BoneRendererComponents.Add(obj); }
internal static void DoBoneHandle(Transform target, Dictionary <Transform, bool> validBones, BoneRenderer renderer) { int id = target.name.GetHashCode(); Event evt = Event.current; bool hasValidChildBones = false; if (validBones != null) { foreach (Transform child in target) { if (validBones.ContainsKey(child)) { hasValidChildBones = true; break; } } } Vector3 basePoint = target.position; List <Vector3> endPoints = new List <Vector3>(); // [case 525602] do not draw root. if (!hasValidChildBones && target.parent != null) { endPoints.Add(target.position + (target.position - target.parent.position) * 0.4f); } else { foreach (Transform child in target) { // Only render bone connections to valid bones // (except if no child bones are valid - then draw all connections) if (validBones != null && !validBones.ContainsKey(child)) { continue; } endPoints.Add(child.position); } } for (int i = 0; i < endPoints.Count; i++) { Vector3 endPoint = endPoints[i]; switch (evt.GetTypeForControl(id)) { case EventType.Layout: { // TODO : This is slow and should be revisited prior to exposing bone handles Vector3[] vertices = BoneRenderer.GetBoneWireVertices(basePoint, endPoint); if (vertices != null) { HandleUtility.AddControl(id, DistanceToPolygone(vertices)); } break; } case EventType.MouseMove: if (id == HandleUtility.nearestControl) { HandleUtility.Repaint(); } break; case EventType.MouseDown: { // am I closest to the thingy? if (!evt.alt && HandleUtility.nearestControl == id && evt.button == 0) { GUIUtility.hotControl = id; // Grab mouse focus if (evt.shift) { Object[] selected = Selection.objects; if (ArrayUtility.Contains(selected, target) == false) { ArrayUtility.Add(ref selected, target); Selection.objects = selected; } } else { Selection.activeObject = target; } EditorGUIUtility.PingObject(target); evt.Use(); } break; } case EventType.MouseDrag: { if (!evt.alt && GUIUtility.hotControl == id) { DragAndDrop.PrepareStartDrag(); DragAndDrop.objectReferences = new UnityEngine.Object[] { target }; DragAndDrop.StartDrag(ObjectNames.GetDragAndDropTitle(target)); // having a hot control set during drag makes the control eat the drag events // and dragging of bones no longer works over the avatar configure window // see case 912016 GUIUtility.hotControl = 0; evt.Use(); } break; } case EventType.MouseUp: { if (GUIUtility.hotControl == id && (evt.button == 0 || evt.button == 2)) { GUIUtility.hotControl = 0; evt.Use(); } break; } case EventType.Repaint: { color = GUIUtility.hotControl == 0 && HandleUtility.nearestControl == id ? Handles.preselectionColor : color; if (hasValidChildBones) { renderer.AddBoneInstance(basePoint, endPoint, color); } else { renderer.AddBoneLeafInstance(basePoint, target.rotation, (endPoint - basePoint).magnitude, color); } } break; } } }
public void InitRig() { leftArmFeatureVec = new LinkedList <FeatureItem>(); rightArmFeatureVec = new LinkedList <FeatureItem>(); if (rHandSkeleton == null || rHandSkeleton.rootBone == null || rHandSkeleton.lHandQueryTree == null || rHandSkeleton.rHandQueryTree == null || rHandSkeleton.lHandQueryTree.Count == 0 || rHandSkeleton.rHandQueryTree.Count == 0) { if (rHandSkeleton == null) { GameObject kNNSkeleton_ = new GameObject("Right-KNN-Skeleton"); this.rHandSkeleton = kNNSkeleton_.AddComponent <KNNSkeleton>(); } this.rHandSkeleton.SetKNNSkeleton(skeletonPath); this.rHandSkeleton.transform.parent = this.transform; this.rHandSkeleton.rootBone.transform.parent = this.rHandSkeleton.transform; } if (lHandSkeleton == null || lHandSkeleton.rootBone == null || lHandSkeleton.lHandQueryTree == null || lHandSkeleton.rHandQueryTree == null || lHandSkeleton.lHandQueryTree.Count == 0 || lHandSkeleton.rHandQueryTree.Count == 0) { if (lHandSkeleton == null) { GameObject kNNSkeleton_ = new GameObject("Left-KNN-Skeleton"); this.lHandSkeleton = kNNSkeleton_.AddComponent <KNNSkeleton>(); } this.lHandSkeleton.SetKNNSkeleton(skeletonPath); this.lHandSkeleton.transform.parent = this.transform; this.lHandSkeleton.rootBone.transform.parent = this.lHandSkeleton.transform; } if (finalSkeletonBones == null) { GameObject kNNSkeleton_ = new GameObject("final-KNN-Skeleton-Bones"); GameObject rootBone = new GameObject("final-KNN-Skeleton-Bones"); this.finalSkeletonBones = rootBone.AddComponent <KNNBone>(); this.finalSkeletonBones.initKNNBoneFromFile(skeletonPath); this.finalSkeletonBones.transform.parent = kNNSkeleton_.transform; kNNSkeleton_.transform.parent = this.transform; } Stack <KNNBone> boneStackFinal = new Stack <KNNBone>(); Stack <KNNBone> boneStackLeft = new Stack <KNNBone>(); Stack <KNNBone> boneStackRight = new Stack <KNNBone>(); boneStackFinal.Push(this.finalSkeletonBones); boneStackLeft.Push(this.lHandSkeleton.rootBone); boneStackRight.Push(this.rHandSkeleton.rootBone); allBones = new List <Tuple <KNNBone, KNNBone, KNNBone> >(); //assuming they all have the same hierarchy while (boneStackFinal.Count > 0) { KNNBone topBoneFinal = boneStackFinal.Pop(); KNNBone topBoneLeft = boneStackLeft.Pop(); KNNBone topBoneRight = boneStackRight.Pop(); foreach (KNNBone childBone in topBoneFinal.children) { boneStackFinal.Push(childBone); } foreach (KNNBone childBone in topBoneLeft.children) { boneStackLeft.Push(childBone); } foreach (KNNBone childBone in topBoneRight.children) { boneStackRight.Push(childBone); } if (topBoneLeft.name == topBoneRight.name && topBoneFinal.name == topBoneLeft.name) { allBones.Add(Tuple.Create(topBoneLeft, topBoneRight, topBoneFinal)); } } rigTransforms = new List <Tuple <Transform, Transform, Quaternion> >(); Stack <KNNBone> boneStack = new Stack <KNNBone>(); Stack <Transform> transformStack = new Stack <Transform>(); boneStack.Push(this.finalSkeletonBones); transformStack.Push(rig); while (boneStack.Count > 0) { KNNBone topBone = boneStack.Pop(); Transform topTransform = null; if (transformStack.Count > 0) { topTransform = transformStack.Pop(); } foreach (KNNBone childBone in topBone.children) { boneStack.Push(childBone); if (topTransform != null) { Transform childTransform = topTransform.Find(childBone.name); if (childTransform != null) { transformStack.Push(childTransform); } } } if (topTransform != null && topTransform.name == topBone.name) { rigTransforms.Add(Tuple.Create(topBone.transform, topTransform, topTransform.rotation)); } } Transform targets = null; Transform lHandTmpTarget = null; Transform rHandTmpTarget = null; Transform headTmpTarget = null; if (this.transform.Find("Targets") == null) { targets = new GameObject("Targets").transform; targets.transform.parent = this.transform; } else { targets = this.transform.Find("Targets"); lHandTmpTarget = targets.Find("LHandTarget"); rHandTmpTarget = targets.Find("RHandTarget"); headTmpTarget = targets.Find("HeadTarget"); } if (lHandTarget == null) { if (lHandTmpTarget == null) { lHandTmpTarget = new GameObject("LHandTarget").transform; lHandTmpTarget.transform.parent = targets.transform; } lHandTarget = lHandTmpTarget; } if (rHandTarget == null) { if (rHandTmpTarget == null) { rHandTmpTarget = new GameObject("RHandTarget").transform; rHandTmpTarget.transform.parent = targets.transform; } rHandTarget = rHandTmpTarget; } if (headTarget == null) { if (headTmpTarget == null) { headTmpTarget = new GameObject("HeadTarget").transform; headTmpTarget.transform.parent = targets.transform; } headTarget = headTmpTarget; } BoneRenderer leftBoneRenderer = lHandSkeleton.GetComponent <BoneRenderer>(); BoneRenderer rightBoneRenderer = rHandSkeleton.GetComponent <BoneRenderer>(); BoneRenderer finalBoneRenderer = finalSkeletonBones.GetComponent <BoneRenderer>(); if (leftBoneRenderer != null) { leftBoneRenderer.boneColor = Color.green; } if (rightBoneRenderer != null) { rightBoneRenderer.boneColor = Color.white; } }
internal static void DoBoneHandle(Transform target, BoneRenderer renderer) { DoBoneHandle(target, null, renderer); }