diff --git a/src/math/p5.Vector.js b/src/math/p5.Vector.js index d2dd4abef5..703cfa6cda 100644 --- a/src/math/p5.Vector.js +++ b/src/math/p5.Vector.js @@ -2972,8 +2972,8 @@ p5.Vector = class { * */ reflect(surfaceNormal) { - surfaceNormal.normalize(); - return this.sub(surfaceNormal.mult(2 * this.dot(surfaceNormal))); + const surfaceNormalCopy = p5.Vector.normalize(surfaceNormal); + return this.sub(surfaceNormalCopy.mult(2 * this.dot(surfaceNormalCopy))); } /** diff --git a/test/unit/math/p5.Vector.js b/test/unit/math/p5.Vector.js index 07a7d6b454..ef3570ee0b 100644 --- a/test/unit/math/p5.Vector.js +++ b/test/unit/math/p5.Vector.js @@ -1646,6 +1646,21 @@ suite('p5.Vector', function() { 0.01 ); }); + test('should not update surface normal', function() { + const tolerance = 0.001; + assert.closeTo(x_normal.x, 3, tolerance); + assert.closeTo(x_normal.y, 0, tolerance); + assert.closeTo(x_normal.z, 0, tolerance); + + assert.closeTo(y_normal.x, 0, tolerance); + assert.closeTo(y_normal.y, 3, tolerance); + assert.closeTo(y_normal.z, 0, tolerance); + + assert.closeTo(z_normal.x, 0, tolerance); + assert.closeTo(z_normal.y, 0, tolerance); + assert.closeTo(z_normal.z, 3, tolerance); + }); + }); suite('p5.Vector.reflect() [CLASS]', function() { @@ -1696,6 +1711,22 @@ suite('p5.Vector', function() { expect(z_bounce_incoming).to.not.equal(z_bounce_outgoing); }); + test('should not update surface normal', function() { + const tolerance = 0.001; + assert.closeTo(x_normal.x, 3, tolerance); + assert.closeTo(x_normal.y, 0, tolerance); + assert.closeTo(x_normal.z, 0, tolerance); + + assert.closeTo(y_normal.x, 0, tolerance); + assert.closeTo(y_normal.y, 3, tolerance); + assert.closeTo(y_normal.z, 0, tolerance); + + assert.closeTo(z_normal.x, 0, tolerance); + assert.closeTo(z_normal.y, 0, tolerance); + assert.closeTo(z_normal.z, 3, tolerance); + }); + + test('should update target', function() { assert.equal(x_target, x_bounce_outgoing); assert.equal(y_target, y_bounce_outgoing);