示例#1
0
        public void DoSolverGUI(Solver2D solver)
        {
            if (solver == null || !solver.isValid)
            {
                return;
            }

            IKManager2D manager = IKEditorManager.instance.FindManager(solver);

            if (!solver.isActiveAndEnabled || manager == null || !manager.isActiveAndEnabled)
            {
                return;
            }

            var solverData = manager.GetSolverEditorData(solver);

            if (!solverData.showGizmo)
            {
                return;
            }
            DrawSolver(solver, solverData);

            var allChainsHaveTargets = solver.allChainsHaveTargets;

            for (int i = 0; i < solver.chainCount; ++i)
            {
                var chain = solver.GetChain(i);
                if (chain == null)
                {
                    continue;
                }

                if (allChainsHaveTargets)
                {
                    if (!IsTargetTransformSelected(chain))
                    {
                        DoTargetGUI(solver, chain);
                    }
                }
                else if (chain.target == null)
                {
                    DoIkPoseGUI(solver, chain);
                }
            }

            if (GUIUtility.hotControl == 0)
            {
                isDragging = false;
            }
        }
        public void Setup()
        {
            editorManager = IKEditorManager.instance;

            go = new GameObject();
            var child1GO = new GameObject();

            child1GO.transform.parent = go.transform;

            var child2GO = new GameObject();

            child2GO.transform.parent = child1GO.transform;

            var child3GO = new GameObject();

            child3GO.transform.parent = child2GO.transform;

            targetGO = new GameObject();
            targetGO.transform.parent = child3GO.transform;

            go.transform.position       = Vector3.zero;
            child1GO.transform.position = new Vector3(1.0f, 0.0f, 0.0f);
            child2GO.transform.position = new Vector3(3.0f, 0.0f, 0.0f);
            child3GO.transform.position = new Vector3(6.0f, 0.0f, 0.0f);
            targetGO.transform.position = new Vector3(10.0f, 0.0f, 0.0f);

            ikGO    = new GameObject();
            manager = ikGO.AddComponent <IKManager2D>();
            var lsGO = new GameObject();

            solver = lsGO.AddComponent <FabrikSolver2D>();
            lsGO.transform.parent = ikGO.transform;

            effectorGO = new GameObject();
            effectorGO.transform.parent   = solver.transform;
            effectorGO.transform.position = new Vector3(10.0f, 0.0f, 0.0f);

            chain                = solver.GetChain(0);
            chain.target         = targetGO.transform;
            chain.effector       = effectorGO.transform;
            chain.transformCount = 5;

            solver.Initialize();

            manager.AddSolver(solver);

            editorManager.Initialize();
        }
示例#3
0
        private void DrawSolver(Solver2D solver, IKManager2D.SolverEditorData editorData)
        {
            if (Event.current.type != EventType.Repaint)
            {
                return;
            }

            for (int i = 0; i < solver.chainCount; ++i)
            {
                var chain = solver.GetChain(i);
                if (chain != null)
                {
                    DrawChain(chain, editorData.color, solver.allChainsHaveTargets);
                }
            }
        }
        public void Setup()
        {
            go = new GameObject();
            var child1GO = new GameObject();

            child1GO.transform.parent = go.transform;

            var child2GO = new GameObject();

            child2GO.transform.parent = child1GO.transform;

            var child3GO = new GameObject();

            child3GO.transform.parent = child2GO.transform;

            targetGO = new GameObject();
            targetGO.transform.parent = child3GO.transform;

            go.transform.position       = Vector3.zero;
            child1GO.transform.position = new Vector3(1.0f, 0.0f, 0.0f);
            child2GO.transform.position = new Vector3(3.0f, 0.0f, 0.0f);
            child3GO.transform.position = new Vector3(6.0f, 0.0f, 0.0f);
            targetGO.transform.position = new Vector3(10.0f, 0.0f, 0.0f);

            ikGO    = new GameObject();
            manager = ikGO.AddComponent <IKManager2D>();
            var lsGO = new GameObject();

            // Using FABRIKSolver2D here, but tests are generalised for all Solver2Ds
            solver = lsGO.AddComponent <FabrikSolver2D>();
            lsGO.transform.parent = ikGO.transform;

            effectorGO = new GameObject();
            effectorGO.transform.parent = solver.transform;

            var chain = solver.GetChain(0);

            chain.target         = targetGO.transform;
            chain.effector       = effectorGO.transform;
            chain.transformCount = 5;
            chain.Initialize();

            manager.AddSolver(solver);
        }
示例#5
0
        private void DrawSolver(Solver2D solver)
        {
            if (Event.current.type != EventType.Repaint)
            {
                return;
            }

            IKManager2D manager           = IKEditorManager.instance.FindManager(solver);
            bool        isManagerDisabled = !solver.isActiveAndEnabled || manager == null || !manager.isActiveAndEnabled;

            for (int i = 0; i < solver.chainCount; ++i)
            {
                var chain = solver.GetChain(i);
                if (chain != null)
                {
                    DrawChain(chain, isManagerDisabled, solver.allChainsHaveTargets);
                }
            }
        }
示例#6
0
        private bool PrepareEffectorOverrides(Solver2D solver)
        {
            m_EffectorPositions.Clear();

            for (int i = 0; i < solver.chainCount; ++i)
            {
                var chain = solver.GetChain(i);

                Vector3 positionOverride;
                if (!m_ChainPositionOverrides.TryGetValue(chain, out positionOverride))
                {
                    m_EffectorPositions.Clear();
                    return(false);
                }

                m_EffectorPositions.Add(positionOverride);
            }

            return(true);
        }
示例#7
0
        public void DoSolverGUI(Solver2D solver)
        {
            if (solver == null || !solver.isValid)
            {
                return;
            }

            DrawSolver(solver);

            var allChainsHaveTargets = solver.allChainsHaveTargets;

            for (int i = 0; i < solver.chainCount; ++i)
            {
                var chain = solver.GetChain(i);
                if (chain == null)
                {
                    continue;
                }

                if (allChainsHaveTargets)
                {
                    if (!IsTargetTransformSelected(chain))
                    {
                        DoTargetGUI(solver, chain);
                    }
                }
                else if (chain.target == null)
                {
                    DoIkPoseGUI(solver, chain);
                }
            }

            if (GUIUtility.hotControl == 0)
            {
                isDragging = false;
            }
        }
        public void TargetIsReachableForChain_EndPointReachesTarget()
        {
            var targetPosition = new Vector3(9.0f, 1.0f, 0.0f);

            effectorGO.transform.position = targetPosition;

            manager.UpdateManager();

            var chain = solver.GetChain(0);

            Assert.That(targetPosition, Is.EqualTo(chain.target.position).Using(vec3Compare));
            Assert.That(0.0f, Is.EqualTo((targetPosition - chain.target.position).magnitude).Using(floatCompare));
        }
示例#9
0
 public static Transform Target(this Solver2D solver, int chainIndex = 0)
 {
     return(solver.GetChain(chainIndex).target);
 }