コード例 #1
0
    static void RenderAnchorControls(Transform objectTransform, GizmoType gizmoType, bool selected)
    {
        GameObject    gameObject    = objectTransform.gameObject;
        HarmonyAnchor harmonyAnchor = gameObject.GetComponent <HarmonyAnchor>();

        if (harmonyAnchor == null)
        {
            return;
        }

        HarmonyRenderer harmonyRenderer = harmonyAnchor.GetComponentInParent <HarmonyRenderer>();

        if (harmonyRenderer == null)
        {
            return;
        }

        string clipName = harmonyRenderer.currentClipName;

        if (string.IsNullOrEmpty(clipName))
        {
            return;
        }

        string projectFolder = harmonyRenderer.currentProjectFolder;

        if (string.IsNullOrEmpty(projectFolder))
        {
            return;
        }

        float[] position = new float[3];
        float[] rotation = new float[3];
        float[] scale    = new float[3];

        if (Internal.CalculateLocatorTransform(projectFolder, clipName, harmonyRenderer.currentFrame, harmonyAnchor.nodeName, position, rotation, scale))
        {
            Vector3    localPosition   = new Vector3(position[0], position[1], position[2]);
            Quaternion localQuaternion = Quaternion.Euler(rotation[0], rotation[1], rotation[2]);
            Vector3    localScale      = new Vector3(scale[0], scale[1], scale[2]);

            Matrix4x4 localMatrix = Matrix4x4.TRS(localPosition, localQuaternion, localScale);

            Vector3 globalPosition       = localMatrix.MultiplyPoint(Vector3.zero);
            Vector3 globalRightDirection = localMatrix.MultiplyVector(Vector3.right);
            Vector3 globalUpDirection    = localMatrix.MultiplyVector(Vector3.up);

            if (gameObject.transform.parent != null)
            {
                globalPosition       = gameObject.transform.parent.localToWorldMatrix.MultiplyPoint(globalPosition);
                globalRightDirection = gameObject.transform.parent.localToWorldMatrix.MultiplyVector(globalRightDirection);
                globalUpDirection    = gameObject.transform.parent.localToWorldMatrix.MultiplyVector(globalUpDirection);
            }

            globalRightDirection.Normalize();
            globalUpDirection.Normalize();

            Quaternion axisQuaternion        = Quaternion.FromToRotation(Vector3.forward, Vector3.right);
            Quaternion globalRightQuaternion = Quaternion.FromToRotation(new Vector3(1, 0, 0), globalRightDirection);

            float arrowLength  = HandleUtility.GetHandleSize(globalPosition) * 0.5f;
            float axisLength   = arrowLength * 0.6f;
            float circleRadius = arrowLength * 0.5f;

            Handles.color = selected ? Color.cyan : Color.red;

            Handles.DrawWireDisc(globalPosition,
                                 Vector3.forward,
                                 circleRadius);

            Handles.DrawLine(globalPosition - globalRightDirection * axisLength,
                             globalPosition);

            Handles.DrawLine(globalPosition - globalUpDirection * axisLength,
                             globalPosition + globalUpDirection * axisLength);

            Handles.ArrowCap(0,
                             globalPosition,
                             globalRightQuaternion * axisQuaternion,
                             arrowLength);
        }
    }