UNPKG

lingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

221 lines 6.28 kB
import { forceGet, forceGetInstance, random } from "@lincode/utils"; import deserialize from "../api/serializer/deserialize"; import settings from "../api/settings"; import spawn from "../api/spawn"; // const dummy = new Dummy() // dummy.roughnessFactor = 0.4 // dummy.metalnessFactor = 1.5 // dummy.envFactor = 1.5 // dummy.scale = 5 // settings.environment = "studio" // settings.defaultLight = false settings.skybox = "day"; settings.ssr = true; const scale = 10; const [turnTemplate, straightTemplate, sideWalkTemplate] = deserialize([ { type: "template", source: "group", uuid: "T5d3cWoQw4yJAI55Sw4gp", id: "turn", name: "turn", scaleX: scale, scaleY: scale, scaleZ: scale, innerY: 45.9, children: [ { type: "cube", uuid: "NSd69ZcVTi3yiaid1E1e3", x: 0.07, y: -48.01, z: 0.31, scaleX: 1.46, scaleY: 0.12, scaleZ: 1.49, texture: "road/sideWalk.png", roughness: 0.52 }, { type: "model", uuid: "DSfr0GqKalQmVpzkqqT4t", y: 7.51, src: "road/turn.glb" } ] }, { type: "template", source: "group", uuid: "-fiDbm6b-ArJf1SM4Z6DF", id: "straight", name: "straight", scaleX: scale, scaleY: scale, scaleZ: scale, z: 148.57, innerY: 46.88, innerRotationY: 90, children: [ { type: "cube", uuid: "VRctNqlqmqqne4dlldSeY", x: 0.07, y: -48.66, z: -0.35, scaleX: 1.46, scaleY: 0.12, scaleZ: 1.49, texture: "road/sideWalk.png", roughness: 0.52 }, { type: "model", uuid: "YPYFEFJOzStKOf06jg9xb", y: 6.99, z: -0.19, scaleZ: 0.7, src: "road/straight.glb" } ] }, { type: "template", source: "cube", uuid: "7YzzDpmyGQu2iMQ_KpzZe", id: "sideWalk", name: "sideWalk", z: -148.58, scaleX: 1.46 * scale, scaleY: 0.12 * scale, scaleZ: 1.49 * scale, innerY: -18.7, texture: "road/sideWalk.png", roughness: 0.52 } ]); const sideWalk = 0; const road = 1; const tiles = { sideWalkTile: [ { "-x": sideWalk, "+x": sideWalk, "-z": sideWalk, "+z": sideWalk }, sideWalkTemplate, 0 ], straightTile: [ { "-x": road, "+x": road, "-z": sideWalk, "+z": sideWalk }, straightTemplate, 0 ], turnTile: [ { "-x": road, "+x": sideWalk, "-z": road, "+z": sideWalk }, turnTemplate, 0 ] }; const rotateTile = ([tile, manager, angle]) => { return [ { "-x": tile["-z"], "-z": tile["+x"], "+x": tile["+z"], "+z": tile["-x"] }, manager, angle - 90 ]; }; const tileArray = []; for (let tile of Object.values(tiles)) { tileArray.push(tile); tileArray.push((tile = rotateTile(tile))); tileArray.push((tile = rotateTile(tile))); tileArray.push((tile = rotateTile(tile))); } const xMap = new Map(); const tilesPositionMap = new Map(); const getTiles = (x, y) => { const yMap = forceGetInstance(xMap, x, (Map)); return forceGet(yMap, y, () => { const tiles = new Set(tileArray); tilesPositionMap.set(tiles, [x, y]); return tiles; }); }; const size = 10; const outOfBounds = (x, z) => x < -size || x > size || z < -size || z > size; const offset = 146 * scale; const collapsed = new WeakSet(); const allocate = (x, z) => { const tilesCenter = getTiles(x, z); const tilesTop = getTiles(x, z + 1); const tilesBottom = getTiles(x, z - 1); const tilesLeft = getTiles(x - 1, z); const tilesRight = getTiles(x + 1, z); return [tilesCenter, tilesTop, tilesBottom, tilesLeft, tilesRight]; }; const collapse = async (x, z) => { await new Promise((resolve) => setTimeout(resolve)); const [tilesCenter, tilesTop, tilesBottom, tilesLeft, tilesRight] = allocate(x, z); const [tile, tileTemplate, tileAngle] = tilesCenter.size ? [...tilesCenter][Math.round(random(0, tilesCenter.size - 1))] : tiles.sideWalkTile; const manager = spawn(tileTemplate); manager.rotationY = tileAngle; manager.x = x * offset; manager.z = z * offset; tilesCenter.clear(); collapsed.add(tilesCenter); tilesPositionMap.delete(tilesCenter); for (const tileBottom of tilesBottom) if (tile["+z"] !== tileBottom[0]["-z"]) tilesBottom.delete(tileBottom); for (const tileTop of tilesTop) if (tile["-z"] !== tileTop[0]["+z"]) tilesTop.delete(tileTop); for (const tileLeft of tilesLeft) if (tile["-x"] !== tileLeft[0]["+x"]) tilesLeft.delete(tileLeft); for (const tileRight of tilesRight) if (tile["+x"] !== tileRight[0]["-x"]) tilesRight.delete(tileRight); let tilesMin; for (const tiles of [tilesTop, tilesBottom, tilesLeft, tilesRight]) { if (!tilesPositionMap.has(tiles)) continue; const [xNext, zNext] = tilesPositionMap.get(tiles); if (outOfBounds(xNext, zNext)) { tilesPositionMap.delete(tiles); continue; } if (tiles.size < (tilesMin?.size ?? Infinity)) tilesMin = tiles; } if (!tilesMin) return; const [xNext, yNext] = tilesPositionMap.get(tilesMin); await collapse(xNext, yNext); }; (async () => { await collapse(0, 0); while (tilesPositionMap.size) { const [[x, z]] = tilesPositionMap.values(); await collapse(x, z); } })(); //# sourceMappingURL=testWFC.js.map