Issue 1:
When input GLTF file contains accessors with stride that doesn't match the expected stride based on the accessor type, GLTFLoader creates the interleaved attribute as follows:

var ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType;
var ib = parser.cache.get( ibCacheKey );

if ( ! ib ) {
// Use the full buffer if it's interleaved.
array = new TypedArray( bufferView );

// Integer parameters to IB/IBA are in array elements, not bytes.
ib = new THREE.InterleavedBuffer( array, byteStride / elementBytes );

parser.cache.add( ibCacheKey, ib );
}

bufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset / elementBytes, normalized );

As a result, the attribute objects that are created have .count property reflect the full size of the buffer view. If multiple meshes share the same buffer view, then what will happen is that all of them will have the same .count (that is equal to the total vertex count across all meshes), but access to .getX() etc. will apply the byte offset for each mesh.

This is a problem. For example, in this code in computeBoundingSphere:

for ( var i = 0, il = position.count; i < il; i ++ ) {
vector.fromBufferAttribute( position, i );
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
}

For each mesh we'll iterate over the number of elements in the buffer view, but during access in fromBufferAttribute an offset will be applied, which - for meshes with offset != 0 - will result in vector being undefined and maxRadiusSq equal to NaN.

I'm considering options for how to fix this.

One option is to make caching logic more involved by incorporating accessor count into the cache, and only storing a slice of the buffer view that matches the accessor count; something along these lines:

var ibSlice = Math.floor( byteOffset / byteStride );
var ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;
var ib = parser.cache.get( ibCacheKey );

if ( ! ib ) {
array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );

// Integer parameters to IB/IBA are in array elements, not bytes.
ib = new THREE.InterleavedBuffer( array, byteStride / elementBytes );

parser.cache.add( ibCacheKey, ib );
}

bufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, (byteOffset - ibSlice * byteStride) / elementBytes, normalized );

Another option is to change InterleavedBufferAttribute.count to a field that's computed in the constructor from an optional extra count argument like this:

function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized, count ) {
this.data = interleavedBuffer;
this.itemSize = itemSize;
this.offset = offset;
this.count = count || interleavedBuffer.count;
this.normalized = normalized === true;
}

Thoughts?

Issue 2:
The main source code has recently been ported to ES2015 modules (see #9310); however, some parts are still relying on global namespace pollution and have thus become unusable.

Specifically the things in /examples/js/ haven't been transformed to support modules yet; this makes them currently unusable from within environments such as webpack or SystemJS.

Edit, 11-20-2016: They can be used, but it requires a lot of setup: SystemJS, webpack. If you need assistance with these: Sorry, but this is the wrong thread to announce it! 😄