public static void drawIkHelp(Transform main, object skel)
        {
            foreach (FieldInfo field in skel.GetType().GetFields())
            {
                if (field.GetCustomAttributes(typeof(CustomSkelResultAttribute), true).Length == 0)
                {
                    continue;
                }
                object value     = field.GetValue(skel);
                Type   fieldType = field.FieldType;
                drawIkHelp(main, value);

                if (fieldType == typeof(Vector3))
                {
                    Vector3 w2s = Camera.current.WorldToScreenPoint((Vector3)value);
                    if (w2s.z < 0)
                    {
                        continue;
                    }
                    UnityEditorUtils.fillStripe2D(w2s.getXy(), IK_DISK_R1, IK_DISK_R2, 20);
                }
                if (fieldType == typeof(P <Vector3>))
                {
                }
            }
        }
        private static void Gizmo(MoveenSkelLimb2 h, GizmoType gizmoType)
        {
            if (!h.isActiveAndEnabled)
            {
                return;
            }
            OnDrawGizmos(h);
            Gizmos.color = new Color(0, 1, 0, 0.4f);
            drawSimpleSpiderGizmo(h.rotJoint, h.maxLen * 0.2f, h.transform.position, h.targetPosRel);

            if (((int)gizmoType & (int)GizmoType.InSelectionHierarchy) != 0 && solveIk)
            {
                Gizmos.color = IK_GIZMO_COLOR;
                Vector3 w2s = Camera.current.WorldToScreenPoint(h.targetPos);
                if (w2s.z > 0)
                {
                    UnityEditorUtils.fillStripe2D(w2s.getXy(), IK_DISK_R1, IK_DISK_R2, 20);
                }
//                UnityEditorUtils.fillStripe2D(Camera.current.WorldToScreenPoint(h.transform.TransformPoint(h.rotJoint.axisRel)).getXy(), MoveenGizmos_Limb1.IK_DISK_R1, MoveenGizmos_Limb1.IK_DISK_R2, 20);
                MoveenSkelLimb1Editor.drawIkHelp(h.transform, h);
            }

            Gizmos.color = new Color(0, 0.5f, 0, 0.8f);

//            Gizmos.DrawLine(rotationJoint.basisAbs.v, rotationJoint.targetAbs.v);
            Gizmos.DrawLine(h.invisibleElbowJoint.basisAbs.v, h.invisibleElbowJoint.resultAbs.v);
            Gizmos.DrawLine(h.invisibleElbowJoint.resultAbs.v, h.invisibleElbowJoint.targetAbs.v);
        }
        private static void Gizmo(MoveenSkelLimb1 h, GizmoType gizmoType)
        {
            if (!h.isActiveAndEnabled)
            {
                return;
            }
            OnDrawGizmos(h);
            Gizmos.color = new Color(0, 1, 0, 0.4f);
            MoveenSkelLimb2Editor.drawSimpleSpiderGizmo(h.rotJoint, h.maxLen * 0.2f, h.transform.position, h.targetPosRel);

            if (((int)gizmoType & (int)GizmoType.InSelectionHierarchy) != 0 && solveIk)
            {
                Gizmos.color = IK_GIZMO_COLOR;
                Vector3 w2s = Camera.current.WorldToScreenPoint(h.targetPos);
                if (w2s.z > 0)
                {
                    UnityEditorUtils.fillStripe2D(w2s.getXy(), IK_DISK_R1, IK_DISK_R2, 20);
                }
                drawIkHelp(h.transform, h);
            }
        }
        private static void OnDrawGizmos(MoveenStepper5 component, GizmoType gizmoType)
        {
            if (!component.isActiveAndEnabled)
            {
                return;
            }
            Vector3 distSum = new Vector3();

            for (var i = 0; i < component.engine.steps.Count; i++)
            {
                var step = component.engine.steps[i];

                //step dial
                float r1 = 10;
                float r2 = 20;

                float airTime     = step.lastStepLen / step.legSpeed * 1.5f;
                float earthTime   = step.lastStepLen / step.bodySpeed.length();
                float dockedAngle = MyMath.PI * 2 * earthTime / (airTime + earthTime);
//                float angle = MyMath.PI;

                if (component.engine.showPhaseDials)
                {
                    Vector2 dialCenter = new Vector2(r2 * 2 + i * (r2 * 2.5f), r2 * 2);
                    Gizmos.color = Color.green;
                    UnityEditorUtils.fillStripe2D(dialCenter, r1, r2, 20);
                    Gizmos.color = Color.red;
                    UnityEditorUtils.fillArcStripe2D(dialCenter, r1, r2, 20, MyMath.PI * 2 * 3 / 4 - dockedAngle / 2, MyMath.PI * 2 * 3 / 4 + dockedAngle / 2);

                    float a2;
                    if (step.dockedState)
                    {
                        a2 = MyMath.PI * 2 * 3 / 4 - dockedAngle / 2 + dockedAngle * step.progress;
                    }
                    else
                    {
                        a2 = MyMath.PI * 2 * 3 / 4 + dockedAngle / 2 + (MyMath.PI * 2 - dockedAngle) * step.progress;
                    }
                    Gizmos.color = new Color(0.8f, 0.8f, 0.8f, 1);
                    UnityEditorUtils.fillArcStripe2D(dialCenter, r2 - 5, r2 + 2, 5, a2, a2 + step.beFaster);
                    Gizmos.color = step.dockedState ? Color.white : Color.black;
                    drawNeedle(a2, dialCenter, r1, r2);
                }

                Gizmos.color = Color.green;

                if (component.engine.collectSteppingHistory && Application.isPlaying)
                {
                    CounterStacksCollection history = step.paramHistory;
                    drawHistory(history, historyBeans, i);
                }
            }
            distSum       = MyMath.max(distSum, new Vector3(0.5f, 0.5f, 0.5f));
            Gizmos.color  = Color.yellow;
            Gizmos.matrix = Matrix4x4.TRS(component.targetPos, component.targetRot, new Vector3(1, 1, 1));
            Gizmos.DrawWireCube(Vector3.zero, distSum * 0.2f);
            Gizmos.matrix = Matrix4x4.identity;
            Gizmos.color  = Color.green;

            if (component.hip != null)
            {
                Gizmos.matrix = Matrix4x4.TRS(component.engine.hipPosAbs, component.engine.hipRotAbs, new Vector3(1, 1, 1));
                Gizmos.DrawWireCube(Vector3.zero, distSum / 2);
                Gizmos.matrix = Matrix4x4.identity;
            }

            Gizmos.matrix = Matrix4x4.TRS(component.transform.position, component.transform.rotation, new Vector3(1, 1, 1));
            UnityEditorUtils.arrow();
            Gizmos.DrawWireCube(Vector3.zero, distSum);
            Gizmos.matrix = Matrix4x4.identity;

            if (Application.isPlaying)
            {
                Gizmos.color = Color.cyan;
                Gizmos.DrawWireSphere(component.engine.imBody, 0.2f);
                Gizmos.color = new Color(0, 0, 1);
                Gizmos.DrawWireSphere(component.engine.imCenter, 0.4f);
                Gizmos.color = Color.green;
                Gizmos.DrawWireSphere(component.engine.virtualForLegs, 0.35f);
            }

            Gizmos.color = new Color(1, 0.0f, 1);
            Gizmos.DrawWireSphere(component.engine.calculatedCOG, 0.1f);
        }