- // Resolve slides and crossing cell boundaries
- // in reverse order to direct movement limits, because
- // we only want to cross the closest cell boundary.
- if (reachedZn) {
- if (obstacle & OBSTACLE_ZN) {
- float dx = clamp(displacement.x, distanceXn, distanceXp);
- position.x += dx;
- displacement = scaleVector(displacement, 1.0f - (dx / displacement.x));
+ // Slide along obstacles
+ if ((reachedXp && obstacle & OBSTACLE_XP)
+ || (reachedXn && obstacle & OBSTACLE_XN))
+ {
+ float dz = displacement.z;
+ if (dz > distanceZp) {
+ dz = distanceZp;
+ reachedZp = true;