void Mouse_ButtonDown(object sender, OpenTK.Input.MouseButtonEventArgs e) { if (e.Button == OpenTK.Input.MouseButton.Left) { switch (CurrentState) { case GameState.Playing: break; case GameState.RailTrackEdition: if (RailTrack.CurrentSegment == null) { RailTrack.CurrentSegment = new TrackSegment(terrain.SelCenterPos); RailTrack.TrackStarts.Add(RailTrack.CurrentSegment); } else { TrackSegment newTS = new TrackSegment(RailTrack.CurrentSegment.EndPos, RailTrack.vEnd); RailTrack.CurrentSegment.NextSegment.Add(newTS); newTS.PreviousSegment.Add(RailTrack.CurrentSegment); RailTrack.CurrentSegment = newTS; } RailTrack.UpdateTrackMesh(); break; } } }
void buildSegment(TrackSegment tPrevious, TrackSegment tNext) { if (tPrevious != null) { float segLenght = (tPrevious.EndPos - tPrevious.StartPos).Length; float controlPointDist = segLenght * 0.49f; Vector3 secondCtrPoint; if (tNext == null) { if (tPrevious == CurrentSegment) { secondCtrPoint = tPrevious.EndPos - vEnd * controlPointDist; } else { restartIdx.Add(tp.Count); return; } } else { secondCtrPoint = tPrevious.EndPos - tNext.vStart * controlPointDist; } Vector3[] p = new Vector3[] { tPrevious.StartPos, tPrevious.StartPos + tPrevious.vStart * controlPointDist, secondCtrPoint, tPrevious.EndPos }; for (int j = 0; j < resolution - 1; j++) { float t = (float)j / (float)(resolution - 1); tp.Add(Path.CalculateBezierPoint(t, p [0], p [1], p [2], p [3])); } if (tNext == null) { tp.Add(tPrevious.EndPos); return; } } if (tNext.NextSegment.Count == 0) { buildSegment(tNext, null); return; } foreach (TrackSegment ts in tNext.NextSegment) { buildSegment(tNext, ts); } }
void buildSegment(TrackSegment tPrevious, TrackSegment tNext) { if (tPrevious != null) { float segLenght = (tPrevious.EndPos - tPrevious.StartPos).Length; float controlPointDist = segLenght * 0.49f; Vector3 secondCtrPoint; if (tNext == null) { if (tPrevious == CurrentSegment) secondCtrPoint = tPrevious.EndPos - vEnd * controlPointDist; else { restartIdx.Add (tp.Count); return; } }else secondCtrPoint = tPrevious.EndPos - tNext.vStart * controlPointDist; Vector3[] p = new Vector3[] { tPrevious.StartPos, tPrevious.StartPos + tPrevious.vStart * controlPointDist, secondCtrPoint, tPrevious.EndPos }; for (int j = 0; j < resolution - 1; j++) { float t = (float)j / (float)(resolution - 1); tp.Add (Path.CalculateBezierPoint (t, p [0], p [1], p [2], p [3])); } if (tNext == null) { tp.Add (tPrevious.EndPos); return; } } if (tNext.NextSegment.Count == 0) { buildSegment(tNext, null); return; } foreach (TrackSegment ts in tNext.NextSegment ) { buildSegment (tNext, ts); } }
void Mouse_ButtonDown (object sender, OpenTK.Input.MouseButtonEventArgs e) { if (e.Button == OpenTK.Input.MouseButton.Left) { switch (CurrentState) { case GameState.Playing: break; case GameState.RailTrackEdition: if (RailTrack.CurrentSegment == null) { RailTrack.CurrentSegment = new TrackSegment (terrain.SelCenterPos); RailTrack.TrackStarts.Add (RailTrack.CurrentSegment); } else { TrackSegment newTS = new TrackSegment (RailTrack.CurrentSegment.EndPos, RailTrack.vEnd); RailTrack.CurrentSegment.NextSegment.Add (newTS); newTS.PreviousSegment.Add (RailTrack.CurrentSegment); RailTrack.CurrentSegment = newTS; } RailTrack.UpdateTrackMesh (); break; } } }
void Mouse_Move(object sender, OpenTK.Input.MouseMoveEventArgs e) { if (e.XDelta != 0 || e.YDelta != 0) { terrain.MouseMove(e); NotifyValueChanged("MousePos", MousePos); //selection texture has clientRect size and 4 bytes per pixel, so switch (CurrentState) { case GameState.Playing: break; case GameState.RailTrackEdition: TrackSegment ts = RailTrack.CurrentSegment; if (ts != null) { if (terrain.SelCenterPos == ts.StartPos) { return; } if (e.Mouse.LeftButton == OpenTK.Input.ButtonState.Pressed) { ts.EndPos = terrain.SelCenterPos; ts.vStart = Vector3.Normalize(ts.EndPos - ts.StartPos); RailTrack.vEnd = ts.vStart; } else { ts.EndPos = terrain.SelCenterPos; Vector3 vDir = Vector3.Normalize(ts.EndPos - ts.StartPos); float dot = Vector3.Dot(ts.vStart, vDir); RailTrack.vEnd = -(ts.vStart - 2 * dot * vDir); } RailTrack.UpdateTrackMesh(); } break; } if (e.Mouse.MiddleButton == OpenTK.Input.ButtonState.Pressed) { if (Keyboard [OpenTK.Input.Key.ShiftLeft]) { Vector3 v = new Vector3( Vector2.Normalize(vLook.Xy.PerpendicularLeft)); Vector3 tmp = Vector3.Transform(vLook, Matrix4.CreateRotationZ(-e.XDelta * RotationSpeed) * Matrix4.CreateFromAxisAngle(v, -e.YDelta * RotationSpeed)); tmp.Normalize(); if (tmp.Z <= 0f) { return; } vLook = tmp; } else { Vector3 vH = new Vector3(Vector2.Normalize(vLook.Xy.PerpendicularLeft) * e.XDelta * MoveSpeed * eyeDist); Vector3 vV = new Vector3(Vector2.Normalize(vLook.Xy) * e.YDelta * MoveSpeed * eyeDist); vEyeTarget -= vH + vV; } UpdateViewMatrix(); } } }