MaterialHandler.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /**
  2. * @author Kai Salmen / https://kaisalmen.de
  3. * Development repository: https://github.com/kaisalmen/WWOBJLoader
  4. */
  5. import {
  6. LineBasicMaterial,
  7. Material,
  8. MaterialLoader,
  9. MeshStandardMaterial,
  10. PointsMaterial,
  11. VertexColors
  12. } from "../../../../build/three.module.js";
  13. export { MaterialHandler }
  14. const MaterialHandler = function () {
  15. this.logging = {
  16. enabled: true,
  17. debug: false
  18. };
  19. this.callbacks = {
  20. onLoadMaterials: null
  21. };
  22. this.materials = {};
  23. this._createDefaultMaterials();
  24. };
  25. MaterialHandler.prototype = {
  26. constructor: MaterialHandler,
  27. /**
  28. * Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
  29. *
  30. * @param {boolean} enabled True or false.
  31. * @param {boolean} debug True or false.
  32. */
  33. setLogging: function ( enabled, debug ) {
  34. this.logging.enabled = enabled === true;
  35. this.logging.debug = debug === true;
  36. },
  37. _setCallbacks: function ( onLoadMaterials ) {
  38. if ( onLoadMaterials !== undefined && onLoadMaterials !== null ) {
  39. this.callbacks.onLoadMaterials = onLoadMaterials;
  40. }
  41. },
  42. _createDefaultMaterials: function () {
  43. let defaultMaterial = new MeshStandardMaterial( { color: 0xDCF1FF } );
  44. defaultMaterial.name = 'defaultMaterial';
  45. let defaultVertexColorMaterial = new MeshStandardMaterial( { color: 0xDCF1FF } );
  46. defaultVertexColorMaterial.name = 'defaultVertexColorMaterial';
  47. defaultVertexColorMaterial.vertexColors = VertexColors;
  48. let defaultLineMaterial = new LineBasicMaterial();
  49. defaultLineMaterial.name = 'defaultLineMaterial';
  50. let defaultPointMaterial = new PointsMaterial( { size: 0.1 } );
  51. defaultPointMaterial.name = 'defaultPointMaterial';
  52. let runtimeMaterials = {};
  53. runtimeMaterials[ defaultMaterial.name ] = defaultMaterial;
  54. runtimeMaterials[ defaultVertexColorMaterial.name ] = defaultVertexColorMaterial;
  55. runtimeMaterials[ defaultLineMaterial.name ] = defaultLineMaterial;
  56. runtimeMaterials[ defaultPointMaterial.name ] = defaultPointMaterial;
  57. this.addMaterials( runtimeMaterials );
  58. },
  59. /**
  60. * Updates the materials with contained material objects (sync) or from alteration instructions (async).
  61. *
  62. * @param {Object} materialPayload Material update instructions
  63. * @returns {Object} Map of {@link Material}
  64. */
  65. addPayloadMaterials: function ( materialPayload ) {
  66. let material, materialName;
  67. let materialCloneInstructions = materialPayload.materials.materialCloneInstructions;
  68. let newMaterials = {};
  69. if ( materialCloneInstructions !== undefined && materialCloneInstructions !== null ) {
  70. let materialNameOrg = materialCloneInstructions.materialNameOrg;
  71. if ( materialNameOrg !== undefined && materialNameOrg !== null ) {
  72. let materialOrg = this.materials[ materialNameOrg ];
  73. material = materialOrg.clone();
  74. materialName = materialCloneInstructions.materialName;
  75. material.name = materialName;
  76. let materialProperties = materialCloneInstructions.materialProperties;
  77. for ( let key in materialProperties ) {
  78. if ( material.hasOwnProperty( key ) && materialProperties.hasOwnProperty( key ) ) {
  79. material[ key ] = materialProperties[ key ];
  80. }
  81. }
  82. this.materials[ materialName ] = material;
  83. newMaterials[ materialName ] = material;
  84. } else {
  85. console.info( 'Requested material "' + materialNameOrg + '" is not available!' );
  86. }
  87. }
  88. let materials = materialPayload.materials.serializedMaterials;
  89. if ( materials !== undefined && materials !== null && Object.keys( materials ).length > 0 ) {
  90. let loader = new MaterialLoader();
  91. let materialJson;
  92. for ( materialName in materials ) {
  93. materialJson = materials[ materialName ];
  94. if ( materialJson !== undefined && materialJson !== null ) {
  95. material = loader.parse( materialJson );
  96. if ( this.logging.enabled ) console.info( 'De-serialized material with name "' + materialName + '" will be added.' );
  97. this.materials[ materialName ] = material;
  98. newMaterials[ materialName ] = material;
  99. }
  100. }
  101. }
  102. materials = materialPayload.materials.runtimeMaterials;
  103. newMaterials = this.addMaterials( materials, newMaterials );
  104. return newMaterials;
  105. },
  106. /**
  107. * Set materials loaded by any supplier of an Array of {@link Material}.
  108. *
  109. * @param materials Object with named {@link Material}
  110. * @param newMaterials [Object] with named {@link Material}
  111. */
  112. addMaterials: function ( materials, newMaterials ) {
  113. if ( newMaterials === undefined || newMaterials === null ) {
  114. newMaterials = {};
  115. }
  116. if ( materials !== undefined && materials !== null && Object.keys( materials ).length > 0 ) {
  117. let material;
  118. for ( let materialName in materials ) {
  119. material = materials[ materialName ];
  120. this.materials[ materialName ] = material;
  121. newMaterials[ materialName ] = material;
  122. if ( this.logging.enabled ) console.info( 'Material with name "' + materialName + '" was added.' );
  123. }
  124. }
  125. return newMaterials;
  126. },
  127. /**
  128. * Returns the mapping object of material name and corresponding material.
  129. *
  130. * @returns {Object} Map of {@link Material}
  131. */
  132. getMaterials: function () {
  133. return this.materials;
  134. },
  135. /**
  136. *
  137. * @param {String} materialName
  138. * @returns {Material}
  139. */
  140. getMaterial: function ( materialName ) {
  141. return this.materials[ materialName ];
  142. },
  143. /**
  144. * Returns the mapping object of material name and corresponding jsonified material.
  145. *
  146. * @returns {Object} Map of Materials in JSON representation
  147. */
  148. getMaterialsJSON: function () {
  149. let materialsJSON = {};
  150. let material;
  151. for ( let materialName in this.materials ) {
  152. material = this.materials[ materialName ];
  153. materialsJSON[ materialName ] = material.toJSON();
  154. }
  155. return materialsJSON;
  156. }
  157. };