Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Addons: Remove PackedPhongMaterial. #29382

Merged
merged 1 commit into from
Sep 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion examples/files.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
159 changes: 37 additions & 122 deletions examples/jsm/utils/GeometryCompressionUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) {

Expand Down Expand Up @@ -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' ) {

Expand All @@ -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' ) {

Expand All @@ -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' ) {

Expand All @@ -120,69 +112,31 @@ 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 {

console.error( 'Unrecognized encoding method, should be `DEFAULT` or `ANGLES` or `OCT`. ' );

}

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 ) {

Expand All @@ -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 ) {

Expand Down Expand Up @@ -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;

}

Expand Down
Loading