Отрисовка с помощью Three.js, загрузка моделей GLTF и текстур PNG | Rendering with Three.js, loading of GLTF models and PNG textures
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
5.4KB

  1. рисовательПоддерживаетИзображениеСИменемФайла = (файл) =>
  2. {
  3. var форматы = поддерживаемыеРисователемФорматыИзображений();
  4. for (var окончание in форматы)
  5. {
  6. if (файл.endsWith(окончание))
  7. {
  8. return true;
  9. }
  10. }
  11. return false;
  12. };
  13. // // // //
  14. поддерживаемыеРисователемФорматыИзображений = () =>
  15. {
  16. return {
  17. ".png": "png",
  18. ".jpg": "jpeg",
  19. ".jpeg": "jpeg",
  20. ".gif": "gif",
  21. };
  22. };
  23. // // // //
  24. загрузитьРесурсыПоследовательно = (мир, функция, словарь, событие) =>
  25. {
  26. var список = словарьРесурсовВСписок(словарь);
  27. function загрузить(мир, список, номер, успех, провал)
  28. {
  29. const э = список[номер];
  30. функция(
  31. мир,
  32. э.указатель,
  33. э.файл,
  34. function(ресурс) {
  35. словарь[э.указатель][э.файл] = ресурс;
  36. успех();
  37. },
  38. function() {
  39. успех();
  40. }
  41. );
  42. }
  43. сделатьПоследовательно(
  44. мир,
  45. список,
  46. загрузить,
  47. function() {
  48. мир.уведомить(событие);
  49. }
  50. );
  51. };
  52. // // // //
  53. словарьРесурсовВСписок = словарь =>
  54. {
  55. var список = [];
  56. for (var указатель in словарь)
  57. {
  58. for (var файл in словарь[указатель])
  59. {
  60. список.push({
  61. "указатель": указатель,
  62. "файл": файл,
  63. });
  64. }
  65. }
  66. return список;
  67. };
  68. // // // //
  69. форматИзображенияДляБазы64 = файл =>
  70. {
  71. var форматы = поддерживаемыеРисователемФорматыИзображений();
  72. for (var окончание in форматы)
  73. {
  74. if (файл.toLowerCase().endsWith(окончание))
  75. {
  76. return форматы[окончание];
  77. }
  78. }
  79. return null;
  80. };
  81. // // // //
  82. загрузитьТекстуру = (мир, указатель, файл, откликУспех, откликПровал = null) =>
  83. {
  84. var модуль = мир.модули.модульПоУказателю(указатель);
  85. var содержимое = модуль.содержимое[файл];
  86. var представление = мир.база64ИзДвоичногоМассива(new Uint8Array(содержимое));
  87. var формат = форматИзображенияДляБазы64(файл);
  88. var адрес = `data:image/${формат};base64,${представление}`;
  89. мир.текстурщик.load(
  90. адрес,
  91. function(текстура) {
  92. текстура.flipY = false;
  93. откликУспех(текстура);
  94. },
  95. null,
  96. function(error) {
  97. var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Не удалось загрузить текстуру ⚬ 无法加载纹理 ⚬ Could not load texture";
  98. console.error(ошибка, указатель, файл);
  99. if (откликПровал)
  100. {
  101. откликПровал();
  102. }
  103. }
  104. );
  105. };
  106. // // // //
  107. загрузитьПолигональнуюСетку = (мир, указатель, файл, откликУспех, откликПровал = null) =>
  108. {
  109. var м = мир.модули.модульПоУказателю(указатель);
  110. var адрес = `${window.location.origin}${файл}`;
  111. THREE.Cache.enabled = true;
  112. THREE.Cache.add(адрес, м.содержимое[файл]);
  113. мир.модельер.load(
  114. адрес,
  115. function(gltf) {
  116. THREE.Cache.remove(адрес);
  117. // Вычленяем полигональную сетку.
  118. // Take polygon mesh.
  119. var успех = false;
  120. gltf.scene.traverse(function(ребёнок) {
  121. if (!успех && ребёнок.isMesh)
  122. {
  123. откликУспех(ребёнок);
  124. успех = true;
  125. }
  126. });
  127. if (успех)
  128. {
  129. return;
  130. }
  131. var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Отсутствует полигональная сетка ⚬ 不存在多边形网格 ⚬ Polygon mesh is absent";
  132. console.error(ошибка, указатель, файл);
  133. if (откликПровал)
  134. {
  135. откликПровал();
  136. }
  137. },
  138. null,
  139. function(error) {
  140. var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Не удалось загрузить полигональную сетку ⚬ 无法加载多边形网格 ⚬ Could not load polygon mesh";
  141. console.error(ошибка, указатель, файл);
  142. if (откликПровал)
  143. {
  144. откликПровал();
  145. }
  146. }
  147. );
  148. };