Add entity instance equality check and helper functions
This commit is contained in:
@@ -88,6 +88,10 @@ function cloneVec3(vector: Vec3): Vec3 {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function areVec3Equal(left: Vec3, right: Vec3): boolean {
|
||||||
|
return left.x === right.x && left.y === right.y && left.z === right.z;
|
||||||
|
}
|
||||||
|
|
||||||
function assertFiniteVec3(vector: Vec3, label: string) {
|
function assertFiniteVec3(vector: Vec3, label: string) {
|
||||||
if (!Number.isFinite(vector.x) || !Number.isFinite(vector.y) || !Number.isFinite(vector.z)) {
|
if (!Number.isFinite(vector.x) || !Number.isFinite(vector.y) || !Number.isFinite(vector.z)) {
|
||||||
throw new Error(`${label} must be finite on every axis.`);
|
throw new Error(`${label} must be finite on every axis.`);
|
||||||
@@ -326,6 +330,34 @@ export function cloneEntityRegistry(entities: Record<string, EntityInstance>): R
|
|||||||
return Object.fromEntries(Object.entries(entities).map(([entityId, entity]) => [entityId, cloneEntityInstance(entity)]));
|
return Object.fromEntries(Object.entries(entities).map(([entityId, entity]) => [entityId, cloneEntityInstance(entity)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function areEntityInstancesEqual(left: EntityInstance, right: EntityInstance): boolean {
|
||||||
|
if (left.kind !== right.kind || left.id !== right.id || !areVec3Equal(left.position, right.position)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (left.kind) {
|
||||||
|
case "playerStart":
|
||||||
|
return left.yawDegrees === right.yawDegrees;
|
||||||
|
case "soundEmitter":
|
||||||
|
return (
|
||||||
|
left.radius === right.radius &&
|
||||||
|
left.gain === right.gain &&
|
||||||
|
left.autoplay === right.autoplay &&
|
||||||
|
left.loop === right.loop
|
||||||
|
);
|
||||||
|
case "triggerVolume":
|
||||||
|
return (
|
||||||
|
areVec3Equal(left.size, right.size) &&
|
||||||
|
left.triggerOnEnter === right.triggerOnEnter &&
|
||||||
|
left.triggerOnExit === right.triggerOnExit
|
||||||
|
);
|
||||||
|
case "teleportTarget":
|
||||||
|
return left.yawDegrees === right.yawDegrees;
|
||||||
|
case "interactable":
|
||||||
|
return left.radius === right.radius && left.prompt === right.prompt && left.enabled === right.enabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function compareEntityInstances(left: EntityInstance, right: EntityInstance): number {
|
export function compareEntityInstances(left: EntityInstance, right: EntityInstance): number {
|
||||||
const leftOrder = ENTITY_KIND_ORDER.indexOf(left.kind);
|
const leftOrder = ENTITY_KIND_ORDER.indexOf(left.kind);
|
||||||
const rightOrder = ENTITY_KIND_ORDER.indexOf(right.kind);
|
const rightOrder = ENTITY_KIND_ORDER.indexOf(right.kind);
|
||||||
|
|||||||
Reference in New Issue
Block a user