Skip to content

Commit 6da00a8

Browse files
ludovic-theobaldEvergreen
authored andcommitted
[VFX] Fix Collision with SDF jitter in rest state
1 parent 17bcb75 commit 6da00a8

File tree

1 file changed

+17
-5
lines changed
  • Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/Collision

1 file changed

+17
-5
lines changed

Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/Collision/CollisionSDF.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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($@"
141153
if (isZeroScaled)
142154
return;

0 commit comments

Comments
 (0)