- matt.rudder
- Posts: 21
- Joined:
- Location: San Francisco, CA
- Contact:
Debugging crashes in Unity with NoesisGUI
Hey guys,
I'm running into a crash manipulating one of my UIs, and I'm trying find out what the issue is. It looks like the crash happens right after calling ScrollViewer.ScrollToHorizontalOffset. This makes me curious about a couple things.
First, is there anyway to shield Unity from errors in NoesisGUI? Right now a single binding or API getting invalid input takes down the entire editor process, which makes iteration a bit of a pain.
Second, I noticed a log file in the bin folder of the SDK. Is that from the runtime of NoesisGUI? I tried to get some information from that about my crash, but it doesn't look like it's plain text file. Do you have a custom application for viewing these logs? If so, are there plans to include this with the SDK so we can view them?
Here is stack trace that shows up in the Unity crash reporter logs:
XAML:
ScrollViewDragger.cs:
I'm running into a crash manipulating one of my UIs, and I'm trying find out what the issue is. It looks like the crash happens right after calling ScrollViewer.ScrollToHorizontalOffset. This makes me curious about a couple things.
First, is there anyway to shield Unity from errors in NoesisGUI? Right now a single binding or API getting invalid input takes down the entire editor process, which makes iteration a bit of a pain.
Second, I noticed a log file in the bin folder of the SDK. Is that from the runtime of NoesisGUI? I tried to get some information from that about my crash, but it doesn't look like it's plain text file. Do you have a custom application for viewing these logs? If so, are there plans to include this with the SDK so we can view them?
Here is stack trace that shows up in the Unity crash reporter logs:
Code: Select all
(0x28333960) (Noesis): (filename not available): Noesis::Gui::ScrollContentPresenter::SetHorizontalOffset + 0x0
(0x1FAFC416) (Mono JIT code): (filename not available): (wrapper delegate-invoke) Noesis.NoesisUnityPINVOKE/Point_SetXDelegate:invoke_void__this___HandleRef_single (System.Runtime.InteropServices.HandleRef,single) + 0x1ae (1FAFC268 1FAFC42D) [07EB6BD0 - Unity Child Domain] + 0x0
(0x1FAFD7E0) (Mono JIT code): (filename not available): Noesis.NoesisUnityPINVOKE:ScrollViewer_ScrollToHorizontalOffset (System.Runtime.InteropServices.HandleRef,single) + 0x58 (1FAFD788 1FAFD7F7) [07EB6BD0 - Unity Child Domain] + 0x0
(0x1FAFD762) (Mono JIT code): (filename not available): Noesis.ScrollViewer:ScrollToHorizontalOffset (single) + 0x52 (1FAFD710 1FAFD779) [07EB6BD0 - Unity Child Domain] + 0x0
(0x1FAFA92A) (Mono JIT code): (filename not available): ScrollViewDragger:OnPreviewMouseMove (Noesis.BaseComponent,Noesis.MouseEventArgs) + 0x26a (1FAFA6C0 1FAFA941) [07EB6BD0 - Unity Child Domain] + 0x0
(0x1FAFA3AC) (Mono JIT code): (filename not available): Noesis.UIElement:RaisePreviewMouseMove (intptr,intptr) + 0xbc (1FAFA2F0 1FAFA3C3) [07EB6BD0 - Unity Child Domain] + 0x0
(0x1A480170) (Mono JIT code): (filename not available): (wrapper native-to-managed) Noesis.UIElement:RaisePreviewMouseMove (intptr,intptr) + 0xa0 (1A4800D0 1A480189) [07EB6BD0 - Unity Child Domain] + 0x0
(0x28481B84) (Noesis): (filename not available): CSharp_BindEventTimelineCompleted + 0x134
(0x28374659) (Noesis): (filename not available): Noesis::Gui::UIElement::TunnelingEvent + 0x49
(0x28371FB6) (Noesis): (filename not available): Noesis::Gui::UIElement::RaiseEvent + 0x36
(0x282F6D45) (Noesis): (filename not available): Noesis::Gui::Mouse::Move + 0x95
(0x284829E9) (Noesis): (filename not available): Noesis_MouseMove + 0x19
(0x1FAF67C9) (Mono JIT code): (filename not available): (wrapper delegate-invoke) Noesis.UIRenderer/MouseMoveDelegate:invoke_void__this___intptr_single_single (intptr,single,single) + 0x159 (1FAF6670 1FAF67E0) [07EB6BD0 - Unity Child Domain] + 0x0
(0x1FAF6653) (Mono JIT code): (filename not available): No
Code: Select all
<Border xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border.Resources>
<ResourceDictionary>
<!-- ListBox Style -->
<Style TargetType="{x:Type ListBox}">
<Setter Property="UseLayoutRounding" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="Foreground" Value="Transparent"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border
Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="1"
CornerRadius="2"
UseLayoutRounding="True">
<ScrollViewer
x:Name="Scroller"
Margin="{TemplateBinding Padding}"
Focusable="false"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
CanContentScroll="{TemplateBinding ScrollViewer.CanContentScroll}">
<ItemsPresenter UseLayoutRounding="{TemplateBinding UseLayoutRounding}"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="SelectionItem" TargetType="{x:Type ListBoxItem}">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<DockPanel LastChildFill="True" Width="128" Height="128" Margin="8,0,0,0">
<ContentPresenter DockPanel.Dock="Bottom" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Border Background="#F2B600">
<TextBlock Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="32">?</TextBlock>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
</ResourceDictionary>
</Border.Resources>
<ListBox x:Name="MyList">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
</ListBox>
</Border>
Code: Select all
using UnityEngine;
using Noesis;
public class ScrollViewDragger : MonoBehaviour
{
public float m_friction = 0.2f;
// Use this for initialization
void Start()
{
m_scrollTarget = new Point();
m_scrollStartPoint = new Pointi();
m_scrollStartOffset = new Point();
m_velocity = new Point();
m_previousPos = new Pointi();
var gui = GetComponent<NoesisGUIPanel>();
m_grid = gui.GetRoot<Grid>();
m_picker = m_grid.FindName<ListBox>("MyList");
if (m_picker != null)
{
var template = m_picker.GetTemplate();
var scroller = template.FindName("Scroller");
m_scrollViewer = scroller.As<ScrollViewer>();
m_picker.PreviewMouseDown += OnPreviewMouseDown;
m_picker.PreviewMouseMove += OnPreviewMouseMove;
m_picker.PreviewMouseUp += OnPreviewMouseUp;
}
}
void OnPreviewMouseUp(BaseComponent sender, MouseButtonEventArgs e)
{
Debug.Log("OnPreviewMouseUp: IsMouseCaptured=" + m_grid.GetIsMouseCaptured());
if (m_mouseCaptured)//m_grid.GetIsMouseCaptured())
{
m_mouseCaptured = false;
//m_grid.ReleaseMouseCapture();
Debug.Log("OnPreviewMouseUp: MouseCaptureReleased!");
}
}
void OnPreviewMouseDown(BaseComponent sender, MouseButtonEventArgs e)
{
Debug.Log("OnPreviewMouseDown: mouse over=" + m_picker.GetIsMouseOver());
if (m_picker.GetIsMouseOver())
{
m_scrollStartPoint = m_picker.GetMouse().GetPosition();
m_scrollStartOffset.x = m_scrollViewer.GetHorizontalOffset();
m_scrollStartOffset.y = m_scrollViewer.GetVerticalOffset();
m_mouseCaptured = true;
//if (m_grid.CaptureMouse())
// Debug.Log("OnPreviewMouseDown: Mouse captured!");
}
}
void OnPreviewMouseMove(BaseComponent sender, MouseEventArgs e)
{
//Debug.Log("OnPreviewMouseMove: IsMouseCaptured=" + m_grid.GetIsMouseCaptured());
if (m_mouseCaptured)//m_grid.GetIsMouseCaptured())
{
Point currentPoint = e.position;
Point delta = new Point(m_scrollStartPoint.x - currentPoint.x, m_scrollStartPoint.y - currentPoint.y);
m_scrollTarget.x = m_scrollStartOffset.x + delta.x;
m_scrollTarget.y = m_scrollStartOffset.y + delta.y;
Debug.Log(string.Format("OnPreviewMouseMove: scrollTarget.x={0}", m_scrollTarget.x));
m_scrollViewer.ScrollToHorizontalOffset(Mathf.Clamp(m_scrollTarget.x, 0f, m_scrollViewer.GetExtentWidth() - m_scrollViewer.GetViewportWidth()));
}
}
// Update is called once per frame
void Update()
{
if (m_mouseCaptured)//m_grid.GetIsMouseCaptured())
{
Pointi currentPos = m_picker.GetMouse().GetPosition();
//Vector3 currentPos = Input.mousePosition;
m_velocity.x = m_previousPos.x - currentPos.x;
m_velocity.y = m_previousPos.y - currentPos.y;
m_previousPos = currentPos;
}
else
{
if (!Mathf.Approximately(m_velocity.x, 0.0f))
{
float friction = 1.0f - Mathf.Clamp(m_friction, 0f, 1f);
m_scrollViewer.ScrollToHorizontalOffset(Mathf.Clamp(m_scrollTarget.x, 0f, m_scrollViewer.GetExtentWidth() - m_scrollViewer.GetViewportWidth()));
m_scrollTarget.x += m_velocity.x;
m_velocity.x *= friction;
m_velocity.y *= friction;
}
}
}
ListBox m_picker;
Pointi m_scrollStartPoint;
Point m_scrollStartOffset;
Point m_scrollTarget;
Point m_velocity;
Pointi m_previousPos;
Grid m_grid;
bool m_mouseCaptured;
ScrollViewer m_scrollViewer;
}
-
sfernandez
Site Admin
- Posts: 2997
- Joined:
Re: Debugging crashes in Unity with NoesisGUI
Hi,
Native unhandled exceptions are not being catched right now, and this could be the reason of Unity Editor process shutdown. We are working on this issue and expect to be fixed for the next release.
The log file you found in SDK bin path is generated when you execute any of the applications you find there (XamlPlayer, BuildTool, ..), it is not related with Unity playing NoesisGUI. We made changes recently to generate log files also when playing NoesisGUI in Unity, that will be found in the root directory of the Unity project being used (also available in next release). This log files can be opened with our NoesisConsole tool that will be distributed with professional versions. The tool includes memory and cpu profilers to detect bottlenecks in the user interfaces being drawn.
About the error you are suffering, it is obviously a bug in our code that we will try to fix as soon as possible. But there is something I don't understand in your code, or at least, I think it is not correct. You are getting the ScrollViewer from the Template of the ListBox like this:
That ScrollViewer object instance is part of the ListBox template VisualTree, but it is not the one that was generated for your ListBox instance. Any time a template is applied to a control, a new instantiation of the template VisualTree is done, and assigned to the control. You cannot access those objects via template.FindName. You must get control visual child (that would be the root of the VisualTree instantiation for that control), and perform the FindName there.
Maybe we could add some FindTemplateName() helper function to simplify this process.
If you don't understand this part don't hesitate to ask because it is a bit hard to explain
Native unhandled exceptions are not being catched right now, and this could be the reason of Unity Editor process shutdown. We are working on this issue and expect to be fixed for the next release.
The log file you found in SDK bin path is generated when you execute any of the applications you find there (XamlPlayer, BuildTool, ..), it is not related with Unity playing NoesisGUI. We made changes recently to generate log files also when playing NoesisGUI in Unity, that will be found in the root directory of the Unity project being used (also available in next release). This log files can be opened with our NoesisConsole tool that will be distributed with professional versions. The tool includes memory and cpu profilers to detect bottlenecks in the user interfaces being drawn.
About the error you are suffering, it is obviously a bug in our code that we will try to fix as soon as possible. But there is something I don't understand in your code, or at least, I think it is not correct. You are getting the ScrollViewer from the Template of the ListBox like this:
Code: Select all
var template = m_picker.GetTemplate();
var scroller = template.FindName("Scroller");
m_scrollViewer = scroller.As<ScrollViewer>();
Code: Select all
FrameworkElement child = VisualTreeHelper.GetChild(m_picker, 0).As<FrameworkElement>();
m_scrollViewer = child.FindName<ScrollViewer>("Scroller");
If you don't understand this part don't hesitate to ask because it is a bit hard to explain
- matt.rudder
- Posts: 21
- Joined:
- Location: San Francisco, CA
- Contact:
Re: Debugging crashes in Unity with NoesisGUI
Ok, great. The profiling tool sounds particularly useful!
I believe I tried the VisualTreeHelper route initially before landing on the GetTemplate route. Calling VisualTreeHelper.GetChild results in a crash in my test scene, unfortunately.
I believe I tried the VisualTreeHelper route initially before landing on the GetTemplate route. Calling VisualTreeHelper.GetChild results in a crash in my test scene, unfortunately.
Code: Select all
(0x0ADC10C1) c:\buildagent\work\14c008c4a873643b\eglib\src\goutput.c (159 + 0x2): g_logv + 0x6f
(0x0ADC10E3) c:\buildagent\work\14c008c4a873643b\eglib\src\goutput.c (169 + 0x16): g_log + 0x16
(0x0C2E0066) ((module-name not available)): (filename not available): (function-name not available) + 0x0
(0x1DE2640F) (Mono JIT code): (filename not available): (wrapper delegate-invoke) Noesis.NoesisUnityPINVOKE/VisualTreeHelper_GetChildDelegate:invoke_intptr__this___HandleRef_uint (System.Runtime.InteropServices.HandleRef,uint) + 0x19f (1DE26270 1DE26426) [081E6BD0 - Unity Child Domain] + 0x0
(0x1DE26252) (Mono JIT code): (filename not available): Noesis.NoesisUnityPINVOKE:VisualTreeHelper_GetChild (System.Runtime.InteropServices.HandleRef,uint) + 0x5a (1DE261F8 1DE2626F) [081E6BD0 - Unity Child Domain] + 0x0
(0x1DE26048) (Mono JIT code): (filename not available): Noesis.VisualTreeHelper:GetChild (Noesis.Visual,uint) + 0x58 (1DE25FF0 1DE260ED) [081E6BD0 - Unity Child Domain] + 0x0
(0x1DE24ADA) (Mono JIT code): (filename not available): ScrollViewDragger:Start () + 0x212 (1DE248C8 1DE24C57) [081E6BD0 - Unity Child Domain] + 0x0
(0x0A18BE1F) (Mono JIT code): (filename not available): (wrapper runtime-invoke) object:runtime_invoke_void__this__ (object,intptr,intptr,intptr) + 0x8f (0A18BD90 0A18BEEA) [081E6BD0 - Unity Child Domain] + 0x0
(0x0AEAFF9C) c:\buildagent\work\14c008c4a873643b\mono\mini\mini.c (4889 + 0xc): mono_jit_runtime_invoke + 0x214
(0x0AE1EBBE) c:\buildagent\work\14c008c4a873643b\mono\metadata\object.c (2615 + 0x10): mono_runtime_invoke + 0x51
(0x00804386) c:\buildagent\work\7535de4ca26c26ac\runtime\mono\monoutility.h (448 + 0x10): mono_runtime_invoke_profiled_fast + 0x86
(0x0080616A) c:\buildagent\work\7535de4ca26c26ac\runtime\mono\monobehaviour.cpp (860 + 0xf): MonoBehaviour::InvokeMethodOrCoroutineChecked + 0x6a
(0x00806539) c:\buildagent\work\7535de4ca26c26ac\runtime\mono\monobehaviour.cpp (952 + 0x0): MonoBehaviour::InvokeMethodOrCoroutineChecked + 0x99
(0x00806DCB) c:\buildagent\work\7535de4ca26c26ac\runtime\mono\monobehaviour.cpp (559 + 0xa): MonoBehaviour::Start + 0xdb
(0x006ADD9E) c:\buildagent\work\7535de4ca26c26ac\runtime\gamecode\calldelayed.cpp (164 + 0xb): DelayedCallManager::Update + 0x16e
(0x00795DAD) c:\buildagent\work\7535de4ca26c26ac\runtime\misc\player.cpp (1605 + 0x0): PlayerLoop + 0x1cd
(0x00DDD156) c:\buildagent\work\7535de4ca26c26ac\editor\src\application.cpp (2167 + 0xb): Application::UpdateScene + 0x216
(0x00DE0DCF) c:\buildagent\work\7535de4ca26c26ac\editor\src\application.cpp (2341 + 0x0): Application::SetIsPlaying + 0x31f
(0x00DE61B3) c:\buildagent\work\7535de4ca26c26ac\editor\src\application.cpp (1274 + 0x0): Application::TickTimer + 0x773
(0x00E68AC2) c:\buildagent\work\7535de4ca26c26ac\editor\platform\windows\wineditormain.cpp (335 + 0x0): MainMessageLoop + 0x1c2
(0x00E699AC) c:\buildagent\work\7535de4ca26c26ac\editor\platform\windows\wineditormain.cpp (834 + 0x0): WinMain + 0xddc
(0x00F7374F) f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c (275 + 0x1c): __tmainCRTStartup + 0x11a
(0x76EC33AA) (kernel32): (filename not available): BaseThreadInitThunk + 0x12
(0x77C39EF2) (ntdll): (filename not available): RtlInitializeExceptionChain + 0x63
(0x77C39EC5) (ntdll): (filename not available): RtlInitializeExceptionChain + 0x36
-
sfernandez
Site Admin
- Posts: 2997
- Joined:
Re: Debugging crashes in Unity with NoesisGUI
The VisualTreeHelper route is the correct way to access template children. We will solve this bug as soon as possible.
-
sfernandez
Site Admin
- Posts: 2997
- Joined:
Re: Debugging crashes in Unity with NoesisGUI
The ScrollContentPresenter.SetHorizontalOffset() bug was found and solved
Will be fixed in the following release.
About the VisualTreeHelper.GetChild() bug, I was unable to reproduce it. The code I posted:
...was working fine for me.
Could you post the script that produced the last error?
Will be fixed in the following release.
About the VisualTreeHelper.GetChild() bug, I was unable to reproduce it. The code I posted:
Code: Select all
FrameworkElement child = VisualTreeHelper.GetChild(m_picker, 0).As<FrameworkElement>();
m_scrollViewer = child.FindName<ScrollViewer>("Scroller");
Could you post the script that produced the last error?
- matt.rudder
- Posts: 21
- Joined:
- Location: San Francisco, CA
- Contact:
Re: Debugging crashes in Unity with NoesisGUI
Sure, here it is. Still a bit in progress as I was debugging some issues with it. I couldn't get the mouse capture behavior working correctly either, but I might have been doing something wrong.
Here's the test XAML for it:
Code: Select all
using UnityEngine;
using Noesis;
public class ScrollViewDragger : MonoBehaviour
{
public float m_friction = 0.2f;
public string m_listBoxName = "MyList";
// Use this for initialization
void Start()
{
m_scrollTarget = new Point();
m_scrollStartPoint = new Pointi();
m_scrollStartOffset = new Point();
m_velocity = new Point();
m_previousPos = new Pointi();
var gui = GetComponent<NoesisGUIPanel>();
m_grid = gui.GetRoot<Grid>();
m_picker = m_grid.FindName<ListBox>(m_listBoxName);
if (m_picker != null)
{
FrameworkElement child = VisualTreeHelper.GetChild(m_picker, 0).As<FrameworkElement>();
m_scrollViewer = child.FindName<ScrollViewer>("Scroller");
m_picker.PreviewMouseDown += OnPreviewMouseDown;
m_picker.PreviewMouseMove += OnPreviewMouseMove;
m_picker.PreviewMouseUp += OnPreviewMouseUp;
}
}
void OnPreviewMouseUp(BaseComponent sender, MouseButtonEventArgs e)
{
Debug.Log("OnPreviewMouseUp: IsMouseCaptured=" + m_grid.GetIsMouseCaptured());
if (m_mouseCaptured)//m_grid.GetIsMouseCaptured())
{
m_mouseCaptured = false;
//m_grid.ReleaseMouseCapture();
Debug.Log("OnPreviewMouseUp: MouseCaptureReleased!");
}
}
void OnPreviewMouseDown(BaseComponent sender, MouseButtonEventArgs e)
{
Debug.Log("OnPreviewMouseDown: mouse over=" + m_picker.GetIsMouseOver());
if (m_picker.GetIsMouseOver())
{
m_scrollStartPoint = m_picker.GetMouse().GetPosition();
m_scrollStartOffset.x = m_scrollViewer.GetHorizontalOffset();
m_scrollStartOffset.y = m_scrollViewer.GetVerticalOffset();
m_mouseCaptured = true;
//if (m_grid.CaptureMouse())
// Debug.Log("OnPreviewMouseDown: Mouse captured!");
}
}
void OnPreviewMouseMove(BaseComponent sender, MouseEventArgs e)
{
//Debug.Log("OnPreviewMouseMove: IsMouseCaptured=" + m_grid.GetIsMouseCaptured());
if (m_mouseCaptured)//m_grid.GetIsMouseCaptured())
{
Point currentPoint = e.position;
Point delta = new Point(m_scrollStartPoint.x - currentPoint.x, m_scrollStartPoint.y - currentPoint.y);
m_scrollTarget.x = m_scrollStartOffset.x + delta.x;
m_scrollTarget.y = m_scrollStartOffset.y + delta.y;
Debug.Log(string.Format("OnPreviewMouseMove: scrollTarget.x={0}", m_scrollTarget.x));
//m_scrollViewer.SetBackground(Brushes.CornflowerBlue());
m_scrollViewer.ScrollToHorizontalOffset(Mathf.Clamp(m_scrollTarget.x, 0f, m_scrollViewer.GetExtentWidth() - m_scrollViewer.GetViewportWidth()));
}
}
// Update is called once per frame
void Update()
{
if (m_mouseCaptured)//m_grid.GetIsMouseCaptured())
{
Pointi currentPos = m_picker.GetMouse().GetPosition();
//Vector3 currentPos = Input.mousePosition;
m_velocity.x = m_previousPos.x - currentPos.x;
m_velocity.y = m_previousPos.y - currentPos.y;
m_previousPos = currentPos;
}
else
{
if (!Mathf.Approximately(m_velocity.x, 0.0f))
{
float friction = 1.0f - Mathf.Clamp(m_friction, 0f, 1f);
m_scrollViewer.ScrollToHorizontalOffset(Mathf.Clamp(m_scrollTarget.x, 0f, m_scrollViewer.GetExtentWidth() - m_scrollViewer.GetViewportWidth()));
//m_scrollViewer.SetBackground(Brushes.Tomato());
m_scrollTarget.x += m_velocity.x;
m_velocity.x *= friction;
m_velocity.y *= friction;
}
}
}
ListBox m_picker;
Pointi m_scrollStartPoint;
Point m_scrollStartOffset;
Point m_scrollTarget;
Point m_velocity;
Pointi m_previousPos;
Grid m_grid;
bool m_mouseCaptured;
ScrollViewer m_scrollViewer;
}
Code: Select all
<Border xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border.Resources>
<ResourceDictionary>
<!-- ListBox Style -->
<Style TargetType="{x:Type ListBox}">
<Setter Property="UseLayoutRounding" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="Foreground" Value="Transparent"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border
Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="1"
CornerRadius="2"
UseLayoutRounding="True">
<ScrollViewer
x:Name="Scroller"
Margin="{TemplateBinding Padding}"
Focusable="false"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
CanContentScroll="{TemplateBinding ScrollViewer.CanContentScroll}">
<ItemsPresenter UseLayoutRounding="{TemplateBinding UseLayoutRounding}"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="SelectionItem" TargetType="{x:Type ListBoxItem}">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<DockPanel LastChildFill="True" Width="128" Height="128" Margin="8,0,0,0">
<ContentPresenter DockPanel.Dock="Bottom" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Border Background="#F2B600">
<TextBlock Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="32">?</TextBlock>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
</ResourceDictionary>
</Border.Resources>
<ListBox x:Name="MyList">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="1" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="2" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="3" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="4" />
<ListBoxItem Style="{StaticResource SelectionItem}" Content="5" />
</ListBox>
</Border>
-
sfernandez
Site Admin
- Posts: 2997
- Joined:
Re: Debugging crashes in Unity with NoesisGUI
We found the bug that causes the crash with VisualTreeHelper::GetChild(). It was hard to track, but finally found it was related with mismatched calling conventions between native exported functions and imported function pointers in mono.
We are preparing a new release that patches this and other bugs, will be ready to download in a few hours.
We are preparing a new release that patches this and other bugs, will be ready to download in a few hours.
- matt.rudder
- Posts: 21
- Joined:
- Location: San Francisco, CA
- Contact:
Re: Debugging crashes in Unity with NoesisGUI
That's encouraging. Seems like a bug like that could cause issues all throughout the library, so I hope my reproduction steps helped.
Thanks for the update!
Thanks for the update!
-
sfernandez
Site Admin
- Posts: 2997
- Joined:
Re: Debugging crashes in Unity with NoesisGUI
Any feedback you provide is very valuable to us. Without it we could not polish our product as we are. Thank you so much.
The new version is already updated, have a try
The new version is already updated, have a try
Who is online
Users browsing this forum: No registered users and 5 guests