private void WireframeHelper(GeometryModel3D model, Matrix3DStack matrixStack) { Geometry3D geometry = model.Geometry; MeshGeometry3D mesh = geometry as MeshGeometry3D; if (mesh != null) { Point3D[] positions = new Point3D[mesh.Positions.Count]; mesh.Positions.CopyTo(positions, 0); matrixStack.Peek().Transform(positions); WireframeHelper(positions, mesh.TriangleIndices); } }
private void WireframeHelper(GeometryModel3D model, Matrix3DStack matrixStack) { Geometry3D geometry = model.Geometry; MeshGeometry3D mesh = geometry as MeshGeometry3D; if (mesh != null) { Point3D[] positions = new Point3D[mesh.Positions.Count]; mesh.Positions.CopyTo(positions, 0); matrixStack.Peek().Transform(positions); Int32Collection indices = mesh.TriangleIndices; if (indices.Count > 0) { int limit = positions.Length - 1; for (int i = 2, count = indices.Count; i < count; i += 3) { int i0 = indices[i - 2]; int i1 = indices[i - 1]; int 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) { int i0 = i - 2; int i1 = i - 1; int i2 = i; AddTriangle(positions, i0, i1, i2); } } } }