diff --git a/src/document/scene-document-validation.js b/src/document/scene-document-validation.js index d485393e..56c8e052 100644 --- a/src/document/scene-document-validation.js +++ b/src/document/scene-document-validation.js @@ -2,7 +2,7 @@ import {} from "../assets/project-assets"; import { isModelInstanceCollisionMode } from "../assets/model-instances"; import { isPlayerStartColliderMode, getPlayerStartColliderHeight } from "../entities/entity-instances"; import {} from "../interactions/interaction-links"; -import { BOX_FACE_IDS, hasPositiveBoxSize } from "./brushes"; +import { BOX_FACE_IDS, BOX_VERTEX_IDS, hasPositiveBoxSize } from "./brushes"; import { isAdvancedRenderingShadowMapSize, isAdvancedRenderingShadowType, isAdvancedRenderingToneMappingMode, isHexColorString } from "./world-settings"; export function createDiagnostic(severity, code, message, path, scope = "document") { return { @@ -557,6 +557,11 @@ export function validateSceneDocument(document) { if (!isFiniteVec3(brush.size) || !hasPositiveBoxSize(brush.size)) { diagnostics.push(createDiagnostic("error", "invalid-box-size", "Box brush sizes must remain finite and positive on every axis.", `${path}.size`)); } + for (const vertexId of BOX_VERTEX_IDS) { + if (!isFiniteVec3(brush.geometry.vertices[vertexId])) { + diagnostics.push(createDiagnostic("error", "invalid-box-geometry-vertex", "Box brush geometry vertices must remain finite on every axis.", `${path}.geometry.vertices.${vertexId}`)); + } + } for (const faceId of BOX_FACE_IDS) { const materialId = brush.faces[faceId].materialId; if (materialId !== null && document.materials[materialId] === undefined) { diff --git a/src/runtime-three/rapier-collision-world.js b/src/runtime-three/rapier-collision-world.js index 8df42b7c..1cef7014 100644 --- a/src/runtime-three/rapier-collision-world.js +++ b/src/runtime-three/rapier-collision-world.js @@ -56,12 +56,7 @@ function attachBrushCollider(world, collider) { const body = world.createRigidBody(RAPIER.RigidBodyDesc.fixed() .setTranslation(collider.center.x, collider.center.y, collider.center.z) .setRotation(createRapierQuaternion(collider.rotationDegrees))); - const halfExtents = { - x: collider.size.x * 0.5, - y: collider.size.y * 0.5, - z: collider.size.z * 0.5 - }; - world.createCollider(RAPIER.ColliderDesc.cuboid(halfExtents.x, halfExtents.y, halfExtents.z), body); + world.createCollider(RAPIER.ColliderDesc.trimesh(collider.vertices, collider.indices), body); } function attachSimpleModelCollider(world, collider) { const body = createFixedBodyForModelCollider(world, collider);