Builds a mesh geometry for a collection of billboards.
Inheritance: HelixToolkit.Wpf.ScreenGeometryBuilder
        /// <summary>
        /// Initializes a new instance of the <see cref="BillboardVisual3D" /> class.
        /// </summary>
        public BillboardVisual3D()
        {
            this.builder = new BillboardGeometryBuilder(this);
            this.Mesh    = new MeshGeometry3D
            {
                TriangleIndices    = BillboardGeometryBuilder.CreateIndices(1),
                TextureCoordinates =
                    new PointCollection
                {
                    new Point(0, 1),
                    new Point(1, 1),
                    new Point(1, 0),
                    new Point(0, 0)
                }
            };

            this.Model = new GeometryModel3D {
                Geometry = this.Mesh
            };
            this.Content = this.Model;
            this.OnMaterialChanged();
            this.OnGeometryChanged();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="BillboardVisual3D" /> class.
        /// </summary>
        public BillboardVisual3D()
        {
            this.builder = new BillboardGeometryBuilder(this);
            this.Mesh = new MeshGeometry3D
                            {
                                TriangleIndices = BillboardGeometryBuilder.CreateIndices(1),
                                TextureCoordinates =
                                    new PointCollection
                                        {
                                            new Point(0, 1),
                                            new Point(1, 1),
                                            new Point(1, 0),
                                            new Point(0, 0)
                                        }
                            };

            this.Model = new GeometryModel3D { Geometry = this.Mesh };
            this.Content = this.Model;
            this.OnMaterialChanged();
            this.OnGeometryChanged();
        }
Example #3
0
        /// <summary>
        /// Updates the visual appearance (texture and geometry).
        /// </summary>
        private void VisualChanged()
        {
            this.meshes.Clear();
            this.pinMeshes.Clear();

            if (this.Items == null)
            {
                this.Content = null;
                return;
            }

            var pinMaterial = new DiffuseMaterial(this.PinBrush);

            var items = this.Items.Where(i => !string.IsNullOrEmpty(i.Text)).ToList();
            var group = new Model3DGroup();

            while (items.Count > 0)
            {
                Dictionary <string, FrameworkElement> elementMap;
                Dictionary <FrameworkElement, Rect>   elementPositions;
                var material = TextGroupVisual3D.CreateTextMaterial(
                    items, this.CreateElement, this.Background, out elementMap, out elementPositions);
                material.Freeze();

                var billboards         = new List <Billboard>();
                var addedChildren      = new List <BillboardTextItem>();
                var textureCoordinates = new PointCollection();
                foreach (var item in items)
                {
                    var element = elementMap[item.Text];
                    var r       = elementPositions[element];
                    if (r.Bottom > 1)
                    {
                        break;
                    }

                    billboards.Add(
                        new Billboard(
                            item.Position,
                            element.ActualWidth,
                            element.ActualHeight,
                            item.HorizontalAlignment,
                            item.VerticalAlignment,
                            item.DepthOffset,
                            item.WorldDepthOffset));
                    textureCoordinates.Add(new Point(r.Left, r.Bottom));
                    textureCoordinates.Add(new Point(r.Right, r.Bottom));
                    textureCoordinates.Add(new Point(r.Right, r.Top));
                    textureCoordinates.Add(new Point(r.Left, r.Top));

                    addedChildren.Add(item);
                }

                var triangleIndices = BillboardGeometryBuilder.CreateIndices(billboards.Count);
                triangleIndices.Freeze();

                var g = new MeshGeometry3D
                {
                    TriangleIndices    = triangleIndices,
                    TextureCoordinates = textureCoordinates,
                    Positions          = this.builder.GetPositions(billboards, this.Offset)
                };
                group.Children.Add(new GeometryModel3D(g, material));
                this.meshes.Add(g, billboards);

                if (this.Offset.Length > 0)
                {
                    var pinGeometry = new MeshGeometry3D
                    {
                        TriangleIndices = triangleIndices,
                        Positions       = this.builder.GetPinPositions(billboards, this.Offset, this.PinWidth)
                    };
                    group.Children.Add(new GeometryModel3D(pinGeometry, pinMaterial));
                    this.pinMeshes.Add(pinGeometry, billboards);
                }

                foreach (var c in addedChildren)
                {
                    items.Remove(c);
                }
            }

            this.Content = group;
        }
Example #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="BillboardTextGroupVisual3D" /> class.
 /// </summary>
 public BillboardTextGroupVisual3D()
 {
     this.builder = new BillboardGeometryBuilder(this);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="BillboardTextGroupVisual3D" /> class.
 /// </summary>
 public BillboardTextGroupVisual3D()
 {
     this.builder = new BillboardGeometryBuilder(this);
 }
        /// <summary>
        /// Updates the text block when the visual appearance changed.
        /// </summary>
        private void VisualChanged()
        {
            this.meshes.Clear();

            if (this.Items == null)
            {
                this.Content = null;
                return;
            }

            var items = this.Items.Where(i => !string.IsNullOrEmpty(i.Text)).ToList();
            var group = new Model3DGroup();

            while (items.Count > 0)
            {
                Dictionary <string, FrameworkElement> elementMap;
                Dictionary <FrameworkElement, Rect>   elementPositions;
                /// DELETED BY SJT FOR .NET 3.5
                //var material = TextGroupVisual3D.CreateTextMaterial(items, this.CreateElement, this.Background, out elementMap, out elementPositions);
                //material.Freeze();

                var billboards         = new List <Billboard>();
                var addedChildren      = new List <BillboardTextItem>();
                var textureCoordinates = new PointCollection();
                /// DELETED BY SJT FOR .NET 3.5
                //foreach (var item in items)
                //{
                //    var element = elementMap[item.Text];
                //    var r = elementPositions[element];
                //    if (r.Bottom > 1)
                //    {
                //        break;
                //    }

                //    billboards.Add(
                //        new Billboard(
                //            item.Position,
                //            element.ActualWidth,
                //            element.ActualHeight,
                //            item.HorizontalAlignment,
                //            item.VerticalAlignment,
                //            item.DepthOffset));
                //    textureCoordinates.Add(new Point(r.Left, r.Bottom));
                //    textureCoordinates.Add(new Point(r.Right, r.Bottom));
                //    textureCoordinates.Add(new Point(r.Right, r.Top));
                //    textureCoordinates.Add(new Point(r.Left, r.Top));

                //    addedChildren.Add(item);
                //}

                var g = new MeshGeometry3D
                {
                    TriangleIndices    = BillboardGeometryBuilder.CreateIndices(billboards.Count),
                    TextureCoordinates = textureCoordinates,
                    Positions          = this.builder.GetPositions(billboards)
                };
                /// DELETED BY SJT FOR .NET 3.5
                //group.Children.Add(new GeometryModel3D(g, material));
                this.meshes.Add(g, billboards);
                foreach (var c in addedChildren)
                {
                    items.Remove(c);
                }
            }

            this.Content = group;
        }