|
@@ -14,7 +14,8 @@ import {
|
|
|
Mesh,
|
|
|
MeshPhongMaterial,
|
|
|
Points,
|
|
|
- PointsMaterial
|
|
|
+ PointsMaterial,
|
|
|
+ Vector3
|
|
|
} from "../../../build/three.module.js";
|
|
|
|
|
|
var OBJLoader = ( function () {
|
|
@@ -28,6 +29,13 @@ var OBJLoader = ( function () {
|
|
|
// usemap map_name
|
|
|
var map_use_pattern = /^usemap /;
|
|
|
|
|
|
+ var vA = new Vector3();
|
|
|
+ var vB = new Vector3();
|
|
|
+ var vC = new Vector3();
|
|
|
+
|
|
|
+ var ab = new Vector3();
|
|
|
+ var cb = new Vector3();
|
|
|
+
|
|
|
function ParserState() {
|
|
|
|
|
|
var state = {
|
|
@@ -70,7 +78,9 @@ var OBJLoader = ( function () {
|
|
|
vertices: [],
|
|
|
normals: [],
|
|
|
colors: [],
|
|
|
- uvs: []
|
|
|
+ uvs: [],
|
|
|
+ hasNormalIndices: false,
|
|
|
+ hasUVIndices: false
|
|
|
},
|
|
|
materials: [],
|
|
|
smooth: true,
|
|
@@ -263,6 +273,27 @@ var OBJLoader = ( function () {
|
|
|
|
|
|
},
|
|
|
|
|
|
+ addFaceNormal: function ( a, b, c ) {
|
|
|
+
|
|
|
+ var src = this.vertices;
|
|
|
+ var dst = this.object.geometry.normals;
|
|
|
+
|
|
|
+ vA.fromArray( src, a );
|
|
|
+ vB.fromArray( src, b );
|
|
|
+ vC.fromArray( src, c );
|
|
|
+
|
|
|
+ cb.subVectors( vC, vB );
|
|
|
+ ab.subVectors( vA, vB );
|
|
|
+ cb.cross( ab );
|
|
|
+
|
|
|
+ cb.normalize();
|
|
|
+
|
|
|
+ dst.push( cb.x, cb.y, cb.z );
|
|
|
+ dst.push( cb.x, cb.y, cb.z );
|
|
|
+ dst.push( cb.x, cb.y, cb.z );
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
addColor: function ( a, b, c ) {
|
|
|
|
|
|
var src = this.colors;
|
|
@@ -285,6 +316,16 @@ var OBJLoader = ( function () {
|
|
|
|
|
|
},
|
|
|
|
|
|
+ addDefaultUV: function () {
|
|
|
+
|
|
|
+ var dst = this.object.geometry.uvs;
|
|
|
+
|
|
|
+ dst.push( 0, 0 );
|
|
|
+ dst.push( 0, 0 );
|
|
|
+ dst.push( 0, 0 );
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
addUVLine: function ( a ) {
|
|
|
|
|
|
var src = this.uvs;
|
|
@@ -305,26 +346,45 @@ var OBJLoader = ( function () {
|
|
|
this.addVertex( ia, ib, ic );
|
|
|
this.addColor( ia, ib, ic );
|
|
|
|
|
|
+ // normals
|
|
|
+
|
|
|
+ if ( na !== undefined && na !== '' ) {
|
|
|
+
|
|
|
+ var nLen = this.normals.length;
|
|
|
+
|
|
|
+ ia = this.parseNormalIndex( na, nLen );
|
|
|
+ ib = this.parseNormalIndex( nb, nLen );
|
|
|
+ ic = this.parseNormalIndex( nc, nLen );
|
|
|
+
|
|
|
+ this.addNormal( ia, ib, ic );
|
|
|
+
|
|
|
+ this.object.geometry.hasNormalIndices = true;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ this.addFaceNormal( ia, ib, ic );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // uvs
|
|
|
+
|
|
|
if ( ua !== undefined && ua !== '' ) {
|
|
|
|
|
|
var uvLen = this.uvs.length;
|
|
|
+
|
|
|
ia = this.parseUVIndex( ua, uvLen );
|
|
|
ib = this.parseUVIndex( ub, uvLen );
|
|
|
ic = this.parseUVIndex( uc, uvLen );
|
|
|
- this.addUV( ia, ib, ic );
|
|
|
|
|
|
- }
|
|
|
+ this.addUV( ia, ib, ic );
|
|
|
|
|
|
- if ( na !== undefined && na !== '' ) {
|
|
|
+ this.object.geometry.hasUVIndices = true;
|
|
|
|
|
|
- // Normals are many times the same. If so, skip function call and parseInt.
|
|
|
- var nLen = this.normals.length;
|
|
|
- ia = this.parseNormalIndex( na, nLen );
|
|
|
+ } else {
|
|
|
|
|
|
- ib = na === nb ? ia : this.parseNormalIndex( nb, nLen );
|
|
|
- ic = na === nc ? ia : this.parseNormalIndex( nc, nLen );
|
|
|
+ // add placeholder values (for inconsistent face definitions)
|
|
|
|
|
|
- this.addNormal( ia, ib, ic );
|
|
|
+ this.addDefaultUV();
|
|
|
|
|
|
}
|
|
|
|
|
@@ -667,14 +727,10 @@ var OBJLoader = ( function () {
|
|
|
|
|
|
buffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );
|
|
|
|
|
|
- if ( geometry.normals.length > 0 ) {
|
|
|
+ if ( geometry.hasNormalIndices === true ) {
|
|
|
|
|
|
buffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );
|
|
|
|
|
|
- } else {
|
|
|
-
|
|
|
- buffergeometry.computeVertexNormals();
|
|
|
-
|
|
|
}
|
|
|
|
|
|
if ( geometry.colors.length > 0 ) {
|
|
@@ -684,7 +740,7 @@ var OBJLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( geometry.uvs.length > 0 ) {
|
|
|
+ if ( geometry.hasUVIndices === true ) {
|
|
|
|
|
|
buffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );
|
|
|
|