예제 #1
0
        private void EnsureChildren(Shape3DMaterial frontMaterial, Shape3DMaterial backMaterial)
        {
            Visual3D frontChild = EnsureChild(_frontChild, frontMaterial);
            if (frontChild != _frontChild)
            {
                if (_frontChild != null)
                {
                    RemoveVisual3DChild(_frontChild);
                }

                _frontChild = frontChild;

                if (_frontChild != null)
                {
                    AddVisual3DChild(_frontChild);
                }
            }

            Visual3D backChild = EnsureChild(_backChild, backMaterial);
            if (backChild != _backChild)
            {
                if (_backChild != null)
                {
                    RemoveVisual3DChild(_backChild);
                }

                _backChild = backChild;

                if (_backChild != null)
                {
                    AddVisual3DChild(_backChild);
                }
            }
        }
예제 #2
0
        private void UpdateChild(Visual3D child, MeshGeometry3D geometry, Shape3DMaterial material)
        {
            if(material != null)
            {
                if(material.HasElement)
                {
                    Viewport2DVisual3D viewport = (Viewport2DVisual3D) child;
                    viewport.Geometry = geometry;
                    viewport.Material = HostingMaterial;

                    // Set the size of the root element to the surface size.
                    Border border = (Border) viewport.Visual;
                    border.Width = SurfaceWidth;
                    border.Height = SurfaceHeight;
                    border.Child = material.GetElement(this);

                    // Add the material.
                    //Viewbox viewbox = (Viewbox)border.Child;
                    //viewbox.Width = SurfaceWidth;
                    //viewbox.Height = SurfaceHeight;
                    //viewbox.Child = material.GetElement(this);

                    // Set the mesh into the visualizer.
                    //viewbox.Child = new MeshTextureCoordinateVisualizer();
                    //((MeshTextureCoordinateVisualizer)viewbox.Child).Mesh = geometry;
                }
                else
                {
                    Debug.Assert(material.HasMaterial);

                    GeometryModel3D model = (GeometryModel3D)((ModelVisual3D)child).Content;
                    model.Geometry = geometry;
                    model.Material = material.GetMaterial(this);
                }
            }
        }
예제 #3
0
        private Visual3D EnsureChild(Visual3D currentChild, Shape3DMaterial material)
        {
            Visual3D newChild = null;

            if (material != null)
            {
                if (material.HasElement)
                {
                    // We need a Viewport2DVisual3D to display an element.
                    if(currentChild is Viewport2DVisual3D)
                    {
                        newChild = currentChild;
                    }
                    else
                    {
                        //Viewbox viewbox = new Viewbox();
                        //viewbox.StretchDirection = StretchDirection.Both;
                        //viewbox.Stretch = Stretch.Fill;

                        Border border = new Border();
                        border.UseLayoutRounding = true;
                        border.Background = Brushes.Green;
                        //border.Child = viewbox;

                        Viewport2DVisual3D viewport = new Viewport2DVisual3D();
                        viewport.Visual = border;

                        newChild = viewport;
                    }

                    // Set the appropriate caching strategy.
                    CacheScale cacheScale = CacheScale;
                    if (cacheScale == null)
                    {
                        // Remove any VisualBrush caching.
                        RenderOptions.SetCachingHint(newChild, CachingHint.Unspecified);

                        // Remove any BitmapCache.
                        ((Viewport2DVisual3D)newChild).CacheMode = null;
                    }
                    else if (cacheScale.IsAuto)
                    {
                        // Remove any BitmapCache.
                        ((Viewport2DVisual3D)newChild).CacheMode = null;

                        // Specify VisualBrush caching with 2x min and max
                        // thresholds.
                        RenderOptions.SetCachingHint(newChild, CachingHint.Cache);
                        RenderOptions.SetCacheInvalidationThresholdMinimum(newChild, 0.5);
                        RenderOptions.SetCacheInvalidationThresholdMaximum(newChild, 2.0);
                    }
                    else
                    {
                        // Remove any VisualBrush caching.
                        RenderOptions.SetCachingHint(newChild, CachingHint.Unspecified);

                        // Set a BitmapCache with the appropriate scale.
                        BitmapCache bitmapCache = ((Viewport2DVisual3D)newChild).CacheMode as BitmapCache;
                        if (bitmapCache == null)
                        {
                            ((Viewport2DVisual3D)newChild).CacheMode = new BitmapCache(cacheScale.Scale);
                        }
                        else
                        {
                            bitmapCache.RenderAtScale = cacheScale.Scale;
                        }
                    }
                }
                else
                {
                    Debug.Assert(material.HasMaterial);

                    // We need a ModelVisual3D to display the material.
                    if(currentChild is ModelVisual3D)
                    {
                        Debug.Assert(((ModelVisual3D)currentChild).Content is GeometryModel3D);
                        newChild = currentChild;
                    }
                    else
                    {
                        newChild = new ModelVisual3D();
                        ((ModelVisual3D)newChild).Content = new GeometryModel3D();
                    }
                }
            }

            return newChild;
        }