@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
56 lines (55 loc) • 2.4 kB
JavaScript
;
import { WFCQuadAttribute } from "./WFCAttributes";
import { Vector4 } from "three";
import { QuadGraph } from "../geometry/modules/quad/graph/QuadGraph";
import { QuadPrimitive } from "../geometry/modules/quad/QuadPrimitive";
import { quadId } from "./WFCUtils";
const _v4 = new Vector4();
const DEFAULT_TILE_ID = "";
export class WFCFloorGraph {
//
constructor(quadObject, floorIndex) {
this.quadObject = quadObject;
this.floorIndex = floorIndex;
this._quadGraph = new QuadGraph();
this._quadNodeByQuadId = /* @__PURE__ */ new Map();
this._allowedTileConfigsByQuadId = /* @__PURE__ */ new Map();
}
setupQuadNode(index, allTileConfigs) {
const indices = this.quadObject.geometry.index;
_v4.fromArray(indices, index * 4);
const quadNode = this._quadGraph.addQuad(index, _v4.toArray());
const { quadTileConfigs } = this.resetQuadNode(quadNode, allTileConfigs);
return { quadNode, quadTileConfigs };
}
resetQuadNode(quadNode, allTileConfigs) {
const index = quadNode.id;
const _quadId = quadId(this.quadObject, index);
if (_quadId == null) {
throw new Error(`attribute ${WFCQuadAttribute.QUAD_ID} not found`);
}
const tileId = QuadPrimitive.hasAttribute(this.quadObject, WFCQuadAttribute.TILE_ID) ? QuadPrimitive.attribValue(this.quadObject, index, WFCQuadAttribute.TILE_ID) || DEFAULT_TILE_ID : DEFAULT_TILE_ID;
const tileIds = tileId.trim().length > 0 ? tileId.split(" ") : [];
const tileIdsSet = new Set(tileIds);
const quadTileConfigs = tileIds.length > 0 ? allTileConfigs.filter((c) => tileIdsSet.has(c.tileId)) : [...allTileConfigs];
this._allowedTileConfigsByQuadId.set(index, quadTileConfigs);
this._quadNodeByQuadId.set(_quadId, quadNode);
return { quadTileConfigs };
}
quadNodeFromId(quadId2) {
return this._quadNodeByQuadId.get(quadId2);
}
quadNodeFromOtherQuadNode(otherGraphQuadNode) {
const _quadId = quadId(this.quadObject, otherGraphQuadNode.id);
return this._quadNodeByQuadId.get(_quadId);
}
allowedTileConfigsForQuadNode(quadNode) {
return this._allowedTileConfigsByQuadId.get(quadNode.id);
}
setAllowedTileConfigsForQuadNode(quadNode, tileConfigs) {
this._allowedTileConfigsByQuadId.set(quadNode.id, tileConfigs);
}
neighbourData(quadId2, sideIndex, target) {
this._quadGraph.neighbourData(quadId2, sideIndex, target);
}
}