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); }
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(); }