Ejemplo n.º 1
0
        public void addEdge(CameraPathEdge edge)
        {
            List <CameraPathEdge> tempArray = new List <CameraPathEdge> (edges);

            tempArray.Add(edge);
            edges = tempArray.ToArray();
        }
Ejemplo n.º 2
0
 public void drawEdgeSceneGUIButton(CameraPathEdge edge)
 {
     if (edge.n1 != null && edge.n2 != null)
     {
         if (showSelectedOnly && selectedEdge != edge)
         {
             Handles.BeginGUI();
             Vector2 pos = HandleUtility.WorldToGUIPoint((edge.n1.transform.position + edge.n2.transform.position) / 2);
             if (GUI.Button(new Rect(pos.x - 10, pos.y - 10, 20, 20), "E"))
             {
                 Selection.activeObject = edge.gameObject;
             }
             Handles.EndGUI();
         }
     }
 }
Ejemplo n.º 3
0
        public CameraSetting getNearestCameraSetting(Vector3 position)
        {
            lastNearestNode = null;
            lastNearestEdge = null;

            // Find Volume Node first
            for (int i = 0; i < nodes.Length; i++)
            {
                CameraPathNode node = nodes[i];
                if (node.enabled && node.gameObject.activeInHierarchy && node.type == CameraPathNode.CameraPathNodeType.Volume)
                {
                    if (node.isInside(position))
                    {
                        lastNearestNode = node;
                        return(new CameraSetting(node.cameraSetting));
                    }
                }
            }

            float minDist = float.MaxValue;
            float ratio   = 0;

            for (int i = 0; i < edges.Length; i++)
            {
                CameraPathEdge edge = edges[i];
                if (edge.n1 != null && edge.n2 != null)
                {
                    float dist;
                    float r;
                    if (edge.project(position, out r, out dist))
                    {
                        if (dist < minDist)
                        {
                            minDist         = dist;
                            ratio           = r;
                            lastNearestEdge = edge;
                        }
                    }
                }
            }
            if (lastNearestEdge)
            {
                return(CameraSetting.Lerp(lastNearestEdge.n1.cameraSetting, lastNearestEdge.n2.cameraSetting, lastNearestEdge.weight.Evaluate(ratio)));
            }

            minDist = float.MaxValue;
            for (int i = 0; i < nodes.Length; i++)
            {
                CameraPathNode node = nodes[i];
                if (node.enabled && node.gameObject.activeInHierarchy && node.type == CameraPathNode.CameraPathNodeType.Point)
                {
                    float dist = Vector3.Distance(position, node.transform.position);
                    if (dist < minDist)
                    {
                        minDist         = dist;
                        lastNearestNode = node;
                    }
                }
            }
            if (lastNearestNode)
            {
                return(new CameraSetting(lastNearestNode.cameraSetting));
            }

            return(null);
        }
Ejemplo n.º 4
0
 void Start()
 {
     nodes           = nodes.OrderByDescending(x => x.priority).ToArray();
     lastNearestNode = null;
     lastNearestEdge = null;
 }
Ejemplo n.º 5
0
        void drawInspector()
        {
            serializedObject.Update();

            if (Selection.activeObject is GameObject)
            {
                selectedEdge = ((GameObject)Selection.activeObject).GetComponent <CameraPathEdge> ();
                selectedNode = ((GameObject)Selection.activeObject).GetComponent <CameraPathNode> ();
            }
            else
            {
                selectedEdge = null;
                selectedNode = null;
            }

            showSelectedOnly = EditorGUILayout.Toggle("Show Selected Only", showSelectedOnly);

            showNodes = EditorGUILayout.Foldout(showNodes, "Nodes");
            if (showNodes)
            {
                int nodeCount = nodesProp.arraySize;

                for (int i = 0; i < nodeCount; i++)
                {
                    drawNodeInspector(cameraPath[i], i);
                }

                if (GUILayout.Button("Add Node"))
                {
                    GameObject nodeObject = new GameObject("Node " + nodesProp.arraySize);
                    Undo.RegisterCreatedObjectUndo(nodeObject, "Add Node");
                    nodeObject.transform.parent        = cameraPath.transform;
                    nodeObject.transform.localPosition = Vector3.zero;

                    CameraPathNode newNode = nodeObject.AddComponent <CameraPathNode> ();
                    newNode.cameraSetting = new CameraSetting();
                    newNode.boxSize       = Vector3.one;

                    nodesProp.InsertArrayElementAtIndex(nodesProp.arraySize);
                    nodesProp.GetArrayElementAtIndex(nodesProp.arraySize - 1).objectReferenceValue = newNode;

                    Selection.activeObject = nodeObject;
                }
            }

            EditorGUILayout.Space();

            showEdges = EditorGUILayout.Foldout(showEdges, "Edges");
            if (showEdges)
            {
                int edgeCount = edgesProp.arraySize;

                for (int i = 0; i < edgeCount; i++)
                {
                    drawEdgeInspector(cameraPath.getEdge(i), i);
                }

                if (GUILayout.Button("Add Edge"))
                {
                    GameObject edgeObject = new GameObject("Edge " + edgesProp.arraySize);
                    Undo.RegisterCreatedObjectUndo(edgeObject, "Add Edge");
                    edgeObject.transform.parent        = cameraPath.transform;
                    edgeObject.transform.localPosition = Vector3.zero;
                    edgeObject.hideFlags = HideFlags.HideInHierarchy;

                    CameraPathEdge newEdge = edgeObject.AddComponent <CameraPathEdge> ();
                    newEdge.weight = AnimationCurve.Linear(0, 0, 1, 1);

                    edgesProp.InsertArrayElementAtIndex(edgesProp.arraySize);
                    edgesProp.GetArrayElementAtIndex(edgesProp.arraySize - 1).objectReferenceValue = newEdge;

                    Selection.activeObject = edgeObject;
                }
            }

            EditorGUILayout.BeginVertical("Box");
            isSimulating = EditorGUILayout.BeginToggleGroup("Simulate", isSimulating);
            if (isSimulating)
            {
                Vector3 newProxyPosition = EditorGUILayout.Vector3Field("Proxy Position", proxyPosition);
                if (newProxyPosition != proxyPosition)
                {
                    proxyPosition = newProxyPosition;
                    updateSimulation();
                }

                EditorGUILayout.Space();
                EditorGUILayout.Space();

                EditorGUILayout.ObjectField("Camera Target", simulatedCameraSetting.cameraTarget, typeof(Transform), false);
                EditorGUILayout.FloatField("Smooth Time", simulatedCameraSetting.smoothTime);
                EditorGUILayout.FloatField("Scale", simulatedCameraSetting.scale);
                EditorGUILayout.Vector3Field("Position Offset", simulatedCameraSetting.positionOffset);
                EditorGUILayout.Vector3Field("Rotation Offset", simulatedCameraSetting.rotationOffset);
                EditorGUILayout.Vector3Field("Min", simulatedCameraSetting.min);
                EditorGUILayout.Vector3Field("Max", simulatedCameraSetting.max);
            }
            EditorGUILayout.EndToggleGroup();
            EditorGUILayout.EndVertical();

            if (GUI.changed)
            {
                serializedObject.ApplyModifiedProperties();
                EditorUtility.SetDirty(target);
            }

            SceneView.RepaintAll();
        }
Ejemplo n.º 6
0
        public void drawEdgeSceneGUI(CameraPathEdge edge)
        {
            if (edge.n1 != null && edge.n2 != null)
            {
                Handles.color = Color.yellow;
                if (isSimulating && cameraPath.lastNearestEdge == edge)
                {
                    Handles.color = Color.cyan;
                }
                Handles.DrawAAPolyLine(Texture2D.whiteTexture, 3, edge.n1.transform.position, edge.n2.transform.position);
                if (edge == selectedEdge)
                {
                    Handles.color = Color.red;
                }
                else
                {
                    Handles.color = Color.yellow;
                }
                if (isSimulating && cameraPath.lastNearestEdge == edge)
                {
                    Handles.color = Color.cyan;
                }
                Handles.DrawAAPolyLine(Texture2D.whiteTexture, 1, edge.n1.transform.position, edge.n2.transform.position);


                if (!showSelectedOnly || selectedEdge == edge)
                {
                    Handles.color = new Color(1, 1, 1);
                    Vector3   edgeDir    = edge.n2.transform.position - edge.n1.transform.position;
                    float     size       = (HandleUtility.GetHandleSize(edge.n1.transform.position) + HandleUtility.GetHandleSize(edge.n2.transform.position)) / 2;
                    Vector3[] curveVerts = new Vector3[101];
                    float     interval   = edgeDir.magnitude / (curveVerts.Length - 1);
                    edgeDir.Normalize();
                    for (int i = 0; i < curveVerts.Length; i++)
                    {
                        curveVerts[i]    = edge.n1.transform.position + edgeDir * interval * i;
                        curveVerts[i].y += size * edge.weight.Evaluate(((float)i) / (curveVerts.Length - 1));
                    }

                    for (int i = 0; i < curveVerts.Length - 1; i++)
                    {
                        float colorValue = ((float)i) / (curveVerts.Length - 1);
                        Handles.DrawSolidRectangleWithOutline(new Vector3[] {
                            edge.n1.transform.position + edgeDir * interval * i + Vector3.up * size,
                            edge.n1.transform.position + edgeDir * interval * (i + 1) + Vector3.up * size,
                            curveVerts[i + 1],
                            curveVerts[i]
                        }, new Color(1 - colorValue, 1 - colorValue, 0, 0.3f), Color.clear);

                        Handles.DrawSolidRectangleWithOutline(new Vector3[] {
                            edge.n1.transform.position + edgeDir * interval * i,
                            edge.n1.transform.position + edgeDir * interval * (i + 1),
                            curveVerts[i + 1],
                            curveVerts[i]
                        }, new Color(0, colorValue, 0, 0.3f), Color.clear);
                    }

                    Handles.DrawAAPolyLine(Texture2D.whiteTexture, 1, curveVerts);
                }
            }
        }
Ejemplo n.º 7
0
        void drawEdgeInspector(CameraPathEdge edge, int index)
        {
            if (!edge)
            {
                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("X", GUILayout.Width(20)))
                {
                    Undo.RecordObject(cameraPath, "Remove Edge");
                    edgesProp.MoveArrayElement(index, cameraPath.nodeCount - 1);
                    edgesProp.arraySize--;
                    return;
                }

                EditorGUILayout.LabelField("Missing Edge");

                EditorGUILayout.EndHorizontal();

                return;
            }

            SerializedObject serObj = new SerializedObject(edge);

            SerializedProperty n1Prop = serObj.FindProperty("n1");
            SerializedProperty n2Prop = serObj.FindProperty("n2");

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("X", GUILayout.Width(20)))
            {
                Undo.RecordObject(cameraPath, "Remove Edge");
                edgesProp.MoveArrayElement(index, cameraPath.edgeCount - 1);
                edgesProp.arraySize--;
                Undo.DestroyObjectImmediate(edge.gameObject);
                return;
            }

            if (!edge.n1 || !edge.n2)
            {
                GUI.backgroundColor = Color.red;
            }
            EditorGUILayout.ObjectField(edge.gameObject, typeof(GameObject), true);
            GUI.backgroundColor = Color.white;

            if (index != 0 && GUILayout.Button(@"/\", GUILayout.Width(25)))
            {
                UnityEngine.Object other = edgesProp.GetArrayElementAtIndex(index - 1).objectReferenceValue;
                edgesProp.GetArrayElementAtIndex(index - 1).objectReferenceValue = edge;
                edgesProp.GetArrayElementAtIndex(index).objectReferenceValue     = other;
            }

            if (index != edgesProp.arraySize - 1 && GUILayout.Button(@"\/", GUILayout.Width(25)))
            {
                UnityEngine.Object other = edgesProp.GetArrayElementAtIndex(index + 1).objectReferenceValue;
                edgesProp.GetArrayElementAtIndex(index + 1).objectReferenceValue = edge;
                edgesProp.GetArrayElementAtIndex(index).objectReferenceValue     = other;
            }

            EditorGUILayout.EndHorizontal();

            if (!showSelectedOnly || selectedEdge == edge)
            {
                EditorGUILayout.BeginHorizontal();

                EditorGUI.indentLevel++;
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(n1Prop, GUIContent.none);
                EditorGUI.indentLevel--;
                EditorGUI.indentLevel--;
                EditorGUILayout.PropertyField(n2Prop, GUIContent.none);

                EditorGUILayout.EndHorizontal();

                if (edge.n1 && edge.n2)
                {
                    EditorGUI.indentLevel++;
                    EditorGUI.indentLevel++;
                    edge.weight = EditorGUILayout.CurveField(edge.weight, Color.yellow, new Rect(0, 0, 1, 1));
                    EditorGUI.indentLevel--;
                    EditorGUI.indentLevel--;
                }
            }

            if (GUI.changed)
            {
                serObj.ApplyModifiedProperties();
                EditorUtility.SetDirty(serObj.targetObject);
            }
        }