private static void MyCurrentCamPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ViewFrustumFunctions vf = d as ViewFrustumFunctions;
            object newVal           = e.NewValue;

            HelixToolkit.SharpDX.ProjectionCamera cam = newVal as HelixToolkit.SharpDX.ProjectionCamera;

            if (vf != null && cam != null && vf.SynchrCam)
            {
                // clear children list
                vf.Children.Clear();
                // get the size of the viewport
                double      parentH = 0;
                double      parentW = 0;
                Viewport3DX parent  = vf.Parent as Viewport3DX;
                if (parent != null)
                {
                    vf.CurrentPos = parent.CurrentPosition;
                    parentH       = parent.ActualHeight;
                    parentW       = parent.ActualWidth;
                    //var test = parent.Parent;
                }

                // add new View Frustum
                vf.DefineViewFrustum(cam, parentH, parentW);
                vf.BuildViewFrustumModel();
            }
        }
        private static void MyShowFrustumPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ViewFrustumFunctions vff = d as ViewFrustumFunctions;

            if (vff != null && vff.model != null)
            {
                if (vff.ShowFrustum)
                {
                    vff.model.Visibility = Visibility.Visible;
                }
                else
                {
                    vff.model.Visibility = Visibility.Collapsed;
                }
            }
        }
        private void CheckForVisibilitySimpleCommand(object _vff)
        {
            ViewFrustumFunctions viewFF = _vff as ViewFrustumFunctions;

            if (viewFF == null)
            {
                return;
            }

            List <BoundingBox> regions = new List <BoundingBox>();
            List <Point3D>     newPointsVisible_End = new List <Point3D>();
            List <Point3D>     newPointsVisible_Mid = new List <Point3D>();

            this.root.GetVisibleRegions(ref regions, ref newPointsVisible_End, ref newPointsVisible_Mid, viewFF);
            this.PointsVisible_End = new List <Point3D>(newPointsVisible_End);
            this.PointsVisible_Mid = new List <Point3D>(newPointsVisible_Mid);
        }
        private void CheckForVisibilityCommand(object _vff)
        {
            ViewFrustumFunctions viewFF = _vff as ViewFrustumFunctions;

            if (viewFF == null)
            {
                return;
            }

            List <BoundingBox> regions = new List <BoundingBox>();
            List <Point3D>     newPointsVisible_End = new List <Point3D>();
            List <Point3D>     newPointsVisible_Mid = new List <Point3D>();

            this.root.GetVisibleRegions(ref regions, ref newPointsVisible_End, ref newPointsVisible_Mid, viewFF);
            this.PointsVisible_End = new List <Point3D>(newPointsVisible_End);
            this.PointsVisible_Mid = new List <Point3D>(newPointsVisible_Mid);

            if (regions.Count > 0)
            {
                List <SharpDX.Matrix> instances = new List <Matrix>();
                int rn = regions.Count;
                for (int i = rn - 1; i >= 0; i--)
                {
                    BoundingBox    region     = regions[i];
                    Vector3        dimensions = region.Maximum - region.Minimum;
                    Vector3        half       = dimensions / 2f;
                    Vector3        center     = region.Minimum + half;
                    SharpDX.Matrix Sc         = SharpDX.Matrix.Scaling(dimensions - new Vector3((float)VIS_OFFSET));
                    SharpDX.Matrix Tr         = SharpDX.Matrix.Translation(center);
                    instances.Add(Sc * Tr);
                }
                this.cellVisible.Instances         = instances;
                this.cellVisible.Visibility        = Visibility.Visible;
                this.cellVisibleNormals.Instances  = instances;
                this.cellVisibleNormals.Visibility = Visibility.Visible;
            }
            else
            {
                this.cellVisible.Instances         = new List <SharpDX.Matrix>();
                this.cellVisible.Visibility        = Visibility.Hidden;
                this.cellVisibleNormals.Instances  = new List <SharpDX.Matrix>();
                this.cellVisibleNormals.Visibility = Visibility.Hidden;
            }
        }
        public void GetVisibleRegions(ref List <BoundingBox> _regions, ref List <Point3D> _pointsE, ref List <Point3D> _pointsM,
                                      ViewFrustumFunctions _vff)
        {
            if (_vff == null)
            {
                return;
            }
            if (_regions == null)
            {
                _regions = new List <BoundingBox>();
            }
            if (_pointsE == null)
            {
                _pointsE = new List <Point3D>();
            }
            if (_pointsM == null)
            {
                _pointsM = new List <Point3D>();
            }

            bool notOutside = !_vff.IsOutsideFrustum(this.region);

            if (notOutside)
            {
                _regions.Add(this.region);
                Utils.LineWHistory.LinesWH2UniqueP3D(this.nodeLines, ref _pointsE, ref _pointsM, true);

                // check deeper into the tree
                if (this.hasChildren())
                {
                    for (int flags = this.activeNodes, index = 0; flags > 0; flags >>= 1, index++)
                    {
                        if ((flags & 1) == 1)
                        {
                            this.childNodes[index].GetVisibleRegions(ref _regions, ref _pointsE, ref _pointsM, _vff);
                        }
                    }
                }
            }
        }