Files
mahjong-osnova-base/сцена|scene.js

282 lines
7.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const ИМЯ = "ОМ | MB";
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
// // // //
ОтобразитьРаскладкуПоследовательноСоВсемиТекстурами = мир =>
{
var границы = мир.фишка.geometry.boundingBox;
var размеры = [
(границы.max.x - границы.min.x) / 2,
(границы.max.z - границы.min.z) / 2,
границы.max.y - границы.min.y,
];
const позиции = мир.раскладкаKMahjongg.позиции;
мир.фишки = [];
for (var номер in позиции)
{
// Модель.
var фишка = мир.фишка.clone();
мир.фишки.push(фишка);
мир.корень.add(фишка);
// Расположение.
var позиция = позиции[номер];
var слой = позиция[0];
var ряд = позиция[1];
var столбец = позиция[2];
фишка.position.x = столбец * размеры[0];
фишка.position.z = ряд * размеры[1];
фишка.position.y = слой;
// Текстура.
var номерТекстуры = номер % 42;
// Потому что текстуры с индекса 1 начинаются.
номерТекстуры += 1;
var текстура = мир.текстурыТемФишек["отладочная|debug"][номерТекстуры];
var материал = new THREE.MeshLambertMaterial({map: текстура});
фишка.material = материал;
}
};
// // // //
ВывестиФактЗагрузкиТемыФишекМаджонга = мир =>
{
console.debug("ВывестиФактЗагрузкиТемыФишекМаджонга");
};
// // // //
ЗадатьТемуФишекДляЗагрузки = мир =>
{
мир.темаФишек = "отладочная|debug";
};
// // // //
ЦентрироватьСцену = мир =>
{
var мин = {
"x": 0,
"z": 0,
};
var макс = {
"x": 0,
"z": 0,
};
for (var номер in мир.фишки)
{
const фишка = мир.фишки[номер];
if (фишка.position.x < мин.x)
{
мин.x = фишка.position.x;
}
if (фишка.position.x > макс.x)
{
макс.x = фишка.position.x;
}
if (фишка.position.z < мин.z)
{
мин.z = фишка.position.z;
}
if (фишка.position.z > макс.z)
{
макс.z = фишка.position.z;
}
}
мир.корень.position.x -= (макс.x - мин.x) / 2;
мир.корень.position.z -= (макс.z - мин.z) / 2;
};
// // // //
ОтобразитьРаскладкуОднойФишкой = мир =>
{
var границы = мир.фишка.geometry.boundingBox;
var размеры = [
(границы.max.x - границы.min.x) / 2,
(границы.max.z - границы.min.z) / 2,
границы.max.y - границы.min.y,
];
const позиции = мир.раскладкаKMahjongg.позиции;
мир.фишки = [];
for (var номер in позиции)
{
var фишка = мир.фишка.clone();
мир.фишки.push(фишка);
мир.корень.add(фишка);
var позиция = позиции[номер];
var слой = позиция[0];
var ряд = позиция[1];
var столбец = позиция[2];
фишка.position.x = столбец * размеры[0];
фишка.position.z = ряд * размеры[1];
фишка.position.y = слой;
}
};
// // // //
ЗагрузитьРаскладку = мир =>
{
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
//var ресурс = "/cat.layout";
var ресурс = "/X_shaped.layout";
var содержимое = модуль.содержимое[ресурс];
мир.раскладкаKMahjongg = {
"содержимое": содержимое,
};
};
// // // //
ПовернутьФишку = мир =>
{
мир.фишка.rotation.x += 0.03;
мир.фишка.rotation.y += 0.02;
};
// // // //
Отладка = мир =>
{
console.debug("Отладка", Date());
};
// // // //
ЗапуститьТаймерПоворотаФишки = мир =>
{
setInterval(
function() {
мир.уведомить("поворот фишки");
},
60
);
};
// // // //
ПодготовитьСцену = мир =>
{
var коэффициент = 2;
var расстояние = 12;
мир.камера.position.y = расстояние * коэффициент;
мир.камера.position.z = расстояние;
мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
мир.свет = new THREE.DirectionalLight(0xffffff, 1);
мир.свет.position.set(-0.5, 1, 0.5).normalize();
мир.сцена.add(мир.свет);
мир.корень = new THREE.Group();
мир.сцена.add(мир.корень);
};
// // // //
ПодготовитьФишку = мир =>
{
var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки});
мир.фишка.material = материал;
};
// // // //
ЗагрузитьТекстуруФишкиИзМодуля = мир =>
{
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
var ресурс = "/текстура.png";
var содержимое = модуль.содержимое[ресурс];
var b64 = base64js.fromByteArray(new Uint8Array(содержимое));
var адрес = `data:image/png;base64,${b64}`;
мир.загрузчикТекстур.load(
адрес,
function(текстура) {
мир.текстураФишки = текстура;
мир.текстураФишки.flipY = false;
мир.уведомить("загрузили текстуру фишки из модуля");
},
null,
function(error) {
console.error("ОШИБКА | ERROR", error);
}
);
};
// // // //
СоздатьЗагрузчикТекстур = мир =>
{
мир.загрузчикТекстур = new THREE.TextureLoader();
};
// // // //
ЗагрузитьФишку = мир =>
{
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
var ресурс = "/фишка.gltf";
var адрес = `${window.location.origin}${ресурс}`;
THREE.Cache.enabled = true;
THREE.Cache.add(адрес, модуль.содержимое[ресурс]);
мир.загрузчикGLTF.load(
адрес,
function(gltf) {
// Вычленяем Mesh.
gltf.scene.traverse(function(ребёнок) {
if (ребёнок.isMesh)
{
мир.фишка = ребёнок;
}
});
мир.уведомить("загрузили фишку");
},
null,
function(error) {
console.error("ОШИБКА | ERROR", error);
}
);
};
// // // //
СоздатьЗагрузчикGLTF = мир =>
{
мир.загрузчикGLTF = new THREE.GLTFLoader();
};