diff --git a/data/baseline/contour-tangle.png b/data/baseline/contour-tangle.png index 9a7536d7ada2ccdbdb2bf52725abe826bd425cd4..04bb81608011488cb581312d6adcc9ef097d01b0 100644 --- a/data/baseline/contour-tangle.png +++ b/data/baseline/contour-tangle.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4f049b4f0e79a27ebbdab187325db55653abe2ce661c8f1d2f3fcb413e3b961 -size 10883 +oid sha256:785051d9773c4a0ced2701de3499f9cd948da2a4c846a5187e30dfb5cb0783cb +size 10830 diff --git a/data/baseline/contour-uniform.png b/data/baseline/contour-uniform.png index 893063c6e8368498556810ffdaa92faf2805e8fa..054271a1dcdc8e63742c9ba29eb789d2a810ac05 100644 --- a/data/baseline/contour-uniform.png +++ b/data/baseline/contour-uniform.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8c22f2d4e19191ff05d9dc52ea740269fcdfe129b9d100ea8db6d4cbb989b161 -size 9652 +oid sha256:1d990b5f0e9ef27e4e5f87f4c62c4f9974992506521f32bd5901ac6670e71bfa +size 9656 diff --git a/data/baseline/contour-wedge.png b/data/baseline/contour-wedge.png index 66101432e5e892cf58870abff987d80ba68c7eaa..5c404b6d59a2b8856f9ab327ea20029500f2e86d 100644 --- a/data/baseline/contour-wedge.png +++ b/data/baseline/contour-wedge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74995441b8f0c0c19b16d45c489932958784bb3f32c65fd274985b3ecfcc87d6 -size 19885 +oid sha256:54e09a09c97a20627e54c835d2d488bc9f692ef1315122ab60241c006ab78813 +size 19742 diff --git a/data/baseline/point-transform.png b/data/baseline/point-transform.png index 521a8b654ab0fda8cf38be903b1faaa79e7015a0..5f36a5f2c206d7ac0f8fb0a82e752930ff1142a0 100644 --- a/data/baseline/point-transform.png +++ b/data/baseline/point-transform.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:573927195d4a2dbcc5f92b9f443dcdeaa30b0e27c77da3563bf91064b6d037ad -size 31339 +oid sha256:e1472e6002ca4ad4012e0c9f067f8254290fabe93c82713a4994ad97a7fdbdfc +size 31218 diff --git a/data/baseline/split-sharp-edges.png b/data/baseline/split-sharp-edges.png index de8b23cf83d2b40004c166e97e7bf20cf69e97e4..6abf94133bb4233ba041a192023f21b6ef06cf48 100644 --- a/data/baseline/split-sharp-edges.png +++ b/data/baseline/split-sharp-edges.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db2f033837778828b54f398bbc9df180eb8da425cb29025c13e3930aa9c02da3 -size 71673 +oid sha256:5ff6d72bd325ffe0fb3b22bfdc294b6d674384afd662290424bb77634202b4ef +size 71150 diff --git a/data/baseline/streamline.png b/data/baseline/streamline.png index 8753c4f47d47e2a7c3857bd88a2c211da5c401d1..8a2d1b63ccb6fc46d54b57c03ef1963b3b2cc952 100644 --- a/data/baseline/streamline.png +++ b/data/baseline/streamline.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a20e53e0ed56502d9a821fcceef2c0b34e71d2a5748519fd55352c3824582675 -size 37150 +oid sha256:24c71e8846fe62e6f6eefdb72c9729639061af80bf9d3453d35c8c6838de9174 +size 37162 diff --git a/data/baseline/surface-normals.png b/data/baseline/surface-normals.png index 2c415f56d23e4d6c11539069dcfd17816dafcd23..8a6058843743aa31bc9c2aed673fe081b7768fd1 100644 --- a/data/baseline/surface-normals.png +++ b/data/baseline/surface-normals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a2147c3e30227d41dca5b6b18a1df6474ffe7f4fd6a72614979c5245299c973a -size 51846 +oid sha256:b4c905ec76e72513519515ec41cf5efd34490b98255ee7465f8b6746fcff41e5 +size 51865 diff --git a/vtkm/rendering/Camera.cxx b/vtkm/rendering/Camera.cxx index c1ac84c1c9c19f6b914e358670515d34310b0b77..30d0faedd5da113c645c1831c7e711fbc4a4eaa1 100644 --- a/vtkm/rendering/Camera.cxx +++ b/vtkm/rendering/Camera.cxx @@ -286,7 +286,7 @@ void Camera::ResetToBounds(const vtkm::Bounds& dataBounds, vtkm::Float32 diagonalLength = vtkm::Magnitude(totalExtent); this->SetPosition(center + directionOfProjection * diagonalLength * 1.0f); this->SetFieldOfView(60.0f); - this->SetClippingRange(0.1f * diagonalLength, diagonalLength * 10.0f); + this->SetClippingRange(0.1f * diagonalLength, diagonalLength * 5.0f); // Reset for 2D camera this->SetViewRange2D(db); diff --git a/vtkm/rendering/CanvasRayTracer.cxx b/vtkm/rendering/CanvasRayTracer.cxx index ad57f280e4acf246b5b1f43a6ab3fec7d9329f9d..da6a4a0ef2f9ed74ed5e8467a00809625894bf8a 100644 --- a/vtkm/rendering/CanvasRayTracer.cxx +++ b/vtkm/rendering/CanvasRayTracer.cxx @@ -27,11 +27,13 @@ namespace internal class SurfaceConverter : public vtkm::worklet::WorkletMapField { vtkm::Matrix ViewProjMat; + bool Is3d; public: VTKM_CONT - SurfaceConverter(const vtkm::Matrix viewProjMat) + SurfaceConverter(const vtkm::Matrix viewProjMat, bool is3d) : ViewProjMat(viewProjMat) + , Is3d(is3d) { } @@ -51,7 +53,18 @@ public: ColorBufferPortalType& colorBuffer, const vtkm::Id& index) const { - vtkm::Vec intersection = origin + inDepth * dir; + vtkm::Vec intersection; + // For reasons I can't explain atm, the view direction + // is different for for 2d and 3d so that it matches the + // gl depth buffer values for annotations + if (Is3d) + { + intersection = origin + inDepth * dir; + } + else + { + intersection = origin + inDepth * (-dir); + } vtkm::Vec4f_32 point; point[0] = static_cast(intersection[0]); point[1] = static_cast(intersection[1]); @@ -105,7 +118,8 @@ VTKM_CONT void WriteToCanvas(const vtkm::rendering::raytracing::Ray& vtkm::MatrixMultiply(camera.CreateProjectionMatrix(canvas->GetWidth(), canvas->GetHeight()), camera.CreateViewMatrix()); - vtkm::worklet::DispatcherMapField(SurfaceConverter(viewProjMat)) + bool is3d = camera.GetMode() == vtkm::rendering::Camera::MODE_3D; + vtkm::worklet::DispatcherMapField(SurfaceConverter(viewProjMat, is3d)) .Invoke(rays.PixelIdx, colors, rays.Distance, diff --git a/vtkm/rendering/LineRenderer.cxx b/vtkm/rendering/LineRenderer.cxx index 1660319f8d5a4a1d6930faa620c071f1d3ae0657..3914c151c4d3199530081bc81b51bc07796fca9e 100644 --- a/vtkm/rendering/LineRenderer.cxx +++ b/vtkm/rendering/LineRenderer.cxx @@ -55,6 +55,11 @@ void LineRenderer::RenderLine(const vtkm::Vec3f_64& point0, vtkm::Id dx = vtkm::Abs(x1 - x0), sx = x0 < x1 ? 1 : -1; vtkm::Id dy = -vtkm::Abs(y1 - y0), sy = y0 < y1 ? 1 : -1; vtkm::Id err = dx + dy, err2 = 0; + + const vtkm::Id xStart = x0; + const vtkm::Id yStart = y0; + const vtkm::Float32 pdist = vtkm::Sqrt(vtkm::Float32(dx * dx) + vtkm::Float32(dy * dy)); + auto colorPortal = vtkm::rendering::Canvas::ColorBufferType(Canvas->GetColorBuffer()).WritePortal(); auto depthPortal = @@ -63,9 +68,19 @@ void LineRenderer::RenderLine(const vtkm::Vec3f_64& point0, while (x0 >= 0 && x0 < Canvas->GetWidth() && y0 >= 0 && y0 < Canvas->GetHeight()) { - vtkm::Float32 t = (dx == 0) ? 1.0f : (static_cast(x0) - p0[0]) / (p1[0] - p0[0]); + vtkm::Float32 deltaX = static_cast(x0 - xStart); + vtkm::Float32 deltaY = static_cast(y0 - yStart); + // Depth is wrong, but its far less wrong that it used to be. + // These depth values are in screen space, which have been + // potentially tranformed by a perspective correction. + // To interpolated the depth correctly, there must be a perspective correction. + // I haven't looked, but the wireframmer probably suffers from this too. + // Additionally, this should not happen on the CPU. Annotations take + // far longer than the the geometry. + vtkm::Float32 t = pdist == 0.f ? 1.0 : vtkm::Sqrt(deltaX * deltaX + deltaY * deltaY) / pdist; t = vtkm::Min(1.f, vtkm::Max(0.f, t)); vtkm::Float32 z = vtkm::Lerp(z0, z1, t); + vtkm::Id index = y0 * Canvas->GetWidth() + x0; vtkm::Vec4f_32 currentColor = colorPortal.Get(index); vtkm::Float32 currentZ = depthPortal.Get(index); @@ -85,6 +100,7 @@ void LineRenderer::RenderLine(const vtkm::Vec3f_64& point0, writeColor[2] = currentColor[2] + colorC[2] * alpha; writeColor[3] = 1.f * alpha + currentColor[3]; // we are always drawing opaque lines // keep the current z. Line z interpolation is not accurate + // Matt: this is correct. Interpolation is wrong depth = currentZ; } diff --git a/vtkm/rendering/raytracing/CylinderIntersector.cxx b/vtkm/rendering/raytracing/CylinderIntersector.cxx index 0e73026b32ef422bf8cbff1c5ca275c440736224..06c973d87b380d310424fbefdfc61b998450709c 100644 --- a/vtkm/rendering/raytracing/CylinderIntersector.cxx +++ b/vtkm/rendering/raytracing/CylinderIntersector.cxx @@ -379,7 +379,7 @@ public: : MinScalar(minScalar) { Normalize = true; - if (minScalar > maxScalar) + if (minScalar >= maxScalar) { // support the scalar renderer Normalize = false; diff --git a/vtkm/rendering/raytracing/QuadIntersector.cxx b/vtkm/rendering/raytracing/QuadIntersector.cxx index 6590c76d7169434d2231d8d449ad7aa00204b221..ad74812c27ebb64c2a9857ed660710cb87b7b7f4 100644 --- a/vtkm/rendering/raytracing/QuadIntersector.cxx +++ b/vtkm/rendering/raytracing/QuadIntersector.cxx @@ -366,7 +366,7 @@ public: : MinScalar(minScalar) { Normalize = true; - if (minScalar > maxScalar) + if (minScalar >= maxScalar) { // support the scalar renderer Normalize = false; diff --git a/vtkm/rendering/raytracing/RayOperations.cxx b/vtkm/rendering/raytracing/RayOperations.cxx index 1d819eead0c7fcbb6967c2cf6ae3d274b73ead3b..a3d5ff087b013560edf560fae6afb3a0381ef08c 100644 --- a/vtkm/rendering/raytracing/RayOperations.cxx +++ b/vtkm/rendering/raytracing/RayOperations.cxx @@ -28,7 +28,7 @@ void RayOperations::MapCanvasToRays(Ray& rays, (void)valid; // this can be a false negative for really tiny spatial domains. vtkm::worklet::DispatcherMapField( detail::RayMapCanvas(inverse, width, height, camera.GetPosition())) - .Invoke(rays.PixelIdx, rays.MaxDistance, canvas.GetDepthBuffer()); + .Invoke(rays.PixelIdx, rays.MaxDistance, rays.Origin, canvas.GetDepthBuffer()); } } } diff --git a/vtkm/rendering/raytracing/RayOperations.h b/vtkm/rendering/raytracing/RayOperations.h index dd63c3c4fa513a1a2d999553da6e041237153032..5275b441d48dcc695c42f9f3db7244124507f850 100644 --- a/vtkm/rendering/raytracing/RayOperations.h +++ b/vtkm/rendering/raytracing/RayOperations.h @@ -70,12 +70,13 @@ public: DoubleInvWidth = 2.f / static_cast(width); } - using ControlSignature = void(FieldIn, FieldInOut, WholeArrayIn); - using ExecutionSignature = void(_1, _2, _3); + using ControlSignature = void(FieldIn, FieldInOut, FieldIn, WholeArrayIn); + using ExecutionSignature = void(_1, _2, _3, _4); template VTKM_EXEC void operator()(const vtkm::Id& pixelId, Precision& maxDistance, + const Vec& origin, const DepthPortalType& depths) const { vtkm::Vec4f_32 position; @@ -94,7 +95,8 @@ public: p[0] = position[0] / position[3]; p[1] = position[1] / position[3]; p[2] = position[2] / position[3]; - p = p - Origin; + p = p - origin; + maxDistance = vtkm::Magnitude(p); } diff --git a/vtkm/rendering/raytracing/RayTracer.cxx b/vtkm/rendering/raytracing/RayTracer.cxx index 0c12ef888e8e4b3d11a9f55520ce00f9a8a32170..49b512892aff827963ab4cfa62b706e7adccd34a 100644 --- a/vtkm/rendering/raytracing/RayTracer.cxx +++ b/vtkm/rendering/raytracing/RayTracer.cxx @@ -277,6 +277,7 @@ void RayTracer::RenderOnDevice(Ray& rays) logger->AddLogData("shapes", NumberOfShapes); logger->AddLogData("num_rays", rays.NumRays); + size_t numShapes = Intersectors.size(); if (NumberOfShapes > 0) { diff --git a/vtkm/rendering/raytracing/SphereIntersector.cxx b/vtkm/rendering/raytracing/SphereIntersector.cxx index 91dd697372131329821b359e71955b1d30bdf156..e2274cd6d5b85115c72cdb235f5f2c8eb15a3bc9 100644 --- a/vtkm/rendering/raytracing/SphereIntersector.cxx +++ b/vtkm/rendering/raytracing/SphereIntersector.cxx @@ -257,7 +257,7 @@ public: : MinScalar(minScalar) { Normalize = true; - if (minScalar > maxScalar) + if (minScalar >= maxScalar) { // support the scalar renderer Normalize = false; diff --git a/vtkm/rendering/raytracing/TriangleIntersector.cxx b/vtkm/rendering/raytracing/TriangleIntersector.cxx index 27b3bf05c5e2702280e6d36bdf76c682a2e0d97f..62d79535983b4f62b971382b64bf12676d10596a 100644 --- a/vtkm/rendering/raytracing/TriangleIntersector.cxx +++ b/vtkm/rendering/raytracing/TriangleIntersector.cxx @@ -251,7 +251,7 @@ public: : MinScalar(minScalar) { Normalize = true; - if (minScalar > maxScalar) + if (minScalar >= maxScalar) { // support the scalar renderer Normalize = false; @@ -315,7 +315,7 @@ public: : MinScalar(minScalar) { Normalize = true; - if (minScalar > maxScalar) + if (minScalar >= maxScalar) { // support the scalar renderer Normalize = false;