예제 #1
0
        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));
            }
        }
예제 #2
0
        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);
        }