public static RectF Transform(Rect3F rect, GLPanel3D viewport) { if (rect.IsEmpty) { return(RectF.Empty); } var p1 = rect.Location; var p2 = p1 + new Vector3F(rect.SizeX, 0, 0); var p3 = p1 + new Vector3F(0, rect.SizeY, 0); var p4 = p1 + new Vector3F(0, 0, rect.SizeZ); var p5 = p1 + new Vector3F(rect.SizeX, rect.SizeY, 0); var p6 = p1 + new Vector3F(rect.SizeX, 0, rect.SizeZ); var p7 = p1 + new Vector3F(0, rect.SizeY, rect.SizeZ); var p8 = p1 + new Vector3F(rect.SizeX, rect.SizeY, rect.SizeZ); var ret = RectF.Empty; ret.Union(viewport.Point3DToPointInWpf(p1)); ret.Union(viewport.Point3DToPointInWpf(p2)); ret.Union(viewport.Point3DToPointInWpf(p3)); ret.Union(viewport.Point3DToPointInWpf(p4)); ret.Union(viewport.Point3DToPointInWpf(p5)); ret.Union(viewport.Point3DToPointInWpf(p6)); ret.Union(viewport.Point3DToPointInWpf(p7)); ret.Union(viewport.Point3DToPointInWpf(p8)); return(ret); }
internal void UpdateDistance() { if (HasDash && _points != null) { var points = _points.ToArray(); var distances = new float[points.Length]; switch (_mode) { case GLPrimitiveMode.GL_LINES: { for (int i = 0; i < points.Length - 1; i += 2) { var p1 = _viewport.Point3DToPointInWpf(points[i]); var p2 = _viewport.Point3DToPointInWpf(points[i + 1]); distances[i] = 0; distances[i + 1] = (p2 - p1).Length; } } break; case GLPrimitiveMode.GL_LINE_STRIP: { var dis = 0f; var pointsTransformed = new LazyArray <Point3F, PointF>(points, p => _viewport.Point3DToPointInWpf(p)); for (int i = 1; i < pointsTransformed.Length; i++) { var p1 = pointsTransformed[i - 1]; var p2 = pointsTransformed[i]; dis += (p2 - p1).Length; distances[i] = dis; } } break; } _distances = distances.ToList(); } else { _distances = null; } _DataBinding(); }
private static bool _HitTest(GLPanel3D viewport, RectF rectInWpf, IHitTestSource model, List <RectHitResult> results, bool isFullContain) { if (model is GLModel3DGroup) { var group = model as GLModel3DGroup; if (isFullContain) { foreach (var child in group.Children) { if (!_HitTest(viewport, rectInWpf, child, results, isFullContain)) { return(false); } } if (model.Parent == null) { results.Add(new RectHitResult(model)); } return(true); } else { foreach (var child in group.Children) { if (_HitTest(viewport, rectInWpf, child, results, isFullContain)) { return(true); } } return(false); } } else { //var meshModel = model as GLMeshModel3D; var bounds3D = model.Bounds; var bounds2D = Math3DHelper.Transform(bounds3D, viewport); var sensity = model.Mode == GLPrimitiveMode.GL_POINTS ? model.PointSize / 2 : model.LineWidth; switch (model.Mode) { case GLPrimitiveMode.GL_POINTS: case GLPrimitiveMode.GL_LINES: case GLPrimitiveMode.GL_LINE_LOOP: case GLPrimitiveMode.GL_LINE_STRIP: if (!bounds2D.IsEmpty) { bounds2D.Extents(sensity); } break; } if ((isFullContain && bounds2D.IsEmpty) || rectInWpf.Contains(bounds2D)) { if (!isFullContain || model.Parent == null) { results.Add(new RectHitResult(model)); } return(true); } else { if (!rectInWpf.IntersectsWith(bounds2D)) { return(false); } var flag1 = false; var flag2 = true; var pointsTransformed = new LazyArray <Point3F, PointF>(model.GetHitTestPoints(), p => viewport.Point3DToPointInWpf(p)); switch (model.Mode) { case GLPrimitiveMode.GL_POINTS: { if (model.Pairs == null) { _HitTestPointResult(new DataPair(0, pointsTransformed.Length), pointsTransformed, rectInWpf, isFullContain, sensity, ref flag1, ref flag2); } else { foreach (var pair in model.Pairs) { if (_HitTestPointResult(pair, pointsTransformed, rectInWpf, isFullContain, sensity, ref flag1, ref flag2)) { break; } } } } break; case GLPrimitiveMode.GL_LINES: case GLPrimitiveMode.GL_LINE_LOOP: case GLPrimitiveMode.GL_LINE_STRIP: { if (model.Pairs == null) { _HitTestLinesResult(model, new DataPair(0, pointsTransformed.Length), pointsTransformed, rectInWpf, isFullContain, sensity, ref flag1, ref flag2); } else { foreach (var pair in model.Pairs) { if (_HitTestLinesResult(model, pair, pointsTransformed, rectInWpf, isFullContain, sensity, ref flag1, ref flag2)) { break; } } } } break; case GLPrimitiveMode.GL_TRIANGLES: case GLPrimitiveMode.GL_TRIANGLE_STRIP: { if (model.Pairs == null) { _HitTestTrianglesResult(model, new DataPair(0, pointsTransformed.Length), pointsTransformed, rectInWpf, isFullContain, ref flag1, ref flag2); } else { foreach (var pair in model.Pairs) { if (_HitTestTrianglesResult(model, pair, pointsTransformed, rectInWpf, isFullContain, ref flag1, ref flag2)) { break; } } } } break; case GLPrimitiveMode.GL_TRIANGLE_FAN: { if (model.Pairs == null) { _HitTestTriangleFansResult(new DataPair(0, pointsTransformed.Length), pointsTransformed, rectInWpf, isFullContain, ref flag1, ref flag2); } else { foreach (var pair in model.Pairs) { if (_HitTestTriangleFansResult(pair, pointsTransformed, rectInWpf, isFullContain, ref flag1, ref flag2)) { break; } } } } break; } if (flag1 && !isFullContain) { results.Add(new RectHitResult(model)); return(true); } else if (flag2 && isFullContain) { if (model.Parent == null) { results.Add(new RectHitResult(model)); } return(true); } return(false); } } }