Beispiel #1
0
    void OnDrawGizmos()
    {
        if (Application.isPlaying)
        {
            return;
        }

        if (splinePoints.Count > 3)
        {
            Gizmos.color = Color.black;
            Vector3 prevPt = CalcPositionAtTime(0);

            for (int i = 1; i <= 100; i++)
            {
                float   pm     = (float)i / (float)100;
                Vector3 currPt = CalcPositionAtTime(pm);
                Gizmos.DrawLine(currPt, prevPt);
                prevPt = currPt;
            }

            Gizmos.color = Color.white;
        }

        if (ropeEnd && QuickRope2Helper.HasMoved(ref pRopeEndPos, ropeEnd.transform.position))
        {
            ApplyRopeSettings();
        }
    }
Beispiel #2
0
    void OnSceneGUI()
    {
        r = (QuickRope2)target;
        if (Application.isPlaying || r.ropeEnd == null)
        {
            return;
        }

        if (EditorApplication.isCompiling)
        {
            rebuildAfterCompile = true;
        }
        else if (rebuildAfterCompile)
        {
            rebuildAfterCompile = false;
            UpdateRope();
            //return;
        }

        Quaternion camLookAt = SceneView.currentDrawingSceneView.camera.transform.rotation;
        Vector3    camNormal = SceneView.currentDrawingSceneView.camera.transform.forward;


        //==============  Add Control Point Button ==================

        if (r.ControlPoints.Count == 0 && PlusButton(r.transform.position + (r.ropeEnd.transform.position - r.transform.position) / 2, camLookAt))
        {
            r.ControlPoints.Add(r.transform.position + (r.ropeEnd.transform.position - r.transform.position) / 2);
        }

        if (r.ControlPoints.Count > 0)
        {
            // First Add Button
            if (PlusButton(r.transform.position + (r.ControlPoints[0] - r.transform.position) / 2, camLookAt))
            {
                r.ControlPoints.Insert(0, r.transform.position + (r.ControlPoints[0] - r.transform.position) / 2);
                currentActiveHandle = 0;
            }

            // Last Add Button
            if (PlusButton(r.ControlPoints[r.ControlPoints.Count - 1] + (r.ropeEnd.transform.position - r.ControlPoints[r.ControlPoints.Count - 1]) / 2, camLookAt))
            {
                r.ControlPoints.Insert(r.ControlPoints.Count, r.ControlPoints[r.ControlPoints.Count - 1] + (r.ropeEnd.transform.position - r.ControlPoints[r.ControlPoints.Count - 1]) / 2);
                currentActiveHandle = r.ControlPoints.Count - 1;
            }

            for (int i = 0; i < r.ControlPoints.Count - 1; i++)
            {
                Vector3 btnPos = r.ControlPoints[i] + ((r.ControlPoints[i + 1] - r.ControlPoints[i]) / 2);

                if (PlusButton(btnPos, camLookAt))
                {
                    r.ControlPoints.Insert(i + 1, btnPos);
                    currentActiveHandle = i + 1;
                }
            }
        }

        // ==================
        if (r.ControlPoints == null)
        {
            UpdateRope();
            return;
        }

        // =================
        for (int i = 0; i < r.ControlPoints.Count; i++)
        {
            Handles.color = new Color(0, 0, 0, 1);
            if (Handles.Button(r.ControlPoints[i], camLookAt, 0.5f * guiScale, 0.5f * guiScale, Handles.CircleCap))
            {
                currentActiveHandle = i;
            }

            if (i == currentActiveHandle)
            {
                Handles.color = new Color(0.3f, 0.3f, 0.8f);
                Handles.DrawSolidDisc(r.ControlPoints[i], camNormal, 0.4f * guiScale);

                Handles.color      = Color.white;
                r.ControlPoints[i] = Handles.PositionHandle(r.ControlPoints[i], Quaternion.identity);

                if (Event.current.type == EventType.keyDown)
                {
                    if (Event.current.keyCode == KeyCode.P)
                    {
                        if (i > 0 && i < r.ControlPoints.Count - 2)
                        {
                            r.ControlPoints.Insert(i + 1, r.ControlPoints[i] + ((r.ControlPoints[i + 1] - r.ControlPoints[i]) / 2));
                        }
                        //UpdateRope();
                    }

                    if (Event.current.keyCode == KeyCode.Backspace)
                    {
                        r.ControlPoints.RemoveAt(currentActiveHandle);

                        currentActiveHandle--;
                        if (currentActiveHandle == -1 && r.ControlPoints.Count != 0)
                        {
                            currentActiveHandle = 0;
                        }

                        r.ControlPoints.TrimExcess();
                        UpdateRope();
                        return;
                    }
                }
            }
            else
            {
                Handles.color = new Color(0.2f, 0.2f, 0.4f, 0.8f);
                Handles.DrawSolidDisc(r.ControlPoints[i], camNormal, 0.4f * guiScale);
            }
        }

        //Deal with rope end
        {
            Handles.color = new Color(0, 0, 0, 1);
            if (Handles.Button(r.ropeEnd.transform.position, camLookAt, 0.5f * guiScale, 0.5f * guiScale, Handles.CircleCap))
            {
                currentActiveHandle = 5000;
            }

            if (currentActiveHandle == 5000)

            {
                Handles.color = new Color(0.3f, 0.3f, 0.8f);
                Handles.DrawSolidDisc(r.ropeEnd.transform.position, camNormal, 0.4f * guiScale);

                Handles.color = Color.white;
                r.ropeEnd.transform.position = Handles.PositionHandle(r.ropeEnd.transform.position, Quaternion.identity);
            }
            else
            {
                Handles.color = new Color(0.2f, 0.2f, 0.4f, 0.8f);
                Handles.DrawSolidDisc(r.ropeEnd.transform.position, camNormal, 0.4f * guiScale);
            }
        }

        foreach (RopeAttachedObject ao in r.attachedObjects)
        {
            if (ao.go == null)
            {
                continue;
            }

            if (ao.jointIndex > r.Joints.Count - 1)
            {
                ao.jointIndex = r.Joints.Count - 1;
            }

            Handles.color = new Color(0.8f, 0.4f, 0f, 0.8f);
            Handles.DrawSolidDisc(ao.go.transform.position, camNormal, 0.2f * guiScale);
            Handles.DrawSolidDisc(r.Joints[ao.jointIndex].transform.position, camNormal, 0.2f * guiScale);

            float dist = Vector3.Distance(r.Joints[ao.jointIndex].transform.position, ao.go.transform.position);

            if (dist > 0.5f)
            {
                Handles.ArrowCap(0, ao.go.transform.position, Quaternion.LookRotation((r.Joints[ao.jointIndex].transform.position - ao.go.transform.position).normalized), dist * 0.8f);
            }

            Handles.color = new Color(0.8f, 0f, 0f, 0.8f);
            if (ao.jointType == RopeAttachmentJointType.Hinge && (ao.hingeAxis != Vector3.zero))
            {
                Handles.ArrowCap(0, ao.go.transform.position, ao.go.transform.rotation * Quaternion.LookRotation(ao.hingeAxis), 1);
            }
        }

        winRect = GUI.Window(0, winRect, EditWindowFunc, "Edit Selected Control Point");

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
            UpdateRope();
        }
        else if (QuickRope2Helper.HasMoved(ref prevRopePos, r.transform.position))
        {
            UpdateRope();
        }
    }