|
@@ -6,176 +6,15 @@ import {
|
|
|
InterleavedBufferAttribute,
|
|
|
TriangleFanDrawMode,
|
|
|
TriangleStripDrawMode,
|
|
|
- TrianglesDrawMode,
|
|
|
- Vector2,
|
|
|
- Vector3
|
|
|
+ TrianglesDrawMode
|
|
|
} from '../../../build/three.module.js';
|
|
|
|
|
|
var BufferGeometryUtils = {
|
|
|
|
|
|
computeTangents: function ( geometry ) {
|
|
|
|
|
|
- var index = geometry.index;
|
|
|
- var attributes = geometry.attributes;
|
|
|
-
|
|
|
- // based on http://www.terathon.com/code/tangent.html
|
|
|
- // (per vertex tangents)
|
|
|
-
|
|
|
- if ( index === null ||
|
|
|
- attributes.position === undefined ||
|
|
|
- attributes.normal === undefined ||
|
|
|
- attributes.uv === undefined ) {
|
|
|
-
|
|
|
- console.error( 'THREE.BufferGeometryUtils: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );
|
|
|
- return;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var indices = index.array;
|
|
|
- var positions = attributes.position.array;
|
|
|
- var normals = attributes.normal.array;
|
|
|
- var uvs = attributes.uv.array;
|
|
|
-
|
|
|
- var nVertices = positions.length / 3;
|
|
|
-
|
|
|
- if ( attributes.tangent === undefined ) {
|
|
|
-
|
|
|
- geometry.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var tangents = attributes.tangent.array;
|
|
|
-
|
|
|
- var tan1 = [], tan2 = [];
|
|
|
-
|
|
|
- for ( var i = 0; i < nVertices; i ++ ) {
|
|
|
-
|
|
|
- tan1[ i ] = new Vector3();
|
|
|
- tan2[ i ] = new Vector3();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var vA = new Vector3(),
|
|
|
- vB = new Vector3(),
|
|
|
- vC = new Vector3(),
|
|
|
-
|
|
|
- uvA = new Vector2(),
|
|
|
- uvB = new Vector2(),
|
|
|
- uvC = new Vector2(),
|
|
|
-
|
|
|
- sdir = new Vector3(),
|
|
|
- tdir = new Vector3();
|
|
|
-
|
|
|
- function handleTriangle( a, b, c ) {
|
|
|
-
|
|
|
- vA.fromArray( positions, a * 3 );
|
|
|
- vB.fromArray( positions, b * 3 );
|
|
|
- vC.fromArray( positions, c * 3 );
|
|
|
-
|
|
|
- uvA.fromArray( uvs, a * 2 );
|
|
|
- uvB.fromArray( uvs, b * 2 );
|
|
|
- uvC.fromArray( uvs, c * 2 );
|
|
|
-
|
|
|
- vB.sub( vA );
|
|
|
- vC.sub( vA );
|
|
|
-
|
|
|
- uvB.sub( uvA );
|
|
|
- uvC.sub( uvA );
|
|
|
-
|
|
|
- var r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );
|
|
|
-
|
|
|
- // silently ignore degenerate uv triangles having coincident or colinear vertices
|
|
|
-
|
|
|
- if ( ! isFinite( r ) ) return;
|
|
|
-
|
|
|
- sdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );
|
|
|
- tdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );
|
|
|
-
|
|
|
- tan1[ a ].add( sdir );
|
|
|
- tan1[ b ].add( sdir );
|
|
|
- tan1[ c ].add( sdir );
|
|
|
-
|
|
|
- tan2[ a ].add( tdir );
|
|
|
- tan2[ b ].add( tdir );
|
|
|
- tan2[ c ].add( tdir );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var groups = geometry.groups;
|
|
|
-
|
|
|
- if ( groups.length === 0 ) {
|
|
|
-
|
|
|
- groups = [ {
|
|
|
- start: 0,
|
|
|
- count: indices.length
|
|
|
- } ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- for ( var i = 0, il = groups.length; i < il; ++ i ) {
|
|
|
-
|
|
|
- var group = groups[ i ];
|
|
|
-
|
|
|
- var start = group.start;
|
|
|
- var count = group.count;
|
|
|
-
|
|
|
- for ( var j = start, jl = start + count; j < jl; j += 3 ) {
|
|
|
-
|
|
|
- handleTriangle(
|
|
|
- indices[ j + 0 ],
|
|
|
- indices[ j + 1 ],
|
|
|
- indices[ j + 2 ]
|
|
|
- );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var tmp = new Vector3(), tmp2 = new Vector3();
|
|
|
- var n = new Vector3(), n2 = new Vector3();
|
|
|
- var w, t, test;
|
|
|
-
|
|
|
- function handleVertex( v ) {
|
|
|
-
|
|
|
- n.fromArray( normals, v * 3 );
|
|
|
- n2.copy( n );
|
|
|
-
|
|
|
- t = tan1[ v ];
|
|
|
-
|
|
|
- // Gram-Schmidt orthogonalize
|
|
|
-
|
|
|
- tmp.copy( t );
|
|
|
- tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();
|
|
|
-
|
|
|
- // Calculate handedness
|
|
|
-
|
|
|
- tmp2.crossVectors( n2, t );
|
|
|
- test = tmp2.dot( tan2[ v ] );
|
|
|
- w = ( test < 0.0 ) ? - 1.0 : 1.0;
|
|
|
-
|
|
|
- tangents[ v * 4 ] = tmp.x;
|
|
|
- tangents[ v * 4 + 1 ] = tmp.y;
|
|
|
- tangents[ v * 4 + 2 ] = tmp.z;
|
|
|
- tangents[ v * 4 + 3 ] = w;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- for ( var i = 0, il = groups.length; i < il; ++ i ) {
|
|
|
-
|
|
|
- var group = groups[ i ];
|
|
|
-
|
|
|
- var start = group.start;
|
|
|
- var count = group.count;
|
|
|
-
|
|
|
- for ( var j = start, jl = start + count; j < jl; j += 3 ) {
|
|
|
-
|
|
|
- handleVertex( indices[ j + 0 ] );
|
|
|
- handleVertex( indices[ j + 1 ] );
|
|
|
- handleVertex( indices[ j + 2 ] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
+ geometry.computeTangents();
|
|
|
+ console.warn( 'THREE.BufferGeometryUtils: .computeTangents() has been removed. Use BufferGeometry.computeTangents() instead.' );
|
|
|
|
|
|
},
|
|
|
|
|
@@ -757,6 +596,7 @@ var BufferGeometryUtils = {
|
|
|
newIndices.push( index.getX( i + 1 ) );
|
|
|
newIndices.push( index.getX( i + 2 ) );
|
|
|
|
|
|
+
|
|
|
} else {
|
|
|
|
|
|
newIndices.push( index.getX( i + 2 ) );
|
|
@@ -790,7 +630,7 @@ var BufferGeometryUtils = {
|
|
|
|
|
|
}
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* Calculates the morphed attributes of a morphed/skinned BufferGeometry.
|