|
@@ -63,6 +63,8 @@ import {
|
|
|
Sphere,
|
|
|
SpotLight,
|
|
|
TextureLoader,
|
|
|
+ TriangleFanDrawMode,
|
|
|
+ TriangleStripDrawMode,
|
|
|
UniformsUtils,
|
|
|
Vector2,
|
|
|
Vector3,
|
|
@@ -2459,6 +2461,101 @@ var GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @param {BufferGeometry} geometry
|
|
|
+ * @param {Number} drawMode
|
|
|
+ * @return {BufferGeometry}
|
|
|
+ */
|
|
|
+ function toTrianglesDrawMode( geometry, drawMode ) {
|
|
|
+
|
|
|
+ var index = geometry.getIndex();
|
|
|
+
|
|
|
+ // generate index if not present
|
|
|
+
|
|
|
+ if ( index === null ) {
|
|
|
+
|
|
|
+ var indices = [];
|
|
|
+
|
|
|
+ var position = geometry.getAttribute( 'position' );
|
|
|
+
|
|
|
+ if ( position !== undefined ) {
|
|
|
+
|
|
|
+ for ( var i = 0; i < position.count; i ++ ) {
|
|
|
+
|
|
|
+ indices.push( i );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ geometry.setIndex( indices );
|
|
|
+ index = geometry.getIndex();
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );
|
|
|
+ return geometry;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ var numberOfTriangles = index.count - 2;
|
|
|
+ var newIndices = [];
|
|
|
+
|
|
|
+ if ( drawMode === TriangleFanDrawMode ) {
|
|
|
+
|
|
|
+ // gl.TRIANGLE_FAN
|
|
|
+
|
|
|
+ for ( var i = 1; i <= numberOfTriangles; i ++ ) {
|
|
|
+
|
|
|
+ newIndices.push( index.getX( 0 ) );
|
|
|
+ newIndices.push( index.getX( i ) );
|
|
|
+ newIndices.push( index.getX( i + 1 ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // gl.TRIANGLE_STRIP
|
|
|
+
|
|
|
+ for ( var i = 0; i < numberOfTriangles; i ++ ) {
|
|
|
+
|
|
|
+ if ( i % 2 === 0 ) {
|
|
|
+
|
|
|
+ newIndices.push( index.getX( i ) );
|
|
|
+ newIndices.push( index.getX( i + 1 ) );
|
|
|
+ newIndices.push( index.getX( i + 2 ) );
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ newIndices.push( index.getX( i + 2 ) );
|
|
|
+ newIndices.push( index.getX( i + 1 ) );
|
|
|
+ newIndices.push( index.getX( i ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( ( newIndices.length / 3 ) !== numberOfTriangles ) {
|
|
|
+
|
|
|
+ console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // build final geometry
|
|
|
+
|
|
|
+ var newGeometry = geometry.clone();
|
|
|
+ newGeometry.setIndex( newIndices );
|
|
|
+ newGeometry.clearGroups();
|
|
|
+
|
|
|
+ return newGeometry;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry
|
|
|
*
|
|
@@ -2589,9 +2686,13 @@ var GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {
|
|
|
+ if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {
|
|
|
+
|
|
|
+ mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );
|
|
|
+
|
|
|
+ } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {
|
|
|
|
|
|
- console.warn( 'THREE.GLTFLoader: The draw modes triangle strip and fan are not supported anymore.' );
|
|
|
+ mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );
|
|
|
|
|
|
}
|
|
|
|