예제 #1
0
        private static void DrawTextOn3DLocation_Fancy(Vector3 location, string text, Color color, float physicalHeight, bool startAndEndSpriteBatchForMe = true)
        {
            // Project the 3d position first
            Vector3 screenPos3D_Top = GFX.Device.Viewport.Project(location + new Vector3(0, physicalHeight / 2, 0),
                                                                  GFX.World.MatrixProjection, GFX.World.CameraTransform.CameraViewMatrix, GFX.World.MatrixWorld);

            Vector3 screenPos3D_Bottom = GFX.Device.Viewport.Project(location - new Vector3(0, physicalHeight / 2, 0),
                                                                     GFX.World.MatrixProjection, GFX.World.CameraTransform.CameraViewMatrix, GFX.World.MatrixWorld);

            //Vector3 camNormal = Vector3.Transform(Vector3.Forward, CAMERA_ROTATION);
            //Vector3 directionFromCam = Vector3.Normalize(location - Vector3.Transform(WORLD_VIEW.CameraPosition, CAMERA_WORLD));
            //var normDot = Vector3.Dot(directionFromCam, camNormal);

            if (screenPos3D_Top.Z >= 1 || screenPos3D_Bottom.Z >= 1)
            {
                return;
            }



            // Just to make it easier to use we create a Vector2 from screenPos3D
            Vector2 screenPos2D_Top = new Vector2(screenPos3D_Top.X, screenPos3D_Top.Y);

            Vector2 screenPos2D_Bottom = new Vector2(screenPos3D_Bottom.X, screenPos3D_Bottom.Y);

            Vector2 screenPos2D_Center = (screenPos2D_Top + screenPos2D_Bottom) / 2;

            if (screenPos2D_Center.X < 0 || screenPos2D_Center.X > GFX.Device.Viewport.Width || screenPos2D_Center.Y < 0 || screenPos2D_Center.Y > GFX.Device.Viewport.Height)
            {
                return;
            }

            Vector2 labelSpritefontSize = DEBUG_FONT.MeasureString(text);

            float labelHeightInPixels = (screenPos2D_Top - screenPos2D_Bottom).Length();



            //text += $"[DBG]{screenPos3D.Z}";

            float scale = labelHeightInPixels / labelSpritefontSize.Y;

            DrawOutlinedText(text,
                             (screenPos2D_Center) - new Vector2(GFX.Device.Viewport.X, GFX.Device.Viewport.Y),
                             color, DEBUG_FONT,
                             ((screenPos3D_Top.Z + screenPos3D_Bottom.Z) / 2), scale, labelSpritefontSize / 2,
                             startAndEndSpriteBatchForMe);
        }
예제 #2
0
        private static void DrawTextOn3DLocation_Fast(Vector3 location, string text, Color color, float physicalHeight, bool startAndEndSpriteBatchForMe = true)
        {
            //// Project the 3d position first
            //Vector3 screenPos3D = GFX.Device.Viewport.Project(location,
            //    GFX.World.MatrixProjection, GFX.World.CameraTransform.CameraViewMatrix, GFX.World.MatrixWorld);

            //if (screenPos3D.Z >= 1 || screenPos3D.Z >= 1)
            //    return;

            //if (screenPos3D.X < 0 || screenPos3D.X > GFX.Device.Viewport.Width || screenPos3D.Y < 0 || screenPos3D.Y > GFX.Device.Viewport.Height)
            //    return;

            // Project the 3d position first
            Vector3 screenPos3D_Top = GFX.Device.Viewport.Project(location + new Vector3(0, physicalHeight / 2, 0),
                                                                  GFX.World.MatrixProjection, GFX.World.CameraTransform.CameraViewMatrix * Matrix.Invert(GFX.World.MatrixWorld), Matrix.Identity);

            Vector3 screenPos3D_Bottom = GFX.Device.Viewport.Project(location - new Vector3(0, physicalHeight / 2, 0),
                                                                     GFX.World.MatrixProjection, GFX.World.CameraTransform.CameraViewMatrix * Matrix.Invert(GFX.World.MatrixWorld), Matrix.Identity);

            //Vector3 camNormal = Vector3.Transform(Vector3.Forward, CAMERA_ROTATION);
            //Vector3 directionFromCam = Vector3.Normalize(location - Vector3.Transform(WORLD_VIEW.CameraPosition, CAMERA_WORLD));
            //var normDot = Vector3.Dot(directionFromCam, camNormal);

            if (screenPos3D_Top.Z >= 1 || screenPos3D_Bottom.Z >= 1)
            {
                return;
            }

            // Just to make it easier to use we create a Vector2 from screenPos3D
            Vector2 screenPos2D_Top    = new Vector2(screenPos3D_Top.X, screenPos3D_Top.Y);
            Vector2 screenPos2D_Bottom = new Vector2(screenPos3D_Bottom.X, screenPos3D_Bottom.Y);
            Vector2 screenPos2D_Center = (screenPos2D_Top + screenPos2D_Bottom) / 2;

            if (screenPos2D_Center.X < 0 || screenPos2D_Center.X > GFX.Device.Viewport.Width || screenPos2D_Center.Y < 0 || screenPos2D_Center.Y > GFX.Device.Viewport.Height)
            {
                return;
            }

            Vector2 labelSpritefontSize = DEBUG_FONT.MeasureString(text);

            float labelHeightInPixels = (screenPos2D_Top - screenPos2D_Bottom).Length();



            //text += $"[DBG]{screenPos3D.Z}";

            float scale = labelHeightInPixels / labelSpritefontSize.Y;

            if (scale < 0.25f)
            {
                return;
            }

            //if (startAndEndSpriteBatchForMe)
            //    GFX.SpriteBatch.Begin(samplerState: SamplerState.PointClamp);

            //GFX.SpriteBatch.DrawString(DEBUG_FONT_SIMPLE, text,
            //    new Vector2(screenPos3D.X, screenPos3D.Y) -
            //    new Vector2(GFX.Device.Viewport.X, GFX.Device.Viewport.Y), color);

            var textPos = new Vector2(screenPos2D_Center.X, screenPos2D_Center.Y) -
                          new Vector2(GFX.Device.Viewport.X, GFX.Device.Viewport.Y);

            GFX.SpriteBatch.DrawString(DEBUG_FONT, text,
                                       new Vector2((int)textPos.X + 2, (int)textPos.Y + 2),
                                       Color.Black, 0, labelSpritefontSize / 2, scale, SpriteEffects.None,
                                       ((screenPos3D_Top.Z + screenPos3D_Bottom.Z) / 2) + 0.0001f);

            GFX.SpriteBatch.DrawString(DEBUG_FONT, text,
                                       new Vector2((int)textPos.X, (int)textPos.Y),
                                       color, 0, labelSpritefontSize / 2, scale, SpriteEffects.None,
                                       ((screenPos3D_Top.Z + screenPos3D_Bottom.Z) / 2));



            //if (startAndEndSpriteBatchForMe)
            //    GFX.SpriteBatch.End();
        }