public void RenderSpritesToTexture(int area, ListReader <MySprite> sprites, Vector2I textureSize, Vector2 aspectRatio, Color backgroundColor, byte backgroundAlpha) { string targetTexture = this.GenerateOffscreenTextureName(this.m_entity.EntityId, area); Vector2 aspectFactor = CalcAspectFactor(textureSize, aspectRatio); Vector2 vector2 = CalcShift(textureSize, aspectFactor); for (int i = 0; i < sprites.Count; i++) { MySprite sprite = sprites[i]; Vector2? size = sprite.Size; Vector2 vector3 = (size != null) ? size.GetValueOrDefault() : ((Vector2)textureSize); size = sprite.Position; Vector2 screenCoord = (size != null) ? size.GetValueOrDefault() : ((Vector2)(textureSize / 2)); Color? nullable2 = sprite.Color; Color colorMask = (nullable2 != null) ? nullable2.GetValueOrDefault() : Color.White; screenCoord += vector2; SpriteType type = sprite.Type; if (type != SpriteType.TEXTURE) { if (type == SpriteType.TEXT) { switch (sprite.Alignment) { case TextAlignment.RIGHT: screenCoord -= new Vector2(vector3.X, 0f); break; case TextAlignment.CENTER: screenCoord -= new Vector2(vector3.X * 0.5f, 0f); break; default: break; } MyFontDefinition definition = MyDefinitionManager.Static.GetDefinition <MyFontDefinition>(MyStringHash.GetOrCompute(sprite.FontId)); int textureWidthinPx = (int)Math.Round((double)vector3.X); MyRenderProxy.DrawStringAligned((definition != null) ? ((int)definition.Id.SubtypeId) : ((int)MyStringHash.GetOrCompute("Debug")), screenCoord, colorMask, sprite.Data ?? string.Empty, sprite.RotationOrScale, float.PositiveInfinity, targetTexture, textureWidthinPx, (MyRenderTextAlignmentEnum)sprite.Alignment); } } else { MyLCDTextureDefinition definition = MyDefinitionManager.Static.GetDefinition <MyLCDTextureDefinition>(MyStringHash.GetOrCompute(sprite.Data)); if (definition != null) { switch (sprite.Alignment) { case TextAlignment.LEFT: screenCoord += new Vector2(vector3.X * 0.5f, 0f); break; case TextAlignment.RIGHT: screenCoord -= new Vector2(vector3.X * 0.5f, 0f); break; default: break; } Vector2 rightVector = new Vector2(1f, 0f); if (Math.Abs(sprite.RotationOrScale) > 1E-05f) { rightVector = new Vector2((float)Math.Cos((double)sprite.RotationOrScale), (float)Math.Sin((double)sprite.RotationOrScale)); } MyRenderProxy.DrawSpriteAtlas(definition.SpritePath ?? definition.TexturePath, screenCoord, Vector2.Zero, Vector2.One, rightVector, Vector2.One, colorMask, vector3 / 2f, targetTexture); } } } backgroundColor.A = backgroundAlpha; uint[] renderObjectIDs = this.m_screenAreas[area].RenderObjectIDs; int index = 0; while ((index < renderObjectIDs.Length) && (renderObjectIDs[index] == uint.MaxValue)) { index++; } if (index < renderObjectIDs.Length) { MyRenderProxy.RenderOffscreenTexture(targetTexture, new Vector2?(aspectFactor), new Color?(backgroundColor)); } }
private void DrawGravityIndicator(MyHudGravityIndicator indicator, MyHudCharacterInfo characterInfo) { if (indicator.Entity == null) { return; } Vector3 gravity = MyGravityProviderSystem.CalculateGravityInPoint(MySession.GetCameraControllerEnum() == MyCameraControllerEnum.Entity || MySession.GetCameraControllerEnum() == MyCameraControllerEnum.ThirdPersonSpectator ? indicator.Entity.PositionComp.WorldAABB.Center : MySpectatorCameraController.Static.Position); //gravity += MyPhysics.HavokWorld.Gravity; bool anyGravity = !MyUtils.IsZero(gravity.Length()); // Background and text drawing MyFontEnum font; StringBuilder text; m_hudIndicatorText.Clear(); m_hudIndicatorText.AppendFormatedDecimal("", gravity.Length() / 9.81f, 1, " g"); MyGuiPaddedTexture bg; if (anyGravity) { font = MyFontEnum.Blue; text = MyTexts.Get(MySpaceTexts.HudInfoGravity); bg = MyGuiConstants.TEXTURE_HUD_BG_MEDIUM_DEFAULT; } else { font = MyFontEnum.Red; text = MyTexts.Get(MySpaceTexts.HudInfoNoGravity); bg = MyGuiConstants.TEXTURE_HUD_BG_MEDIUM_RED; } bool drawOxygen = MySession.Static.Settings.EnableOxygen; Vector2 bgSizeDelta = new Vector2(0.015f, 0f); float oxygenLevel = 0f; Vector2 bgSize = bg.SizeGui + bgSizeDelta; Vector2 bgPos, textPos, gTextPos, position; MyGuiDrawAlignEnum align; if (indicator.Entity is MyCharacter) { bgPos = new Vector2(0.99f, 0.99f); bgPos = ConvertHudToNormalizedGuiPosition(ref bgPos); textPos = bgPos - bgSize * new Vector2(0.94f, 0.98f) + bg.PaddingSizeGui * Vector2.UnitY * 0.2f; gTextPos = bgPos - bgSize * new Vector2(0.56f, 0.98f) + bg.PaddingSizeGui * Vector2.UnitY * 0.2f; align = MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM; position = bgPos - bgSize * new Vector2(0.5f, 0.5f) + bg.PaddingSizeGui * Vector2.UnitY * 0.5f; oxygenLevel = (indicator.Entity as MyCharacter).EnvironmentOxygenLevel; } else { bgPos = new Vector2(0.01f, 1f - (characterInfo.Data.GetGuiHeight() + 0.02f)); bgPos = ConvertHudToNormalizedGuiPosition(ref bgPos); textPos = bgPos + bgSize * new Vector2(1 - 0.94f, -0.98f) + bg.PaddingSizeGui * Vector2.UnitY * 0.2f; gTextPos = bgPos + bgSize * new Vector2(1 - 0.56f, -0.98f) + bg.PaddingSizeGui * Vector2.UnitY * 0.2f; align = MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_BOTTOM; position = bgPos - bgSize * new Vector2(-0.5f, 0.5f) + bg.PaddingSizeGui * Vector2.UnitY * 0.5f; var cockpit = indicator.Entity as MyCockpit; if (cockpit != null && cockpit.Pilot != null) { oxygenLevel = cockpit.Pilot.EnvironmentOxygenLevel; } else { drawOxygen = false; } } if (drawOxygen) { bgSizeDelta += new Vector2(0f, 0.025f); } MyGuiManager.DrawSpriteBatch(bg.Texture, bgPos, bg.SizeGui + bgSizeDelta, Color.White, align); MyGuiManager.DrawString(font, text, textPos, m_textScale); if (drawOxygen) { var oxygenFont = MyFontEnum.Blue; var oxygenText = new StringBuilder("Oxygen: "); if (oxygenLevel == 0f) { oxygenText.Append("None"); oxygenFont = MyFontEnum.Red; } else if (oxygenLevel < 0.5f) { oxygenText.Append("Low"); oxygenFont = MyFontEnum.Red; } else { oxygenText.Append("High"); } MyGuiManager.DrawString(oxygenFont, oxygenText, textPos - new Vector2(0f, 0.025f), m_textScale); } if (anyGravity) { MyGuiManager.DrawString(MyFontEnum.White, m_hudIndicatorText, gTextPos, m_textScale); } position = MyGuiManager.GetHudSize() * ConvertNormalizedGuiToHud(ref position); if (MyVideoSettingsManager.IsTripleHead()) { position.X += 1.0f; } // Draw each of gravity indicators. foreach (var generatorGravity in MyGravityProviderSystem.GravityVectors) { DrawGravityVectorIndicator(position, generatorGravity, MyHudTexturesEnum.gravity_arrow, Color.Gray); } //if (MyPhysics.HavokWorld.Gravity != Vector3.Zero) // DrawGravityVectorIndicator(position, MyPhysics.HavokWorld.Gravity, MyHudTexturesEnum.gravity_arrow, Color.Gray); if (anyGravity) { DrawGravityVectorIndicator(position, gravity, MyHudTexturesEnum.gravity_arrow, Color.White); } // Draw center MyAtlasTextureCoordinate centerTextCoord; if (anyGravity) { centerTextCoord = GetTextureCoord(MyHudTexturesEnum.gravity_point_white); } else { centerTextCoord = GetTextureCoord(MyHudTexturesEnum.gravity_point_red); } float hudSizeX = MyGuiManager.GetSafeFullscreenRectangle().Width / MyGuiManager.GetHudSize().X; float hudSizeY = MyGuiManager.GetSafeFullscreenRectangle().Height / MyGuiManager.GetHudSize().Y; Vector2 rightVector = Vector2.UnitX; MyRenderProxy.DrawSpriteAtlas( m_atlas, position, centerTextCoord.Offset, centerTextCoord.Size, rightVector, new Vector2(hudSizeX, hudSizeY), MyHudConstants.HUD_COLOR_LIGHT, Vector2.One * 0.005f); }