Отрисовка с помощью Three.js, загрузка моделей GLTF и текстур PNG | Rendering with Three.js, loading of GLTF models and PNG textures
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

176 lignes
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. };