@@ -34,7 +34,7 @@ public override IEnumerable<VFXNamedExpression> GetParameters(CollisionBase coll
3434
3535 yield return p ;
3636 }
37-
37+
3838 var w = new VFXExpressionCastUintToFloat ( new VFXExpressionTextureWidth ( SDF ) ) ;
3939 var h = new VFXExpressionCastUintToFloat ( new VFXExpressionTextureHeight ( SDF ) ) ;
4040 var d = new VFXExpressionCastUintToFloat ( new VFXExpressionTextureDepth ( SDF ) ) ;
@@ -92,7 +92,16 @@ public override string GetSource(CollisionBase collisionBase)
9292 int i = 0;
9393 hit = false;
9494 float maxDist = length(tDelta * textureDimInvScale);
95- for(i = 0; i < ITERATION_COUNT; i++)
95+
96+ int iterationCount = ITERATION_COUNT;
97+ if(dist < VFX_EPSILON)
98+ {
99+ hit = true;
100+ tHit = 0;
101+ iterationCount = 0;
102+ }
103+
104+ for(i = 0; i < iterationCount; i++)
96105 {
97106 uvw = uvw + tDir * textureDimScale * dist;
98107 float newDist = colliderSign * (SampleSDF(DistanceField, uvw) - radiusOffset);
@@ -119,14 +128,18 @@ public override string GetSource(CollisionBase collisionBase)
119128
120129 string projectOnSurfaceCode = @"
121130 hit = true;
122- const int ITERATION_COUNT = 4;
123- int i = 0;
131+
124132 float3 uvw = saturate(tPos + 0.5f);
125133 float3 sdfNormal = normalize(SampleSDFUnscaledDerivatives(DistanceField, uvw, uvStep));
126134 float radiusOffset = colliderSign * dot(sdfNormal*sdfNormal ,invScale * textureDimInvScale) * radius;
127135
136+ const int ITERATION_COUNT = 4;
137+ int i = 0;
128138 for(i = 0; i < ITERATION_COUNT; i++)
129139 {
140+ float dist = colliderSign * (SampleSDF(DistanceField, uvw) - radiusOffset);
141+ if(abs(dist) < VFX_EPSILON)
142+ break;
130143 uvw = IterateTowardSDFSurface(DistanceField, uvw, uvStep, radiusOffset, stepSizeMeter, sdfNormal);
131144 }
132145 tPos = uvw - 0.5f;
@@ -136,7 +149,6 @@ public override string GetSource(CollisionBase collisionBase)
136149 tHit = 0;
137150" ;
138151
139-
140152 var Source = new StringBuilder ( $@ "
141153if (isZeroScaled)
142154 return;
0 commit comments