/// <summary> /// Get the poi start speed based on the speed type /// </summary> /// <param name="speedType"></param> /// <returns></returns> public float GetStartSpeed(PegasusConstants.SpeedType speedType) { switch (speedType) { case PegasusConstants.SpeedType.ReallySlow: return(PegasusConstants.SpeedReallySlow); case PegasusConstants.SpeedType.Slow: return(PegasusConstants.SpeedSlow); case PegasusConstants.SpeedType.Medium: return(PegasusConstants.SpeedMedium); case PegasusConstants.SpeedType.Fast: return(PegasusConstants.SpeedFast); case PegasusConstants.SpeedType.ReallyFast: return(PegasusConstants.SpeedReallyFast); } return(m_startSpeed); }
/// <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); } }