Beispiel #1
0
    private void OnDrawGizmos()
    {
        // snapping to cone
        if (!Application.isPlaying)
        {
            if (transform.parent == null)
            {
                return;
            }
            Linkage3D linkage;
            if (linkage = transform.parent.GetComponent <Linkage3D>())
            {
                float angleHere = Vector3.SignedAngle(
                    Vector3.right, new Vector3(transform.localPosition.x, 0,
                                               transform.localPosition.z), Vector3.up);
                float radiusHere = Mathf.Lerp(
                    linkage.coneRadius, 0, Mathf.InverseLerp(0, linkage.coneHeight, transform.localPosition.y));
                Vector3 snappedPosition = Quaternion.Euler(0, angleHere, 0) * (Vector3.right * radiusHere)
                                          + Vector3.up * transform.localPosition.y;
                transform.localPosition = snappedPosition;

                transform.LookAt(linkage.transform.position + Vector3.up * linkage.coneHeight);
            }
        }
        // display edges
        foreach (Joint3D j in initialEdges)
        {
            Gizmos.DrawLine(transform.position, j.transform.position);
        }

        if (isAnchored)
        {
            //Gizmos.DrawWireSphere(transform.position, transform.lossyScale.x / 4f);
        }
    }
Beispiel #2
0
    public void OnSceneGUI()
    {
        Linkage3D links = (Linkage3D)target;

        if (Event.current.type == EventType.MouseDown && Event.current.button == 1)
        {
            Ray        worldRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
            RaycastHit hitInfo;

            if (Physics.Raycast(worldRay, out hitInfo))
            {
                Joint3D selected;
                if (selected = hitInfo.collider.GetComponentInParent <Joint3D>())
                {
                    if (previousSelection == null) // first selection
                    {
                        previousSelection = selected;
                    }
                    else // second selection
                    {
                        if (previousSelection == selected) // selected again, undo selection
                        {
                            previousSelection = null;
                        }
                        else if (previousSelection.initialEdges.Contains(selected))
                        {
                            Undo.RecordObject(previousSelection, "Remove Edge");
                            previousSelection.initialEdges.Remove(selected);
                            PrefabUtility.RecordPrefabInstancePropertyModifications(previousSelection);
                        }
                        else if (selected.initialEdges.Contains(previousSelection))
                        {
                            Undo.RecordObject(selected, "Remove Edge");
                            selected.initialEdges.Remove(previousSelection);
                            PrefabUtility.RecordPrefabInstancePropertyModifications(selected);
                        }
                        else // didn't exist yet, add from previous to new
                        {
                            Undo.RecordObject(previousSelection, "Add Edge");
                            previousSelection.initialEdges.Add(selected);
                            PrefabUtility.RecordPrefabInstancePropertyModifications(previousSelection);
                        }
                        previousSelection = null;
                    }
                    Event.current.Use();
                }
            }
        }
        if (previousSelection)
        {
            Handles.DrawWireCube(previousSelection.transform.position, previousSelection.transform.lossyScale / 4f);
        }
    }
Beispiel #3
0
 private void Start()
 {
     linkage = GetComponentInParent <Linkage3D>();
 }