View Issue Details

IDProjectCategoryView StatusLast Update
0004269NoesisGUIUnitypublic2025-08-06 13:34
Reporterstonstad Assigned Tojsantos  
PrioritynormalSeveritymajor 
Status resolvedResolutionfixed 
Product Version3.2.8 
Target Version3.2.9Fixed in Version3.2.9 
Summary0004269: World UI Culling Incorrect
Description

The culling algorithm for World UI is overly aggressive or incorrect.

Example:
https://stellarconquest.blob.core.windows.net/tmp/noesis/BadCulling.mp4

Expected Outcome:
The arrows appear regardless of screen aspect ratio and arrow position, provided it is within bounds of the parent control. The arrow position is animated for illustration purposes.

Actual Outcome:
The arrow appears and disappears based on camera aspect ratio and arrow position.

This is quite impactful. Is there a way to disable this culling behavior?

Attached Files
MapOrbitsControl.xaml (10,443 bytes)   
<UserControl
  x:Class="StellarConquest.Presentation.Unity.UI.MapOrbitsControl"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"    
  xmlns:noesis="clr-namespace:NoesisGUIExtensions;assembly=Noesis.GUI.Extensions"
  xmlns:local="clr-namespace:StellarConquest.Presentation.Unity.UI">
    <UserControl.Resources>
        <!-- System Orbits -->
        <sys:Single x:Key="SystemOrbitStrokeThickness">5</sys:Single>
        <Color x:Key="SystemOrbitStrokeColor">#66666666</Color>
        <SolidColorBrush x:Key="SystemOrbitStrokeBrush" Color="{StaticResource SystemOrbitStrokeColor}"/>

        <!-- Planet Orbits -->
        <sys:Single x:Key="OrbitStrokeThickness">4</sys:Single>
        <Color x:Key="OrbitStrokeColor">#22aaaaaa</Color>
        <SolidColorBrush x:Key="OrbitStrokeBrush" Color="{StaticResource OrbitStrokeColor}"/>

        <!-- Jump Gates-->
        <sys:Single x:Key="JumpBeaconStrokeThickness">2</sys:Single>

        <Color x:Key="JumpBeaconFillColor">#33008800</Color>
        <Color x:Key="JumpBeaconStrokeColor">#dd00ff00</Color>
        <Color x:Key="JumpBeaconSelectedFillColor">#33dd8300</Color>
        <Color x:Key="JumpBeaconSelectedStrokeColor">#ddffa500</Color>
        <Color x:Key="JumpBeaconDisabledFillColor">#66333333</Color>
        <Color x:Key="JumpBeaconDisabledStrokeColor">#66666666</Color>

        <!-- Jump Gate Text -->
        <Style x:Key="JumpBeaconTextStyle" TargetType="TextBlock">
            <Setter Property="FontFamily" Value="{StaticResource RajdhaniRegular}"/>
            <Setter Property="FontSize" Value="60"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
        </Style>

        <PathGeometry x:Key="TrianglePathGeometry">
            <!-- (0 , Height) -->
            <PathFigure StartPoint="0,130">
                <!-- (Width, Height) -->
                <LineSegment Point="350,130" />
                <!-- (Width * 0.5, Height) -->
                <LineSegment Point="175,0" />
                <!-- (0, Height) -->
                <LineSegment Point="0,130" />
            </PathFigure>
        </PathGeometry>

        <Storyboard x:Key="Storyboard.Press">
            <DoubleAnimation Storyboard.TargetName="_TemplateRoot" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" To="0.97" Duration="0:0:0.1" DecelerationRatio="0.25"/>
            <DoubleAnimation Storyboard.TargetName="_TemplateRoot" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" To="0.97" Duration="0:0:0.1" DecelerationRatio="0.25"/>
        </Storyboard>
        <Storyboard x:Key="Storyboard.Release">
            <DoubleAnimation Storyboard.TargetName="_TemplateRoot" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.2" DecelerationRatio="1"/>
            <DoubleAnimation Storyboard.TargetName="_TemplateRoot" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.2" DecelerationRatio="1"/>
        </Storyboard>

        <Storyboard x:Key="Storyboard.MouseOver">
            <ColorAnimation Storyboard.TargetName="_Path" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)" To="{StaticResource JumpBeaconSelectedFillColor}" Duration="0:0:0.25"/>
            <ColorAnimation Storyboard.TargetName="_Path" Storyboard.TargetProperty="(Path.Stroke).(SolidColorBrush.Color)" To="{StaticResource JumpBeaconSelectedStrokeColor}" Duration="0:0:0.25"/>
        </Storyboard>
        <Storyboard x:Key="Storyboard.MouseExit">
            <ColorAnimation Storyboard.TargetName="_Path" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)" To="{StaticResource JumpBeaconFillColor}" Duration="0:0:0.25"/>
            <ColorAnimation Storyboard.TargetName="_Path" Storyboard.TargetProperty="(Path.Stroke).(SolidColorBrush.Color)" To="{StaticResource JumpBeaconStrokeColor}" Duration="0:0:0.25"/>
        </Storyboard>
        <Storyboard x:Key="Storyboard.Disabled">
            <ColorAnimation Storyboard.TargetName="_Path" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)" To="{StaticResource JumpBeaconDisabledFillColor}" Duration="0:0:0.25"/>
            <ColorAnimation Storyboard.TargetName="_Path" Storyboard.TargetProperty="(Path.Stroke).(SolidColorBrush.Color)" To="{StaticResource JumpBeaconDisabledStrokeColor}" Duration="0:0:0.25"/>
        </Storyboard>

        <ControlTemplate x:Key="JumpBeaconTemplate" TargetType="{x:Type local:JumpBeaconControl}">
            <ControlTemplate.Resources>
                <SolidColorBrush x:Key="JumpBeaconFillBrush" Color="{StaticResource JumpBeaconFillColor}"/>
                <SolidColorBrush x:Key="JumpBeaconStrokeBrush" Color="{StaticResource JumpBeaconStrokeColor}"/>
                <SolidColorBrush x:Key="JumpBeaconSelectedFillBrush" Color="{StaticResource JumpBeaconSelectedFillColor}"/>
            </ControlTemplate.Resources>
            <Grid x:Name="_TemplateRoot" RenderTransformOrigin="0.5,0.5">
                <Grid.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="1.0" ScaleY="1.0" />
                        <RotateTransform Angle="{Binding Path=Angle, RelativeSource={RelativeSource TemplatedParent}}"/>
                        <TranslateTransform X="{Binding Path=X, RelativeSource={RelativeSource TemplatedParent}}" Y="{Binding Path=Y, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </TransformGroup>
                </Grid.RenderTransform>
                <StackPanel>
                    <Path x:Name="_Path" Fill="{StaticResource JumpBeaconFillBrush}" Stroke="{StaticResource JumpBeaconStrokeBrush}" 
                    StrokeThickness="{StaticResource JumpBeaconStrokeThickness}" Data="{StaticResource TrianglePathGeometry}" HorizontalAlignment="Center"/>
                    <TextBlock x:Name="_TextBlock" Style="{StaticResource JumpBeaconTextStyle}" Margin="0, 12, 0, 0" Text="{Binding Path=Text, RelativeSource={RelativeSource TemplatedParent}}"/>
                </StackPanel>
            </Grid>

            <ControlTemplate.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsPressed" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Trigger.EnterActions>
                        <BeginStoryboard Name="_PressStoryboard" Storyboard="{StaticResource Storyboard.Press}"/>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard Name="_ReleaseStoryboard" Storyboard="{StaticResource Storyboard.Release}"/>
                    </Trigger.ExitActions>
                </MultiTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True"/>
                        <Condition Property="IsEnabled" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Trigger.EnterActions>
                        <BeginStoryboard Name="_MouseEnterStoryboard" Storyboard="{StaticResource Storyboard.MouseOver}"/>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard Name="_MouseExitStoryboard" Storyboard="{StaticResource Storyboard.MouseExit}"/>
                    </Trigger.ExitActions>
                </MultiTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsEnabled" Value="False"/>
                    </MultiTrigger.Conditions>
                    <Trigger.EnterActions>
                        <StopStoryboard BeginStoryboardName="_MouseEnterStoryboard"/>
                        <StopStoryboard BeginStoryboardName="_MouseExitStoryboard"/>
                        <BeginStoryboard x:Name="_DisabledStoryboard" Storyboard="{StaticResource Storyboard.Disabled}"/>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard Storyboard="{StaticResource Storyboard.MouseExit}"/>
                    </Trigger.ExitActions>
                </MultiTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

    </UserControl.Resources>
    <Viewbox>
        <Grid>
            <Grid x:Name="_OrbitsGrid" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <Grid x:Name="_SystemOrbitsGrid"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <Grid x:Name="_JumpBeaconsGrid" HorizontalAlignment="Center" VerticalAlignment="Center">
                <local:JumpBeaconControl x:Name="_TopJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Top" Angle="0"/>
                <local:JumpBeaconControl x:Name="_TopRightJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Top Right" Angle="45"/>
                <local:JumpBeaconControl x:Name="_RightJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Right" Angle="90"/>
                <local:JumpBeaconControl x:Name="_BottomRightJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Bottom Right" Angle="135"/>
                <local:JumpBeaconControl x:Name="_BottomJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Bottom" Angle="180"/>
                <local:JumpBeaconControl x:Name="_BottomLeftJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Bottom Left" Angle="225"/>
                <local:JumpBeaconControl x:Name="_LeftJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="Left" Angle="270"/>
                <local:JumpBeaconControl x:Name="_TopLeftJumpBeaconControl" Template="{StaticResource JumpBeaconTemplate}" Text="TopLeft" Angle="315"/>
            </Grid>
        </Grid>
    </Viewbox>
</UserControl>
MapOrbitsControl.xaml (10,443 bytes)   
MapOrbitsControl.cs (15,868 bytes)   
using Noesis;
using StellarConquest.Model.Actions;
using StellarConquest.Model.Core;
using StellarConquest.Model.Planets;
using StellarConquest.Model.Stars;
using StellarConquest.Model.Universe;
using System.Linq;
using UnityEngine;
using Grid = Noesis.Grid;
using GUI = Noesis.GUI;
using NoesisEventArgs = Noesis.EventArgs;

namespace StellarConquest.Presentation.Unity.UI
{
    public sealed class MapOrbitsControl : UserControl
    {
        private FrameworkElement _Root;

        private Grid _SystemOrbitsGrid;
        private Grid _OrbitsGrid;

        private Grid _JumpBeaconsGrid;
        private JumpBeaconControl _TopJumpBeaconControl;
        private JumpBeaconControl _TopRightJumpBeaconControl;
        private JumpBeaconControl _RightJumpBeaconControl;
        private JumpBeaconControl _BottomRightJumpBeaconControl;
        private JumpBeaconControl _BottomJumpBeaconControl;
        private JumpBeaconControl _BottomLeftJumpBeaconControl;
        private JumpBeaconControl _LeftJumpBeaconControl;
        private JumpBeaconControl _TopLeftJumpBeaconControl;

        private View _View;
        private int _FrameCount = 0;

        public MapOrbitsControl()
        {
            if (!Application.isPlaying)
                return;

            Initialized += OnInitialized;
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            GUI.LoadComponent(this, "Assets/User Interface/Screens/Game/Static/Map/MapOrbitsControl.xaml");

            Loaded += (sender, e) =>
            {
                _View = View;
                _View.Rendering += OnRendering;
            };
            Unloaded += (sender, e) =>
            {
                if (_View != null)
                    _View.Rendering -= OnRendering;
                _View = null;
            };

            _Root = Content as FrameworkElement;

            _SystemOrbitsGrid = _Root.FindName(nameof(_SystemOrbitsGrid)) as Grid;
            _OrbitsGrid = _Root.FindName(nameof(_OrbitsGrid)) as Grid;

            _JumpBeaconsGrid = _Root.FindName(nameof(_JumpBeaconsGrid)) as Grid;
            _TopJumpBeaconControl = _Root.FindName(nameof(_TopJumpBeaconControl)) as JumpBeaconControl;
            _TopRightJumpBeaconControl = _Root.FindName(nameof(_TopRightJumpBeaconControl)) as JumpBeaconControl;
            _RightJumpBeaconControl = _Root.FindName(nameof(_RightJumpBeaconControl)) as JumpBeaconControl;
            _BottomRightJumpBeaconControl = _Root.FindName(nameof(_BottomRightJumpBeaconControl)) as JumpBeaconControl;
            _BottomJumpBeaconControl = _Root.FindName(nameof(_BottomJumpBeaconControl)) as JumpBeaconControl;
            _BottomLeftJumpBeaconControl = _Root.FindName(nameof(_BottomLeftJumpBeaconControl)) as JumpBeaconControl;
            _LeftJumpBeaconControl = _Root.FindName(nameof(_LeftJumpBeaconControl)) as JumpBeaconControl;
            _TopLeftJumpBeaconControl = _Root.FindName(nameof(_TopLeftJumpBeaconControl)) as JumpBeaconControl;

            foreach (FrameworkElement element in _JumpBeaconsGrid.Children)
                element.MouseUp += (sender, e) => SelectJumpBeacon((StarSystemMetadata)element.Tag);
        }

        private void OnInitialized(object sender, NoesisEventArgs args)
        {
        }

        private void OnRendering(object sender, NoesisEventArgs e)
        {
            if (Visibility == Visibility.Collapsed)
                return;

            _FrameCount++;
            if (_FrameCount % 5 == 0)
                UpdateJumpBeaconEnabledState();

            // Animation to show broken culling
            float radius = SessionState.Instance.StarSystem.GetRadius();
            float hack = (Mathf.Cos(Time.timeSinceLevelLoad * 0.5f) + 1) * 0.5f + 0.2f;
            Debug.Log(hack);
            UpdateRadius(radius, hack);
        }

        private void UpdateRadius(float radius, float hack = 1.0f)
        {
            float JumpBeaconRadius = (radius + 110);
            float JumpBeaconRadiusDiagonal = JumpBeaconRadius * 0.71f;

            JumpBeaconRadius *= hack;
            JumpBeaconRadiusDiagonal *= hack;

            _TopJumpBeaconControl.X = 0;
            _TopJumpBeaconControl.Y = -JumpBeaconRadius;
            _TopRightJumpBeaconControl.X = JumpBeaconRadiusDiagonal;
            _TopRightJumpBeaconControl.Y = -JumpBeaconRadiusDiagonal;
            _RightJumpBeaconControl.X = JumpBeaconRadius;
            _RightJumpBeaconControl.Y = 0;
            _BottomRightJumpBeaconControl.X = JumpBeaconRadiusDiagonal;
            _BottomRightJumpBeaconControl.Y = JumpBeaconRadiusDiagonal;
            _BottomJumpBeaconControl.X = 0;
            _BottomJumpBeaconControl.Y = JumpBeaconRadius;
            _BottomLeftJumpBeaconControl.X = -JumpBeaconRadiusDiagonal;
            _BottomLeftJumpBeaconControl.Y = JumpBeaconRadiusDiagonal;
            _LeftJumpBeaconControl.X = -JumpBeaconRadius;
            _LeftJumpBeaconControl.Y = 0;
            _TopLeftJumpBeaconControl.X = -JumpBeaconRadiusDiagonal;
            _TopLeftJumpBeaconControl.Y = -JumpBeaconRadiusDiagonal;
        }

        private void SelectJumpBeacon(StarSystemMetadata metadata)
        {
            if (!PickingManager.Instance.InteractionFired && !UIStateMachine.Instance.IsCursorOverUI && !UIStateMachine.Instance.IsPrimaryOverlayVisible)
                if (SessionState.Instance.Player.Location.IsPlayerInStellarShip)
                {
                    if (SessionState.Instance.Ship.FuelValue >= SessionState.Instance.Ship.FuelConsumption)
                    {
                        PickingManager.Instance.InteractionFired = true;
                        UIStateMachine.Instance.GameScreen.TargetingControl.SelectTarget(SessionState.Instance.Ship.InstanceId, true, false);
                        UIJumpAction jumpAction = new UIJumpAction(SessionState.Instance.Galaxy.InstanceId, metadata.Id);
                        jumpAction.ExecuteServerSide();

                    }
                    else
                        UIStateMachine.Instance.GameScreen.ShowMessage(StatusActionType.Navigation, "INSUFFICIENT FUEL");
                }
        }

        public void SetVisibility(bool visible)
        {
            if (visible)
                Visibility = Visibility.Visible;
            else
                Visibility = Visibility.Collapsed;
        }

        public void Update()
        {
            if (Visibility == Visibility.Collapsed)
                return;

            float radius = SessionState.Instance.StarSystem.GetRadius();
            UpdateRadius(radius);

            // system orbits
            _SystemOrbitsGrid.Children.Clear();

            Ellipse innerStarSystemRadius = new Ellipse();
            innerStarSystemRadius.Width = radius * 2;
            innerStarSystemRadius.Height = radius * 2;
            innerStarSystemRadius.Stroke = FindResource("SystemOrbitStrokeBrush") as SolidColorBrush;
            innerStarSystemRadius.StrokeThickness = (float)FindResource("SystemOrbitStrokeThickness");
            innerStarSystemRadius.StrokeDashArray = "13,13";
            _SystemOrbitsGrid.Children.Add(innerStarSystemRadius);

            Ellipse outerStarSystemRadius = new Ellipse();
            outerStarSystemRadius.Width = (radius + Constants.Universe.JumpRegionRadius) * 2;
            outerStarSystemRadius.Height = (radius + Constants.Universe.JumpRegionRadius) * 2;
            outerStarSystemRadius.Stroke = FindResource("SystemOrbitStrokeBrush") as SolidColorBrush;
            outerStarSystemRadius.StrokeThickness = (float)FindResource("SystemOrbitStrokeThickness");
            outerStarSystemRadius.StrokeDashArray = "25,25";
            _SystemOrbitsGrid.Children.Add(outerStarSystemRadius);

            // orbits
            _OrbitsGrid.Children.Clear();

            if (SessionState.Instance.StarSystem.CountStars > 0 && SessionState.Instance.StarSystem.StarType != StarType.BlackHole)
            {
                foreach (BasePlanet planet in SessionState.Instance.StarSystem.Planets)
                {
                    int distance = (int)(2 * Vector3.Distance(Vector3.zero, planet.Position.Convert()));

                    Ellipse ellipse = new Ellipse();
                    ellipse.Width = distance;
                    ellipse.Height = distance;
                    ellipse.Stroke = FindResource("OrbitStrokeBrush") as SolidColorBrush;
                    ellipse.StrokeThickness = (float)FindResource("OrbitStrokeThickness");

                    _OrbitsGrid.Children.Add(ellipse);
                }
            }
            else if (SessionState.Instance.StarSystem.StarType == StarType.BlackHole)
            {
                Ellipse midpointSystemRadius = new Ellipse();
                midpointSystemRadius.Width = radius * 0.66f;
                midpointSystemRadius.Height = radius * 0.66f;
                midpointSystemRadius.Stroke = FindResource("SystemOrbitStrokeBrush") as SolidColorBrush;
                midpointSystemRadius.StrokeThickness = (float)FindResource("SystemOrbitStrokeThickness");
                midpointSystemRadius.StrokeDashArray = "13,13";
                _SystemOrbitsGrid.Children.Add(midpointSystemRadius);
            }
            else
            {
                if (SessionState.Instance.StarSystem.CountPlanets == 0)
                {
                    Ellipse midpointSystemRadius = new Ellipse();
                    midpointSystemRadius.Width = radius * 0.5f;
                    midpointSystemRadius.Height = radius * 0.5f;
                    midpointSystemRadius.Stroke = FindResource("SystemOrbitStrokeBrush") as SolidColorBrush;
                    midpointSystemRadius.StrokeThickness = (float)FindResource("SystemOrbitStrokeThickness");
                    midpointSystemRadius.StrokeDashArray = "13,13";
                    _SystemOrbitsGrid.Children.Add(midpointSystemRadius);
                }
            }

            // jump gates
            Location location = SessionState.Instance.Location;

            //if (location.CanMoveTop())
            {
                _TopJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.Top.Id);

                _TopJumpBeaconControl.Text = "T"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _TopJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_TopJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveTopRight())
            {
                _TopRightJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.TopRight.Id);
                _TopRightJumpBeaconControl.Text = "TR"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _TopRightJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_TopRightJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveRight())
            {
                _RightJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.Right.Id);
                _RightJumpBeaconControl.Text = "R"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _RightJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_RightJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveBottomRight())
            {
                _BottomRightJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.BottomRight.Id);
                _BottomRightJumpBeaconControl.Text = "BR"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _BottomRightJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_BottomRightJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveBottom())
            {
                _BottomJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.Bottom.Id);
                _BottomJumpBeaconControl.Text = "B"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _BottomJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_BottomJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveBottomLeft())
            {
                _BottomLeftJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.BottomLeft.Id);
                _BottomLeftJumpBeaconControl.Text = "BL"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _BottomLeftJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_BottomLeftJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveLeft())
            {
                _LeftJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.Left.Id);
                _LeftJumpBeaconControl.Text = "L"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _LeftJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_LeftJumpBeaconControl.Visibility = Visibility.Collapsed;

            //if (location.CanMoveTopLeft())
            {
                _TopLeftJumpBeaconControl.Visibility = Visibility.Visible;
                StarSystemMetadata connectionMetadata = SessionState.Instance.StarSystem.ConnectionsMetadata.FirstOrDefault(
                    a => a.Id == location.AbsolutePosition.TopLeft.Id);
                _TopLeftJumpBeaconControl.Text = "TL"; // connectionMetadata.Name != null ? connectionMetadata.Name : "Unknown";
                _TopLeftJumpBeaconControl.Tag = connectionMetadata;
            }
            //else
                //_TopLeftJumpBeaconControl.Visibility = Visibility.Collapsed;
        }

        public void UpdateJumpBeaconEnabledState()
        {
            foreach (FrameworkElement element in _JumpBeaconsGrid.Children)
                if (GameState.Instance.PlayerShip != null)
                    element.IsEnabled = GameState.Instance.PlayerShip.ShipController.CanJump();
                else
                    element.IsEnabled = false;
        }
    }
}
MapOrbitsControl.cs (15,868 bytes)   
image.png (100,172 bytes)   
image.png (100,172 bytes)   
PlatformAny

Activities

stonstad

stonstad

2025-06-20 20:35

reporter   ~0010856

Here is another video showing the behavior. I was mistaken. It is not associated with aspect ratio. It appears to be associated with resolution. https://stellarconquest.blob.core.windows.net/tmp/noesis/BadCulling2.mp4

stonstad

stonstad

2025-06-20 21:01

reporter   ~0010857

Now that I'm aware of the behavior I tested other gameplay mechanics which use World UI.

Everything using World UI is broken across the board.

Images 1 & 2 are with Noesis 3.2.8
Images 3 & 4 are with Noesis 3.2.4.

I downgraded and the missing functionality returned.

image-2.png (2,447,156 bytes)
image-3.png (2,588,575 bytes)
image-4.png (2,540,405 bytes)
image-5.png (2,693,724 bytes)
jsantos

jsantos

2025-06-23 13:03

manager   ~0010860

I see the glitch in the video very clearly, but I am confused with the images (you also mention Images 1, but that's not attached). You saying that this feature was working in 3.2.4 and it is broken in 3.2.8?

How easy would it be for you to reproduce this in a separate mini project we could debug?

Thank you!

stonstad

stonstad

2025-06-24 22:15

reporter   ~0010863

Last edited: 2025-06-24 22:16

Private reproduction included above. Just hit play and it will manifest. RE: images above were misnumbered.

jsantos

jsantos

2025-06-25 12:03

manager   ~0010864

Thank you!

stonstad

stonstad

2025-07-01 13:29

reporter   ~0010890

Hey guys -- I totally don't want to nag. I'm just REALLY excited to use 3.2.8 because it is allocation free. Is it possible there is a work-around for the above behavior?

sfernandez

sfernandez

2025-07-03 12:22

manager   ~0010897

Hello, we have an idea of the source of the problem. We're looking into it to properly fix it.

stonstad

stonstad

2025-07-22 18:00

reporter   ~0010925

Hey guys. Any updates on this bug? It's a blocker for my upgrade to 3.2.8.

Thanks,
Shaun

sfernandez

sfernandez

2025-07-23 12:42

manager   ~0010928

Hi, we still don't have the definitive fix, but I generated a patched library with a solution for both 0004269 and #4237 so you can test it:
https://drive.google.com/file/d/1IJlY_OsA5AsdEyBXIlt3frP3hUNvA-sS/view?usp=sharing

Please let us know if it solved your issues.

stonstad

stonstad

2025-07-23 16:07

reporter   ~0010929

Thanks, Sergio! Both behaviors appear to be fixed.

If I see a regression I'll reopen the corresponding ticket.

Issue History

Date Modified Username Field Change
2025-06-20 20:14 stonstad New Issue
2025-06-20 20:14 stonstad File Added: MapOrbitsControl.xaml
2025-06-20 20:14 stonstad File Added: MapOrbitsControl.cs
2025-06-20 20:14 stonstad File Added: image.png
2025-06-20 20:16 stonstad Description Updated
2025-06-20 20:35 stonstad Note Added: 0010856
2025-06-20 21:01 stonstad Note Added: 0010857
2025-06-20 21:01 stonstad File Added: image-2.png
2025-06-20 21:01 stonstad File Added: image-3.png
2025-06-20 21:01 stonstad File Added: image-4.png
2025-06-20 21:01 stonstad File Added: image-5.png
2025-06-23 12:59 jsantos Assigned To => jsantos
2025-06-23 12:59 jsantos Status new => assigned
2025-06-23 12:59 jsantos Target Version => 3.2.9
2025-06-23 13:03 jsantos Note Added: 0010860
2025-06-23 13:03 jsantos Status assigned => feedback
2025-06-24 22:15 stonstad Status feedback => assigned
2025-06-24 22:15 stonstad Note Added: 0010863
2025-06-24 22:16 stonstad Note Edited: 0010863
2025-06-25 12:03 jsantos Note Added: 0010864
2025-07-01 13:29 stonstad Note Added: 0010890
2025-07-03 12:22 sfernandez Note Added: 0010897
2025-07-22 18:00 stonstad Note Added: 0010925
2025-07-23 12:42 sfernandez Status assigned => feedback
2025-07-23 12:42 sfernandez Note Added: 0010928
2025-07-23 16:07 stonstad Note Added: 0010929
2025-07-23 16:07 stonstad Status feedback => assigned
2025-08-06 13:34 jsantos Status assigned => resolved
2025-08-06 13:34 jsantos Resolution open => fixed
2025-08-06 13:34 jsantos Fixed in Version => 3.2.9
2025-10-10 13:29 jsantos Category Unity3D => Unity