From 47c10922535d54b2fef12a385abdc20c6abc1110 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Tue, 10 Sep 2024 11:35:01 +0200 Subject: [PATCH] Addons: Remove `PackedPhongMaterial`. --- examples/files.json | 1 - .../jsm/utils/GeometryCompressionUtils.js | 159 +++------- examples/jsm/utils/PackedPhongMaterial.js | 178 ------------ .../webgl_buffergeometry_compression.jpg | Bin 12213 -> 0 bytes .../webgl_buffergeometry_compression.html | 273 ------------------ 5 files changed, 37 insertions(+), 574 deletions(-) delete mode 100644 examples/jsm/utils/PackedPhongMaterial.js delete mode 100644 examples/screenshots/webgl_buffergeometry_compression.jpg delete mode 100644 examples/webgl_buffergeometry_compression.html diff --git a/examples/files.json b/examples/files.json index e334c744b5fa2e..2f8a0d483c19e6 100644 --- a/examples/files.json +++ b/examples/files.json @@ -253,7 +253,6 @@ "webgl_buffergeometry", "webgl_buffergeometry_attributes_integer", "webgl_buffergeometry_attributes_none", - "webgl_buffergeometry_compression", "webgl_buffergeometry_custom_attributes_particles", "webgl_buffergeometry_drawrange", "webgl_buffergeometry_glbufferattribute", diff --git a/examples/jsm/utils/GeometryCompressionUtils.js b/examples/jsm/utils/GeometryCompressionUtils.js index 0be91d568c15bf..31bbaf9718faae 100644 --- a/examples/jsm/utils/GeometryCompressionUtils.js +++ b/examples/jsm/utils/GeometryCompressionUtils.js @@ -11,27 +11,19 @@ import { Matrix4, Vector3 } from 'three'; -import { PackedPhongMaterial } from './PackedPhongMaterial.js'; /** - * Make the input mesh.geometry's normal attribute encoded and compressed by 3 different methods. - * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the normal data. + * Make the input geometry's normal attribute encoded and compressed by 3 different methods. * - * @param {THREE.Mesh} mesh + * @param {THREE.BufferGeometry} geometry * @param {String} encodeMethod "DEFAULT" || "OCT1Byte" || "OCT2Byte" || "ANGLES" * */ -function compressNormals( mesh, encodeMethod ) { +function compressNormals( geometry, encodeMethod ) { - if ( ! mesh.geometry ) { - - console.error( 'Mesh must contain geometry. ' ); - - } - - const normal = mesh.geometry.attributes.normal; + const normal = geometry.attributes.normal; if ( ! normal ) { @@ -66,8 +58,8 @@ function compressNormals( mesh, encodeMethod ) { } - mesh.geometry.setAttribute( 'normal', new BufferAttribute( result, 3, true ) ); - mesh.geometry.attributes.normal.bytes = result.length * 1; + geometry.setAttribute( 'normal', new BufferAttribute( result, 3, true ) ); + geometry.attributes.normal.bytes = result.length * 1; } else if ( encodeMethod == 'OCT1Byte' ) { @@ -88,8 +80,8 @@ function compressNormals( mesh, encodeMethod ) { } - mesh.geometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) ); - mesh.geometry.attributes.normal.bytes = result.length * 1; + geometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) ); + geometry.attributes.normal.bytes = result.length * 1; } else if ( encodeMethod == 'OCT2Byte' ) { @@ -104,8 +96,8 @@ function compressNormals( mesh, encodeMethod ) { } - mesh.geometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) ); - mesh.geometry.attributes.normal.bytes = result.length * 2; + geometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) ); + geometry.attributes.normal.bytes = result.length * 2; } else if ( encodeMethod == 'ANGLES' ) { @@ -120,8 +112,8 @@ function compressNormals( mesh, encodeMethod ) { } - mesh.geometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) ); - mesh.geometry.attributes.normal.bytes = result.length * 2; + geometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) ); + geometry.attributes.normal.bytes = result.length * 2; } else { @@ -129,60 +121,22 @@ function compressNormals( mesh, encodeMethod ) { } - mesh.geometry.attributes.normal.needsUpdate = true; - mesh.geometry.attributes.normal.isPacked = true; - mesh.geometry.attributes.normal.packingMethod = encodeMethod; - - // modify material - if ( ! ( mesh.material instanceof PackedPhongMaterial ) ) { - - mesh.material = new PackedPhongMaterial().copy( mesh.material ); - - } - - if ( encodeMethod == 'ANGLES' ) { - - mesh.material.defines.USE_PACKED_NORMAL = 0; - - } - - if ( encodeMethod == 'OCT1Byte' ) { - - mesh.material.defines.USE_PACKED_NORMAL = 1; - - } - - if ( encodeMethod == 'OCT2Byte' ) { - - mesh.material.defines.USE_PACKED_NORMAL = 1; - - } - - if ( encodeMethod == 'DEFAULT' ) { - - mesh.material.defines.USE_PACKED_NORMAL = 2; - - } + geometry.attributes.normal.needsUpdate = true; + geometry.attributes.normal.isPacked = true; + geometry.attributes.normal.packingMethod = encodeMethod; } /** - * Make the input mesh.geometry's position attribute encoded and compressed. - * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the position data. + * Make the input geometry's position attribute encoded and compressed. * - * @param {THREE.Mesh} mesh + * @param {THREE.BufferGeometry} geometry * */ -function compressPositions( mesh ) { +function compressPositions( geometry ) { - if ( ! mesh.geometry ) { - - console.error( 'Mesh must contain geometry. ' ); - - } - - const position = mesh.geometry.attributes.position; + const position = geometry.attributes.position; if ( ! position ) { @@ -204,47 +158,27 @@ function compressPositions( mesh ) { const result = quantizedEncode( array, encodingBytes ); const quantized = result.quantized; - const decodeMat = result.decodeMat; // IMPORTANT: calculate original geometry bounding info first, before updating packed positions - if ( mesh.geometry.boundingBox == null ) mesh.geometry.computeBoundingBox(); - if ( mesh.geometry.boundingSphere == null ) mesh.geometry.computeBoundingSphere(); + if ( geometry.boundingBox == null ) geometry.computeBoundingBox(); + if ( geometry.boundingSphere == null ) geometry.computeBoundingSphere(); - mesh.geometry.setAttribute( 'position', new BufferAttribute( quantized, 3 ) ); - mesh.geometry.attributes.position.isPacked = true; - mesh.geometry.attributes.position.needsUpdate = true; - mesh.geometry.attributes.position.bytes = quantized.length * encodingBytes; - - // modify material - if ( ! ( mesh.material instanceof PackedPhongMaterial ) ) { - - mesh.material = new PackedPhongMaterial().copy( mesh.material ); - - } - - mesh.material.defines.USE_PACKED_POSITION = 0; - - mesh.material.uniforms.quantizeMatPos.value = decodeMat; - mesh.material.uniforms.quantizeMatPos.needsUpdate = true; + geometry.setAttribute( 'position', new BufferAttribute( quantized, 3 ) ); + geometry.attributes.position.isPacked = true; + geometry.attributes.position.needsUpdate = true; + geometry.attributes.position.bytes = quantized.length * encodingBytes; } /** - * Make the input mesh.geometry's uv attribute encoded and compressed. - * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the uv data. + * Make the input geometry's uv attribute encoded and compressed. * - * @param {THREE.Mesh} mesh + * @param {THREE.BufferGeometry} geometry * */ -function compressUvs( mesh ) { +function compressUvs( geometry ) { - if ( ! mesh.geometry ) { - - console.error( 'Mesh must contain geometry property. ' ); - - } - - const uvs = mesh.geometry.attributes.uv; + const uvs = geometry.attributes.uv; if ( ! uvs ) { @@ -281,39 +215,20 @@ function compressUvs( mesh ) { } - mesh.geometry.setAttribute( 'uv', new BufferAttribute( result, 2, true ) ); - mesh.geometry.attributes.uv.isPacked = true; - mesh.geometry.attributes.uv.needsUpdate = true; - mesh.geometry.attributes.uv.bytes = result.length * 2; - - if ( ! ( mesh.material instanceof PackedPhongMaterial ) ) { - - mesh.material = new PackedPhongMaterial().copy( mesh.material ); - - } - - mesh.material.defines.USE_PACKED_UV = 0; + geometry.setAttribute( 'uv', new BufferAttribute( result, 2, true ) ); + geometry.attributes.uv.isPacked = true; + geometry.attributes.uv.needsUpdate = true; + geometry.attributes.uv.bytes = result.length * 2; } else { // use quantized encoding method result = quantizedEncodeUV( array, 2 ); - mesh.geometry.setAttribute( 'uv', new BufferAttribute( result.quantized, 2 ) ); - mesh.geometry.attributes.uv.isPacked = true; - mesh.geometry.attributes.uv.needsUpdate = true; - mesh.geometry.attributes.uv.bytes = result.quantized.length * 2; - - if ( ! ( mesh.material instanceof PackedPhongMaterial ) ) { - - mesh.material = new PackedPhongMaterial().copy( mesh.material ); - - } - - mesh.material.defines.USE_PACKED_UV = 1; - - mesh.material.uniforms.quantizeMatUV.value = result.decodeMat; - mesh.material.uniforms.quantizeMatUV.needsUpdate = true; + geometry.setAttribute( 'uv', new BufferAttribute( result.quantized, 2 ) ); + geometry.attributes.uv.isPacked = true; + geometry.attributes.uv.needsUpdate = true; + geometry.attributes.uv.bytes = result.quantized.length * 2; } diff --git a/examples/jsm/utils/PackedPhongMaterial.js b/examples/jsm/utils/PackedPhongMaterial.js deleted file mode 100644 index f71aab8e2d8c6b..00000000000000 --- a/examples/jsm/utils/PackedPhongMaterial.js +++ /dev/null @@ -1,178 +0,0 @@ - -/** - * `PackedPhongMaterial` inherited from THREE.MeshPhongMaterial - * - * @param {Object} parameters - */ -import { - MeshPhongMaterial, - ShaderChunk, - ShaderLib, - UniformsUtils, -} from 'three'; - -class PackedPhongMaterial extends MeshPhongMaterial { - - constructor( parameters ) { - - super(); - - this.defines = {}; - this.type = 'PackedPhongMaterial'; - this.uniforms = UniformsUtils.merge( [ - - ShaderLib.phong.uniforms, - - { - quantizeMatPos: { value: null }, - quantizeMatUV: { value: null } - } - - ] ); - - this.vertexShader = [ - '#define PHONG', - - 'varying vec3 vViewPosition;', - - ShaderChunk.common, - ShaderChunk.uv_pars_vertex, - ShaderChunk.displacementmap_pars_vertex, - ShaderChunk.envmap_pars_vertex, - ShaderChunk.color_pars_vertex, - ShaderChunk.fog_pars_vertex, - ShaderChunk.normal_pars_vertex, - ShaderChunk.morphtarget_pars_vertex, - ShaderChunk.skinning_pars_vertex, - ShaderChunk.shadowmap_pars_vertex, - ShaderChunk.logdepthbuf_pars_vertex, - ShaderChunk.clipping_planes_pars_vertex, - - `#ifdef USE_PACKED_NORMAL - #if USE_PACKED_NORMAL == 0 - vec3 decodeNormal(vec3 packedNormal) - { - float x = packedNormal.x * 2.0 - 1.0; - float y = packedNormal.y * 2.0 - 1.0; - vec2 scth = vec2(sin(x * PI), cos(x * PI)); - vec2 scphi = vec2(sqrt(1.0 - y * y), y); - return normalize( vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y) ); - } - #endif - - #if USE_PACKED_NORMAL == 1 - vec3 decodeNormal(vec3 packedNormal) - { - vec3 v = vec3(packedNormal.xy, 1.0 - abs(packedNormal.x) - abs(packedNormal.y)); - if (v.z < 0.0) - { - v.xy = (1.0 - abs(v.yx)) * vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0); - } - return normalize(v); - } - #endif - - #if USE_PACKED_NORMAL == 2 - vec3 decodeNormal(vec3 packedNormal) - { - vec3 v = (packedNormal * 2.0) - 1.0; - return normalize(v); - } - #endif - #endif`, - - `#ifdef USE_PACKED_POSITION - #if USE_PACKED_POSITION == 0 - uniform mat4 quantizeMatPos; - #endif - #endif`, - - `#ifdef USE_PACKED_UV - #if USE_PACKED_UV == 1 - uniform mat3 quantizeMatUV; - #endif - #endif`, - - `#ifdef USE_PACKED_UV - #if USE_PACKED_UV == 0 - vec2 decodeUV(vec2 packedUV) - { - vec2 uv = (packedUV * 2.0) - 1.0; - return uv; - } - #endif - - #if USE_PACKED_UV == 1 - vec2 decodeUV(vec2 packedUV) - { - vec2 uv = ( vec3(packedUV, 1.0) * quantizeMatUV ).xy; - return uv; - } - #endif - #endif`, - - 'void main() {', - - ShaderChunk.uv_vertex, - - `#ifdef USE_MAP - #ifdef USE_PACKED_UV - vMapUv = decodeUV(vMapUv); - #endif - #endif`, - - ShaderChunk.color_vertex, - ShaderChunk.morphcolor_vertex, - - ShaderChunk.beginnormal_vertex, - - `#ifdef USE_PACKED_NORMAL - objectNormal = decodeNormal(objectNormal); - #endif - - #ifdef USE_TANGENT - vec3 objectTangent = vec3( tangent.xyz ); - #endif - `, - - ShaderChunk.morphnormal_vertex, - ShaderChunk.skinbase_vertex, - ShaderChunk.skinnormal_vertex, - ShaderChunk.defaultnormal_vertex, - ShaderChunk.normal_vertex, - - ShaderChunk.begin_vertex, - - `#ifdef USE_PACKED_POSITION - #if USE_PACKED_POSITION == 0 - transformed = ( vec4(transformed, 1.0) * quantizeMatPos ).xyz; - #endif - #endif`, - - ShaderChunk.morphtarget_vertex, - ShaderChunk.skinning_vertex, - ShaderChunk.displacementmap_vertex, - ShaderChunk.project_vertex, - ShaderChunk.logdepthbuf_vertex, - ShaderChunk.clipping_planes_vertex, - - 'vViewPosition = - mvPosition.xyz;', - - ShaderChunk.worldpos_vertex, - ShaderChunk.envmap_vertex, - ShaderChunk.shadowmap_vertex, - ShaderChunk.fog_vertex, - - '}', - ].join( '\n' ); - - // Use the original MeshPhongMaterial's fragmentShader. - this.fragmentShader = ShaderLib.phong.fragmentShader; - - this.setValues( parameters ); - - } - -} - -export { PackedPhongMaterial }; diff --git a/examples/screenshots/webgl_buffergeometry_compression.jpg b/examples/screenshots/webgl_buffergeometry_compression.jpg deleted file mode 100644 index 4da713d915df6ad60b5adff074444173aeaf52f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12213 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 Urq)mRcS-)g`Sd@341yp34~<~b82|tP diff --git a/examples/webgl_buffergeometry_compression.html b/examples/webgl_buffergeometry_compression.html deleted file mode 100644 index 1822acd3b6ec90..00000000000000 --- a/examples/webgl_buffergeometry_compression.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - three.js webgl - buffergeometry - compression - - - - - -
- three.js - BufferGeometry Compression
- Octahedron and Quantization encoding methods from Tarek Sherif -
- - - - - - -