Beispiel #1
0
 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);
     //}
 }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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();
            }
        }