Project() публичный Метод

Projects a Vector3 from world space into screen space.
public Project ( System.Vector3 source, System.Matrix projection, System.Matrix view, System.Matrix world ) : System.Vector3
source System.Vector3 The to project.
projection System.Matrix The projection .
view System.Matrix The view .
world System.Matrix The world .
Результат System.Vector3
Пример #1
0
 public Butterfly(Vector3 Position, float rotation, Viewport ViewPort, Matrix View, Matrix Projection, ButterflyColors color)
 {
     world = Matrix.CreateFromAxisAngle(Vector3.Right, -1 * (float)(Math.PI / 2f)) * Matrix.CreateTranslation(Position);
     Vector3 ScreenProjection = ViewPort.Project(Position, Projection, View, Matrix.CreateScale(0.1f) * Matrix.CreateFromAxisAngle(Vector3.Right, -1 * (float)(Math.PI / 2f)) * Matrix.CreateTranslation(Position));
     hitbox = new Hitbox(new Rectangle((int)(ScreenProjection.X - padX), (int)(ScreenProjection.Y - padY), 2 * padX, 2 * padY));
     viewPort = ViewPort;
     projection = Projection;
     view = View;
     hitbox.Entered += new Hitbox.EnteredEventHandler(hitbox_Entered);
     hitbox.Exited += new Hitbox.ExitedEventHandler(hitbox_Exited);
     timeSelected = new Stopwatch();
     myColor = color;
     hidden = false;
     position = Position;
     startPosition = Position * 20;
     msOffset = rand.Next(0, 500);
     wanderDirection = new Vector2();
     tether = Vector2.Transform(new Vector2(Position.X, Position.Y), Matrix.CreateScale(0.1f));
 }
Пример #2
0
        /// <summary>
        /// Draws the background screen.
        /// </summary>
        public override void Draw(GameTime gameTime)
        {
            SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
            Viewport viewport = ScreenManager.Viewport;
            Rectangle fullscreen = new Rectangle(0, 0, viewport.Width, viewport.Height);

            Vector3 horizV;
            Vector3 horiz;
            float horizHeight;

            if (selectionMode == 1)
            {
                for (int i = 0; i < 3; i++)
                {
                    if (!cupTracks[i].HasLoaded) continue;

                    ScreenManager.GraphicsDevice.SetRenderTarget(cupTrackRT[i]);

                    ScreenManager.GraphicsDevice.Clear(cupTracks[i].SkyColor);

                    int nextpos = (trackPos[i] + 1);
                    if (nextpos >= cupTracks[i].TrackSegments.Count) nextpos = nextpos - cupTracks[i].TrackSegments.Count;
                    Camera.projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (193f/108f), 0.001f, 100f);
                    Camera.Position = cupTracks[i].TrackSegments[trackPos[i]].Position + new Vector3(0, 0.5f, 0);
                    Camera.LookAt(cupTracks[i].TrackSegments[nextpos].Position + new Vector3(0, 0.5f, 0), 0f);
                    drawEffect.View = Camera.viewMatrix;
                    drawEffect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 16f/9f, 0.001f, 100f);
                    drawAlphaEffect.View = Camera.viewMatrix;
                    drawAlphaEffect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 16f / 9f, 0.001f, 100f);

                    cupTrackPM[i].Update(gameTime, new Vector2(((1280 * 4) / MathHelper.TwoPi) * Camera.Yaw, 0f));
                    Viewport testVP = new Viewport(0, 0, 193, 108);
                    horizV = new Vector3(0, 0f, -100);
                    horiz = testVP.Project(horizV, Camera.projectionMatrix, Camera.ViewMatrixUpDownOnly(), Camera.worldMatrix);
                    horizHeight = horiz.Y - (25f * cupTrackPM[i].Scale);
                    ScreenManager.SpriteBatch.Begin();
                    ScreenManager.SpriteBatch.Draw(texList["blank"], new Rectangle(cupTrackRT[i].Width / 2, (int)(horizHeight), cupTrackRT[i].Width * 2, (cupTrackRT[i].Height - (int)(horizHeight)) + 400), null, cupTracks[i].GroundColor, 0f, new Vector2(0.5f, 0), SpriteEffects.None, 1);
                    ScreenManager.SpriteBatch.End();
                    ScreenManager.SpriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, Matrix.CreateScale(new Vector3(cupTrackPM[i].Scale, cupTrackPM[i].Scale, 1f)) * Matrix.CreateTranslation(new Vector3(cupTrackRT[i].Width / 2, horizHeight, 0f)));
                    cupTrackPM[i].Draw(ScreenManager.SpriteBatch);
                    ScreenManager.SpriteBatch.End();

                    ScreenManager.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
                    ScreenManager.GraphicsDevice.RasterizerState = RasterizerState.CullNone;
                    ScreenManager.GraphicsDevice.BlendState = BlendState.Opaque;
                    ScreenManager.GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;

                    cupTracks[i].DrawBatches(ScreenManager.GraphicsDevice, drawEffect, drawAlphaEffect);

            #if !WINDOWS_PHONE
                    ScreenManager.GraphicsDevice.SetRenderTarget(null);
            #else
                    ScreenManager.GraphicsDevice.SetRenderTarget(Psuedo3DRacer.renderTarget);

            #endif
                }

            }

            Camera.projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, ScreenManager.Viewport.AspectRatio, 0.001f, 100f);
            Camera.Position = new Vector3(3f, 0.2f, 16f);
            Camera.LookAt(new Vector3(0f, 0.5f, 25f) + lookAtOffset, 0f);

            drawEffect.View = Camera.viewMatrix;
            drawEffect.Projection = Camera.projectionMatrix;
            drawAlphaEffect.View = Camera.viewMatrix;
            drawAlphaEffect.Projection = Camera.projectionMatrix;

            ScreenManager.GraphicsDevice.Clear(Track.SkyColor);
            horizV = new Vector3(0, 0f, -200);
            horiz = ScreenManager.Viewport.Project(horizV, Camera.projectionMatrix, Camera.ViewMatrixUpDownOnly(), Camera.worldMatrix);
            horizHeight = horiz.Y - (25 * Parallax.Scale);
            ScreenManager.SpriteBatch.Begin();
            ScreenManager.SpriteBatch.Draw(texList["blank"], new Rectangle(ScreenManager.Viewport.Width / 2, (int)horizHeight, ScreenManager.Viewport.Width * 2, (ScreenManager.Viewport.Height - (int)horizHeight) + 400), null, Track.GroundColor, 0f, new Vector2(0.5f, 0), SpriteEffects.None, 1);
            ScreenManager.SpriteBatch.End();
            ScreenManager.SpriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, Matrix.CreateScale(new Vector3(Parallax.Scale, Parallax.Scale,1f)) * Matrix.CreateTranslation(new Vector3(ScreenManager.Viewport.Width / 2, horizHeight, 0f)));
            Parallax.Draw(ScreenManager.SpriteBatch);
            ScreenManager.SpriteBatch.End();

            ScreenManager.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
            ScreenManager.GraphicsDevice.RasterizerState = RasterizerState.CullNone;
            ScreenManager.GraphicsDevice.BlendState = BlendState.Opaque;
            ScreenManager.GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;

            if(Track.HasLoaded) Track.DrawBatches(ScreenManager.GraphicsDevice, drawEffect, drawAlphaEffect);

            ScreenManager.FadeBackBufferToBlack(0.5f);

            spriteBatch.Begin();
            spriteBatch.Draw(texList["banner-top"], bannerTop1Pos, null, Color.White, 0f, new Vector2(texList["banner-top"].Width / 2, 0f), 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["banner-bottom"], bannerBottom1Pos, null, Color.White, 0f, new Vector2(texList["banner-bottom"].Width / 2, 0f), 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["banner-top"], bannerTop2Pos, null, Color.White, 0f, new Vector2(texList["banner-top"].Width / 2, 0f), 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["banner-bottom"], bannerBottom2Pos, null, Color.White, 0f, new Vector2(texList["banner-bottom"].Width / 2, 0f), 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["paintcar"], bannerBottom1Pos - new Vector2(0, ((bannerBottom1Pos.Y - (bannerTop1Pos.Y + texList["banner-top"].Height)) / 2) - 1f), null, Color.White * paintCarAlpha, 0f, new Vector2(texList["paintcar"].Width, texList["paintcar"].Height)/2, 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["selectcup"], bannerBottom2Pos - new Vector2(0, ((bannerBottom2Pos.Y - (bannerTop2Pos.Y + texList["banner-top"].Height)) / 2) - 1f), null, Color.White * selectCupAlpha, 0f, new Vector2(texList["selectcup"].Width, texList["selectcup"].Height) / 2, 1f, SpriteEffects.None, 1);

            spriteBatch.Draw(texList["car-spot"], SpotPos, null, Color.White, 0f, new Vector2(texList["car-spot"].Width , texList["car-spot"].Height)/2, 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texCarDirections[carFrame], CarPos, null, carColor, 0f, new Vector2(texCarDirections[carFrame].Width, texCarDirections[carFrame].Height) / 2, carScale, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["colors"], PaintPos, null, Color.White, 0f, new Vector2(texList["colors"].Width, texList["colors"].Height) / 2, 1f, SpriteEffects.None, 1);

            spriteBatch.Draw(texList["triangles"], new Vector2(redRect.Left+4, redRect.Top + 24) + new Vector2((400f/230f) * (float)(carColor.R-25),0f), null, selectedColor==0?Color.White:Color.Black, 0f, new Vector2(texList["triangles"].Width, texList["triangles"].Height) / 2, 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["triangles"], new Vector2(greenRect.Left + 4, greenRect.Top + 24) + new Vector2((400f / 230f) * (float)(carColor.G - 25), 0f), null, selectedColor == 1 ? Color.White : Color.Black, 0f, new Vector2(texList["triangles"].Width, texList["triangles"].Height) / 2, 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["triangles"], new Vector2(blueRect.Left + 4, blueRect.Top + 24) + new Vector2((400f / 230f) * (float)(carColor.B - 25), 0f), null, selectedColor == 2 ? Color.White : Color.Black, 0f, new Vector2(texList["triangles"].Width, texList["triangles"].Height) / 2, 1f, SpriteEffects.None, 1);

            Color trophyColor = Color.Black * 0.5f;
            switch (trophies[selectedCup])
            {
                case 3:
                    trophyColor = Color.SaddleBrown;
                    break;
                case 2:
                    trophyColor = Color.Silver;
                    break;
                case 1:
                    trophyColor = Color.Gold;
                    break;
            }
            spriteBatch.Draw(texList["cup"], trophyPos, null, trophyColor, 0f, new Vector2(texList["cup"].Width, texList["cup"].Height) / 2, 1f, SpriteEffects.None, 1);

            spriteBatch.Draw(texList["arrow"], new Vector2(leftRect.Center.X, leftRect.Center.Y), null, Color.LightGray, 0f, new Vector2(texList["arrow"].Width, texList["arrow"].Height) / 2, 1f, SpriteEffects.FlipHorizontally, 1);
            spriteBatch.Draw(texList["arrow"], new Vector2(rightRect.Center.X, rightRect.Center.Y), null, Color.LightGray, 0f, new Vector2(texList["arrow"].Width, texList["arrow"].Height) / 2, 1f, SpriteEffects.None, 1);

            spriteBatch.Draw(texList["cuparrow"], new Vector2(leftCupRect.Center.X, leftCupRect.Center.Y), null, Color.LightGray * (selectedCup>0?1f:0.2f), 0f, new Vector2(texList["cuparrow"].Width, texList["cuparrow"].Height) / 2, 1f, SpriteEffects.None, 1);
            spriteBatch.Draw(texList["cuparrow"], new Vector2(rightCupRect.Center.X, rightCupRect.Center.Y), null, Color.LightGray * (selectedCup < (Cups.Count-1) ? 1f : 0.2f), 0f, new Vector2(texList["cuparrow"].Width, texList["cuparrow"].Height) / 2, 1f, SpriteEffects.FlipHorizontally, 1);

            spriteBatch.End();

            spriteBatch.Begin(SpriteSortMode.FrontToBack, null);
            foreach(Cup c in Cups)
            {
                spriteBatch.Draw(texList["cup-holder"], c.Position, null, Color.LightGray * c.Scale, 0f, new Vector2(texList["cup-holder"].Width, texList["cup-holder"].Height) / 2, c.Scale, SpriteEffects.None, c.Scale);
                spriteBatch.Draw(texList["cuptitle" + (Cups.IndexOf(c) + 1).ToString()], c.Position + new Vector2(0, -175 * c.Scale), null, Color.LightGray * c.Scale, 0f, new Vector2(texList["cuptitle" + (Cups.IndexOf(c) + 1).ToString()].Width, texList["cuptitle" + (Cups.IndexOf(c) + 1).ToString()].Height) / 2, c.Scale, SpriteEffects.None, c.Scale);

                if (selectionMode == 1 && Cups.IndexOf(c) == selectedCup)
                {
                    if(cupTracks[0].HasLoaded) spriteBatch.Draw(cupTrackRT[0], c.Position + new Vector2(0, -31 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(cupTrackRT[0].Width, cupTrackRT[0].Height) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    else spriteBatch.Draw(texList["blank-track"], c.Position + new Vector2(0, -31 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(193, 108) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    if (cupTracks[1].HasLoaded) spriteBatch.Draw(cupTrackRT[1], c.Position + new Vector2(0, 79 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(cupTrackRT[1].Width, cupTrackRT[1].Height) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    else spriteBatch.Draw(texList["blank-track"], c.Position + new Vector2(0, 79 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(193, 108) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    if (cupTracks[2].HasLoaded) spriteBatch.Draw(cupTrackRT[2], c.Position + new Vector2(0, 189 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(cupTrackRT[2].Width, cupTrackRT[2].Height) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    else spriteBatch.Draw(texList["blank-track"], c.Position + new Vector2(0, 189 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(193, 108) / 2, c.Scale, SpriteEffects.None, c.Scale);
                }
                else
                {
                    spriteBatch.Draw(texList["blank-track"], c.Position + new Vector2(0, -31 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(193, 108) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    spriteBatch.Draw(texList["blank-track"], c.Position + new Vector2(0, 79 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(193, 108) / 2, c.Scale, SpriteEffects.None, c.Scale);
                    spriteBatch.Draw(texList["blank-track"], c.Position + new Vector2(0, 189 * c.Scale), null, Color.White * c.Scale, 0f, new Vector2(193, 108) / 2, c.Scale, SpriteEffects.None, c.Scale);
                }
            }
            spriteBatch.End();

            ScreenManager.FadeBackBufferToBlack(1f - TransitionAlpha);
        }
Пример #3
0
            private void drawSpawnBar(Vector3 spawnPoint, float zoom, Viewport viewport)
            {
                Vector3 projection = viewport.Project(spawnPoint, RenderingDevice.Camera.Projection,
                    RenderingDevice.Camera.View, RenderingDevice.Camera.World);
                float baseZoom = 100;
                float scale = baseZoom / zoom; // baseZoom / zoom gets us a scale that increases when zoom is low; that is; zoomed in.
                float offset = 15;
                Vector2 screenCoords = new Vector2(projection.X, projection.Y);

                screenCoords.X += offset * RenderingDevice.TextureScaleFactor.X;
                screenCoords.Y -= offset * RenderingDevice.TextureScaleFactor.Y;

                outerSpawnBar.X = innerSpawnBar.X = (int)(screenCoords.X + texOffset * RenderingDevice.TextureScaleFactor.X * scale);
                outerSpawnBar.Y = innerSpawnBar.Y = (int)(screenCoords.Y + texOffset * RenderingDevice.TextureScaleFactor.Y * scale);

                RenderingDevice.SpriteBatch.Draw(Resources.EmptyTex, outerSpawnBar, null, outerBarColor, 0, Vector2.Zero, SpriteEffects.None, 0);
                if(remaining > 0)
                    RenderingDevice.SpriteBatch.Draw(Resources.EmptyTex, innerSpawnBar, null, innerBarColor, 0, Vector2.Zero, SpriteEffects.None, 0);
                RenderingDevice.SpriteBatch.Draw(barTex, screenCoords, null, Color.White, 0, Vector2.Zero, RenderingDevice.TextureScaleFactor * scale, SpriteEffects.None, 0);
            }
        public static void Run()
        {
            var left = -1;
            var right = 1;
            var bottom = -1;
            var top = 1;
            
            var near = 5.0f;
            var far = near + 30.0f;
            var xdiv = (right - left) / (far - near);
            var ydiv = (top - bottom) / (far - near);

            var world = Matrix.Identity;
            var view = Matrix.Identity;
            var proj = Matrix.CreatePerspectiveOffCenter(left, right, bottom, top, near, far);

            var width = 2;
            var height = 2;

            var port = new Viewport(left, bottom, width, height);

            // From MSDN et. al.
            //
            // projection space refers to the space after applying projection transformation from 
            // view space. After the projection transformation, visible content has x and y coordinates
            // ranging from -1 to 1, and z coordinates ranging from 0 to 1.
            //
            // Positive Z comes out of the screen, so negative near and far is into the screen.
            //
            // The viewport then mirrors Y so it goes down in screen space.
            Doing(v => port.Project(v, proj, view, world)).With(-1, -1, -near).ShouldBe(-1, 1, 0)
                                                          .With( 1, -1, -near).ShouldBe(1, 1, 0)
                                                          .With(-1, 1, -near).ShouldBe(-1, -1, 0)
                                                          .With(1, 1, -near).ShouldBe(1, -1, 0)
                                                          .With( 0, 0, -near).ShouldBe(0, 0, 0)
                                                          .With(0, 0, -far).ShouldBe(0, 0, 1);
            
            // Test project is inverse of unproject
            Doing(v => port.Unproject(v, proj, view, world)).With(-1, -1, 1).ShouldBe(-1 / near * far, 1 / near * far, -far);
            Doing(v => port.Project(v, proj, view, world)).With(-1 / near * far, 1 / near * far, -far).ShouldBe(-1, -1, 1);

            Doing(v => port.Project(v, proj, view, world)).With(-1 / near * far, -1 / near * far, -far).ShouldBe(-1, 1, 1)
                                                          .With(1 / near * far, 1 / near * far, -far).ShouldBe(1, -1, 1)
                                                          .With(1 / near * far, -1 / near * far, -far).ShouldBe(1, 1, 1);

            // Similar verification but now with values that are typical of usage.
            top = 10;
            left = -5;
            bottom = 0;
            right = 5;

            near = 1.0f;
            far = near + 100.0f;
            
            world = Matrix.Identity;
            view = Matrix.Identity;
            proj = Matrix.CreatePerspectiveOffCenter(left, right, bottom, top, near, far);

            width = 640;
            height = 480;
            port = new Viewport(0, 0, width, height);

            Doing(v => port.Project(v, proj, view, world))

                // Corners of the screen at near plane.
                .With(left, top, -near).ShouldBe(0, 0, 0)
                .With(right, top, -near).ShouldBe(width, 0, 0)
                .With(left, bottom, -near).ShouldBe(0, height, 0)
                .With(right, bottom, -near).ShouldBe(width, height, 0)

                // Center of the screen.
                .With(0, 0, -near).ShouldBe(width / 2, height, 0)
                .With(0, 0, -far).ShouldBe(width / 2, height, 1);

            Doing(v => port.Unproject(v, proj, view, world)).With(0, 0, 0).ShouldBe(left, top, -near)
                                                            .With(width, 0, 0).ShouldBe(right, top, -near)
                                                            .With(0, height, 0).ShouldBe(left, bottom, -near)
                                                            .With(width, height, 0).ShouldBe(right, bottom, -near);
        }
Пример #5
0
        public static void ProjectRayToScreenSpace(Ray ray, Viewport viewport, Matrix viewTransform, Matrix projectionTransform,
            out Vector2 rayPosition,
            out Vector2 rayDirection)
        {
            Vector3 screenPosition1 = viewport.Project(ray.Position, projectionTransform, viewTransform, Matrix.Identity);
            Vector3 screenPosition2 = viewport.Project(ray.Position + ray.Direction, projectionTransform, viewTransform, Matrix.Identity);

            Vector3 direction = screenPosition2 - screenPosition1;
            rayPosition = new Vector2(screenPosition1.X, screenPosition1.Y);
            rayDirection = new Vector2(direction.X, direction.Y);
        }
Пример #6
0
        public void ProjectTest()
        {
            Viewport viewport = new Viewport(0, 0, 640, 480);
              PerspectiveProjection projection = new PerspectiveProjection();
              projection.SetFieldOfView(MathHelper.ToRadians(60), viewport.AspectRatio, 10, 1000);
              Matrix44F view = Matrix44F.CreateLookAt(new Vector3F(0, 0, 0), new Vector3F(0, 0, -1), Vector3F.Up);

              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(320, 240, 0), viewport.Project(new Vector3F(0, 0, -10), projection, view)));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 0), viewport.Project(new Vector3F(projection.Left, projection.Top, -10), projection, view)));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(640, 0, 0), viewport.Project(new Vector3F(projection.Right, projection.Top, -10), projection, view)));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 480, 0), viewport.Project(new Vector3F(projection.Left, projection.Bottom, -10), projection, view)));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(640, 480, 0), viewport.Project(new Vector3F(projection.Right, projection.Bottom, -10), projection, view)));

              Vector3[] farCorners = new Vector3[4];
              GraphicsHelper.GetFrustumFarCorners(projection, farCorners);
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(320, 240, 1), viewport.Project(new Vector3F(0, 0, -1000), projection, view)));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 1), viewport.Project((Vector3F)farCorners[0], projection, view), 1e-4f));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(640, 0, 1), viewport.Project((Vector3F)farCorners[1], projection, view), 1e-4f));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 480, 1), viewport.Project((Vector3F)farCorners[2], projection, view), 1e-4f));
              Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(640, 480, 1), viewport.Project((Vector3F)farCorners[3], projection, view), 1e-4f));
        }
Пример #7
0
        public override void Render(SpriteBatch batch, Camera camera, Viewport viewport)
        {
            if(camera == null)
            {
                return;
            }

            Vector3 screenCoord = viewport.Project(WorldPosition, camera.ProjectionMatrix, camera.ViewMatrix, Matrix.Identity);
            if(viewport.Bounds.Contains((int) screenCoord.X, (int) screenCoord.Y) && screenCoord.Z > 0 && Image != null)
            {
                batch.Draw(Image.Image, new Vector2(screenCoord.X, screenCoord.Y) + Offset, Image.SourceRect, Tint, Rotation, new Vector2(Image.SourceRect.Width / 2.0f, Image.SourceRect.Height / 2.0f), Scale, Effects, 0.0f);
            }
        }
Пример #8
0
        public override void Render(SpriteBatch batch, Camera camera, Viewport viewport)
        {
            Vector2 extents = Font.MeasureString(Text);
            Vector3 unprojected = viewport.Project(Position, camera.ProjectionMatrix, camera.ViewMatrix, Matrix.Identity);

            unprojected.X = Math.Min(Math.Max(extents.X * 0.5f, unprojected.X), viewport.Width - extents.X * 0.5f) ;
            unprojected.Y = Math.Min(Math.Max(extents.Y * 0.5f, unprojected.Y), viewport.Height - extents.Y * 0.5f);

            batch.DrawString(Font, Text, new Vector2(unprojected.X + 1, unprojected.Y) - extents / 2.0f, StrokeColor);
            batch.DrawString(Font, Text, new Vector2(unprojected.X - 1, unprojected.Y) - extents / 2.0f, StrokeColor);

            batch.DrawString(Font, Text, new Vector2(unprojected.X, unprojected.Y + 1) - extents / 2.0f, StrokeColor);
            batch.DrawString(Font, Text, new Vector2(unprojected.X, unprojected.Y - 1) - extents / 2.0f, StrokeColor);

            batch.DrawString(Font, Text, new Vector2(unprojected.X, unprojected.Y) - extents / 2.0f, TextColor);

            base.Render(batch, camera, viewport);
        }
Пример #9
0
        public override void Render(SpriteBatch batch, Camera camera, Viewport viewport)
        {
            Vector2 extents = Font.MeasureString(Text);
            Vector3 unprojected = viewport.Project(Position, camera.ProjectionMatrix, camera.ViewMatrix, Matrix.Identity);

            Rectangle rect = new Rectangle((int)(unprojected.X - extents.X / 2.0f  - StrokeWeight), (int)(unprojected.Y - extents.Y / 2.0f - StrokeWeight),
                                           (int)(extents.X + StrokeWeight + 5), (int)(extents.Y + StrokeWeight + 5));

            Drawer2D.FillRect(batch, rect, FillColor);
            Drawer2D.DrawRect(batch, rect, RectStrokeColor, StrokeWeight);
            batch.DrawString(Font, Text, new Vector2(unprojected.X + 1, unprojected.Y) - extents / 2.0f, StrokeColor);
            batch.DrawString(Font, Text, new Vector2(unprojected.X - 1, unprojected.Y) - extents / 2.0f, StrokeColor);

            batch.DrawString(Font, Text, new Vector2(unprojected.X, unprojected.Y + 1) - extents / 2.0f, StrokeColor);
            batch.DrawString(Font, Text, new Vector2(unprojected.X, unprojected.Y - 1) - extents / 2.0f, StrokeColor);

            batch.DrawString(Font, Text, new Vector2(unprojected.X, unprojected.Y) - extents / 2.0f, TextColor);

            base.Render(batch, camera, viewport);
        }
Пример #10
0
        public void RenderSunMoon(DwarfTime time, GraphicsDevice device, Camera camera, Viewport viewPort, float scale)
        {
            Matrix rot = Matrix.CreateRotationZ(-(CosTime + 0.5f * (float) Math.PI));
            SunPosition = new Vector3(1000, 100, 0);
            Vector3 moonPosition = new Vector3(-1000, 100, 0);
            SunPosition = Vector3.Transform(SunPosition, rot);
            moonPosition = Vector3.Transform(moonPosition, rot);
            SunPosition += camera.Position;
            moonPosition += camera.Position;

            Vector3 cameraFrameSun = Vector3.Transform(SunPosition, camera.ViewMatrix * camera.ProjectionMatrix);
            Vector3 cameraFramMoon = Vector3.Transform(moonPosition, camera.ViewMatrix * camera.ProjectionMatrix);

            Vector3 unProjectSun = viewPort.Project(SunPosition, camera.ProjectionMatrix, camera.ViewMatrix, Matrix.Identity);
            Vector3 unProjectMoon = viewPort.Project(moonPosition, camera.ProjectionMatrix, camera.ViewMatrix, Matrix.Identity);

            DwarfGame.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone, null, Matrix.Identity);

            if(unProjectSun.Z > 0 && cameraFrameSun.Z > 0)
            {
                DwarfGame.SpriteBatch.Draw(SunTexture, new Vector2(unProjectSun.X - SunTexture.Width / 2 * scale, unProjectSun.Y - SunTexture.Height / 2 * scale), null, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, 0.0f);
            }
            if(unProjectMoon.Z > 0 && cameraFramMoon.Z > 0)
            {
                DwarfGame.SpriteBatch.Draw(MoonTexture, new Vector2(unProjectMoon.X - SunTexture.Width / 2 * scale, unProjectMoon.Y - SunTexture.Height / 2 * scale), null, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, 0.0f);
            }
            DwarfGame.SpriteBatch.End();

            Vector3 sunDir = (camera.Position - SunPosition);
            sunDir.Normalize();
            SunlightDir = sunDir;
        }
Пример #11
0
 public Vector3 GetScreenCoordinates(Vector3 point)
 {
     // todo: retrieve viewport
     Viewport v = new Viewport(0, 0, 1024, 768);
     return v.Project(point, ProjectionMatrix, viewMatrix, Matrix.Identity);
 }
Пример #12
0
        public override void Render(SpriteBatch batch, Camera camera, Viewport viewport)
        {
            if(batch == null || camera == null)
            {
                return;
            }

            Vector2 extents = Datastructures.SafeMeasure(Font, Text);

            Vector3 unprojected = viewport.Project(Position, camera.ProjectionMatrix, camera.ViewMatrix, Matrix.Identity);

            if (unprojected.Z < 0)
            {
                return;
            }

            Rectangle rect = new Rectangle((int) (unprojected.X - extents.X / 2.0f - StrokeWeight), (int) (unprojected.Y - extents.Y / 2.0f - StrokeWeight),
                (int) (extents.X + StrokeWeight + 5), (int) (extents.Y + StrokeWeight + 5));

            Drawer2D.FillRect(batch, rect, FillColor);
            Drawer2D.DrawRect(batch, rect, RectStrokeColor, StrokeWeight);
            Drawer2D.SafeDraw(batch, Text, Font, StrokeColor, new Vector2(unprojected.X + 1, unprojected.Y) - extents / 2.0f, Vector2.Zero);
            Drawer2D.SafeDraw(batch, Text, Font, StrokeColor, new Vector2(unprojected.X - 1, unprojected.Y) - extents / 2.0f, Vector2.Zero);

            Drawer2D.SafeDraw(batch, Text, Font, StrokeColor, new Vector2(unprojected.X, unprojected.Y + 1) - extents / 2.0f, Vector2.Zero);
            Drawer2D.SafeDraw(batch, Text, Font, StrokeColor, new Vector2(unprojected.X, unprojected.Y - 1) - extents / 2.0f, Vector2.Zero);

            Drawer2D.SafeDraw(batch, Text, Font, TextColor, new Vector2(unprojected.X, unprojected.Y) - extents / 2.0f, Vector2.Zero);
        }
Пример #13
0
        public override void PreRender(DwarfTime time, SpriteBatch sprites)
        {
            if(!HomeSet)
            {
                HomePosition = PlayState.Camera.Target;
                HomeSet = true;
            }

            if(IsVisible && !IsMinimized && GUI.RootComponent.IsVisible)
            {
                Viewport originalViewport = PlayState.GraphicsDevice.Viewport;
                Camera.Update(time, PlayState.ChunkManager);
                Camera.Target = PlayState.Camera.Target + Vector3.Up * 50;
                Camera.Phi = -(float) Math.PI * 0.5f;
                Camera.Theta = PlayState.Camera.Theta;
                Camera.UpdateProjectionMatrix();

                PlayState.GraphicsDevice.SetRenderTarget(RenderTarget);
                PlayState.GraphicsDevice.Clear(ClearOptions.Target, Color.Black, 0, 0);
                PlayState.DefaultShader.Parameters["xView"].SetValue(Camera.ViewMatrix);
                PlayState.DefaultShader.Parameters["xEnableFog"].SetValue(0);

                PlayState.DefaultShader.Parameters["xProjection"].SetValue(Camera.ProjectionMatrix);
                PlayState.DefaultShader.CurrentTechnique = PlayState.DefaultShader.Techniques["Textured_colorscale"];

                PlayState.GraphicsDevice.BlendState = BlendState.AlphaBlend;

                PlayState.ChunkManager.RenderAll(Camera, time, PlayState.GraphicsDevice, PlayState.DefaultShader, Matrix.Identity, ColorMap);
                PlayState.WaterRenderer.DrawWaterFlat(PlayState.GraphicsDevice, Camera.ViewMatrix, Camera.ProjectionMatrix, PlayState.DefaultShader, PlayState.ChunkManager);

                PlayState.GraphicsDevice.Textures[0] = null;
                PlayState.GraphicsDevice.Indices = null;
                PlayState.GraphicsDevice.SetVertexBuffer(null);
                PlayState.DefaultShader.Parameters["xEnableFog"].SetValue(1);

                DwarfGame.SpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, RasterizerState.CullNone);
                Viewport viewPort = new Viewport(RenderTarget.Bounds);
                foreach(MinimapIcon icon in PlayState.ComponentManager.RootComponent.GetChildrenOfTypeRecursive<MinimapIcon>())
                {

                    if (!icon.Parent.IsVisible)
                    {
                        continue;
                    }

                   Vector3 screenPos = viewPort.Project(icon.GlobalTransform.Translation, Camera.ProjectionMatrix, Camera.ViewMatrix, Matrix.Identity);

                    if(RenderTarget.Bounds.Contains((int) screenPos.X, (int) screenPos.Y))
                    {
                        sprites.Draw(icon.Icon.Image, new Vector2(screenPos.X, screenPos.Y), icon.Icon.SourceRect, Color.White, 0.0f, new Vector2(icon.Icon.SourceRect.Width / 2.0f, icon.Icon.SourceRect.Height / 2.0f), icon.IconScale, SpriteEffects.None, 0);
                    }
                }

                sprites.End();
                PlayState.GraphicsDevice.BlendState = BlendState.AlphaBlend;
                PlayState.GraphicsDevice.DepthStencilState = DepthStencilState.None;
                PlayState.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
                PlayState.GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
                PlayState.GraphicsDevice.SetRenderTarget(null);

            }

            base.PreRender(time, sprites);
        }
Пример #14
0
 //Updates the life bar texture
 public void updateLifeBarsMonsters(int i,int percentage, Vector3 position, Camera cam, Viewport viewport)
 {
     Vector3 posi = viewport.Project(position, cam.projection, cam.view, Matrix.Identity);
     Vector2 pos = new Vector2(posi.X, posi.Y) + new Vector2(-40 ,-40);
     //pos = new Vector2(0, 0);
     if (percentage == 100)
         monstersLife[i].Update(ref life100, pos);
     if (percentage == 75)
         monstersLife[i].Update(ref life75, pos);
     if (percentage == 50)
         monstersLife[i].Update(ref life50, pos);
     if (percentage == 25)
         monstersLife[i].Update(ref life25, pos);
 }