void eventSource3D_MouseLeave(object sender, Ab3d.DirectX.Common.EventManager3D.Mouse3DEventArgs e)
        {
            Log("MouseLeave: " + (e.RayHitResult != null ? e.RayHitResult.HitSceneNode.ToString() : "<null>"));

            // Note that the e.RayHitResult.HitSceneNode is set to the new hit object (object that is hit when we left the previously entered object)
            // Therefore we cannot use this to change the color.

            if (_selectedInstanceIndex != -1)
            {
                ChangeInstanceColor(_selectedInstanceIndex, Colors.Yellow);
            }
            else if (_selectedGeometryModel3D != null)
            {
                _selectedGeometryModel3D.Material = new DiffuseMaterial(new SolidColorBrush(Colors.Yellow));
            }
            else if (_selectedVisual3D != null)
            {
                ChangeColor(_selectedVisual3D, Colors.Yellow);
            }


            _selectedVisual3D      = null;
            _selectedInstanceIndex = -1;

            if (_wireCrossVisual3D != null)
            {
                MainViewport3D.Children.Remove(_wireCrossVisual3D);
            }
        }
        private void ChangeColor(Ab3d.DirectX.Common.EventManager3D.Mouse3DEventArgs e, System.Windows.Media.Color color)
        {
            var wpfGeometryModel3DNode = e.RayHitResult.HitSceneNode as WpfGeometryModel3DNode;

            if (wpfGeometryModel3DNode != null)
            {
                wpfGeometryModel3DNode.GeometryModel3D.Material = new DiffuseMaterial(new SolidColorBrush(color));
            }
            else
            {
                var hitVisual3D = e.RayHitResult.HitSceneNode.GetVisual3D();
                ChangeColor(hitVisual3D, color);
            }
        }
        void eventSource3D_MouseEnter(object sender, Ab3d.DirectX.Common.EventManager3D.Mouse3DEventArgs e)
        {
            if (e.RayHitResult != null)
            {
                Log("MouseEnter: " + e.RayHitResult.HitSceneNode);

                // We need to save the hit SceneNode.
                // This way we will be able to change the material back in the eventSource3D_MouseLeave event handler.
                _selectedVisual3D = e.RayHitResult.HitSceneNode.GetVisual3D();

                var wpfGeometryModel3DNode = e.RayHitResult.HitSceneNode as WpfGeometryModel3DNode;
                if (wpfGeometryModel3DNode != null)
                {
                    _selectedGeometryModel3D = wpfGeometryModel3DNode.GeometryModel3D;
                }
                else
                {
                    _selectedGeometryModel3D = null;
                }


                var dxRayInstancedHitTestResult = e.RayHitResult as DXRayInstancedHitTestResult;
                if (dxRayInstancedHitTestResult != null)
                {
                    _selectedInstanceIndex = dxRayInstancedHitTestResult.HitInstanceIndex;
                }


                if (_wireCrossVisual3D == null)
                {
                    _wireCrossVisual3D = new WireCrossVisual3D()
                    {
                        LineColor     = Colors.DeepPink,
                        LineThickness = 2,
                        LinesLength   = 10
                    };
                }

                _wireCrossVisual3D.Position = e.RayHitResult.HitPosition.ToWpfPoint3D();

                if (!MainViewport3D.Children.Contains(_wireCrossVisual3D))
                {
                    MainViewport3D.Children.Add(_wireCrossVisual3D);
                }
            }
            else
            {
                _selectedVisual3D        = null;
                _selectedGeometryModel3D = null;
                _selectedInstanceIndex   = -1;

                Log("MouseEnter: <null>");
                return;
            }

            if (_selectedInstanceIndex != -1)
            {
                ChangeInstanceColor(_selectedInstanceIndex, Colors.Red);
            }
            else
            {
                ChangeColor(e, Colors.Red);
            }
        }