content/hifi-content/dave/walk-tools/walkTools/libraries/three.js/extras/helpers/VertexTangentsHelper.js
2022-02-13 22:49:05 +01:00

95 lines
2 KiB
JavaScript

/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/
THREE.VertexTangentsHelper = function ( object, size, hex, linewidth ) {
this.object = object;
this.size = ( size !== undefined ) ? size : 1;
var color = ( hex !== undefined ) ? hex : 0x0000ff;
var width = ( linewidth !== undefined ) ? linewidth : 1;
var geometry = new THREE.Geometry();
var faces = object.geometry.faces;
for ( var i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
for ( var j = 0, jl = face.vertexTangents.length; j < jl; j ++ ) {
geometry.vertices.push( new THREE.Vector3() );
geometry.vertices.push( new THREE.Vector3() );
}
}
THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ), THREE.LinePieces );
this.matrixAutoUpdate = false;
this.update();
};
THREE.VertexTangentsHelper.prototype = Object.create( THREE.Line.prototype );
THREE.VertexTangentsHelper.prototype.constructor = THREE.VertexTangentsHelper;
THREE.VertexTangentsHelper.prototype.update = ( function ( object ) {
var v1 = new THREE.Vector3();
return function( object ) {
var keys = [ 'a', 'b', 'c', 'd' ];
this.object.updateMatrixWorld( true );
var vertices = this.geometry.vertices;
var verts = this.object.geometry.vertices;
var faces = this.object.geometry.faces;
var worldMatrix = this.object.matrixWorld;
var idx = 0;
for ( var i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
for ( var j = 0, jl = face.vertexTangents.length; j < jl; j ++ ) {
var vertexId = face[ keys[ j ] ];
var vertex = verts[ vertexId ];
var tangent = face.vertexTangents[ j ];
vertices[ idx ].copy( vertex ).applyMatrix4( worldMatrix );
v1.copy( tangent ).transformDirection( worldMatrix ).multiplyScalar( this.size );
v1.add( vertices[ idx ] );
idx = idx + 1;
vertices[ idx ].copy( v1 );
idx = idx + 1;
}
}
this.geometry.verticesNeedUpdate = true;
return this;
}
}());