예제 #1
0
        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);
        }
예제 #2
0
        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();
        }
예제 #3
0
        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);
                }
            }
        }