Skip to content

Commit 9963eed

Browse files
committed
Added new WIP GLTFLoader (Basic support of glTF-Embedded)
1 parent 9c872b1 commit 9963eed

File tree

3 files changed

+294
-5
lines changed

3 files changed

+294
-5
lines changed

editor/index.html

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<script src="../examples/js/loaders/BabylonLoader.js"></script>
2222
<script src="../examples/js/loaders/ColladaLoader2.js"></script>
2323
<script src="../examples/js/loaders/FBXLoader.js"></script>
24+
<script src="../examples/js/loaders/GLTFLoader.js"></script>
2425
<script src="../examples/js/loaders/KMZLoader.js"></script>
2526
<script src="../examples/js/loaders/MD2Loader.js"></script>
2627
<script src="../examples/js/loaders/OBJLoader.js"></script>
@@ -285,9 +286,9 @@
285286
switch ( event.keyCode ) {
286287

287288
case 8: // backspace
288-
289+
289290
event.preventDefault(); // prevent browser back
290-
291+
291292
case 46: // delete
292293

293294
var object = editor.selected;
@@ -314,19 +315,19 @@
314315
break;
315316

316317
case 87: // Register W for translation transform mode
317-
318+
318319
editor.signals.transformModeChanged.dispatch( 'translate' );
319320

320321
break;
321322

322323
case 69: // Register E for rotation transform mode
323-
324+
324325
editor.signals.transformModeChanged.dispatch( 'rotate' );
325326

326327
break;
327328

328329
case 82: // Register R for scaling transform mode
329-
330+
330331
editor.signals.transformModeChanged.dispatch( 'scale' );
331332

332333
break;

editor/js/Loader.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,25 @@ var Loader = function ( editor ) {
155155

156156
break;
157157

158+
case 'gltf':
159+
160+
reader.addEventListener( 'load', function ( event ) {
161+
162+
var contents = event.target.result;
163+
var json = JSON.parse( contents );
164+
165+
var loader = new THREE.GLTFLoader();
166+
var collada = loader.parse( json );
167+
168+
collada.scene.name = filename;
169+
170+
editor.execute( new AddObjectCommand( collada.scene ) );
171+
172+
}, false );
173+
reader.readAsText( file );
174+
175+
break;
176+
158177
case 'js':
159178
case 'json':
160179

examples/js/loaders/GLTFLoader.js

Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
/**
2+
* @author mrdoob / http://mrdoob.com/
3+
*/
4+
5+
THREE.GLTFLoader = function ( manager ) {
6+
7+
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
8+
9+
};
10+
11+
THREE.GLTFLoader.prototype = {
12+
13+
constructor: THREE.GLTFLoader,
14+
15+
load: function ( url, onLoad, onProgress, onError ) {
16+
17+
var scope = this;
18+
19+
var loader = new THREE.XHRLoader( scope.manager );
20+
loader.load( url, function ( text ) {
21+
22+
onLoad( scope.parse( JSON.parse( text ) ) );
23+
24+
}, onProgress, onError );
25+
26+
},
27+
28+
setCrossOrigin: function ( value ) {
29+
30+
this.crossOrigin = value;
31+
32+
},
33+
34+
parse: function ( json ) {
35+
36+
function stringToArrayBuffer( string ) {
37+
38+
var bytes = atob( string );
39+
var buffer = new ArrayBuffer( bytes.length );
40+
var bufferView = new Uint8Array( buffer );
41+
42+
for ( var i = 0; i < bytes.length; i ++ ) {
43+
44+
bufferView[ i ] = bytes.charCodeAt( i );
45+
46+
}
47+
48+
return buffer;
49+
50+
}
51+
52+
console.time( 'GLTFLoader' );
53+
54+
// buffers
55+
56+
var buffers = json.buffers;
57+
58+
for ( var bufferId in buffers ) {
59+
60+
var buffer = buffers[ bufferId ];
61+
62+
if ( buffer.type === 'arraybuffer' ) {
63+
64+
var header = 'data:application/octet-stream;base64,';
65+
66+
if ( buffer.uri.indexOf( header ) === 0 ) {
67+
68+
buffer._arraybuffer = stringToArrayBuffer( buffer.uri.substr( header.length ) );
69+
70+
}
71+
72+
}
73+
74+
}
75+
76+
// buffer views
77+
78+
var bufferViews = json.bufferViews;
79+
80+
for ( var bufferViewId in bufferViews ) {
81+
82+
var bufferView = bufferViews[ bufferViewId ];
83+
var arraybuffer = buffers[ bufferView.buffer ]._arraybuffer;
84+
85+
bufferView._arraybuffer = arraybuffer.slice( bufferView.byteOffset, bufferView.byteOffset + bufferView.byteLength );
86+
87+
}
88+
89+
// accessors
90+
91+
var COMPONENT_TYPES = {
92+
5120: Int8Array,
93+
5121: Uint8Array,
94+
5122: Int16Array,
95+
5123: Uint16Array,
96+
5126: Float32Array,
97+
};
98+
99+
var TYPE_SIZES = {
100+
'SCALAR': 1, 'VEC2': 2, 'VEC3': 3, 'VEC4': 4,
101+
'MAT2': 4, 'MAT3': 9, 'MAT4': 16
102+
};
103+
104+
var accessors = json.accessors;
105+
106+
for ( var accessorId in accessors ) {
107+
108+
var accessor = accessors[ accessorId ];
109+
110+
var arraybuffer = bufferViews[ accessor.bufferView ]._arraybuffer;
111+
var itemSize = TYPE_SIZES[ accessor.type ];
112+
var TypedArray = COMPONENT_TYPES[ accessor.componentType ];
113+
114+
var array = new TypedArray( arraybuffer, accessor.byteOffset, accessor.count * itemSize );
115+
116+
accessor._bufferattribute = new THREE.BufferAttribute( array, itemSize );
117+
118+
}
119+
120+
// meshes
121+
122+
var meshes = json.meshes;
123+
124+
for ( var meshId in meshes ) {
125+
126+
var mesh = meshes[ meshId ];
127+
128+
var geometry = new THREE.BufferGeometry();
129+
geometry.name = mesh.name;
130+
131+
var primitives = mesh.primitives;
132+
133+
for ( var i = 0; i < 1; /*primitives.length;*/ i ++ ) {
134+
135+
var primitive = primitives[ 0 ];
136+
var attributes = primitive.attributes;
137+
138+
if ( primitive.indices ) {
139+
140+
geometry.setIndex( accessors[ primitive.indices ]._bufferattribute );
141+
142+
}
143+
144+
for ( var attributeId in attributes ) {
145+
146+
var attribute = attributes[ attributeId ];
147+
var bufferAttribute = accessors[ attribute ]._bufferattribute;
148+
149+
switch ( attributeId ) {
150+
151+
case 'POSITION':
152+
geometry.addAttribute( 'position', bufferAttribute );
153+
break;
154+
155+
case 'NORMAL':
156+
geometry.addAttribute( 'normal', bufferAttribute );
157+
break;
158+
159+
case 'TEXCOORD_0':
160+
geometry.addAttribute( 'uv', bufferAttribute );
161+
break;
162+
163+
}
164+
165+
}
166+
167+
}
168+
169+
mesh._geometry = geometry;
170+
171+
}
172+
173+
// nodes
174+
175+
var nodes = json.nodes;
176+
var matrix = new THREE.Matrix4();
177+
178+
for ( var nodeId in nodes ) {
179+
180+
var node = nodes[ nodeId ];
181+
182+
var object = new THREE.Group();
183+
object.name = node.name;
184+
185+
if ( node.translation !== undefined ) {
186+
187+
object.position.fromArray( node.translation );
188+
189+
}
190+
191+
if ( node.rotation !== undefined ) {
192+
193+
object.quaternion.fromArray( node.rotation );
194+
195+
}
196+
197+
if ( node.scale !== undefined ) {
198+
199+
object.scale.fromArray( node.scale );
200+
201+
}
202+
203+
if ( node.matrix !== undefined ) {
204+
205+
matrix.fromArray( node.matrix );
206+
matrix.decompose( object.position, object.quaternion, object.scale );
207+
208+
}
209+
210+
if ( node.meshes !== undefined ) {
211+
212+
for ( var i = 0; i < node.meshes.length; i ++ ) {
213+
214+
var meshId = node.meshes[ i ];
215+
object.add( new THREE.Mesh( meshes[ meshId ]._geometry, new THREE.MeshNormalMaterial() ) );
216+
217+
}
218+
219+
}
220+
221+
node._object = object;
222+
223+
}
224+
225+
for ( var nodeId in nodes ) {
226+
227+
var node = nodes[ nodeId ];
228+
229+
for ( var i = 0; i < node.children.length; i ++ ) {
230+
231+
var child = node.children[ i ];
232+
233+
node._object.add( nodes[ child ]._object );
234+
235+
}
236+
237+
}
238+
239+
// scenes
240+
241+
var scenes = json.scenes;
242+
243+
for ( var sceneId in scenes ) {
244+
245+
var scene = scenes[ sceneId ];
246+
var container = new THREE.Scene();
247+
248+
for ( var i = 0; i < scene.nodes.length; i ++ ) {
249+
250+
var node = scene.nodes[ i ];
251+
container.add( nodes[ node ]._object );
252+
253+
}
254+
255+
scene._container = container;
256+
257+
}
258+
259+
console.timeEnd( 'GLTFLoader' );
260+
261+
return {
262+
263+
scene: json.scenes[ json.scene ]._container
264+
265+
};
266+
267+
}
268+
269+
};

0 commit comments

Comments
 (0)