55// property of any third parties.
66
77#include < pch.h>
8+
89#include < jet/constants.h>
910#include < jet/custom_implicit_surface2.h>
1011#include < jet/level_set_utils.h>
@@ -14,12 +15,13 @@ using namespace jet;
1415CustomImplicitSurface2::CustomImplicitSurface2 (
1516 const std::function<double (const Vector2D&)>& func,
1617 const BoundingBox2D& domain, double resolution,
17- unsigned int maxNumOfIterations, const Transform2& transform ,
18- bool isNormalFlipped)
18+ double rayMarchingResolution, unsigned int maxNumOfIterations ,
19+ const Transform2& transform, bool isNormalFlipped)
1920 : ImplicitSurface2(transform, isNormalFlipped),
2021 _func(func),
2122 _domain(domain),
2223 _resolution(resolution),
24+ _rayMarchingResolution(rayMarchingResolution),
2325 _maxNumOfIterations(maxNumOfIterations) {}
2426
2527CustomImplicitSurface2::~CustomImplicitSurface2 () {}
@@ -54,17 +56,18 @@ bool CustomImplicitSurface2::intersectsLocal(const Ray2D& ray) const {
5456
5557 double t = tStart;
5658 Vector2D pt = ray.pointAt (t);
57- double prevSign = sign (_func (pt));
58-
59+ double prevPhi = _func (pt);
5960 while (t <= tEnd) {
6061 pt = ray.pointAt (t);
61- double newSign = sign (_func (pt));
62+ const double newPhi = _func (pt);
63+ const double newPhiAbs = std::fabs (newPhi);
6264
63- if (newSign * prevSign < 0.0 ) {
65+ if (newPhi * prevPhi < 0.0 ) {
6466 return true ;
6567 }
6668
67- t += _resolution;
69+ t += std::max (newPhiAbs, _rayMarchingResolution);
70+ prevPhi = newPhi;
6871 }
6972 }
7073
@@ -118,11 +121,12 @@ SurfaceRayIntersection2 CustomImplicitSurface2::closestIntersectionLocal(
118121
119122 while (t <= tEnd) {
120123 pt = ray.pointAt (t);
121- double newPhi = _func (pt);
124+ const double newPhi = _func (pt);
125+ const double newPhiAbs = std::fabs (newPhi);
122126
123127 if (newPhi * prevPhi < 0.0 ) {
124- double frac = fractionInsideSdf (prevPhi, newPhi);
125- double tSub = t + _resolution * frac;
128+ const double frac = prevPhi / (prevPhi - newPhi);
129+ const double tSub = t + _rayMarchingResolution * frac;
126130
127131 result.isIntersecting = true ;
128132 result.distance = tSub;
@@ -135,7 +139,8 @@ SurfaceRayIntersection2 CustomImplicitSurface2::closestIntersectionLocal(
135139 return result;
136140 }
137141
138- t += _resolution;
142+ t += std::max (newPhiAbs, _rayMarchingResolution);
143+ prevPhi = newPhi;
139144 }
140145 }
141146
@@ -174,6 +179,12 @@ CustomImplicitSurface2::Builder::withResolution(double resolution) {
174179 return *this ;
175180}
176181
182+ CustomImplicitSurface2::Builder&
183+ CustomImplicitSurface2::Builder::withRayMarchingResolution (double resolution) {
184+ _rayMarchingResolution = resolution;
185+ return *this ;
186+ }
187+
177188CustomImplicitSurface2::Builder&
178189CustomImplicitSurface2::Builder::withMaxNumberOfIterations (
179190 unsigned int numIter) {
@@ -183,14 +194,14 @@ CustomImplicitSurface2::Builder::withMaxNumberOfIterations(
183194
184195CustomImplicitSurface2 CustomImplicitSurface2::Builder::build () const {
185196 return CustomImplicitSurface2 (_func, _domain, _resolution,
186- _maxNumOfIterations, _transform ,
187- _isNormalFlipped);
197+ _rayMarchingResolution, _maxNumOfIterations ,
198+ _transform, _isNormalFlipped);
188199}
189200
190201CustomImplicitSurface2Ptr CustomImplicitSurface2::Builder::makeShared () const {
191202 return std::shared_ptr<CustomImplicitSurface2>(
192203 new CustomImplicitSurface2 (_func, _domain, _resolution,
193- _maxNumOfIterations, _transform ,
194- _isNormalFlipped),
204+ _rayMarchingResolution, _maxNumOfIterations ,
205+ _transform, _isNormalFlipped),
195206 [](CustomImplicitSurface2* obj) { delete obj; });
196207}
0 commit comments