const ИМЯ = "ОМ | MB"; const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources"; // // // // ВывестиКоординатыНажатия = мир => { var п = мир.позицияНажатия; console.debug("нажатие", п.x, п.y); }; // // // // ИсправитьОтслеживаниеНажатийНаIOS = мир => { // https://stackoverflow.com/a/31459240/3404710 мир.отрисовщик.domElement.style.cursor = "pointer"; }; // // // // ОтслеживатьНажатияПальцем = мир => { window.addEventListener( "touchstart", function(событие) { var позиция = new THREE.Vector2(); позиция.x = (событие.touches[0].clientX / window.innerWidth) * 2 - 1; позиция.y = - (событие.touches[0].clientY / window.innerHeight) * 2 + 1; мир.позицияНажатия = позиция; мир.уведомить("нажали"); } ); }; // // // // ОтслеживатьНажатияМышью = мир => { window.addEventListener( "click", function(событие) { var позиция = new THREE.Vector2(); позиция.x = (событие.clientX / window.innerWidth) * 2 - 1; позиция.y = - (событие.clientY / window.innerHeight) * 2 + 1; мир.позицияНажатия = позиция; мир.уведомить("нажали"); } ); }; // // // // ЗадатьМатериалыФишкамПоГруппам = мир => { for (var номер in мир.группыФишек) { var группа = мир.группыФишек[номер]; var материал = мир.материалыФишек[группа]; фишка = мир.фишки[номер]; фишка.material = материал; } }; // // // // СоздатьГруппыФишек = мир => { мир.группыФишек = []; const позиции = мир.раскладкаKMahjongg.позиции; var группа = 0; for (var номер in позиции) { мир.группыФишек.push(группа); // Меняем группу каждую пару фишек. if (номер %2 == 0) { ++группа; // Начинаем группы заново, как только они заканчиваются. if (группа >= 42) { группа = 0; } } } }; // // // // СоздатьУзлыФишек = мир => { 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 границы = мир.фишка.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; var материал = мир.материалыФишек[номерМатериала]; фишка.material = материал; } }; // // // // СоздатьМатериалыФишекОтладочнойТемы = мир => { мир.материалыФишек = []; var тема = "отладочная|debug"; for (var номер = 1; номер <= 42; ++номер) { var текстура = мир.текстурыТемФишек[тема][номер]; var материал = new THREE.MeshLambertMaterial({map: текстура}); мир.материалыФишек.push(материал); } }; // // // // ВывестиФактЗагрузкиТемыФишекМаджонга = мир => { 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(); };