Add rotation support for brush meshes and colliders

This commit is contained in:
2026-04-04 19:27:06 +02:00
parent b79ec90293
commit 991e414ae4
2 changed files with 23 additions and 6 deletions

View File

@@ -474,6 +474,11 @@ export class RuntimeHost {
const mesh = new Mesh(geometry, materials);
mesh.position.set(brush.center.x, brush.center.y, brush.center.z);
mesh.rotation.set(
(brush.rotationDegrees.x * Math.PI) / 180,
(brush.rotationDegrees.y * Math.PI) / 180,
(brush.rotationDegrees.z * Math.PI) / 180
);
this.brushGroup.add(mesh);
this.brushMeshes.set(brush.id, mesh);
}

View File

@@ -25,6 +25,7 @@ export interface RuntimeBoxBrushInstance {
id: string;
kind: "box";
center: Vec3;
rotationDegrees: Vec3;
size: Vec3;
faces: Record<BoxFaceId, RuntimeBrushFace>;
}
@@ -33,8 +34,13 @@ export interface RuntimeBoxCollider {
kind: "box";
source: "brush";
brushId: string;
min: Vec3;
max: Vec3;
center: Vec3;
rotationDegrees: Vec3;
size: Vec3;
worldBounds: {
min: Vec3;
max: Vec3;
};
}
export type RuntimeSceneCollider = RuntimeBoxCollider | GeneratedModelCollider;
@@ -181,6 +187,7 @@ function buildRuntimeBrush(brush: BoxBrush, document: SceneDocument): RuntimeBox
id: brush.id,
kind: "box",
center: cloneVec3(brush.center),
rotationDegrees: cloneVec3(brush.rotationDegrees),
size: cloneVec3(brush.size),
faces: {
posX: {
@@ -224,8 +231,13 @@ function buildRuntimeCollider(brush: BoxBrush): RuntimeBoxCollider {
kind: "box",
source: "brush",
brushId: brush.id,
min: cloneVec3(bounds.min),
max: cloneVec3(bounds.max)
center: cloneVec3(brush.center),
rotationDegrees: cloneVec3(brush.rotationDegrees),
size: cloneVec3(brush.size),
worldBounds: {
min: cloneVec3(bounds.min),
max: cloneVec3(bounds.max)
}
};
}
@@ -245,8 +257,8 @@ function buildRuntimeModelInstance(modelInstance: SceneDocument["modelInstances"
function getColliderBounds(collider: RuntimeSceneCollider): GeneratedColliderBounds {
if (collider.source === "brush") {
return {
min: cloneVec3(collider.min),
max: cloneVec3(collider.max)
min: cloneVec3(collider.worldBounds.min),
max: cloneVec3(collider.worldBounds.max)
};
}