public override void AddViewPort(IViewPort viewport) { viewport.SetMaxSize(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height); XnaCameraMan man = new XnaCameraMan(new Camera(_worldBounds),0f,(float)(Math.PI) + (((float)Math.PI) / 20f) + (((float)Math.PI) / 20f),10f); man.SelectedBoat = 0; man.DrawSatelliteImagery = _lakeTextureAvailible; viewport.CameraMan = man; //List<string> boatNames = new List<string>(); //List<string> boatNumbers = new List<string>(); //List<System.Drawing.Color> boatColors = new List<System.Drawing.Color>(); //foreach (AmphibianSoftware.VisualSail.Library.Boat b in boats) //{ // boatNames.Add(b.Name); // boatNumbers.Add(b.Number); // boatColors.Add(b.Color); //} /*Dictionary<ReplayBoat, int> offsets = */ viewport.SetBoatList(this.Replay.Boats); viewport.Shutdown = new ShutdownViewPort(this.RemoveViewPort); lock (_viewports) { _viewports.Add(viewport, man); } //lock (_viewportOffsets) //{ // _viewportOffsets.Add(viewport, offsets); //} }
public void DrawHUD(ReplayBoat boat, GraphicsDevice device, XnaCameraMan cameraMan, DateTime time, float coordinateDivisor) { device.RenderState.DepthBufferEnable = false; Camera camera = cameraMan.Camera; float angle = boat.Angle; if (boat.Direction == ReplayBoat.BoatDirection.Backwards) { angle = AngleHelper.NormalizeAngle(boat.Angle + MathHelper.Pi); } camera.ConfigureBasicEffect(_hudEffect); _hudEffect.World = Matrix.Identity; _hudEffect.Begin(); foreach (EffectPass pass in _hudEffect.CurrentTechnique.Passes) { pass.Begin(); if (cameraMan.DrawPastPath || cameraMan.DrawFuturePath) { DateTime startTime = boat.SensorReadings[boat.CurrentSensorReadingIndex].datetime; DateTime endTime = boat.SensorReadings[boat.CurrentSensorReadingIndex].datetime; int startIndex = boat.CurrentSensorReadingIndex; int endIndex = boat.CurrentSensorReadingIndex; if (cameraMan.DrawPastPath) { startTime = startTime - new TimeSpan(0, 0, cameraMan.DrawPathLength); while (startIndex > 0 && boat.SensorReadings[startIndex].datetime > startTime) { startIndex--; } } if (cameraMan.DrawFuturePath) { endTime = endTime + new TimeSpan(0, 0, cameraMan.DrawPathLength); while (endIndex < boat.SensorReadings.Count && boat.SensorReadings[endIndex].datetime < endTime) { endIndex++; } } if (_boatDataRowsCurveMap[boat].ContainsKey(startIndex) && _boatDataRowsCurveMap[boat].ContainsKey(endIndex)) { int curveStart = _boatDataRowsCurveMap[boat][startIndex] * 2; int curveEnd = _boatDataRowsCurveMap[boat][endIndex] * 2; int curveLength = (curveEnd - curveStart) / 2; int curveMidPoint = _boatDataRowsCurveMap[boat][boat.CurrentSensorReadingIndex] * 2; for (int i = curveStart; i < curveEnd; i++) { float distance; if (i < boat.CurrentSensorReadingIndex) { distance = (float)Math.Abs(i - curveMidPoint) / (float)Math.Abs(curveStart - curveMidPoint); } else if (i > boat.CurrentSensorReadingIndex) { distance = (float)Math.Abs(i - curveMidPoint) / (float)Math.Abs(curveEnd - curveMidPoint); } else { distance = 1f; } float alpha = 1 - distance; Color c = new Color(new Vector4(boat.Color.R, boat.Color.G, boat.Color.B, alpha)); _boatPathCurve[boat][i].Color = c; } device.VertexDeclaration = VertexDeclarationHelper.Get(typeof(VertexPositionColor)); device.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleStrip, _boatPathCurve[boat], curveStart, curveLength * 2); } } pass.End(); } _hudEffect.End(); if (boat.CurrentRacingStatus != ReplayBoat.RacingStatus.Finished && cameraMan.DrawAngleToMark) { //float angleToMark = AngleHelper.FindAngle(CurrentMarkLocation.ToWorld(), ProjectedPoint.ToWorld()); DrawInstrument(device, InstrumentDrawing.OutwardArrow, Microsoft.Xna.Framework.Graphics.Color.Orange, ProjectedPointToWorld(boat.ProjectedPoint), boat.Angle, 0.5f, 0.5f); } if (cameraMan.DrawAngleToWind) { DrawInstrument(device, InstrumentDrawing.InwardArrow, Microsoft.Xna.Framework.Graphics.Color.Green, ProjectedPointToWorld(boat.ProjectedPoint), Replay.WindAngle + MathHelper.Pi, 0.5f, 0.5f); } if (cameraMan.DrawAbsoluteAngleReference || cameraMan.DrawRelativeAngleReference) { int line = 0; for (float a = 0f; a < MathHelper.TwoPi; a = a + (MathHelper.PiOver4 / 2.0f)) { float length = 0.1f; if (line == 0) length = 0.4f; else if (line % 4 == 0) length = 0.3f; else if (line % 2 == 0) length = 0.2f; if (cameraMan.DrawRelativeAngleReference) { InstrumentDrawing id = InstrumentDrawing.Line; if (line == 0) { id = InstrumentDrawing.OutwardArrow; } DrawInstrument(device, id, Microsoft.Xna.Framework.Graphics.Color.Gray, ProjectedPointToWorld(boat.ProjectedPoint), a + boat.Angle, 1.0f - length, length); } if (cameraMan.DrawAbsoluteAngleReference) { DrawInstrument(device, InstrumentDrawing.Line, Microsoft.Xna.Framework.Graphics.Color.LightGray, ProjectedPointToWorld(boat.ProjectedPoint), a, 1.0f, length); } line++; } } device.RenderState.DepthBufferEnable = true; }
public void DrawBoat(ReplayBoat boat, GraphicsDevice device, XnaCameraMan cameraMan, DateTime time) { if (boat.ProjectedPoint != null) { Camera camera = cameraMan.Camera; float angle = boat.Angle; if (boat.Direction == ReplayBoat.BoatDirection.Backwards) { angle = AngleHelper.NormalizeAngle(boat.Angle + MathHelper.Pi); } foreach (ModelMesh mesh in _boatModel.Meshes) { foreach (BasicEffect mfx in mesh.Effects) { mfx.EnableDefaultLighting(); mfx.AmbientLightColor = DrawingToXnaColor(boat.Color).ToVector3(); mfx.World = Matrix.CreateScale(0.02f) * Matrix.CreateTranslation(new Vector3(0f, 0f, -0.25f)) * Matrix.CreateRotationZ(MathHelper.ToRadians(boat.Heel)) * Matrix.CreateRotationY(MathHelper.ToRadians(90.0f)) * Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(ProjectedPointToWorld(boat.ProjectedPoint)); camera.ConfigureBasicEffect(mfx); } mesh.Draw(); } camera.ConfigureBasicEffect(_sailEffect); _sailEffect.World = Matrix.CreateScale(0.1f) * Matrix.CreateRotationY(boat.BoomAngle) * Matrix.CreateTranslation(new Vector3(0f, 0f, 0.25f)) * Matrix.CreateTranslation(new Vector3(0, 0, -0.36f)) * Matrix.CreateRotationZ(MathHelper.ToRadians(-boat.Heel)) * Matrix.CreateRotationY(MathHelper.ToRadians(270.0f) + angle) * Matrix.CreateTranslation(ProjectedPointToWorld(boat.ProjectedPoint)); _sailEffect.Begin(); foreach (EffectPass pass in _sailEffect.CurrentTechnique.Passes) { pass.Begin(); _boatMains[boat].Draw(device, boat.SailCurve, 0); pass.End(); } _sailEffect.End(); camera.ConfigureBasicEffect(_sailEffect); _sailEffect.World = Matrix.CreateScale(0.1f) /** Matrix.CreateRotationY(currentBoomAngle)*/ * Matrix.CreateTranslation(new Vector3(0f, 0f, 0.25f)) * Matrix.CreateTranslation(new Vector3(0, 0, -0.36f)) * Matrix.CreateRotationZ(MathHelper.ToRadians(-boat.Heel)) * Matrix.CreateRotationY(MathHelper.ToRadians(270.0f) + angle) * Matrix.CreateTranslation(ProjectedPointToWorld(boat.ProjectedPoint)); _sailEffect.Begin(); foreach (EffectPass pass in _sailEffect.CurrentTechnique.Passes) { pass.Begin(); _boatJibs[boat].Draw(device, boat.SailCurve, (boat.BoomAngle * 80f) * 0.02f); pass.End(); } _sailEffect.End(); } }