コード例 #1
0
ファイル: IKGizmos.cs プロジェクト: Isvan/LudumDare44
        private void DoIkPoseGUI(Solver2D solver, IKChain2D chain)
        {
            int controlId = GUIUtility.GetControlID(kTargetHashCode, FocusType.Passive);

            var color = FadeFromChain(Color.white, chain);

            if (!isDragging && (color.a == 0f || !IsVisible(chain.effector.position)))
            {
                return;
            }

            if (HandleUtility.nearestControl == controlId && Event.current.type == EventType.MouseDown && Event.current.button == 0)
            {
                StoreSolverPositionOverrides(solver);
            }

            EditorGUI.BeginChangeCheck();

            Handles.color = color;
            Vector3 newPosition = Handles.Slider2D(controlId, chain.effector.position, chain.effector.forward, chain.effector.up, chain.effector.right, HandleUtility.GetHandleSize(chain.effector.position) * kCircleHandleRadius, Handles.CircleHandleCap, Vector2.zero);

            if (EditorGUI.EndChangeCheck())
            {
                if (!isDragging)
                {
                    isDragging = true;
                }

                IKEditorManager.instance.Record(solver, "IK Pose");

                SetSolverPositionOverrides();
                IKEditorManager.instance.SetChainPositionOverride(chain, newPosition);
                IKEditorManager.instance.UpdateSolverImmediate(solver, true);
            }
        }
コード例 #2
0
        public void Setup()
        {
            go = new GameObject();
            var childGO = new GameObject();

            childGO.transform.parent = go.transform;

            var targetGO = new GameObject();

            targetGO.transform.parent = childGO.transform;

            go.transform.position       = Vector3.zero;
            childGO.transform.position  = new Vector3(1.0f, 0.0f, 0.0f);
            targetGO.transform.position = new Vector3(3.0f, 0.0f, 0.0f);

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

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

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

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

            solver.Initialize();

            manager.AddSolver(solver);
        }
コード例 #3
0
ファイル: IKGizmos.cs プロジェクト: Isvan/LudumDare44
        private void DoTargetGUI(Solver2D solver, IKChain2D chain)
        {
            int controlId = GUIUtility.GetControlID(kTargetHashCode, FocusType.Passive);

            var color = FadeFromChain(Color.white, chain);

            if (!isDragging && (color.a == 0f || !IsVisible(chain.target.position)))
            {
                return;
            }

            EditorGUI.BeginChangeCheck();

            Handles.color = color;
            var newPosition = Handles.Slider2D(controlId, chain.target.position, chain.target.forward, chain.target.up, chain.target.right, HandleUtility.GetHandleSize(chain.effector.position) * kCircleHandleRadius, Handles.CircleHandleCap, Vector2.zero);

            if (EditorGUI.EndChangeCheck())
            {
                if (!isDragging)
                {
                    isDragging = true;
                    IKEditorManager.instance.RegisterUndo(solver, "Move Target");
                }

                Undo.RecordObject(chain.target, "Move Target");

                chain.target.position = newPosition;
            }
        }
コード例 #4
0
ファイル: IKGizmos.cs プロジェクト: LS122800/ProjectEntropy
        private void DrawChain(IKChain2D chain, Color solverColor, bool solverHasTargets)
        {
            Handles.matrix = Matrix4x4.identity;
            Color color = FadeFromChain(solverColor, chain);

            if (color.a == 0f)
            {
                return;
            }

            Transform currentTransform = chain.effector;

            for (int i = 0; i < chain.transformCount - 1; ++i)
            {
                var     parentPosition         = currentTransform.parent.position;
                var     position               = currentTransform.position;
                Vector3 projectedLocalPosition = Vector3.Project(currentTransform.localPosition, Vector3.right);
                Vector3 projectedEndPoint      = currentTransform.parent.position + currentTransform.parent.TransformVector(projectedLocalPosition);
                var     visible = IsVisible(projectedEndPoint) || IsVisible(position);

                if (visible && currentTransform.localPosition.sqrMagnitude != projectedLocalPosition.sqrMagnitude)
                {
                    Color red = Color.red;
                    red.a         = color.a;
                    Handles.color = red;
                    Handles.DrawDottedLine(projectedEndPoint, position, kDottedLineLength);
                }

                visible = IsVisible(parentPosition) || IsVisible(projectedEndPoint);

                Handles.color = color;
                if (visible)
                {
                    Handles.DrawDottedLine(parentPosition, projectedEndPoint, kDottedLineLength);
                }

                currentTransform = currentTransform.parent;
            }

            Handles.color    = color;
            currentTransform = chain.effector;
            for (int i = 0; i < chain.transformCount; ++i)
            {
                var position = currentTransform.position;
                var size     = HandleUtility.GetHandleSize(position);

                if (IsVisible(position))
                {
                    Handles.DrawSolidDisc(position, currentTransform.forward, kNodeRadius * size);
                }

                currentTransform = currentTransform.parent;
            }

            Handles.color = Color.white;
        }
コード例 #5
0

        
コード例 #6
0
ファイル: IKGizmos.cs プロジェクト: Isvan/LudumDare44
        private Color FadeFromChain(Color color, IKChain2D chain)
        {
            var size        = HandleUtility.GetHandleSize(chain.effector.position);
            var scaleFactor = 1f;
            var lengths     = chain.lengths;

            foreach (var length in lengths)
            {
                scaleFactor = Mathf.Max(scaleFactor, length);
            }

            return(FadeFromSize(color, size, kFadeStart * scaleFactor, kFadeEnd * scaleFactor));
        }
コード例 #7
0
        public override void OnInspectorGUI()
        {
            IKChain2D chain = m_Solver.GetChain(0);

            serializedObject.Update();
            EditorGUILayout.PropertyField(m_EffectorProperty, Contents.effectorLabel);
            EditorGUILayout.PropertyField(m_TargetProperty, Contents.targetLabel);
            EditorGUILayout.IntSlider(m_TransformCountProperty, 0, IKUtility.GetMaxChainCount(chain), Contents.chainLengthLabel);
            EditorGUILayout.PropertyField(m_IterationsProperty, Contents.iterationsLabel);
            EditorGUILayout.PropertyField(m_ToleranceProperty, Contents.toleranceLabel);

            DrawCommonSolverInspector();

            serializedObject.ApplyModifiedProperties();
        }
コード例 #8
0
        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();
        }
コード例 #9
0
 public void SetChainPositionOverride(IKChain2D chain, Vector3 position)
 {
     m_ChainPositionOverrides[chain] = position;
 }
コード例 #10
0
ファイル: IKGizmos.cs プロジェクト: Isvan/LudumDare44
        private bool IsTargetTransformSelected(IKChain2D chain)
        {
            Debug.Assert(chain.target != null);

            return(Selection.Contains(chain.target.gameObject));
        }
コード例 #11
0
        private bool IsEffectorTransformSelected(IKChain2D chain)
        {
            Debug.Assert(chain.effector != null);

            return(Selection.Contains(chain.effector.gameObject));
        }