public bool PlayCutscene(string cutsceneName) { MySandboxGame.Log.WriteLineAndConsole("Cutscene start: " + cutsceneName); if (m_cutsceneLibrary.ContainsKey(cutsceneName)) { if (IsCutsceneRunning) { CutsceneEnd(false); } m_currentCutscene = m_cutsceneLibrary[cutsceneName]; m_currentNode = null; m_currentNodeIndex = 0; m_currentTime = 0; m_nodeActivated = false; m_lookTarget = null; m_attachedPositionTo = null; m_attachedRotationTo = null; m_rotateTarget = null; m_moveTarget = null; m_currentFOV = MathHelper.Clamp(m_currentCutscene.StartingFOV, MINIMUM_FOV, MAXIMUM_FOV); MyGuiScreenGamePlay.DisableInput = true; if (MyCubeBuilder.Static.IsActivated) { MyCubeBuilder.Static.Deactivate(); } MyHud.CutsceneHud = true; m_overlayEnabled = MyHudCameraOverlay.Enabled; MyHudCameraOverlay.Enabled = false; MatrixD startMatrix = MatrixD.Identity; MyEntity entity = m_currentCutscene.StartEntity.Length > 0 ? MyVisualScriptLogicProvider.GetEntityByName(m_currentCutscene.StartEntity) : null; if (entity != null) { startMatrix = entity.WorldMatrix; } if (m_currentCutscene.StartLookAt.Length > 0 && !m_currentCutscene.StartLookAt.Equals(m_currentCutscene.StartEntity)) { entity = MyVisualScriptLogicProvider.GetEntityByName(m_currentCutscene.StartLookAt); if (entity != null) { startMatrix = MatrixD.CreateLookAtInverse(startMatrix.Translation, entity.PositionComp.GetPosition(), startMatrix.Up); } } m_nodeStartMatrix = startMatrix; m_currentCameraMatrix = startMatrix; m_originalCameraController = MySession.Static.CameraController; m_cameraEntity.WorldMatrix = startMatrix; MySession.Static.SetCameraController(MyCameraControllerEnum.Entity, m_cameraEntity); return(true); } else { Debug.Fail("There is no cutscene named \"" + cutsceneName + "\"."); CutsceneEnd(); return(false); } }
public override void UpdateBeforeSimulation() { if (IsCutsceneRunning) { if (MySession.Static.CameraController != m_cameraEntity) { m_originalCameraController = MySession.Static.CameraController; MySession.Static.SetCameraController(MyCameraControllerEnum.Entity, m_cameraEntity); } if (m_currentCutscene.SequenceNodes != null && m_currentCutscene.SequenceNodes.Length > m_currentNodeIndex) { m_currentNode = m_currentCutscene.SequenceNodes[m_currentNodeIndex]; CutsceneUpdate(); } else { //cutscene done if (m_currentCutscene.NextCutscene != null && m_currentCutscene.NextCutscene.Length > 0) { PlayCutscene(m_currentCutscene.NextCutscene); } else { CutsceneEnd(); } } m_cameraEntity.WorldMatrix = m_currentCameraMatrix; /* * DEBUG curve * if (false && m_waypoints.Count > 2) * { * int i = 0; * for (float timeRatio = 0f; timeRatio <= 1f; timeRatio += 0.01f) * { * float segmentTime = 1f / (m_waypoints.Count - 1); * int segment = (int)Math.Floor(timeRatio / segmentTime); * float segmentRatio = (timeRatio - segment * segmentTime) / segmentTime; * Vector3D pos = Vector3D.Zero; * if (segment == 0) * { * pos = MathHelper.CalculateBezierPoint(segmentRatio, m_waypoints[segment], m_waypoints[segment], m_waypoints[segment + 1] - (m_waypoints[segment + 2] - m_waypoints[segment]) / 4, m_waypoints[segment + 1]); * } * else if (segment >= m_waypoints.Count - 2) * { * pos = MathHelper.CalculateBezierPoint(segmentRatio, m_waypoints[segment], m_waypoints[segment] + (m_waypoints[segment + 1] - m_waypoints[segment - 1]) / 4, m_waypoints[segment + 1], m_waypoints[segment + 1]); * } * else * { * pos = MathHelper.CalculateBezierPoint(segmentRatio, m_waypoints[segment], m_waypoints[segment] + (m_waypoints[segment + 1] - m_waypoints[segment - 1]) / 4, m_waypoints[segment+1] - (m_waypoints[segment + 2] - m_waypoints[segment]) / 4, m_waypoints[segment + 1]); * } * //VRageRender.MyRenderProxy.DebugDrawSphere((Vector3)pos, 0.2f, Color.Aquamarine, 1f, true); * VRageRender.MyRenderProxy.DebugDrawText3D(pos, i.ToString(), Color.GreenYellow, 1, true); * i++; * } * foreach(var w in m_waypoints) * VRageRender.MyRenderProxy.DebugDrawSphere(w, 1.5f, Color.Orange, 1f, true); * }*/ } }
void onClick_AddNodeButton(MyGuiControlButton sender) { CutsceneSequenceNode[] newNodes = new CutsceneSequenceNode[] { new CutsceneSequenceNode() }; if (m_selectedCutscene.SequenceNodes != null) { m_selectedCutscene.SequenceNodes = m_selectedCutscene.SequenceNodes.Union(newNodes).ToArray(); } else { m_selectedCutscene.SequenceNodes = newNodes; } }
void m_comboNodes_ItemSelected() { m_selectedCutsceneNode = m_selectedCutscene.SequenceNodes[m_comboNodes.GetSelectedKey()]; m_nodeTimeSlider.Value = m_selectedCutsceneNode.Time; m_comboWaypoints.ClearItems(); if (m_selectedCutsceneNode.Waypoints != null) { foreach (var waypoint in m_selectedCutsceneNode.Waypoints) { m_comboWaypoints.AddItem(waypoint.Name.GetHashCode(), waypoint.Name); } if (m_comboWaypoints.GetItemsCount() > 0) { m_comboWaypoints.SelectItemByIndex(0); } } }