diff --git a/src/core/BufferAttribute.js b/src/core/BufferAttribute.js index 92fb5f0611f675..d832cc530e9c8e 100644 --- a/src/core/BufferAttribute.js +++ b/src/core/BufferAttribute.js @@ -2,6 +2,7 @@ import { Vector4 } from '../math/Vector4.js'; import { Vector3 } from '../math/Vector3.js'; import { Vector2 } from '../math/Vector2.js'; import { Color } from '../math/Color.js'; +import { denormalize, normalize } from '../math/MathUtils.js'; import { StaticDrawUsage } from '../constants.js'; const _vector = /*@__PURE__*/ new Vector3(); @@ -100,9 +101,19 @@ class BufferAttribute { } - array[ offset ++ ] = color.r; - array[ offset ++ ] = color.g; - array[ offset ++ ] = color.b; + if ( this.normalized ) { + + array[ offset ++ ] = normalize( color.r, array ); + array[ offset ++ ] = normalize( color.g, array ); + array[ offset ++ ] = normalize( color.b, array ); + + } else { + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } } @@ -126,8 +137,17 @@ class BufferAttribute { } - array[ offset ++ ] = vector.x; - array[ offset ++ ] = vector.y; + if ( this.normalized ) { + + array[ offset ++ ] = normalize( vector.x, array ); + array[ offset ++ ] = normalize( vector.y, array ); + + } else { + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } } @@ -151,9 +171,19 @@ class BufferAttribute { } - array[ offset ++ ] = vector.x; - array[ offset ++ ] = vector.y; - array[ offset ++ ] = vector.z; + if ( this.normalized ) { + + array[ offset ++ ] = normalize( vector.x, array ); + array[ offset ++ ] = normalize( vector.y, array ); + array[ offset ++ ] = normalize( vector.z, array ); + + } else { + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } } @@ -177,10 +207,21 @@ class BufferAttribute { } - array[ offset ++ ] = vector.x; - array[ offset ++ ] = vector.y; - array[ offset ++ ] = vector.z; - array[ offset ++ ] = vector.w; + if ( this.normalized ) { + + array[ offset ++ ] = normalize( vector.x, array ); + array[ offset ++ ] = normalize( vector.y, array ); + array[ offset ++ ] = normalize( vector.z, array ); + array[ offset ++ ] = normalize( vector.w, array ); + + } else { + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } } @@ -268,6 +309,8 @@ class BufferAttribute { set( value, offset = 0 ) { + if ( this.normalized ) value = normalize( value, this.array ); + this.array.set( value, offset ); return this; @@ -276,12 +319,18 @@ class BufferAttribute { getX( index ) { - return this.array[ index * this.itemSize ]; + let x = this.array[ index * this.itemSize ]; + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; } setX( index, x ) { + if ( this.normalized ) x = normalize( x, this.array ); + this.array[ index * this.itemSize ] = x; return this; @@ -290,12 +339,18 @@ class BufferAttribute { getY( index ) { - return this.array[ index * this.itemSize + 1 ]; + let y = this.array[ index * this.itemSize + 1 ]; + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; } setY( index, y ) { + if ( this.normalized ) y = normalize( y, this.array ); + this.array[ index * this.itemSize + 1 ] = y; return this; @@ -304,12 +359,18 @@ class BufferAttribute { getZ( index ) { - return this.array[ index * this.itemSize + 2 ]; + let z = this.array[ index * this.itemSize + 2 ]; + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; } setZ( index, z ) { + if ( this.normalized ) z = normalize( z, this.array ); + this.array[ index * this.itemSize + 2 ] = z; return this; @@ -318,12 +379,18 @@ class BufferAttribute { getW( index ) { - return this.array[ index * this.itemSize + 3 ]; + let w = this.array[ index * this.itemSize + 3 ]; + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; } setW( index, w ) { + if ( this.normalized ) w = normalize( w, this.array ); + this.array[ index * this.itemSize + 3 ] = w; return this; @@ -334,6 +401,13 @@ class BufferAttribute { index *= this.itemSize; + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; @@ -345,6 +419,14 @@ class BufferAttribute { index *= this.itemSize; + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; this.array[ index + 2 ] = z; @@ -357,6 +439,15 @@ class BufferAttribute { index *= this.itemSize; + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; this.array[ index + 2 ] = z; diff --git a/src/core/InterleavedBufferAttribute.js b/src/core/InterleavedBufferAttribute.js index 1fe89b7f6e60f3..aabb4aaf09e86c 100644 --- a/src/core/InterleavedBufferAttribute.js +++ b/src/core/InterleavedBufferAttribute.js @@ -1,5 +1,6 @@ import { Vector3 } from '../math/Vector3.js'; import { BufferAttribute } from './BufferAttribute.js'; +import { denormalize, normalize } from '../math/MathUtils.js'; const _vector = /*@__PURE__*/ new Vector3(); @@ -85,6 +86,8 @@ class InterleavedBufferAttribute { setX( index, x ) { + if ( this.normalized ) x = normalize( x, this.array ); + this.data.array[ index * this.data.stride + this.offset ] = x; return this; @@ -93,6 +96,8 @@ class InterleavedBufferAttribute { setY( index, y ) { + if ( this.normalized ) y = normalize( y, this.array ); + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; return this; @@ -101,6 +106,8 @@ class InterleavedBufferAttribute { setZ( index, z ) { + if ( this.normalized ) z = normalize( z, this.array ); + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; return this; @@ -109,6 +116,8 @@ class InterleavedBufferAttribute { setW( index, w ) { + if ( this.normalized ) w = normalize( w, this.array ); + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; return this; @@ -117,25 +126,41 @@ class InterleavedBufferAttribute { getX( index ) { - return this.data.array[ index * this.data.stride + this.offset ]; + let x = this.data.array[ index * this.data.stride + this.offset ]; + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; } getY( index ) { - return this.data.array[ index * this.data.stride + this.offset + 1 ]; + let y = this.data.array[ index * this.data.stride + this.offset + 1 ]; + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; } getZ( index ) { - return this.data.array[ index * this.data.stride + this.offset + 2 ]; + let z = this.data.array[ index * this.data.stride + this.offset + 2 ]; + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; } getW( index ) { - return this.data.array[ index * this.data.stride + this.offset + 3 ]; + let w = this.data.array[ index * this.data.stride + this.offset + 3 ]; + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; } @@ -143,6 +168,13 @@ class InterleavedBufferAttribute { index = index * this.data.stride + this.offset; + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; @@ -154,6 +186,14 @@ class InterleavedBufferAttribute { index = index * this.data.stride + this.offset; + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; this.data.array[ index + 2 ] = z; @@ -166,6 +206,15 @@ class InterleavedBufferAttribute { index = index * this.data.stride + this.offset; + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; this.data.array[ index + 2 ] = z; diff --git a/src/math/Color.js b/src/math/Color.js index 1f61b01adce9bf..32d4fb550db7c0 100644 --- a/src/math/Color.js +++ b/src/math/Color.js @@ -574,16 +574,6 @@ class Color { this.g = attribute.getY( index ); this.b = attribute.getZ( index ); - if ( attribute.normalized === true ) { - - // assuming Uint8Array - - this.r /= 255; - this.g /= 255; - this.b /= 255; - - } - return this; } diff --git a/src/renderers/webgl/WebGLMorphtargets.js b/src/renderers/webgl/WebGLMorphtargets.js index ec61e7cd23127c..9fbb99e57717b5 100644 --- a/src/renderers/webgl/WebGLMorphtargets.js +++ b/src/renderers/webgl/WebGLMorphtargets.js @@ -112,8 +112,6 @@ function WebGLMorphtargets( gl, capabilities, textures ) { morph.fromBufferAttribute( morphTarget, j ); - if ( morphTarget.normalized === true ) denormalize( morph, morphTarget ); - buffer[ offset + stride + 0 ] = morph.x; buffer[ offset + stride + 1 ] = morph.y; buffer[ offset + stride + 2 ] = morph.z; @@ -125,8 +123,6 @@ function WebGLMorphtargets( gl, capabilities, textures ) { morph.fromBufferAttribute( morphNormal, j ); - if ( morphNormal.normalized === true ) denormalize( morph, morphNormal ); - buffer[ offset + stride + 4 ] = morph.x; buffer[ offset + stride + 5 ] = morph.y; buffer[ offset + stride + 6 ] = morph.z; @@ -138,8 +134,6 @@ function WebGLMorphtargets( gl, capabilities, textures ) { morph.fromBufferAttribute( morphColor, j ); - if ( morphColor.normalized === true ) denormalize( morph, morphColor ); - buffer[ offset + stride + 8 ] = morph.x; buffer[ offset + stride + 9 ] = morph.y; buffer[ offset + stride + 10 ] = morph.z;