Example #1
0
        private void UpdateCache(Viewport3D viewport, Document document)
        {
            var ccl  = new Coordinate((decimal)viewport.Camera.Location.X, (decimal)viewport.Camera.Location.Y, (decimal)viewport.Camera.Location.Z);
            var ccla = new Coordinate((decimal)viewport.Camera.LookAt.X, (decimal)viewport.Camera.LookAt.Y, (decimal)viewport.Camera.LookAt.Z);

            var cache = _cachedLines.FirstOrDefault(x => x.Viewport3D == viewport);

            if (cache == null)
            {
                cache = new CachedLines(viewport);
                _cachedLines.Add(cache);
            }
            if (ccl == cache.CameraLocation && ccla == cache.CameraLookAt && cache.PivotPoint == _pivotPoint && cache.Width == viewport.Width && cache.Height == viewport.Height)
            {
                return;
            }

            var origin   = _pivotPoint;
            var distance = (ccl - origin).VectorMagnitude();

            if (distance <= 1)
            {
                return;
            }

            cache.CameraLocation = ccl;
            cache.CameraLookAt   = ccla;
            cache.PivotPoint     = _pivotPoint;
            cache.Width          = viewport.Width;
            cache.Height         = viewport.Height;

            var normal = (ccl - origin).Normalise();
            var right  = normal.Cross(Coordinate.UnitZ).Normalise();
            var up     = normal.Cross(right).Normalise();

            var plane = new Plane(normal, origin.Dot(normal));

            const decimal sides = 32;
            var           diff  = (2 * DMath.PI) / sides;

            var radius = 0.15m * distance;

            cache.Cache[CircleType.Outer].Clear();
            cache.Cache[CircleType.X].Clear();
            cache.Cache[CircleType.Y].Clear();
            cache.Cache[CircleType.Z].Clear();

            for (var i = 0; i < sides; i++)
            {
                var cos1 = DMath.Cos(diff * i);
                var sin1 = DMath.Sin(diff * i);
                var cos2 = DMath.Cos(diff * (i + 1));
                var sin2 = DMath.Sin(diff * (i + 1));

                // outer circle
                AddLine(CircleType.Outer,
                        origin + right * cos1 * radius * 1.2m + up * sin1 * radius * 1.2m,
                        origin + right * cos2 * radius * 1.2m + up * sin2 * radius * 1.2m,
                        plane, cache);

                cos1 *= radius;
                sin1 *= radius;
                cos2 *= radius;
                sin2 *= radius;

                // X/Y plane = Z axis
                AddLine(CircleType.Z,
                        origin + Coordinate.UnitX * cos1 + Coordinate.UnitY * sin1,
                        origin + Coordinate.UnitX * cos2 + Coordinate.UnitY * sin2,
                        plane, cache);

                // Y/Z plane = X axis
                AddLine(CircleType.X,
                        origin + Coordinate.UnitY * cos1 + Coordinate.UnitZ * sin1,
                        origin + Coordinate.UnitY * cos2 + Coordinate.UnitZ * sin2,
                        plane, cache);

                // X/Z plane = Y axis
                AddLine(CircleType.Y,
                        origin + Coordinate.UnitZ * cos1 + Coordinate.UnitX * sin1,
                        origin + Coordinate.UnitZ * cos2 + Coordinate.UnitX * sin2,
                        plane, cache);
            }
        }
Example #2
0
        private void AddLine(CircleType type, Coordinate start, Coordinate end, Plane test, CachedLines cache)
        {
            var line = new Line(start, end);
            var cls  = line.ClassifyAgainstPlane(test);

            if (cls == PlaneClassification.Back)
            {
                return;
            }
            if (cls == PlaneClassification.Spanning)
            {
                var isect = test.GetIntersectionPoint(line, true);
                var first = test.OnPlane(line.Start) > 0 ? line.Start : line.End;
                line = new Line(first, isect);
            }
            cache.Cache[type].Add(new Line(cache.Viewport3D.WorldToScreen(line.Start), cache.Viewport3D.WorldToScreen(line.End)));
        }
Example #3
0
 private void AddLine(CircleType type, Coordinate start, Coordinate end, Plane test, CachedLines cache)
 {
     var line = new Line(start, end);
     var cls = line.ClassifyAgainstPlane(test);
     if (cls == PlaneClassification.Back) return;
     if (cls == PlaneClassification.Spanning)
     {
         var isect = test.GetIntersectionPoint(line, true);
         var first = test.OnPlane(line.Start) > 0 ? line.Start : line.End;
         line = new Line(first, isect);
     }
     cache.Cache[type].Add(new Line(cache.Viewport3D.WorldToScreen(line.Start), cache.Viewport3D.WorldToScreen(line.End)));
 }
Example #4
0
        private void UpdateCache(Viewport3D viewport, Document document)
        {
            var ccl = new Coordinate((decimal)viewport.Camera.Location.X, (decimal)viewport.Camera.Location.Y, (decimal)viewport.Camera.Location.Z);
            var ccla = new Coordinate((decimal)viewport.Camera.LookAt.X, (decimal)viewport.Camera.LookAt.Y, (decimal)viewport.Camera.LookAt.Z);

            var cache = _cachedLines.FirstOrDefault(x => x.Viewport3D == viewport);
            if (cache == null)
            {
                cache = new CachedLines(viewport);
                _cachedLines.Add(cache);
            }
            if (ccl == cache.CameraLocation && ccla == cache.CameraLookAt && cache.PivotPoint == _pivotPoint && cache.Width == viewport.Width && cache.Height == viewport.Height) return;

            var origin = _pivotPoint;
            var distance = (ccl - origin).VectorMagnitude();

            if (distance <= 1) return;

            cache.CameraLocation = ccl;
            cache.CameraLookAt = ccla;
            cache.PivotPoint = _pivotPoint;
            cache.Width = viewport.Width;
            cache.Height = viewport.Height;

            var normal = (ccl - origin).Normalise();
            var right = normal.Cross(Coordinate.UnitZ).Normalise();
            var up = normal.Cross(right).Normalise();

            var plane = new Plane(normal, origin.Dot(normal));

            const decimal sides = 32;
            var diff = (2 * DMath.PI) / sides;

            var radius = 0.15m * distance;

            cache.Cache[CircleType.Outer].Clear();
            cache.Cache[CircleType.X].Clear();
            cache.Cache[CircleType.Y].Clear();
            cache.Cache[CircleType.Z].Clear();

            for (var i = 0; i < sides; i++)
            {
                var cos1 = DMath.Cos(diff * i);
                var sin1 = DMath.Sin(diff * i);
                var cos2 = DMath.Cos(diff * (i + 1));
                var sin2 = DMath.Sin(diff * (i + 1));

                // outer circle
                AddLine(CircleType.Outer,
                    origin + right * cos1 * radius * 1.2m + up * sin1 * radius * 1.2m,
                    origin + right * cos2 * radius * 1.2m + up * sin2 * radius * 1.2m,
                    plane, cache);

                cos1 *= radius;
                sin1 *= radius;
                cos2 *= radius;
                sin2 *= radius;

                // X/Y plane = Z axis
                AddLine(CircleType.Z,
                    origin + Coordinate.UnitX * cos1 + Coordinate.UnitY * sin1,
                    origin + Coordinate.UnitX * cos2 + Coordinate.UnitY * sin2,
                    plane, cache);

                // Y/Z plane = X axis
                AddLine(CircleType.X,
                    origin + Coordinate.UnitY * cos1 + Coordinate.UnitZ * sin1,
                    origin + Coordinate.UnitY * cos2 + Coordinate.UnitZ * sin2,
                    plane, cache);

                // X/Z plane = Y axis
                AddLine(CircleType.Y,
                    origin + Coordinate.UnitZ * cos1 + Coordinate.UnitX * sin1,
                    origin + Coordinate.UnitZ * cos2 + Coordinate.UnitX * sin2,
                    plane, cache);
            }
        }
        private void UpdateCache(IViewport viewport, PerspectiveCamera camera)
        {
            var ccl  = camera.EyeLocation;
            var ccla = camera.Position + camera.Direction;

            var cache = _cachedLines.FirstOrDefault(x => x.Viewport == viewport);

            if (cache == null)
            {
                cache = new CachedLines(viewport);
                _cachedLines.Add(cache);
            }
            if (ccl == cache.CameraLocation && ccla == cache.CameraLookAt && cache.PivotPoint == _pivotPoint && cache.Width == viewport.Width && cache.Height == viewport.Height)
            {
                return;
            }

            var origin   = _pivotPoint;
            var distance = (ccl - origin).Length();

            if (distance <= 1)
            {
                return;
            }

            cache.CameraLocation = ccl;
            cache.CameraLookAt   = ccla;
            cache.PivotPoint     = _pivotPoint;
            cache.Width          = viewport.Width;
            cache.Height         = viewport.Height;

            var normal = (ccl - origin).Normalise();
            var right  = normal.Cross(Vector3.UnitZ).Normalise();
            var up     = normal.Cross(right).Normalise();

            var plane = new Plane(normal, origin.Dot(normal));

            const float sides = 32;
            var         diff  = (2 * Math.PI) / sides;

            var radius = 0.15f * distance;

            cache.Cache[CircleType.Outer].Clear();
            cache.Cache[CircleType.X].Clear();
            cache.Cache[CircleType.Y].Clear();
            cache.Cache[CircleType.Z].Clear();

            for (var i = 0; i < sides; i++)
            {
                var cos1 = (float)Math.Cos(diff * i);
                var sin1 = (float)Math.Sin(diff * i);
                var cos2 = (float)Math.Cos(diff * (i + 1));
                var sin2 = (float)Math.Sin(diff * (i + 1));

                // outer circle
                AddLine(CircleType.Outer,
                        origin + right * cos1 * radius * 1.2f + up * sin1 * radius * 1.2f,
                        origin + right * cos2 * radius * 1.2f + up * sin2 * radius * 1.2f,
                        plane, cache);

                cos1 *= radius;
                sin1 *= radius;
                cos2 *= radius;
                sin2 *= radius;

                // X/Y plane = Z axis
                AddLine(CircleType.Z,
                        origin + Vector3.UnitX * cos1 + Vector3.UnitY * sin1,
                        origin + Vector3.UnitX * cos2 + Vector3.UnitY * sin2,
                        plane, cache);

                // Y/Z plane = X axis
                AddLine(CircleType.X,
                        origin + Vector3.UnitY * cos1 + Vector3.UnitZ * sin1,
                        origin + Vector3.UnitY * cos2 + Vector3.UnitZ * sin2,
                        plane, cache);

                // X/Z plane = Y axis
                AddLine(CircleType.Y,
                        origin + Vector3.UnitZ * cos1 + Vector3.UnitX * sin1,
                        origin + Vector3.UnitZ * cos2 + Vector3.UnitX * sin2,
                        plane, cache);
            }
        }