@@ -15,7 +15,8 @@ export interface ICollisionCoordinator {
15
15
maximumRetry : number ,
16
16
excludedMesh : Nullable < AbstractMesh > ,
17
17
onNewPosition : ( collisionIndex : number , newPosition : Vector3 , collidedMesh : Nullable < AbstractMesh > ) => void ,
18
- collisionIndex : number
18
+ collisionIndex : number ,
19
+ slideOnCollide ?: boolean
19
20
) : void ;
20
21
init ( scene : Scene ) : void ;
21
22
}
@@ -36,15 +37,16 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator {
36
37
maximumRetry : number ,
37
38
excludedMesh : AbstractMesh ,
38
39
onNewPosition : ( collisionIndex : number , newPosition : Vector3 , collidedMesh : Nullable < AbstractMesh > ) => void ,
39
- collisionIndex : number
40
+ collisionIndex : number ,
41
+ slideOnCollide : boolean = true
40
42
) : void {
41
43
position . divideToRef ( collider . _radius , this . _scaledPosition ) ;
42
44
displacement . divideToRef ( collider . _radius , this . _scaledVelocity ) ;
43
45
collider . collidedMesh = null ;
44
46
collider . _retry = 0 ;
45
47
collider . _initialVelocity = this . _scaledVelocity ;
46
48
collider . _initialPosition = this . _scaledPosition ;
47
- this . _collideWithWorld ( this . _scaledPosition , this . _scaledVelocity , collider , maximumRetry , this . _finalPosition , excludedMesh ) ;
49
+ this . _collideWithWorld ( this . _scaledPosition , this . _scaledVelocity , collider , maximumRetry , this . _finalPosition , slideOnCollide , excludedMesh ) ;
48
50
49
51
this . _finalPosition . multiplyInPlace ( collider . _radius ) ;
50
52
//run the callback
@@ -65,6 +67,7 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator {
65
67
collider : Collider ,
66
68
maximumRetry : number ,
67
69
finalPosition : Vector3 ,
70
+ slideOnCollide : boolean ,
68
71
excludedMesh : Nullable < AbstractMesh > = null
69
72
) : void {
70
73
const closeDistance = AbstractEngine . CollisionsEpsilon * 10.0 ;
@@ -96,7 +99,11 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator {
96
99
}
97
100
98
101
if ( velocity . x !== 0 || velocity . y !== 0 || velocity . z !== 0 ) {
99
- collider . _getResponse ( position , velocity ) ;
102
+ collider . _getResponse ( position , velocity , slideOnCollide ) ;
103
+ // Halt all movement at the first collision, if not slideOnCollide
104
+ if ( ! slideOnCollide ) {
105
+ velocity . setAll ( 0 ) ;
106
+ }
100
107
}
101
108
102
109
if ( velocity . length ( ) <= closeDistance ) {
@@ -105,7 +112,7 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator {
105
112
}
106
113
107
114
collider . _retry ++ ;
108
- this . _collideWithWorld ( position , velocity , collider , maximumRetry , finalPosition , excludedMesh ) ;
115
+ this . _collideWithWorld ( position , velocity , collider , maximumRetry , finalPosition , slideOnCollide , excludedMesh ) ;
109
116
}
110
117
}
111
118
0 commit comments