176 lines
5.4 KiB
JavaScript
176 lines
5.4 KiB
JavaScript
рисовательПоддерживаетИзображениеСИменемФайла = (файл) =>
|
||
{
|
||
var форматы = поддерживаемыеРисователемФорматыИзображений();
|
||
for (var окончание in форматы)
|
||
{
|
||
if (файл.endsWith(окончание))
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
поддерживаемыеРисователемФорматыИзображений = () =>
|
||
{
|
||
return {
|
||
".png": "png",
|
||
".jpg": "jpeg",
|
||
".jpeg": "jpeg",
|
||
".gif": "gif",
|
||
};
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
загрузитьРесурсыПоследовательно = (мир, функция, словарь, событие) =>
|
||
{
|
||
var список = словарьРесурсовВСписок(словарь);
|
||
|
||
function загрузить(мир, список, номер, успех, провал)
|
||
{
|
||
const э = список[номер];
|
||
функция(
|
||
мир,
|
||
э.указатель,
|
||
э.файл,
|
||
function(ресурс) {
|
||
словарь[э.указатель][э.файл] = ресурс;
|
||
успех();
|
||
},
|
||
function() {
|
||
успех();
|
||
}
|
||
);
|
||
}
|
||
|
||
сделатьПоследовательно(
|
||
мир,
|
||
список,
|
||
загрузить,
|
||
function() {
|
||
мир.уведомить(событие);
|
||
}
|
||
);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
словарьРесурсовВСписок = словарь =>
|
||
{
|
||
var список = [];
|
||
for (var указатель in словарь)
|
||
{
|
||
for (var файл in словарь[указатель])
|
||
{
|
||
список.push({
|
||
"указатель": указатель,
|
||
"файл": файл,
|
||
});
|
||
}
|
||
}
|
||
return список;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
форматИзображенияДляБазы64 = файл =>
|
||
{
|
||
var форматы = поддерживаемыеРисователемФорматыИзображений();
|
||
for (var окончание in форматы)
|
||
{
|
||
if (файл.toLowerCase().endsWith(окончание))
|
||
{
|
||
return форматы[окончание];
|
||
}
|
||
}
|
||
|
||
return null;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
загрузитьТекстуру = (мир, указатель, файл, откликУспех, откликПровал = null) =>
|
||
{
|
||
var модуль = мир.модули.модульПоУказателю(указатель);
|
||
var содержимое = модуль.содержимое[файл];
|
||
var представление = мир.база64ИзДвоичногоМассива(new Uint8Array(содержимое));
|
||
var формат = форматИзображенияДляБазы64(файл);
|
||
var адрес = `data:image/${формат};base64,${представление}`;
|
||
мир.текстурщик.load(
|
||
адрес,
|
||
function(текстура) {
|
||
текстура.flipY = false;
|
||
откликУспех(текстура);
|
||
},
|
||
null,
|
||
function(error) {
|
||
var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Не удалось загрузить текстуру ⚬ 无法加载纹理 ⚬ Could not load texture";
|
||
console.error(ошибка, указатель, файл);
|
||
if (откликПровал)
|
||
{
|
||
откликПровал();
|
||
}
|
||
}
|
||
);
|
||
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
загрузитьПолигональнуюСетку = (мир, указатель, файл, откликУспех, откликПровал = null) =>
|
||
{
|
||
var м = мир.модули.модульПоУказателю(указатель);
|
||
var адрес = `${window.location.origin}${файл}`;
|
||
THREE.Cache.enabled = true;
|
||
THREE.Cache.add(адрес, м.содержимое[файл]);
|
||
мир.модельер.load(
|
||
адрес,
|
||
function(gltf) {
|
||
THREE.Cache.remove(адрес);
|
||
// Вычленяем полигональную сетку.
|
||
// Take polygon mesh.
|
||
var успех = false;
|
||
gltf.scene.traverse(function(ребёнок) {
|
||
if (!успех && ребёнок.isMesh)
|
||
{
|
||
откликУспех(ребёнок);
|
||
успех = true;
|
||
}
|
||
});
|
||
if (успех)
|
||
{
|
||
return;
|
||
}
|
||
var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Отсутствует полигональная сетка ⚬ 不存在多边形网格 ⚬ Polygon mesh is absent";
|
||
console.error(ошибка, указатель, файл);
|
||
if (откликПровал)
|
||
{
|
||
откликПровал();
|
||
}
|
||
},
|
||
null,
|
||
function(error) {
|
||
var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Не удалось загрузить полигональную сетку ⚬ 无法加载多边形网格 ⚬ Could not load polygon mesh";
|
||
console.error(ошибка, указатель, файл);
|
||
if (откликПровал)
|
||
{
|
||
откликПровал();
|
||
}
|
||
}
|
||
);
|
||
}; |