Add support for multi-transform commands for brushes and model instances

This commit is contained in:
2026-04-15 14:45:51 +02:00
parent 2c4804a366
commit bc538e7918

View File

@@ -199,6 +199,33 @@ export function createCommitTransformSessionCommand(document: SceneDocument, ses
label: createTransformCommandLabel(session)
});
}
case "brushes":
if (session.preview.kind !== "brushes") {
throw new Error("Whitebox multi-transform preview is invalid.");
}
return createApplyBatchSelectionTransformCommand({
selection: {
kind: "brushes",
ids: session.target.items.map((item) => item.brushId)
},
brushes: session.preview.items.map((item) => {
const brush = document.brushes[item.brushId];
if (brush === undefined) {
throw new Error(`Whitebox solid ${item.brushId} does not exist.`);
}
return {
...brush,
center: item.center,
rotationDegrees: item.rotationDegrees,
size: item.size,
geometry: item.geometry
};
}),
label: createTransformCommandLabel(session)
});
case "brushFace":
if (session.preview.kind !== "brush") {
throw new Error("Whitebox face transform preview is invalid.");
@@ -282,6 +309,34 @@ export function createCommitTransformSessionCommand(document: SceneDocument, ses
label: createTransformCommandLabel(session)
});
}
case "modelInstances":
if (session.preview.kind !== "modelInstances") {
throw new Error("Model instance multi-transform preview is invalid.");
}
return createApplyBatchSelectionTransformCommand({
selection: {
kind: "modelInstances",
ids: session.target.items.map((item) => item.modelInstanceId)
},
modelInstances: session.preview.items.map((item) => {
const modelInstance = document.modelInstances[item.modelInstanceId];
if (modelInstance === undefined) {
throw new Error(
`Model instance ${item.modelInstanceId} does not exist.`
);
}
return createModelInstance({
...modelInstance,
position: item.position,
rotationDegrees: item.rotationDegrees,
scale: item.scale
});
}),
label: createTransformCommandLabel(session)
});
case "entity": {
if (session.preview.kind !== "entity") {
throw new Error("Entity transform preview is invalid.");
@@ -293,91 +348,31 @@ export function createCommitTransformSessionCommand(document: SceneDocument, ses
throw new Error(`Entity ${session.target.entityId} does not exist.`);
}
switch (entity.kind) {
case "pointLight":
return createUpsertEntityCommand({
entity: createPointLightEntity({
...entity,
position: session.preview.position
}),
label: createTransformCommandLabel(session)
});
case "spotLight":
return createUpsertEntityCommand({
entity: createSpotLightEntity({
...entity,
position: session.preview.position,
direction: session.preview.rotation.kind === "direction" ? session.preview.rotation.direction : entity.direction
}),
label: createTransformCommandLabel(session)
});
case "playerStart":
return createUpsertEntityCommand({
entity: createPlayerStartEntity({
...entity,
position: session.preview.position,
yawDegrees: session.preview.rotation.kind === "yaw" ? session.preview.rotation.yawDegrees : entity.yawDegrees
}),
label: createTransformCommandLabel(session)
});
case "sceneEntry":
return createUpsertEntityCommand({
entity: createSceneEntryEntity({
...entity,
position: session.preview.position,
yawDegrees:
session.preview.rotation.kind === "yaw"
? session.preview.rotation.yawDegrees
: entity.yawDegrees
}),
label: createTransformCommandLabel(session)
});
case "npc":
return createUpsertEntityCommand({
entity: createNpcEntity({
...entity,
position: session.preview.position,
yawDegrees:
session.preview.rotation.kind === "yaw"
? session.preview.rotation.yawDegrees
: entity.yawDegrees
}),
label: createTransformCommandLabel(session)
});
case "soundEmitter":
return createUpsertEntityCommand({
entity: createSoundEmitterEntity({
...entity,
position: session.preview.position
}),
label: createTransformCommandLabel(session)
});
case "triggerVolume":
return createUpsertEntityCommand({
entity: createTriggerVolumeEntity({
...entity,
position: session.preview.position
}),
label: createTransformCommandLabel(session)
});
case "teleportTarget":
return createUpsertEntityCommand({
entity: createTeleportTargetEntity({
...entity,
position: session.preview.position,
yawDegrees: session.preview.rotation.kind === "yaw" ? session.preview.rotation.yawDegrees : entity.yawDegrees
}),
label: createTransformCommandLabel(session)
});
case "interactable":
return createUpsertEntityCommand({
entity: createInteractableEntity({
...entity,
position: session.preview.position
}),
label: createTransformCommandLabel(session)
});
}
return createUpsertEntityCommand({
entity: createUpdatedEntityFromPreview(entity, session.preview),
label: createTransformCommandLabel(session)
});
}
case "entities":
if (session.preview.kind !== "entities") {
throw new Error("Entity multi-transform preview is invalid.");
}
return createApplyBatchSelectionTransformCommand({
selection: {
kind: "entities",
ids: session.target.items.map((item) => item.entityId)
},
entities: session.preview.items.map((item) => {
const entity = document.entities[item.entityId];
if (entity === undefined) {
throw new Error(`Entity ${item.entityId} does not exist.`);
}
return createUpdatedEntityFromPreview(entity, item);
}),
label: createTransformCommandLabel(session)
});
}
}