150 lines
5.4 KiB
TypeScript
150 lines
5.4 KiB
TypeScript
|
|
import { createMoveBoxBrushCommand } from "./move-box-brush-command";
|
||
|
|
import { createUpsertEntityCommand } from "./upsert-entity-command";
|
||
|
|
import { createUpsertModelInstanceCommand } from "./upsert-model-instance-command";
|
||
|
|
import type { EditorCommand } from "./command";
|
||
|
|
import type { SceneDocument } from "../document/scene-document";
|
||
|
|
import { createModelInstance } from "../assets/model-instances";
|
||
|
|
import {
|
||
|
|
createInteractableEntity,
|
||
|
|
createPlayerStartEntity,
|
||
|
|
createPointLightEntity,
|
||
|
|
createSoundEmitterEntity,
|
||
|
|
createSpotLightEntity,
|
||
|
|
createTeleportTargetEntity,
|
||
|
|
createTriggerVolumeEntity
|
||
|
|
} from "../entities/entity-instances";
|
||
|
|
import {
|
||
|
|
getTransformOperationLabel,
|
||
|
|
type ActiveTransformSession
|
||
|
|
} from "../core/transform-session";
|
||
|
|
|
||
|
|
function createTransformCommandLabel(session: ActiveTransformSession): string {
|
||
|
|
return `${getTransformOperationLabel(session.operation)} ${
|
||
|
|
session.target.kind === "brush"
|
||
|
|
? "box brush"
|
||
|
|
: session.target.kind === "entity"
|
||
|
|
? session.target.entityKind === "playerStart"
|
||
|
|
? "player start"
|
||
|
|
: session.target.entityKind === "pointLight"
|
||
|
|
? "point light"
|
||
|
|
: session.target.entityKind === "spotLight"
|
||
|
|
? "spot light"
|
||
|
|
: session.target.entityKind === "soundEmitter"
|
||
|
|
? "sound emitter"
|
||
|
|
: session.target.entityKind === "triggerVolume"
|
||
|
|
? "trigger volume"
|
||
|
|
: session.target.entityKind === "teleportTarget"
|
||
|
|
? "teleport target"
|
||
|
|
: "interactable"
|
||
|
|
: "model instance"
|
||
|
|
}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function createCommitTransformSessionCommand(document: SceneDocument, session: ActiveTransformSession): EditorCommand {
|
||
|
|
switch (session.target.kind) {
|
||
|
|
case "brush":
|
||
|
|
if (session.preview.kind !== "brush" || session.operation !== "translate") {
|
||
|
|
throw new Error("Brush transforms currently support translation only.");
|
||
|
|
}
|
||
|
|
|
||
|
|
return createMoveBoxBrushCommand({
|
||
|
|
brushId: session.target.brushId,
|
||
|
|
center: session.preview.center
|
||
|
|
});
|
||
|
|
case "modelInstance": {
|
||
|
|
if (session.preview.kind !== "modelInstance") {
|
||
|
|
throw new Error("Model instance transform preview is invalid.");
|
||
|
|
}
|
||
|
|
|
||
|
|
const modelInstance = document.modelInstances[session.target.modelInstanceId];
|
||
|
|
|
||
|
|
if (modelInstance === undefined) {
|
||
|
|
throw new Error(`Model instance ${session.target.modelInstanceId} does not exist.`);
|
||
|
|
}
|
||
|
|
|
||
|
|
return createUpsertModelInstanceCommand({
|
||
|
|
modelInstance: createModelInstance({
|
||
|
|
...modelInstance,
|
||
|
|
position: session.preview.position,
|
||
|
|
rotationDegrees: session.preview.rotationDegrees,
|
||
|
|
scale: session.preview.scale
|
||
|
|
}),
|
||
|
|
label: createTransformCommandLabel(session)
|
||
|
|
});
|
||
|
|
}
|
||
|
|
case "entity": {
|
||
|
|
if (session.preview.kind !== "entity") {
|
||
|
|
throw new Error("Entity transform preview is invalid.");
|
||
|
|
}
|
||
|
|
|
||
|
|
const entity = document.entities[session.target.entityId];
|
||
|
|
|
||
|
|
if (entity === undefined) {
|
||
|
|
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 "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)
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|