public void addEdge(CameraPathEdge edge) { List <CameraPathEdge> tempArray = new List <CameraPathEdge> (edges); tempArray.Add(edge); edges = tempArray.ToArray(); }
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(); } } }
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); }
void Start() { nodes = nodes.OrderByDescending(x => x.priority).ToArray(); lastNearestNode = null; lastNearestEdge = null; }
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(); }
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); } } }
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); } }