@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
158 lines (151 loc) • 6.18 kB
text/typescript
import {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';
import {
setObjectBoolean,
getObjectBoolean,
getObjectString,
setObjectString,
setObjectNumber,
getObjectNumber,
} from '../geometry/AttributeUtils';
import {WFCTileSide, WFC_ALL_HORIZONTAL_SIDES} from './WFCCommon';
import {TypeAssert} from '../../engine/poly/Assert';
export enum WFCQuadAttribute {
QUAD_ID = 'quadId',
FLOOR_INDEX = 'floorIndex',
TILE_ID = 'tileId',
SOLVE_ALLOWED = 'solveAllowed',
// solver output
SOLVED_TILE_CONFIGS = 'solvedTileConfigs',
}
export enum WFCTileAttribute {
// IS_TILE = 'WFCTileAttribute_isTile',
TILE_ID = 'WFCTileAttribute_tileId',
ROTATION_Y_ALLOWED = 'WFCTileAttribute_rotationYAllowed',
WEIGHT = 'WFCTileAttribute_weight',
IS_ERROR_TILE = 'WFCTileAttribute_isErrorTile',
IS_UNRESOLVED_TILE = 'WFCTileAttribute_isUnresolvedTile',
// sidename
SIDE_NAME_S = 'WFCTileAttribute_sideNameS',
SIDE_NAME_N = 'WFCTileAttribute_sideNameN',
SIDE_NAME_W = 'WFCTileAttribute_sideNameW',
SIDE_NAME_E = 'WFCTileAttribute_sideNameE',
SIDE_NAME_H = 'WFCTileAttribute_sideNameAllHorizontalSides',
SIDE_NAME_B = 'WFCTileAttribute_sideNameB',
SIDE_NAME_T = 'WFCTileAttribute_sideNameT',
// solver output
// ENTROPY = 'WFCTileAttribute_entropy',
// STEP = 'WFCTileAttribute_step',
}
export enum WFCConnectionAttribute {
// IS_CONNECTION = 'WFCTileAttribute_isConnection',
ID0 = 'WFCTileAttribute_tileId0',
ID1 = 'WFCTileAttribute_tileId1',
SIDE0 = 'WFCTileAttribute_tileSide0',
SIDE1 = 'WFCTileAttribute_tileSide1',
}
type WFCTileSideAttribute =
| WFCTileAttribute.SIDE_NAME_S
| WFCTileAttribute.SIDE_NAME_N
| WFCTileAttribute.SIDE_NAME_W
| WFCTileAttribute.SIDE_NAME_E
| WFCTileAttribute.SIDE_NAME_H
| WFCTileAttribute.SIDE_NAME_B
| WFCTileAttribute.SIDE_NAME_T;
function _sideNameAttribute(side: WFCTileSide): WFCTileSideAttribute {
switch (side) {
case 'n':
return WFCTileAttribute.SIDE_NAME_N;
case 's':
return WFCTileAttribute.SIDE_NAME_S;
case 'w':
return WFCTileAttribute.SIDE_NAME_W;
case 'e':
return WFCTileAttribute.SIDE_NAME_E;
case WFC_ALL_HORIZONTAL_SIDES:
return WFCTileAttribute.SIDE_NAME_H;
case 'b':
return WFCTileAttribute.SIDE_NAME_B;
case 't':
return WFCTileAttribute.SIDE_NAME_T;
}
TypeAssert.unreachable(side);
}
export class CoreWFCTileAttribute {
// static setIsTile(object: ObjectContent<CoreObjectType>, value: boolean) {
// setObjectBoolean(object, WFCTileAttribute.IS_TILE, value);
// }
static getIsTile(object: ObjectContent<CoreObjectType>) {
return this.getTileId(object) != null; //getObjectBoolean(object, WFCTileAttribute.IS_TILE, false);
}
static setTileId(object: ObjectContent<CoreObjectType>, value: string) {
setObjectString(object, WFCTileAttribute.TILE_ID, value);
}
static getTileId(object: ObjectContent<CoreObjectType>): string {
return getObjectString(object, WFCTileAttribute.TILE_ID) as string;
}
static setRotationYAllowed(object: ObjectContent<CoreObjectType>, value: boolean) {
setObjectBoolean(object, WFCTileAttribute.ROTATION_Y_ALLOWED, value);
}
static getRotationYAllowed(object: ObjectContent<CoreObjectType>) {
return getObjectBoolean(object, WFCTileAttribute.ROTATION_Y_ALLOWED, false);
}
static setWeight(object: ObjectContent<CoreObjectType>, value: number) {
setObjectNumber(object, WFCTileAttribute.WEIGHT, value);
}
static getWeight(object: ObjectContent<CoreObjectType>) {
return getObjectNumber(object, WFCTileAttribute.WEIGHT, 1);
}
static setIsErrorTile(object: ObjectContent<CoreObjectType>, value: boolean) {
setObjectBoolean(object, WFCTileAttribute.IS_ERROR_TILE, value);
}
static getIsErrorTile(object: ObjectContent<CoreObjectType>): boolean {
return getObjectBoolean(object, WFCTileAttribute.IS_ERROR_TILE, false) as boolean;
}
static setIsUnresolvedTile(object: ObjectContent<CoreObjectType>, value: boolean) {
setObjectBoolean(object, WFCTileAttribute.IS_UNRESOLVED_TILE, value);
}
static getIsUnresolvedTile(object: ObjectContent<CoreObjectType>): boolean {
return getObjectBoolean(object, WFCTileAttribute.IS_UNRESOLVED_TILE, false) as boolean;
}
// static setEntropy(object: ObjectContent<CoreObjectType>, value: number) {
// setObjectNumber(object, WFCTileAttribute.ENTROPY, value);
// }
static getSideName(object: ObjectContent<CoreObjectType>, side: WFCTileSide): string | undefined {
return getObjectString(object, _sideNameAttribute(side));
}
static setSideName(object: ObjectContent<CoreObjectType>, side: WFCTileSide, value: string) {
setObjectString(object, _sideNameAttribute(side), value);
}
}
export class CoreWFCRuleAttribute {
// static setIsConnection(object: ObjectContent<CoreObjectType>, value: boolean) {
// setObjectBoolean(object, WFCConnectionAttribute.IS_CONNECTION, value);
// }
static getIsConnection(object: ObjectContent<CoreObjectType>) {
return this.getId0(object) && this.getId1(object) && this.getSide0(object) && this.getSide1(object); //getObjectBoolean(object, WFCConnectionAttribute.IS_CONNECTION, false);
}
static setId0(object: ObjectContent<CoreObjectType>, value: string) {
setObjectString(object, WFCConnectionAttribute.ID0, value);
}
static getId0(object: ObjectContent<CoreObjectType>): string {
return getObjectString(object, WFCConnectionAttribute.ID0) as string;
}
static setId1(object: ObjectContent<CoreObjectType>, value: string) {
setObjectString(object, WFCConnectionAttribute.ID1, value);
}
static getId1(object: ObjectContent<CoreObjectType>): string {
return getObjectString(object, WFCConnectionAttribute.ID1) as string;
}
static setSide0(object: ObjectContent<CoreObjectType>, value: string) {
setObjectString(object, WFCConnectionAttribute.SIDE0, value);
}
static getSide0(object: ObjectContent<CoreObjectType>): string {
return getObjectString(object, WFCConnectionAttribute.SIDE0) as string;
}
static setSide1(object: ObjectContent<CoreObjectType>, value: string) {
setObjectString(object, WFCConnectionAttribute.SIDE1, value);
}
static getSide1(object: ObjectContent<CoreObjectType>): string {
return getObjectString(object, WFCConnectionAttribute.SIDE1) as string;
}
}