Loader.js 8.2 KB

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