ObjectLoader.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.ObjectLoader = function ( manager ) {
  5. this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
  6. };
  7. THREE.ObjectLoader.prototype = {
  8. constructor: THREE.ObjectLoader,
  9. load: function ( url, onLoad, onProgress, onError ) {
  10. if ( this.texturePath === undefined ) {
  11. this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );
  12. }
  13. var scope = this;
  14. var loader = new THREE.XHRLoader( scope.manager );
  15. loader.setCrossOrigin( this.crossOrigin );
  16. loader.load( url, function ( text ) {
  17. scope.parse( JSON.parse( text ), onLoad );
  18. }, onProgress, onError );
  19. },
  20. setTexturePath: function ( value ) {
  21. this.texturePath = value;
  22. },
  23. setCrossOrigin: function ( value ) {
  24. this.crossOrigin = value;
  25. },
  26. parse: function ( json, onLoad ) {
  27. var scope = this;
  28. var geometries, materials, images, textures;
  29. this.manager.itemStart( json.object.uuid );
  30. geometries = this.parseGeometries( json.geometries );
  31. images = this.parseImages( json.images, function () {
  32. textures = scope.parseTextures( json.textures, images );
  33. materials = scope.parseMaterials( json.materials, textures );
  34. onLoad( scope.parseObject( json.object, geometries, materials ) );
  35. // report back to parent manager
  36. scope.manager.itemEnd( json.object.uuid );
  37. } );
  38. },
  39. parseGeometries: function ( json ) {
  40. var geometries = {};
  41. if ( json !== undefined ) {
  42. var geometryLoader = new THREE.JSONLoader();
  43. var bufferGeometryLoader = new THREE.BufferGeometryLoader();
  44. for ( var i = 0, l = json.length; i < l; i ++ ) {
  45. var geometry;
  46. var data = json[ i ];
  47. switch ( data.type ) {
  48. case 'PlaneGeometry':
  49. geometry = new THREE.PlaneGeometry(
  50. data.width,
  51. data.height,
  52. data.widthSegments,
  53. data.heightSegments
  54. );
  55. break;
  56. case 'BoxGeometry':
  57. case 'CubeGeometry': // backwards compatible
  58. geometry = new THREE.BoxGeometry(
  59. data.width,
  60. data.height,
  61. data.depth,
  62. data.widthSegments,
  63. data.heightSegments,
  64. data.depthSegments
  65. );
  66. break;
  67. case 'CircleGeometry':
  68. geometry = new THREE.CircleGeometry(
  69. data.radius,
  70. data.segments
  71. );
  72. break;
  73. case 'CylinderGeometry':
  74. geometry = new THREE.CylinderGeometry(
  75. data.radiusTop,
  76. data.radiusBottom,
  77. data.height,
  78. data.radialSegments,
  79. data.heightSegments,
  80. data.openEnded
  81. );
  82. break;
  83. case 'SphereGeometry':
  84. geometry = new THREE.SphereGeometry(
  85. data.radius,
  86. data.widthSegments,
  87. data.heightSegments,
  88. data.phiStart,
  89. data.phiLength,
  90. data.thetaStart,
  91. data.thetaLength
  92. );
  93. break;
  94. case 'IcosahedronGeometry':
  95. geometry = new THREE.IcosahedronGeometry(
  96. data.radius,
  97. data.detail
  98. );
  99. break;
  100. case 'TorusGeometry':
  101. geometry = new THREE.TorusGeometry(
  102. data.radius,
  103. data.tube,
  104. data.radialSegments,
  105. data.tubularSegments,
  106. data.arc
  107. );
  108. break;
  109. case 'TorusKnotGeometry':
  110. geometry = new THREE.TorusKnotGeometry(
  111. data.radius,
  112. data.tube,
  113. data.radialSegments,
  114. data.tubularSegments,
  115. data.p,
  116. data.q,
  117. data.heightScale
  118. );
  119. break;
  120. case 'BufferGeometry':
  121. geometry = bufferGeometryLoader.parse( data.data );
  122. break;
  123. case 'Geometry':
  124. geometry = geometryLoader.parse( data.data ).geometry;
  125. break;
  126. }
  127. geometry.uuid = data.uuid;
  128. if ( data.name !== undefined ) geometry.name = data.name;
  129. geometries[ data.uuid ] = geometry;
  130. }
  131. }
  132. return geometries;
  133. },
  134. parseMaterials: function ( json, textures ) {
  135. var materials = {};
  136. if ( json !== undefined ) {
  137. var loader = new THREE.MaterialLoader();
  138. for ( var i = 0, l = json.length; i < l; i ++ ) {
  139. var data = json[ i ];
  140. var material = loader.parse( data );
  141. material.uuid = data.uuid;
  142. if ( data.name !== undefined ) material.name = data.name;
  143. if ( data.map ) {
  144. if ( textures[ data.map ] === undefined ) {
  145. console.warn( 'THREE.ObjectLoader: Undefined texture', data.map );
  146. }
  147. material.map = textures[ data.map ];
  148. }
  149. if ( data.bumpMap ) {
  150. if ( !textures[data.bumpMap] ) {
  151. console.warn( 'THREE.ObjectLoader: Undefined texture', data.bumpMap );
  152. }
  153. material.bumpMap = textures[data.bumpMap];
  154. }
  155. if ( data.alphaMap ) {
  156. if ( !textures[data.alphaMap] ) {
  157. console.warn( 'THREE.ObjectLoader: Undefined texture', data.alphaMap );
  158. }
  159. material.alphaMap = textures[data.alphaMap];
  160. }
  161. if ( data.envMap ) {
  162. if ( !textures[data.envMap] ) {
  163. console.warn( 'THREE.ObjectLoader: Undefined texture', data.envMap );
  164. }
  165. material.envMap = textures[data.envMap];
  166. }
  167. if ( data.normalMap ) {
  168. if ( !textures[data.normalMap] ) {
  169. console.warn( 'THREE.ObjectLoader: Undefined texture', data.normalMap );
  170. }
  171. material.normalMap = textures[data.normalMap];
  172. }
  173. if ( data.lightMap ) {
  174. if ( !textures[data.lightMap] ) {
  175. console.warn( 'THREE.ObjectLoader: Undefined texture', data.lightMap );
  176. }
  177. material.lightMap = textures[data.lightMap];
  178. }
  179. if ( data.specularMap ) {
  180. if ( !textures[data.specularMap] ) {
  181. console.warn( 'THREE.ObjectLoader: Undefined texture', data.specularMap );
  182. }
  183. material.specularMap = textures[data.specularMap];
  184. }
  185. materials[ data.uuid ] = material;
  186. }
  187. }
  188. return materials;
  189. },
  190. parseImages: function ( json, onLoad ) {
  191. var scope = this;
  192. var images = {};
  193. if ( json !== undefined && json.length > 0 ) {
  194. var manager = new THREE.LoadingManager( onLoad );
  195. var loader = new THREE.ImageLoader( manager );
  196. loader.setCrossOrigin( this.crossOrigin );
  197. var loadImage = function ( data ) {
  198. var url = scope.texturePath + data.url;
  199. scope.manager.itemStart( url );
  200. loader.load( url, function ( image ) {
  201. scope.manager.itemEnd( url );
  202. images[ data.uuid ] = image;
  203. } );
  204. };
  205. for ( var i = 0, l = json.length; i < l; i ++ ) {
  206. loadImage( json[ i ] );
  207. }
  208. } else {
  209. onLoad();
  210. }
  211. return images;
  212. },
  213. parseTextures: function ( json, images ) {
  214. var textures = {};
  215. if ( json !== undefined ) {
  216. for ( var i = 0, l = json.length; i < l; i ++ ) {
  217. var data = json[ i ];
  218. if ( data.image === undefined ) {
  219. console.warn( 'THREE.ObjectLoader: No "image" speficied for', data.uuid );
  220. }
  221. if ( images[ data.image ] === undefined ) {
  222. console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
  223. }
  224. var texture = new THREE.Texture( images[ data.image ] );
  225. texture.needsUpdate = true;
  226. texture.uuid = data.uuid;
  227. if ( data.name !== undefined ) texture.name = data.name;
  228. if ( data.repeat !== undefined ) texture.repeat = new THREE.Vector2( data.repeat[ 0 ], data.repeat[ 1 ] );
  229. if ( data.minFilter !== undefined ) texture.minFilter = THREE[ data.minFilter ];
  230. if ( data.magFilter !== undefined ) texture.magFilter = THREE[ data.magFilter ];
  231. if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
  232. if ( data.wrap instanceof Array ) {
  233. texture.wrapS = THREE[ data.wrap[ 0 ] ];
  234. texture.wrapT = THREE[ data.wrap[ 1 ] ];
  235. }
  236. textures[ data.uuid ] = texture;
  237. }
  238. }
  239. return textures;
  240. },
  241. parseObject: function () {
  242. var matrix = new THREE.Matrix4();
  243. return function ( data, geometries, materials ) {
  244. var object;
  245. switch ( data.type ) {
  246. case 'Scene':
  247. object = new THREE.Scene();
  248. break;
  249. case 'PerspectiveCamera':
  250. object = new THREE.PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
  251. break;
  252. case 'OrthographicCamera':
  253. object = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
  254. break;
  255. case 'AmbientLight':
  256. object = new THREE.AmbientLight( data.color );
  257. break;
  258. case 'DirectionalLight':
  259. object = new THREE.DirectionalLight( data.color, data.intensity );
  260. break;
  261. case 'PointLight':
  262. object = new THREE.PointLight( data.color, data.intensity, data.distance, data.decay );
  263. break;
  264. case 'SpotLight':
  265. object = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.exponent, data.decay );
  266. break;
  267. case 'HemisphereLight':
  268. object = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity );
  269. break;
  270. case 'Mesh':
  271. var geometry = geometries[ data.geometry ];
  272. var material = materials[ data.material ];
  273. if ( geometry === undefined ) {
  274. THREE.warn( 'THREE.ObjectLoader: Undefined geometry', data.geometry );
  275. }
  276. if ( material === undefined ) {
  277. THREE.warn( 'THREE.ObjectLoader: Undefined material', data.material );
  278. }
  279. object = new THREE.Mesh( geometry, material );
  280. break;
  281. case 'Line':
  282. var geometry = geometries[ data.geometry ];
  283. var material = materials[ data.material ];
  284. if ( geometry === undefined ) {
  285. THREE.warn( 'THREE.ObjectLoader: Undefined geometry', data.geometry );
  286. }
  287. if ( material === undefined ) {
  288. THREE.warn( 'THREE.ObjectLoader: Undefined material', data.material );
  289. }
  290. object = new THREE.Line( geometry, material );
  291. break;
  292. case 'PointCloud':
  293. var geometry = geometries[ data.geometry ];
  294. var material = materials[ data.material ];
  295. if ( geometry === undefined ) {
  296. console.warn( 'THREE.ObjectLoader: Undefined geometry', data.geometry );
  297. }
  298. if ( material === undefined ) {
  299. console.warn( 'THREE.ObjectLoader: Undefined material', data.material );
  300. }
  301. object = new THREE.PointCloud( geometry, material );
  302. break;
  303. case 'Sprite':
  304. var material = materials[ data.material ];
  305. if ( material === undefined ) {
  306. THREE.warn( 'THREE.ObjectLoader: Undefined material', data.material );
  307. }
  308. object = new THREE.Sprite( material );
  309. break;
  310. case 'Group':
  311. object = new THREE.Group();
  312. break;
  313. default:
  314. object = new THREE.Object3D();
  315. }
  316. object.uuid = data.uuid;
  317. if ( data.name !== undefined ) object.name = data.name;
  318. if ( data.matrix !== undefined ) {
  319. matrix.fromArray( data.matrix );
  320. matrix.decompose( object.position, object.quaternion, object.scale );
  321. } else {
  322. if ( data.position !== undefined ) object.position.fromArray( data.position );
  323. if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
  324. if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
  325. }
  326. if ( data.visible !== undefined ) object.visible = data.visible;
  327. if ( data.userData !== undefined ) object.userData = data.userData;
  328. if ( data.children !== undefined ) {
  329. for ( var child in data.children ) {
  330. object.add( this.parseObject( data.children[ child ], geometries, materials ) );
  331. }
  332. }
  333. return object;
  334. }
  335. }()
  336. };