MaterialHandler.js 5.6 KB

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