public override void OnInspectorGUI() { //Get our manager m_manager = (PegasusManager)target; //Set up the box style if (m_boxStyle == null) { m_boxStyle = new GUIStyle(GUI.skin.box); m_boxStyle.normal.textColor = GUI.skin.label.normal.textColor; m_boxStyle.fontStyle = FontStyle.Bold; m_boxStyle.alignment = TextAnchor.UpperLeft; } //Setup the wrap style if (m_wrapStyle == null) { m_wrapStyle = new GUIStyle(GUI.skin.label); m_wrapStyle.fontStyle = FontStyle.Normal; m_wrapStyle.wordWrap = true; } //Text intro GUILayout.BeginVertical(string.Format("Pegasus ({0}.{1})", PegasusConstants.MajorVersion, PegasusConstants.MinorVersion), m_boxStyle); GUILayout.Space(20); EditorGUILayout.LabelField("Welcome to Pegasus!\nTo visualise flythrough in editor mode select Window->Layouts->2 x 3 so that both Scene & Game windows are showing.\nCtrl + Left Click: Add POI.\nCrtl + ScrollWheel: Scrub timeline.", m_wrapStyle); GUILayout.EndVertical(); EditorGUI.BeginChangeCheck(); GUILayout.Space(5); GUILayout.BeginVertical("Configuration", m_boxStyle); GUILayout.Space(20); GameObject poiTarget = (GameObject)EditorGUILayout.ObjectField(GetLabel("Target Object"), m_manager.m_target, typeof(GameObject), true); PegasusConstants.FlythroughType flythroughType = (PegasusConstants.FlythroughType)EditorGUILayout.EnumPopup(GetLabel("Flythrough Type"), m_manager.m_flythroughType); PegasusConstants.FlythroughEndAction flythroughEndAction = m_manager.m_flythroughEndAction; PegasusManager nextPegasus = m_manager.m_nextPegasus; if (flythroughType == PegasusConstants.FlythroughType.SingleShot) { flythroughEndAction = (PegasusConstants.FlythroughEndAction)EditorGUILayout.EnumPopup(GetLabel("Flythrough End"), flythroughEndAction); if (flythroughEndAction == PegasusConstants.FlythroughEndAction.PlayNextPegasus) { nextPegasus = (PegasusManager)EditorGUILayout.ObjectField(GetLabel("Next Pegasus"), nextPegasus, typeof(PegasusManager), true); } } bool autoStartAtRuntime = EditorGUILayout.Toggle(GetLabel("Play On Start"), m_manager.m_autoStartAtRuntime); PegasusConstants.TargetFrameRate targetFrameRateType = m_manager.m_targetFramerateType; PegasusConstants.HeightCheckType heightCheckType = m_manager.m_heightCheckType; float minHeightAboveTerrain = m_manager.m_minHeightAboveTerrain; float collisionHeightOffset = m_manager.m_collisionHeightOffset; float rotationDamping = m_manager.m_rotationDamping; float positionDamping = m_manager.m_positionDamping; float poiSize = m_manager.m_poiGizmoSize; bool showAdvanced = EditorGUILayout.BeginToggleGroup(GetLabel(" Advanced"), m_manager.m_showAdvanced); if (showAdvanced) { EditorGUI.indentLevel++; targetFrameRateType = (PegasusConstants.TargetFrameRate)EditorGUILayout.EnumPopup(GetLabel("Framerate"), m_manager.m_targetFramerateType); heightCheckType = (PegasusConstants.HeightCheckType)EditorGUILayout.EnumPopup(GetLabel("Check Height"), m_manager.m_heightCheckType); if (heightCheckType != PegasusConstants.HeightCheckType.None) { if (heightCheckType == PegasusConstants.HeightCheckType.Collision) { collisionHeightOffset = EditorGUILayout.FloatField(GetLabel("Collision Offset"), collisionHeightOffset); } minHeightAboveTerrain = EditorGUILayout.FloatField(GetLabel("Min POI Height"), minHeightAboveTerrain); } rotationDamping = EditorGUILayout.Slider(GetLabel("Rotation Damping"), m_manager.m_rotationDamping, 0f, 3f); positionDamping = EditorGUILayout.Slider(GetLabel("Position Damping"), m_manager.m_positionDamping, 0f, 3f); poiSize = EditorGUILayout.Slider(GetLabel("Gizmo Size"), poiSize, 0.1f, 5f); EditorGUI.indentLevel--; } EditorGUILayout.EndToggleGroup(); GUILayout.Space(3); GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical("Statistics", m_boxStyle); GUILayout.Space(20); EditorGUILayout.LabelField("Distance", string.Format("{0:0.00m}", m_manager.m_totalDistance)); EditorGUILayout.LabelField("Duration", string.Format("{0}:{1:00}.{2:000}", m_manager.m_totalDuration.Minutes, m_manager.m_totalDuration.Seconds, m_manager.m_totalDuration.Milliseconds)); GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical(m_boxStyle); float scrubber = m_manager.m_totalDistanceTravelledPct; m_manager.m_showScrubber = EditorGUILayout.BeginToggleGroup(GetLabel(" Visualisation"), m_manager.m_showScrubber); bool showDebug = m_manager.m_displayDebug; bool alwaysShowGizmos = m_manager.m_alwaysShowGizmos; if (m_manager.m_showScrubber) { EditorGUILayout.LabelField("Switch to Game View and use the Scrubber and Step controls to visualise the flythrough path while in edit mode. This will physically move your Target in the scene so make sure you put it back to its original location afterwards.", m_wrapStyle); scrubber = EditorGUILayout.Slider(GetLabel("Scrubber"), scrubber, 0f, 1f); GUILayout.BeginHorizontal(); if (GUILayout.Button(GetLabel("Step Backward"))) { m_manager.StepTargetBackward(1f); scrubber = m_manager.m_totalDistanceTravelledPct; } if (GUILayout.Button(GetLabel("Step Forward"))) { m_manager.StepTargetForward(1f); scrubber = m_manager.m_totalDistanceTravelledPct; } GUILayout.EndHorizontal(); alwaysShowGizmos = EditorGUILayout.Toggle(GetLabel("Show Gizmos"), alwaysShowGizmos); showDebug = EditorGUILayout.Toggle(GetLabel("Show debug"), showDebug); } EditorGUILayout.EndToggleGroup(); GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical(m_boxStyle); m_manager.m_showPOIHelpers = EditorGUILayout.BeginToggleGroup(GetLabel(" Utilities"), m_manager.m_showPOIHelpers); if (m_manager.m_showPOIHelpers) { if (GUILayout.Button(GetLabel("Go To First POI"))) { PegasusPoi poi = m_manager.GetPOI(0); if (poi != null) { if (Selection.activeTransform != null) { Selection.activeTransform = poi.transform; } if (SceneView.lastActiveSceneView != null) { SceneView.lastActiveSceneView.pivot = poi.transform.position; } poi.m_manager.SelectPoi(poi); poi.m_manager.MoveTargetToPoi(poi); } } if (GUILayout.Button(GetLabel("Set POI To Min Height"))) { m_manager.SetPoiToMinHeight(); } if (GUILayout.Button(GetLabel("Show Debug On POI"))) { m_manager.CreateDebugObjects(); } if (GUILayout.Button(GetLabel("Hide Debug on POI"))) { m_manager.DeleteDebugObjects(); } } EditorGUILayout.EndToggleGroup(); GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); //Display some playback controls if (EditorApplication.isPlaying) { GUILayout.BeginVertical("Playback Status", m_boxStyle); GUILayout.Space(20); EditorGUILayout.LabelField("Status", m_manager.m_currentState.ToString()); if (m_manager.m_currentState == PegasusConstants.FlythroughState.Started) { EditorGUILayout.LabelField("Delta Time", string.Format("{0:0.000}", m_manager.m_frameUpdateTime)); EditorGUILayout.LabelField("Delta Dist", string.Format("{0:0.000}", m_manager.m_frameUpdateDistance)); EditorGUILayout.LabelField("Current Speed", string.Format("{0:0.00}", m_manager.m_currentVelocity)); EditorGUILayout.LabelField("Distance Travelled", string.Format("{0:0.00}", m_manager.m_totalDistanceTravelled)); EditorGUILayout.LabelField("Total Distance", string.Format("{0:0.00}", m_manager.m_totalDistance)); } else { EditorGUILayout.LabelField("Delta Time", string.Format("{0:0.000}", 0f)); EditorGUILayout.LabelField("Delta Dist", string.Format("{0:0.000}", 0f)); EditorGUILayout.LabelField("Current Speed", string.Format("{0:0.00}", 0f)); EditorGUILayout.LabelField("Distance Travelled", string.Format("{0:0.00}", m_manager.m_totalDistanceTravelled)); EditorGUILayout.LabelField("Total Distance", string.Format("{0:0.00}", m_manager.m_totalDistance)); } if (m_manager.m_currentState == PegasusConstants.FlythroughState.Stopped) { if (GUILayout.Button(GetLabel("Play"))) { m_manager.StartFlythrough(); } } else { GUILayout.BeginHorizontal(); if (m_manager.m_currentState == PegasusConstants.FlythroughState.Paused) { if (GUILayout.Button(GetLabel("Resume"))) { m_manager.ResumeFlythrough(); } } else if (m_manager.m_currentState == PegasusConstants.FlythroughState.Started) { if (GUILayout.Button(GetLabel("Pause"))) { m_manager.PauseFlythrough(); } } if (GUILayout.Button(GetLabel("Stop"))) { m_manager.StopFlythrough(); } GUILayout.EndHorizontal(); } GUILayout.Space(3); GUILayout.EndVertical(); } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_manager, "Made changes"); m_manager.m_autoStartAtRuntime = autoStartAtRuntime; m_manager.m_displayDebug = showDebug; m_manager.m_alwaysShowGizmos = alwaysShowGizmos; m_manager.m_collisionHeightOffset = collisionHeightOffset; m_manager.m_showAdvanced = showAdvanced; m_manager.m_poiGizmoSize = poiSize; if (m_manager.m_flythroughType != flythroughType) { m_manager.m_flythroughType = flythroughType; m_manager.InitialiseFlythrough(); } m_manager.m_nextPegasus = nextPegasus; if (m_manager.m_heightCheckType != heightCheckType) { m_manager.m_heightCheckType = heightCheckType; m_manager.InitialiseFlythrough(); } m_manager.m_flythroughEndAction = flythroughEndAction; m_manager.m_target = poiTarget; if (m_manager.m_targetFramerateType != targetFrameRateType) { m_manager.ChangeFramerate(targetFrameRateType); } if (!PegasusPoi.ApproximatelyEqual(scrubber, m_manager.m_totalDistanceTravelledPct)) { m_manager.MoveTargetTo(scrubber); } if (!PegasusPoi.ApproximatelyEqual(minHeightAboveTerrain, m_manager.m_minHeightAboveTerrain)) { m_manager.m_minHeightAboveTerrain = minHeightAboveTerrain; m_manager.InitialiseFlythrough(); } m_manager.m_rotationDamping = rotationDamping; m_manager.m_positionDamping = positionDamping; EditorUtility.SetDirty(m_manager); } }
/// <summary> /// Draw the POI gui /// </summary> public override void OnInspectorGUI() { //Get our poi m_poi = (PegasusPoi)target; //Set up the box style if (m_boxStyle == null) { m_boxStyle = new GUIStyle(GUI.skin.box); m_boxStyle.normal.textColor = GUI.skin.label.normal.textColor; m_boxStyle.fontStyle = FontStyle.Bold; m_boxStyle.alignment = TextAnchor.UpperLeft; } //Setup the wrap style if (m_wrapStyle == null) { m_wrapStyle = new GUIStyle(GUI.skin.label); m_wrapStyle.wordWrap = true; } //Create a nice text intro GUILayout.BeginVertical("Point of Interest", m_boxStyle); GUILayout.Space(20); EditorGUILayout.LabelField("The yellow sphere will be flown through, and the blue sphere is what the camera is looking at. If the blue sphere is not shown then the camera will look along the path of the flythrough.\n\nClick on POI in scene then...\nCTRL + Keys - Move selected POI.\nSHIFT+CTRL + Keys - Move selected LookAt.\nSee PegasusDefaults for Keys.", m_wrapStyle); GUILayout.EndVertical(); EditorGUI.BeginChangeCheck(); PegasusConstants.PoiType poiType = m_poi.m_poiType; GUILayout.Space(5); GUILayout.BeginVertical("Auto Roll", m_boxStyle); GUILayout.Space(20); bool autoRoll = EditorGUILayout.Toggle(GetLabel("Auto Roll"), m_poi.m_autoRollOn); GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical("Target Lookat", m_boxStyle); GUILayout.Space(20); PegasusConstants.LookatType lookatType = (PegasusConstants.LookatType)EditorGUILayout.EnumPopup(GetLabel("Target"), m_poi.m_lookatType); float lookAtAngle = m_poi.m_lookAtAngle; float lookAtDistance = m_poi.m_lookAtDistance; float lookAtHeight = m_poi.m_lookAtHeight; if (lookatType == PegasusConstants.LookatType.Path) { GUI.enabled = false; } lookAtAngle = EditorGUILayout.Slider(GetLabel(" Angle"), m_poi.m_lookAtAngle, 0f, 359.9f); lookAtDistance = EditorGUILayout.FloatField(GetLabel(" Distance"), m_poi.m_lookAtDistance); lookAtHeight = EditorGUILayout.FloatField(GetLabel(" Height"), m_poi.m_lookAtHeight); GUI.enabled = true; GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical("Target Speed", m_boxStyle); GUILayout.Space(20); PegasusConstants.SpeedType speedType = (PegasusConstants.SpeedType)EditorGUILayout.EnumPopup(GetLabel("Type"), m_poi.m_startSpeedType); float startSpeed = m_poi.m_startSpeed; if (speedType != PegasusConstants.SpeedType.Custom) { EditorGUILayout.LabelField(GetLabel("Speed"), GetLabel(string.Format("{0:0.00} m/sec", startSpeed))); } else { startSpeed = EditorGUILayout.FloatField(GetLabel("Speed"), startSpeed); if (startSpeed < 0.0001f) { startSpeed = 0.0001f; } } GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical("Height Constraint", m_boxStyle); GUILayout.Space(20); PegasusConstants.PoiHeightCheckType heightCheckType = (PegasusConstants.PoiHeightCheckType)EditorGUILayout.EnumPopup(GetLabel("Min Height From"), m_poi.m_heightCheckType); GUILayout.Space(3); GUILayout.EndVertical(); GUILayout.Space(5); GUILayout.BeginVertical("Statistics", m_boxStyle); GUILayout.Space(20); EditorGUILayout.LabelField("Distance", string.Format("{0:0.00m}", m_poi.m_segmentDistance)); EditorGUILayout.LabelField("Start Time", string.Format("{0}:{1:00}.{2:000}", m_poi.m_segmentStartTime.Minutes, m_poi.m_segmentStartTime.Seconds, m_poi.m_segmentStartTime.Milliseconds)); EditorGUILayout.LabelField("Segment Time", string.Format("{0}:{1:00}.{2:000}", m_poi.m_segmentDuration.Minutes, m_poi.m_segmentDuration.Seconds, m_poi.m_segmentDuration.Milliseconds)); EditorGUILayout.LabelField("Total Time", string.Format("{0}:{1:00}.{2:000}", m_poi.m_manager.m_totalDuration.Minutes, m_poi.m_manager.m_totalDuration.Seconds, m_poi.m_manager.m_totalDuration.Milliseconds)); GUILayout.Space(3); GUILayout.EndVertical(); PegasusConstants.EasingType velocityEasing = m_poi.m_velocityEasingType; PegasusConstants.EasingType rotationEasing = m_poi.m_rotationEasingType; PegasusConstants.EasingType positionEasing = m_poi.m_positionEasingType; GUILayout.Space(5); GUILayout.BeginVertical("Utilities", m_boxStyle); GUILayout.Space(20); if (GUILayout.Button(GetLabel("Select Manager"))) { if (Selection.activeTransform != null) { Selection.activeTransform = m_poi.m_manager.transform; } } if (GUILayout.Button(GetLabel("Select First POI"))) { PegasusPoi poi = m_poi.m_manager.GetFirstPOI(); if (poi != null) { if (SceneView.lastActiveSceneView != null) { SceneView.lastActiveSceneView.pivot = poi.transform.position; } if (Selection.activeTransform != null) { Selection.activeTransform = poi.transform; } poi.m_manager.SelectPoi(poi); poi.m_manager.MoveTargetToPoi(poi); } } GUILayout.BeginHorizontal(); if (GUILayout.Button(GetLabel("Select Previous POI"))) { PegasusPoi poi = m_poi.m_manager.GetPrevPOI(m_poi); if (poi != null) { if (Selection.activeTransform != null) { Selection.activeTransform = poi.transform; } if (SceneView.lastActiveSceneView != null) { SceneView.lastActiveSceneView.pivot = poi.transform.position; } poi.m_manager.SelectPoi(poi); poi.m_manager.MoveTargetToPoi(poi); } } if (GUILayout.Button(GetLabel("Select Next POI"))) { PegasusPoi poi = m_poi.m_manager.GetNextPOI(m_poi); if (poi != null) { if (Selection.activeTransform != null) { Selection.activeTransform = poi.transform; } if (SceneView.lastActiveSceneView != null) { SceneView.lastActiveSceneView.pivot = poi.transform.position; } poi.m_manager.SelectPoi(poi); poi.m_manager.MoveTargetToPoi(poi); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button(GetLabel("Add POI Before"))) { PegasusPoi poi = m_poi.m_manager.AddPoiBefore(m_poi); if (poi != null) { if (Selection.activeTransform != null) { Selection.activeTransform = poi.transform; } if (SceneView.lastActiveSceneView != null) { SceneView.lastActiveSceneView.pivot = poi.transform.position; } poi.m_manager.SelectPoi(poi); poi.m_manager.MoveTargetToPoi(poi); } } if (GUILayout.Button(GetLabel("Add POI After"))) { PegasusPoi poi = m_poi.m_manager.AddPoiAfter(m_poi); if (poi != null) { if (Selection.activeTransform != null) { Selection.activeTransform = poi.transform; } if (SceneView.lastActiveSceneView != null) { SceneView.lastActiveSceneView.pivot = poi.transform.position; } poi.m_manager.SelectPoi(poi); poi.m_manager.MoveTargetToPoi(poi); } } GUILayout.EndHorizontal(); GUILayout.Space(3); GUILayout.EndVertical(); //Check for changes, make undo record, make changes and let editor know we are dirty if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_poi, "Made changes"); m_poi.m_poiType = poiType; m_poi.m_autoRollOn = autoRoll; if (m_poi.m_lookatType != lookatType && lookatType == PegasusConstants.LookatType.Target) { lookAtHeight = 0f; lookAtDistance = 5f; } m_poi.m_lookatType = lookatType; if (heightCheckType != m_poi.m_heightCheckType) { m_poi.m_heightCheckType = heightCheckType; //m_poi.m_manager.UpdateSegmentWithDependencies(m_poi); } if (!PegasusPoi.ApproximatelyEqual(m_poi.m_lookAtAngle, lookAtAngle)) { m_poi.m_lookAtAngle = lookAtAngle; m_poi.m_lookatLocation = m_poi.transform.position + (m_poi.transform.localRotation * Quaternion.AngleAxis(m_poi.m_lookAtAngle, Vector3.up)) * new Vector3(0f, 0f, -m_poi.m_lookAtDistance); m_poi.m_lookatLocation = m_poi.m_manager.GetLowestLookatPosition(m_poi.m_lookatLocation, m_poi.m_heightCheckType); m_poi.m_lookatLocation.y += m_poi.m_lookAtHeight; } else if (!PegasusPoi.ApproximatelyEqual(m_poi.m_lookAtDistance, lookAtDistance)) { m_poi.m_lookAtDistance = lookAtDistance; m_poi.m_lookatLocation = m_poi.transform.position + (m_poi.transform.localRotation * Quaternion.AngleAxis(m_poi.m_lookAtAngle, Vector3.up)) * new Vector3(0f, 0f, -m_poi.m_lookAtDistance); m_poi.m_lookatLocation = m_poi.m_manager.GetLowestLookatPosition(m_poi.m_lookatLocation, m_poi.m_heightCheckType); m_poi.m_lookatLocation.y += m_poi.m_lookAtHeight; } else if (!PegasusPoi.ApproximatelyEqual(m_poi.m_lookAtHeight, lookAtHeight)) { m_poi.m_lookAtHeight = lookAtHeight; m_poi.m_lookatLocation = m_poi.transform.position + (m_poi.transform.localRotation * Quaternion.AngleAxis(m_poi.m_lookAtAngle, Vector3.up)) * new Vector3(0f, 0f, -m_poi.m_lookAtDistance); m_poi.m_lookatLocation = m_poi.m_manager.GetLowestLookatPosition(m_poi.m_lookatLocation, m_poi.m_heightCheckType); m_poi.m_lookatLocation.y += m_poi.m_lookAtHeight; } if (m_poi.m_startSpeedType != speedType) { m_poi.m_startSpeedType = speedType; m_poi.m_startSpeed = m_poi.GetStartSpeed(speedType); } else { if (!PegasusPoi.ApproximatelyEqual(m_poi.m_startSpeed, startSpeed)) { m_poi.m_startSpeedType = PegasusConstants.SpeedType.Custom; m_poi.m_startSpeed = startSpeed; } } m_poi.m_velocityEasingType = velocityEasing; m_poi.m_rotationEasingType = rotationEasing; m_poi.m_positionEasingType = positionEasing; //Update the segment m_poi.m_manager.UpdateSegmentWithDependencies(m_poi); //Mark it as dirty EditorUtility.SetDirty(m_poi); } }