Enhance pointer lock handling and material resolution in runtime scene build
This commit is contained in:
@@ -219,9 +219,12 @@ export class FirstPersonNavigationController implements NavigationController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const pointerLockResult = this.context.domElement.requestPointerLock();
|
const pointerLockCapableElement = this.context.domElement as HTMLCanvasElement & {
|
||||||
|
requestPointerLock(): void | Promise<void>;
|
||||||
|
};
|
||||||
|
const pointerLockResult = pointerLockCapableElement.requestPointerLock();
|
||||||
|
|
||||||
if (pointerLockResult !== undefined && "catch" in pointerLockResult) {
|
if (pointerLockResult instanceof Promise) {
|
||||||
pointerLockResult.catch(() => {
|
pointerLockResult.catch(() => {
|
||||||
this.context?.setRuntimeMessage(
|
this.context?.setRuntimeMessage(
|
||||||
"Pointer lock request was denied. Click again or use Orbit Visitor for non-locked navigation."
|
"Pointer lock request was denied. Click again or use Orbit Visitor for non-locked navigation."
|
||||||
|
|||||||
@@ -66,6 +66,20 @@ function cloneVec3(vector: Vec3): Vec3 {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolveRuntimeMaterial(document: SceneDocument, materialId: string | null): MaterialDef | null {
|
||||||
|
if (materialId === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const material = document.materials[materialId];
|
||||||
|
|
||||||
|
if (material === undefined) {
|
||||||
|
throw new Error(`Runtime build could not resolve material ${materialId}.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cloneMaterialDef(material);
|
||||||
|
}
|
||||||
|
|
||||||
function buildRuntimeBrush(brush: BoxBrush, document: SceneDocument): RuntimeBoxBrushInstance {
|
function buildRuntimeBrush(brush: BoxBrush, document: SceneDocument): RuntimeBoxBrushInstance {
|
||||||
return {
|
return {
|
||||||
id: brush.id,
|
id: brush.id,
|
||||||
@@ -75,32 +89,32 @@ function buildRuntimeBrush(brush: BoxBrush, document: SceneDocument): RuntimeBox
|
|||||||
faces: {
|
faces: {
|
||||||
posX: {
|
posX: {
|
||||||
materialId: brush.faces.posX.materialId,
|
materialId: brush.faces.posX.materialId,
|
||||||
material: brush.faces.posX.materialId === null ? null : cloneMaterialDef(document.materials[brush.faces.posX.materialId]),
|
material: resolveRuntimeMaterial(document, brush.faces.posX.materialId),
|
||||||
uv: cloneFaceUvState(brush.faces.posX.uv)
|
uv: cloneFaceUvState(brush.faces.posX.uv)
|
||||||
},
|
},
|
||||||
negX: {
|
negX: {
|
||||||
materialId: brush.faces.negX.materialId,
|
materialId: brush.faces.negX.materialId,
|
||||||
material: brush.faces.negX.materialId === null ? null : cloneMaterialDef(document.materials[brush.faces.negX.materialId]),
|
material: resolveRuntimeMaterial(document, brush.faces.negX.materialId),
|
||||||
uv: cloneFaceUvState(brush.faces.negX.uv)
|
uv: cloneFaceUvState(brush.faces.negX.uv)
|
||||||
},
|
},
|
||||||
posY: {
|
posY: {
|
||||||
materialId: brush.faces.posY.materialId,
|
materialId: brush.faces.posY.materialId,
|
||||||
material: brush.faces.posY.materialId === null ? null : cloneMaterialDef(document.materials[brush.faces.posY.materialId]),
|
material: resolveRuntimeMaterial(document, brush.faces.posY.materialId),
|
||||||
uv: cloneFaceUvState(brush.faces.posY.uv)
|
uv: cloneFaceUvState(brush.faces.posY.uv)
|
||||||
},
|
},
|
||||||
negY: {
|
negY: {
|
||||||
materialId: brush.faces.negY.materialId,
|
materialId: brush.faces.negY.materialId,
|
||||||
material: brush.faces.negY.materialId === null ? null : cloneMaterialDef(document.materials[brush.faces.negY.materialId]),
|
material: resolveRuntimeMaterial(document, brush.faces.negY.materialId),
|
||||||
uv: cloneFaceUvState(brush.faces.negY.uv)
|
uv: cloneFaceUvState(brush.faces.negY.uv)
|
||||||
},
|
},
|
||||||
posZ: {
|
posZ: {
|
||||||
materialId: brush.faces.posZ.materialId,
|
materialId: brush.faces.posZ.materialId,
|
||||||
material: brush.faces.posZ.materialId === null ? null : cloneMaterialDef(document.materials[brush.faces.posZ.materialId]),
|
material: resolveRuntimeMaterial(document, brush.faces.posZ.materialId),
|
||||||
uv: cloneFaceUvState(brush.faces.posZ.uv)
|
uv: cloneFaceUvState(brush.faces.posZ.uv)
|
||||||
},
|
},
|
||||||
negZ: {
|
negZ: {
|
||||||
materialId: brush.faces.negZ.materialId,
|
materialId: brush.faces.negZ.materialId,
|
||||||
material: brush.faces.negZ.materialId === null ? null : cloneMaterialDef(document.materials[brush.faces.negZ.materialId]),
|
material: resolveRuntimeMaterial(document, brush.faces.negZ.materialId),
|
||||||
uv: cloneFaceUvState(brush.faces.negZ.uv)
|
uv: cloneFaceUvState(brush.faces.negZ.uv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user