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 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))); }
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))); }
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); } }