Exemple #1
0
 public static void OnRemoveBoneRenderer(BoneRenderer obj)
 {
     s_BoneRendererComponents.Remove(obj);
 }
Exemple #2
0
 public static void OnAddBoneRenderer(BoneRenderer obj)
 {
     s_BoneRendererComponents.Add(obj);
 }
Exemple #3
0
        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;
                }
            }
        }
Exemple #4
0
    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;
        }
    }
Exemple #5
0
 internal static void DoBoneHandle(Transform target, BoneRenderer renderer)
 {
     DoBoneHandle(target, null, renderer);
 }