BinaryLoader.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /**
  2. * @author alteredq / http://alteredqualia.com/
  3. */
  4. THREE.BinaryLoader = function ( manager ) {
  5. if ( typeof manager === 'boolean' ) {
  6. console.warn( 'THREE.BinaryLoader: showStatus parameter has been removed from constructor.' );
  7. manager = undefined;
  8. }
  9. this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
  10. };
  11. THREE.BinaryLoader.prototype = {
  12. constructor: THREE.BinaryLoader,
  13. // Deprecated
  14. get statusDomElement () {
  15. if ( this._statusDomElement === undefined ) {
  16. this._statusDomElement = document.createElement( 'div' );
  17. }
  18. console.warn( 'THREE.BinaryLoader: .statusDomElement has been removed.' );
  19. return this._statusDomElement;
  20. },
  21. // Load models generated by slim OBJ converter with BINARY option (converter_obj_three_slim.py -t binary)
  22. // - binary models consist of two files: JS and BIN
  23. // - parameters
  24. // - url (required)
  25. // - callback (required)
  26. // - texturePath (optional: if not specified, textures will be assumed to be in the same folder as JS model file)
  27. // - binaryPath (optional: if not specified, binary file will be assumed to be in the same folder as JS model file)
  28. load: function ( url, onLoad, onProgress, onError ) {
  29. // todo: unify load API to for easier SceneLoader use
  30. var texturePath = this.texturePath || THREE.Loader.prototype.extractUrlBase( url );
  31. var binaryPath = this.binaryPath || THREE.Loader.prototype.extractUrlBase( url );
  32. // #1 load JS part via web worker
  33. var scope = this;
  34. var jsonloader = new THREE.XHRLoader( this.manager );
  35. jsonloader.setCrossOrigin( this.crossOrigin );
  36. jsonloader.load( url, function ( data ) {
  37. var json = JSON.parse( data );
  38. var bufferUrl = binaryPath + json.buffers;
  39. var bufferLoader = new THREE.XHRLoader( scope.manager );
  40. bufferLoader.setCrossOrigin( scope.crossOrigin );
  41. bufferLoader.setResponseType( 'arraybuffer' );
  42. bufferLoader.load( bufferUrl, function ( bufData ) {
  43. // IEWEBGL needs this ???
  44. //buffer = ( new Uint8Array( xhr.responseBody ) ).buffer;
  45. //// iOS and other XMLHttpRequest level 1 ???
  46. scope.parse( bufData, onLoad, texturePath, json.materials );
  47. }, onProgress, onError );
  48. }, onProgress, onError );
  49. },
  50. setBinaryPath: function ( value ) {
  51. this.binaryPath = value;
  52. },
  53. setCrossOrigin: function ( value ) {
  54. this.crossOrigin = value;
  55. },
  56. setTexturePath: function ( value ) {
  57. this.texturePath = value;
  58. },
  59. parse: function ( data, callback, texturePath, jsonMaterials ) {
  60. var Model = function ( texturePath ) {
  61. var scope = this,
  62. currentOffset = 0,
  63. md,
  64. normals = [],
  65. uvs = [],
  66. start_tri_flat, start_tri_smooth, start_tri_flat_uv, start_tri_smooth_uv,
  67. start_quad_flat, start_quad_smooth, start_quad_flat_uv, start_quad_smooth_uv,
  68. tri_size, quad_size,
  69. len_tri_flat, len_tri_smooth, len_tri_flat_uv, len_tri_smooth_uv,
  70. len_quad_flat, len_quad_smooth, len_quad_flat_uv, len_quad_smooth_uv;
  71. THREE.Geometry.call( this );
  72. md = parseMetaData( data, currentOffset );
  73. currentOffset += md.header_bytes;
  74. /*
  75. md.vertex_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
  76. md.material_index_bytes = Uint16Array.BYTES_PER_ELEMENT;
  77. md.normal_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
  78. md.uv_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
  79. */
  80. // buffers sizes
  81. tri_size = md.vertex_index_bytes * 3 + md.material_index_bytes;
  82. quad_size = md.vertex_index_bytes * 4 + md.material_index_bytes;
  83. len_tri_flat = md.ntri_flat * ( tri_size );
  84. len_tri_smooth = md.ntri_smooth * ( tri_size + md.normal_index_bytes * 3 );
  85. len_tri_flat_uv = md.ntri_flat_uv * ( tri_size + md.uv_index_bytes * 3 );
  86. len_tri_smooth_uv = md.ntri_smooth_uv * ( tri_size + md.normal_index_bytes * 3 + md.uv_index_bytes * 3 );
  87. len_quad_flat = md.nquad_flat * ( quad_size );
  88. len_quad_smooth = md.nquad_smooth * ( quad_size + md.normal_index_bytes * 4 );
  89. len_quad_flat_uv = md.nquad_flat_uv * ( quad_size + md.uv_index_bytes * 4 );
  90. len_quad_smooth_uv = md.nquad_smooth_uv * ( quad_size + md.normal_index_bytes * 4 + md.uv_index_bytes * 4 );
  91. // read buffers
  92. currentOffset += init_vertices( currentOffset );
  93. currentOffset += init_normals( currentOffset );
  94. currentOffset += handlePadding( md.nnormals * 3 );
  95. currentOffset += init_uvs( currentOffset );
  96. start_tri_flat = currentOffset;
  97. start_tri_smooth = start_tri_flat + len_tri_flat + handlePadding( md.ntri_flat * 2 );
  98. start_tri_flat_uv = start_tri_smooth + len_tri_smooth + handlePadding( md.ntri_smooth * 2 );
  99. start_tri_smooth_uv = start_tri_flat_uv + len_tri_flat_uv + handlePadding( md.ntri_flat_uv * 2 );
  100. start_quad_flat = start_tri_smooth_uv + len_tri_smooth_uv + handlePadding( md.ntri_smooth_uv * 2 );
  101. start_quad_smooth = start_quad_flat + len_quad_flat + handlePadding( md.nquad_flat * 2 );
  102. start_quad_flat_uv = start_quad_smooth + len_quad_smooth + handlePadding( md.nquad_smooth * 2 );
  103. start_quad_smooth_uv = start_quad_flat_uv + len_quad_flat_uv + handlePadding( md.nquad_flat_uv * 2 );
  104. // have to first process faces with uvs
  105. // so that face and uv indices match
  106. init_triangles_flat_uv( start_tri_flat_uv );
  107. init_triangles_smooth_uv( start_tri_smooth_uv );
  108. init_quads_flat_uv( start_quad_flat_uv );
  109. init_quads_smooth_uv( start_quad_smooth_uv );
  110. // now we can process untextured faces
  111. init_triangles_flat( start_tri_flat );
  112. init_triangles_smooth( start_tri_smooth );
  113. init_quads_flat( start_quad_flat );
  114. init_quads_smooth( start_quad_smooth );
  115. this.computeFaceNormals();
  116. function handlePadding( n ) {
  117. return ( n % 4 ) ? ( 4 - n % 4 ) : 0;
  118. }
  119. function parseMetaData( data, offset ) {
  120. var metaData = {
  121. 'signature' : parseString( data, offset, 12 ),
  122. 'header_bytes' : parseUChar8( data, offset + 12 ),
  123. 'vertex_coordinate_bytes' : parseUChar8( data, offset + 13 ),
  124. 'normal_coordinate_bytes' : parseUChar8( data, offset + 14 ),
  125. 'uv_coordinate_bytes' : parseUChar8( data, offset + 15 ),
  126. 'vertex_index_bytes' : parseUChar8( data, offset + 16 ),
  127. 'normal_index_bytes' : parseUChar8( data, offset + 17 ),
  128. 'uv_index_bytes' : parseUChar8( data, offset + 18 ),
  129. 'material_index_bytes' : parseUChar8( data, offset + 19 ),
  130. 'nvertices' : parseUInt32( data, offset + 20 ),
  131. 'nnormals' : parseUInt32( data, offset + 20 + 4 * 1 ),
  132. 'nuvs' : parseUInt32( data, offset + 20 + 4 * 2 ),
  133. 'ntri_flat' : parseUInt32( data, offset + 20 + 4 * 3 ),
  134. 'ntri_smooth' : parseUInt32( data, offset + 20 + 4 * 4 ),
  135. 'ntri_flat_uv' : parseUInt32( data, offset + 20 + 4 * 5 ),
  136. 'ntri_smooth_uv' : parseUInt32( data, offset + 20 + 4 * 6 ),
  137. 'nquad_flat' : parseUInt32( data, offset + 20 + 4 * 7 ),
  138. 'nquad_smooth' : parseUInt32( data, offset + 20 + 4 * 8 ),
  139. 'nquad_flat_uv' : parseUInt32( data, offset + 20 + 4 * 9 ),
  140. 'nquad_smooth_uv' : parseUInt32( data, offset + 20 + 4 * 10 )
  141. };
  142. /*
  143. console.log( "signature: " + metaData.signature );
  144. console.log( "header_bytes: " + metaData.header_bytes );
  145. console.log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes );
  146. console.log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes );
  147. console.log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes );
  148. console.log( "vertex_index_bytes: " + metaData.vertex_index_bytes );
  149. console.log( "normal_index_bytes: " + metaData.normal_index_bytes );
  150. console.log( "uv_index_bytes: " + metaData.uv_index_bytes );
  151. console.log( "material_index_bytes: " + metaData.material_index_bytes );
  152. console.log( "nvertices: " + metaData.nvertices );
  153. console.log( "nnormals: " + metaData.nnormals );
  154. console.log( "nuvs: " + metaData.nuvs );
  155. console.log( "ntri_flat: " + metaData.ntri_flat );
  156. console.log( "ntri_smooth: " + metaData.ntri_smooth );
  157. console.log( "ntri_flat_uv: " + metaData.ntri_flat_uv );
  158. console.log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv );
  159. console.log( "nquad_flat: " + metaData.nquad_flat );
  160. console.log( "nquad_smooth: " + metaData.nquad_smooth );
  161. console.log( "nquad_flat_uv: " + metaData.nquad_flat_uv );
  162. console.log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv );
  163. var total = metaData.header_bytes
  164. + metaData.nvertices * metaData.vertex_coordinate_bytes * 3
  165. + metaData.nnormals * metaData.normal_coordinate_bytes * 3
  166. + metaData.nuvs * metaData.uv_coordinate_bytes * 2
  167. + metaData.ntri_flat * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes )
  168. + metaData.ntri_smooth * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 )
  169. + metaData.ntri_flat_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.uv_index_bytes*3 )
  170. + metaData.ntri_smooth_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 + metaData.uv_index_bytes*3 )
  171. + metaData.nquad_flat * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes )
  172. + metaData.nquad_smooth * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 )
  173. + metaData.nquad_flat_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.uv_index_bytes*4 )
  174. + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 );
  175. console.log( "total bytes: " + total );
  176. */
  177. return metaData;
  178. }
  179. function parseString( data, offset, length ) {
  180. var charArray = new Uint8Array( data, offset, length );
  181. var text = "";
  182. for ( var i = 0; i < length; i ++ ) {
  183. text += String.fromCharCode( charArray[ offset + i ] );
  184. }
  185. return text;
  186. }
  187. function parseUChar8( data, offset ) {
  188. var charArray = new Uint8Array( data, offset, 1 );
  189. return charArray[ 0 ];
  190. }
  191. function parseUInt32( data, offset ) {
  192. var intArray = new Uint32Array( data, offset, 1 );
  193. return intArray[ 0 ];
  194. }
  195. function init_vertices( start ) {
  196. var nElements = md.nvertices;
  197. var coordArray = new Float32Array( data, start, nElements * 3 );
  198. var i, x, y, z;
  199. for ( i = 0; i < nElements; i ++ ) {
  200. x = coordArray[ i * 3 ];
  201. y = coordArray[ i * 3 + 1 ];
  202. z = coordArray[ i * 3 + 2 ];
  203. scope.vertices.push( new THREE.Vector3( x, y, z ) );
  204. }
  205. return nElements * 3 * Float32Array.BYTES_PER_ELEMENT;
  206. }
  207. function init_normals( start ) {
  208. var nElements = md.nnormals;
  209. if ( nElements ) {
  210. var normalArray = new Int8Array( data, start, nElements * 3 );
  211. var i, x, y, z;
  212. for ( i = 0; i < nElements; i ++ ) {
  213. x = normalArray[ i * 3 ];
  214. y = normalArray[ i * 3 + 1 ];
  215. z = normalArray[ i * 3 + 2 ];
  216. normals.push( x / 127, y / 127, z / 127 );
  217. }
  218. }
  219. return nElements * 3 * Int8Array.BYTES_PER_ELEMENT;
  220. }
  221. function init_uvs( start ) {
  222. var nElements = md.nuvs;
  223. if ( nElements ) {
  224. var uvArray = new Float32Array( data, start, nElements * 2 );
  225. var i, u, v;
  226. for ( i = 0; i < nElements; i ++ ) {
  227. u = uvArray[ i * 2 ];
  228. v = uvArray[ i * 2 + 1 ];
  229. uvs.push( u, v );
  230. }
  231. }
  232. return nElements * 2 * Float32Array.BYTES_PER_ELEMENT;
  233. }
  234. function init_uvs3( nElements, offset ) {
  235. var i, uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
  236. var uvIndexBuffer = new Uint32Array( data, offset, 3 * nElements );
  237. for ( i = 0; i < nElements; i ++ ) {
  238. uva = uvIndexBuffer[ i * 3 ];
  239. uvb = uvIndexBuffer[ i * 3 + 1 ];
  240. uvc = uvIndexBuffer[ i * 3 + 2 ];
  241. u1 = uvs[ uva * 2 ];
  242. v1 = uvs[ uva * 2 + 1 ];
  243. u2 = uvs[ uvb * 2 ];
  244. v2 = uvs[ uvb * 2 + 1 ];
  245. u3 = uvs[ uvc * 2 ];
  246. v3 = uvs[ uvc * 2 + 1 ];
  247. scope.faceVertexUvs[ 0 ].push( [
  248. new THREE.Vector2( u1, v1 ),
  249. new THREE.Vector2( u2, v2 ),
  250. new THREE.Vector2( u3, v3 )
  251. ] );
  252. }
  253. }
  254. function init_uvs4( nElements, offset ) {
  255. var i, uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
  256. var uvIndexBuffer = new Uint32Array( data, offset, 4 * nElements );
  257. for ( i = 0; i < nElements; i ++ ) {
  258. uva = uvIndexBuffer[ i * 4 ];
  259. uvb = uvIndexBuffer[ i * 4 + 1 ];
  260. uvc = uvIndexBuffer[ i * 4 + 2 ];
  261. uvd = uvIndexBuffer[ i * 4 + 3 ];
  262. u1 = uvs[ uva * 2 ];
  263. v1 = uvs[ uva * 2 + 1 ];
  264. u2 = uvs[ uvb * 2 ];
  265. v2 = uvs[ uvb * 2 + 1 ];
  266. u3 = uvs[ uvc * 2 ];
  267. v3 = uvs[ uvc * 2 + 1 ];
  268. u4 = uvs[ uvd * 2 ];
  269. v4 = uvs[ uvd * 2 + 1 ];
  270. scope.faceVertexUvs[ 0 ].push( [
  271. new THREE.Vector2( u1, v1 ),
  272. new THREE.Vector2( u2, v2 ),
  273. new THREE.Vector2( u4, v4 )
  274. ] );
  275. scope.faceVertexUvs[ 0 ].push( [
  276. new THREE.Vector2( u2, v2 ),
  277. new THREE.Vector2( u3, v3 ),
  278. new THREE.Vector2( u4, v4 )
  279. ] );
  280. }
  281. }
  282. function init_faces3_flat( nElements, offsetVertices, offsetMaterials ) {
  283. var i, a, b, c, m;
  284. var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );
  285. var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
  286. for ( i = 0; i < nElements; i ++ ) {
  287. a = vertexIndexBuffer[ i * 3 ];
  288. b = vertexIndexBuffer[ i * 3 + 1 ];
  289. c = vertexIndexBuffer[ i * 3 + 2 ];
  290. m = materialIndexBuffer[ i ];
  291. scope.faces.push( new THREE.Face3( a, b, c, null, null, m ) );
  292. }
  293. }
  294. function init_faces4_flat( nElements, offsetVertices, offsetMaterials ) {
  295. var i, a, b, c, d, m;
  296. var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );
  297. var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
  298. for ( i = 0; i < nElements; i ++ ) {
  299. a = vertexIndexBuffer[ i * 4 ];
  300. b = vertexIndexBuffer[ i * 4 + 1 ];
  301. c = vertexIndexBuffer[ i * 4 + 2 ];
  302. d = vertexIndexBuffer[ i * 4 + 3 ];
  303. m = materialIndexBuffer[ i ];
  304. scope.faces.push( new THREE.Face3( a, b, d, null, null, m ) );
  305. scope.faces.push( new THREE.Face3( b, c, d, null, null, m ) );
  306. }
  307. }
  308. function init_faces3_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {
  309. var i, a, b, c, m;
  310. var na, nb, nc;
  311. var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );
  312. var normalIndexBuffer = new Uint32Array( data, offsetNormals, 3 * nElements );
  313. var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
  314. for ( i = 0; i < nElements; i ++ ) {
  315. a = vertexIndexBuffer[ i * 3 ];
  316. b = vertexIndexBuffer[ i * 3 + 1 ];
  317. c = vertexIndexBuffer[ i * 3 + 2 ];
  318. na = normalIndexBuffer[ i * 3 ];
  319. nb = normalIndexBuffer[ i * 3 + 1 ];
  320. nc = normalIndexBuffer[ i * 3 + 2 ];
  321. m = materialIndexBuffer[ i ];
  322. var nax = normals[ na * 3 ],
  323. nay = normals[ na * 3 + 1 ],
  324. naz = normals[ na * 3 + 2 ],
  325. nbx = normals[ nb * 3 ],
  326. nby = normals[ nb * 3 + 1 ],
  327. nbz = normals[ nb * 3 + 2 ],
  328. ncx = normals[ nc * 3 ],
  329. ncy = normals[ nc * 3 + 1 ],
  330. ncz = normals[ nc * 3 + 2 ];
  331. scope.faces.push( new THREE.Face3( a, b, c, [
  332. new THREE.Vector3( nax, nay, naz ),
  333. new THREE.Vector3( nbx, nby, nbz ),
  334. new THREE.Vector3( ncx, ncy, ncz )
  335. ], null, m ) );
  336. }
  337. }
  338. function init_faces4_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {
  339. var i, a, b, c, d, m;
  340. var na, nb, nc, nd;
  341. var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );
  342. var normalIndexBuffer = new Uint32Array( data, offsetNormals, 4 * nElements );
  343. var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
  344. for ( i = 0; i < nElements; i ++ ) {
  345. a = vertexIndexBuffer[ i * 4 ];
  346. b = vertexIndexBuffer[ i * 4 + 1 ];
  347. c = vertexIndexBuffer[ i * 4 + 2 ];
  348. d = vertexIndexBuffer[ i * 4 + 3 ];
  349. na = normalIndexBuffer[ i * 4 ];
  350. nb = normalIndexBuffer[ i * 4 + 1 ];
  351. nc = normalIndexBuffer[ i * 4 + 2 ];
  352. nd = normalIndexBuffer[ i * 4 + 3 ];
  353. m = materialIndexBuffer[ i ];
  354. var nax = normals[ na * 3 ],
  355. nay = normals[ na * 3 + 1 ],
  356. naz = normals[ na * 3 + 2 ],
  357. nbx = normals[ nb * 3 ],
  358. nby = normals[ nb * 3 + 1 ],
  359. nbz = normals[ nb * 3 + 2 ],
  360. ncx = normals[ nc * 3 ],
  361. ncy = normals[ nc * 3 + 1 ],
  362. ncz = normals[ nc * 3 + 2 ],
  363. ndx = normals[ nd * 3 ],
  364. ndy = normals[ nd * 3 + 1 ],
  365. ndz = normals[ nd * 3 + 2 ];
  366. scope.faces.push( new THREE.Face3( a, b, d, [
  367. new THREE.Vector3( nax, nay, naz ),
  368. new THREE.Vector3( nbx, nby, nbz ),
  369. new THREE.Vector3( ndx, ndy, ndz )
  370. ], null, m ) );
  371. scope.faces.push( new THREE.Face3( b, c, d, [
  372. new THREE.Vector3( nbx, nby, nbz ),
  373. new THREE.Vector3( ncx, ncy, ncz ),
  374. new THREE.Vector3( ndx, ndy, ndz )
  375. ], null, m ) );
  376. }
  377. }
  378. function init_triangles_flat( start ) {
  379. var nElements = md.ntri_flat;
  380. if ( nElements ) {
  381. var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  382. init_faces3_flat( nElements, start, offsetMaterials );
  383. }
  384. }
  385. function init_triangles_flat_uv( start ) {
  386. var nElements = md.ntri_flat_uv;
  387. if ( nElements ) {
  388. var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  389. var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  390. init_faces3_flat( nElements, start, offsetMaterials );
  391. init_uvs3( nElements, offsetUvs );
  392. }
  393. }
  394. function init_triangles_smooth( start ) {
  395. var nElements = md.ntri_smooth;
  396. if ( nElements ) {
  397. var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  398. var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  399. init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );
  400. }
  401. }
  402. function init_triangles_smooth_uv( start ) {
  403. var nElements = md.ntri_smooth_uv;
  404. if ( nElements ) {
  405. var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  406. var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  407. var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
  408. init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );
  409. init_uvs3( nElements, offsetUvs );
  410. }
  411. }
  412. function init_quads_flat( start ) {
  413. var nElements = md.nquad_flat;
  414. if ( nElements ) {
  415. var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  416. init_faces4_flat( nElements, start, offsetMaterials );
  417. }
  418. }
  419. function init_quads_flat_uv( start ) {
  420. var nElements = md.nquad_flat_uv;
  421. if ( nElements ) {
  422. var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  423. var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  424. init_faces4_flat( nElements, start, offsetMaterials );
  425. init_uvs4( nElements, offsetUvs );
  426. }
  427. }
  428. function init_quads_smooth( start ) {
  429. var nElements = md.nquad_smooth;
  430. if ( nElements ) {
  431. var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  432. var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  433. init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );
  434. }
  435. }
  436. function init_quads_smooth_uv( start ) {
  437. var nElements = md.nquad_smooth_uv;
  438. if ( nElements ) {
  439. var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  440. var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  441. var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
  442. init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );
  443. init_uvs4( nElements, offsetUvs );
  444. }
  445. }
  446. };
  447. Model.prototype = Object.create( THREE.Geometry.prototype );
  448. Model.prototype.constructor = Model;
  449. var geometry = new Model( texturePath );
  450. var materials = THREE.Loader.prototype.initMaterials( jsonMaterials, texturePath, this.crossOrigin );
  451. callback( geometry, materials );
  452. }
  453. };