Loader.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. import { FaceColors, VertexColors, DoubleSide, BackSide, MirroredRepeatWrapping, RepeatWrapping, BlendingMode } from '../constants';
  2. import { _Math } from '../math/Math';
  3. import { MaterialLoader } from './MaterialLoader';
  4. import { TextureLoader } from './TextureLoader';
  5. import { Color } from '../math/Color';
  6. /**
  7. * @author alteredq / http://alteredqualia.com/
  8. */
  9. function Loader() {
  10. this.onLoadStart = function () {};
  11. this.onLoadProgress = function () {};
  12. this.onLoadComplete = function () {};
  13. }
  14. Loader.prototype = {
  15. constructor: Loader,
  16. crossOrigin: undefined,
  17. extractUrlBase: function ( url ) {
  18. var parts = url.split( '/' );
  19. if ( parts.length === 1 ) return './';
  20. parts.pop();
  21. return parts.join( '/' ) + '/';
  22. },
  23. initMaterials: function ( materials, texturePath, crossOrigin ) {
  24. var array = [];
  25. for ( var i = 0; i < materials.length; ++ i ) {
  26. array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );
  27. }
  28. return array;
  29. },
  30. createMaterial: ( function () {
  31. var color, textureLoader, materialLoader;
  32. return function createMaterial( m, texturePath, crossOrigin ) {
  33. if ( color === undefined ) color = new Color();
  34. if ( textureLoader === undefined ) textureLoader = new TextureLoader();
  35. if ( materialLoader === undefined ) materialLoader = new MaterialLoader();
  36. // convert from old material format
  37. var textures = {};
  38. function loadTexture( path, repeat, offset, wrap, anisotropy ) {
  39. var fullPath = texturePath + path;
  40. var loader = Loader.Handlers.get( fullPath );
  41. var texture;
  42. if ( loader !== null ) {
  43. texture = loader.load( fullPath );
  44. } else {
  45. textureLoader.setCrossOrigin( crossOrigin );
  46. texture = textureLoader.load( fullPath );
  47. }
  48. if ( repeat !== undefined ) {
  49. texture.repeat.fromArray( repeat );
  50. if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;
  51. if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;
  52. }
  53. if ( offset !== undefined ) {
  54. texture.offset.fromArray( offset );
  55. }
  56. if ( wrap !== undefined ) {
  57. if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;
  58. if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;
  59. if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;
  60. if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;
  61. }
  62. if ( anisotropy !== undefined ) {
  63. texture.anisotropy = anisotropy;
  64. }
  65. var uuid = _Math.generateUUID();
  66. textures[ uuid ] = texture;
  67. return uuid;
  68. }
  69. //
  70. var json = {
  71. uuid: _Math.generateUUID(),
  72. type: 'MeshLambertMaterial'
  73. };
  74. for ( var name in m ) {
  75. var value = m[ name ];
  76. switch ( name ) {
  77. case 'DbgColor':
  78. case 'DbgIndex':
  79. case 'opticalDensity':
  80. case 'illumination':
  81. break;
  82. case 'DbgName':
  83. json.name = value;
  84. break;
  85. case 'blending':
  86. json.blending = BlendingMode[ value ];
  87. break;
  88. case 'colorAmbient':
  89. case 'mapAmbient':
  90. console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );
  91. break;
  92. case 'colorDiffuse':
  93. json.color = color.fromArray( value ).getHex();
  94. break;
  95. case 'colorSpecular':
  96. json.specular = color.fromArray( value ).getHex();
  97. break;
  98. case 'colorEmissive':
  99. json.emissive = color.fromArray( value ).getHex();
  100. break;
  101. case 'specularCoef':
  102. json.shininess = value;
  103. break;
  104. case 'shading':
  105. if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';
  106. if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';
  107. if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';
  108. break;
  109. case 'mapDiffuse':
  110. json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
  111. break;
  112. case 'mapDiffuseRepeat':
  113. case 'mapDiffuseOffset':
  114. case 'mapDiffuseWrap':
  115. case 'mapDiffuseAnisotropy':
  116. break;
  117. case 'mapEmissive':
  118. json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );
  119. break;
  120. case 'mapEmissiveRepeat':
  121. case 'mapEmissiveOffset':
  122. case 'mapEmissiveWrap':
  123. case 'mapEmissiveAnisotropy':
  124. break;
  125. case 'mapLight':
  126. json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
  127. break;
  128. case 'mapLightRepeat':
  129. case 'mapLightOffset':
  130. case 'mapLightWrap':
  131. case 'mapLightAnisotropy':
  132. break;
  133. case 'mapAO':
  134. json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
  135. break;
  136. case 'mapAORepeat':
  137. case 'mapAOOffset':
  138. case 'mapAOWrap':
  139. case 'mapAOAnisotropy':
  140. break;
  141. case 'mapBump':
  142. json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
  143. break;
  144. case 'mapBumpScale':
  145. json.bumpScale = value;
  146. break;
  147. case 'mapBumpRepeat':
  148. case 'mapBumpOffset':
  149. case 'mapBumpWrap':
  150. case 'mapBumpAnisotropy':
  151. break;
  152. case 'mapNormal':
  153. json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
  154. break;
  155. case 'mapNormalFactor':
  156. json.normalScale = [ value, value ];
  157. break;
  158. case 'mapNormalRepeat':
  159. case 'mapNormalOffset':
  160. case 'mapNormalWrap':
  161. case 'mapNormalAnisotropy':
  162. break;
  163. case 'mapSpecular':
  164. json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
  165. break;
  166. case 'mapSpecularRepeat':
  167. case 'mapSpecularOffset':
  168. case 'mapSpecularWrap':
  169. case 'mapSpecularAnisotropy':
  170. break;
  171. case 'mapMetalness':
  172. json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );
  173. break;
  174. case 'mapMetalnessRepeat':
  175. case 'mapMetalnessOffset':
  176. case 'mapMetalnessWrap':
  177. case 'mapMetalnessAnisotropy':
  178. break;
  179. case 'mapRoughness':
  180. json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );
  181. break;
  182. case 'mapRoughnessRepeat':
  183. case 'mapRoughnessOffset':
  184. case 'mapRoughnessWrap':
  185. case 'mapRoughnessAnisotropy':
  186. break;
  187. case 'mapAlpha':
  188. json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
  189. break;
  190. case 'mapAlphaRepeat':
  191. case 'mapAlphaOffset':
  192. case 'mapAlphaWrap':
  193. case 'mapAlphaAnisotropy':
  194. break;
  195. case 'flipSided':
  196. json.side = BackSide;
  197. break;
  198. case 'doubleSided':
  199. json.side = DoubleSide;
  200. break;
  201. case 'transparency':
  202. console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );
  203. json.opacity = value;
  204. break;
  205. case 'depthTest':
  206. case 'depthWrite':
  207. case 'colorWrite':
  208. case 'opacity':
  209. case 'reflectivity':
  210. case 'transparent':
  211. case 'visible':
  212. case 'wireframe':
  213. json[ name ] = value;
  214. break;
  215. case 'vertexColors':
  216. if ( value === true ) json.vertexColors = VertexColors;
  217. if ( value === 'face' ) json.vertexColors = FaceColors;
  218. break;
  219. default:
  220. console.error( 'THREE.Loader.createMaterial: Unsupported', name, value );
  221. break;
  222. }
  223. }
  224. if ( json.type === 'MeshBasicMaterial' ) delete json.emissive;
  225. if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
  226. if ( json.opacity < 1 ) json.transparent = true;
  227. materialLoader.setTextures( textures );
  228. return materialLoader.parse( json );
  229. };
  230. } )()
  231. };
  232. Loader.Handlers = {
  233. handlers: [],
  234. add: function ( regex, loader ) {
  235. this.handlers.push( regex, loader );
  236. },
  237. get: function ( file ) {
  238. var handlers = this.handlers;
  239. for ( var i = 0, l = handlers.length; i < l; i += 2 ) {
  240. var regex = handlers[ i ];
  241. var loader = handlers[ i + 1 ];
  242. if ( regex.test( file ) ) {
  243. return loader;
  244. }
  245. }
  246. return null;
  247. }
  248. };
  249. export { Loader };