Add support for multi-transform commands for brushes and model instances
This commit is contained in:
@@ -199,6 +199,33 @@ export function createCommitTransformSessionCommand(document: SceneDocument, ses
|
|||||||
label: createTransformCommandLabel(session)
|
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":
|
case "brushFace":
|
||||||
if (session.preview.kind !== "brush") {
|
if (session.preview.kind !== "brush") {
|
||||||
throw new Error("Whitebox face transform preview is invalid.");
|
throw new Error("Whitebox face transform preview is invalid.");
|
||||||
@@ -282,6 +309,34 @@ export function createCommitTransformSessionCommand(document: SceneDocument, ses
|
|||||||
label: createTransformCommandLabel(session)
|
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": {
|
case "entity": {
|
||||||
if (session.preview.kind !== "entity") {
|
if (session.preview.kind !== "entity") {
|
||||||
throw new Error("Entity transform preview is invalid.");
|
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.`);
|
throw new Error(`Entity ${session.target.entityId} does not exist.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (entity.kind) {
|
return createUpsertEntityCommand({
|
||||||
case "pointLight":
|
entity: createUpdatedEntityFromPreview(entity, session.preview),
|
||||||
return createUpsertEntityCommand({
|
label: createTransformCommandLabel(session)
|
||||||
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)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user