Отрисовка с помощью 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.

156 lines
4.8KB

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