170 lines
4.6 KiB
JavaScript
170 lines
4.6 KiB
JavaScript
const ОТСТУП_МЕЖДУ_ФИШКАМИ = 0.02;
|
||
const КОЭФФИЦИЕНТ_ВЫСОТЫ = 1.5;
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
РасположитьКамеруСцены = мир =>
|
||
{
|
||
var р = мир.размерПоляФишек;
|
||
var расстояние = р.макс.z - р.мин.z;
|
||
мир.камера.position.y = расстояние * КОЭФФИЦИЕНТ_ВЫСОТЫ;
|
||
мир.камера.position.z = расстояние;
|
||
мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ЦентрироватьФишкиСцены = мир =>
|
||
{
|
||
// Возвращаем в центр.
|
||
мир.сценаМаджонга.position.x = 0;
|
||
мир.сценаМаджонга.position.z = 0;
|
||
|
||
var р = мир.размерПоляФишек;
|
||
// Убираем пустоту слева.
|
||
мир.сценаМаджонга.position.x -= р.мин.x;
|
||
мир.сценаМаджонга.position.z -= р.мин.z;
|
||
// Центрируем остаток.
|
||
мир.сценаМаджонга.position.x -= (р.макс.x - р.мин.x) / 2;
|
||
мир.сценаМаджонга.position.z -= (р.макс.z - р.мин.z) / 2;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПосчитатьРазмерПоляФишек = мир =>
|
||
{
|
||
var мин = {
|
||
"x": 1000000,
|
||
"z": 1000000,
|
||
};
|
||
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;
|
||
}
|
||
}
|
||
|
||
мир.размерПоляФишек = {
|
||
"мин": мин,
|
||
"макс": макс,
|
||
};
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ЗадатьМатериалыФишкамСцены = мир =>
|
||
{
|
||
for (var н in мир.фишкиМаджонга)
|
||
{
|
||
var ф = мир.фишкиСцены[н];
|
||
var г = мир.фишкиМаджонга[н]["🚩"];
|
||
var м = мир.материалыФишекСцены[г];
|
||
ф.material = м;
|
||
}
|
||
};
|
||
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПерезадатьФишкиСцены = мир =>
|
||
{
|
||
var фишка = мир.модельФишкиСцены;
|
||
var границы = фишка.geometry.boundingBox;
|
||
var размеры = [
|
||
(границы.max.x - границы.min.x) / 2,
|
||
(границы.max.z - границы.min.z) / 2,
|
||
(границы.max.y - границы.min.y),
|
||
];
|
||
var отступ = мир.отступМеждуФишкамиСцены;
|
||
for (var номер in мир.фишкиМаджонга)
|
||
{
|
||
// Узел сцены.
|
||
var ф = мир.фишкиСцены[номер];
|
||
ф.layers.set(0);
|
||
ф.userData = номер;
|
||
// Расположение.
|
||
var фм = мир.фишкиМаджонга[номер];
|
||
var п = фм["📍"];
|
||
var слой = п[0];
|
||
var ряд = п[1];
|
||
var столбец = п[2];
|
||
ф.position.x = столбец * (размеры[0] + отступ);
|
||
ф.position.z = ряд * (размеры[1] + отступ);
|
||
ф.position.y = слой * (размеры[2] + отступ);
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СкрытьФишкиСцены = мир =>
|
||
{
|
||
var фишки = мир.фишкиСцены;
|
||
for (var н in фишки)
|
||
{
|
||
var ф = фишки[н];
|
||
ф.layers.set(1);
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ДосоздатьФишкиСцены = мир =>
|
||
{
|
||
// Если фишек в сцене уже достаточно, то ничего не делаем.
|
||
if (мир.фишкиСцены.length >= мир.фишкиМаджонга.length)
|
||
{
|
||
return;
|
||
}
|
||
|
||
var фишка = мир.модельФишкиСцены;
|
||
var колво = мир.фишкиМаджонга.length - мир.фишкиСцены.length;
|
||
for (var н = 0; н < колво; ++н)
|
||
{
|
||
var ф = фишка.clone();
|
||
мир.фишкиСцены.push(ф);
|
||
мир.кореньСценыМаджонга.add(ф);
|
||
}
|
||
}
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПодготовитьСценуМаджонга = мир =>
|
||
{
|
||
мир.отступМеждуФишкамиСцены = ОТСТУП_МЕЖДУ_ФИШКАМИ;
|
||
мир.сценаМаджонга = new THREE.Group();
|
||
мир.фишкиСцены = [];
|
||
}; |