Example #1
0
        private void WireframeHelper(Model3D model, Matrix3DStack matrixStack)
        {
            var transform = model.Transform;

            if (transform != null && transform != Transform3D.Identity)
            {
                matrixStack.Prepend(model.Transform.Value);
            }

            try
            {
                var group = model as Model3DGroup;

                if (group != null)
                {
                    WireframeHelper(group, matrixStack);
                    return;
                }

                var geometry = model as GeometryModel3D;

                if (geometry != null)
                {
                    WireframeHelper(geometry, matrixStack);
                    return;
                }
            }
            finally
            {
                if (transform != null && transform != Transform3D.Identity)
                {
                    matrixStack.Pop();
                }
            }
        }
Example #2
0
 private void WireframeHelper(Model3DGroup group, Matrix3DStack matrixStack)
 {
     foreach (var child in group.Children)
     {
         WireframeHelper(child, matrixStack);
     }
 }
Example #3
0
        private void WireframeHelper(GeometryModel3D model, Matrix3DStack matrixStack)
        {
            var geometry = model.Geometry;
            var mesh     = geometry as MeshGeometry3D;

            if (mesh == null)
            {
                return;
            }
            var positions = new Point3D[mesh.Positions.Count];

            mesh.Positions.CopyTo(positions, 0);
            matrixStack.Peek().Transform(positions);

            var indices = mesh.TriangleIndices;

            if (indices.Count > 0)
            {
                var limit = positions.Length - 1;

                for (int i = 2, count = indices.Count; i < count; i += 3)
                {
                    var i0 = indices[i - 2];
                    var i1 = indices[i - 1];
                    var i2 = indices[i];

                    // WPF halts rendering on the first deformed triangle.  We should
                    // do the same.
                    if ((0 > i0 || i0 > limit) ||
                        (0 > i1 || i1 > limit) ||
                        (0 > i2 || i2 > limit))
                    {
                        break;
                    }

                    AddTriangle(positions, i0, i1, i2);
                }
            }
            else
            {
                for (int i = 2, count = positions.Length; i < count; i += 3)
                {
                    var i0 = i - 2;
                    var i1 = i - 1;
                    var i2 = i;

                    AddTriangle(positions, i0, i1, i2);
                }
            }
        }
Example #4
0
        public void MakeWireframe(Model3D model)
        {
            Points.Clear();

            if (model == null)
            {
                return;
            }

            var transform = new Matrix3DStack();

            transform.Push(Matrix3D.Identity);

            WireframeHelper(model, transform);
        }