Example #1
0
        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;
                }
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
		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;
				}
			}
		}
Example #5
0
        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();
                }
            }
        }