Files
playcanvas--supersplat/src/pivot.ts
T
wehub-resource-sync 2e0fafcb4e
CI / Build (22.x) (push) Failing after 1s
CI / Lint (22.x) (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:24:51 +08:00

87 lines
2.3 KiB
TypeScript

import { Vec3, Quat } from 'playcanvas';
import { Events } from './events';
import { Transform } from './transform';
// stores the transform pivot location in world space
// the transform tools (translate, rotate, scale) and transform panel modify this pivot
// then the active transform handler applies the changes to the current selection.
class Pivot {
transform = new Transform();
place: (transform: Transform) => void;
start: () => void;
move: (transform: Transform) => void;
moveTRS: (position: Vec3, rotation: Quat, scale: Vec3) => void;
end: () => void;
constructor(events: Events) {
this.place = (transform: Transform) => {
if (!this.transform.equals(transform)) {
this.transform.copy(transform);
events.fire('pivot.placed', this);
}
};
this.start = () => {
events.fire('pivot.started', this);
};
this.move = (transform: Transform) => {
if (!this.transform.equals(transform)) {
this.transform.copy(transform);
events.fire('pivot.moved', this);
}
};
this.moveTRS = (position: Vec3, rotation: Quat, scale: Vec3) => {
if (!this.transform.equalsTRS(position, rotation, scale)) {
this.transform.set(position, rotation, scale);
events.fire('pivot.moved', this);
}
};
this.end = () => {
events.fire('pivot.ended', this);
};
}
}
type PivotOrigin = 'center' | 'boundCenter';
const registerPivotEvents = (events: Events) => {
const pivot = new Pivot(events);
events.function('pivot', () => {
return pivot;
});
// pivot mode
let origin: PivotOrigin = 'center';
const setOrigin = (o: PivotOrigin) => {
if (o !== origin) {
origin = o;
events.fire('pivot.origin', origin);
}
};
events.function('pivot.origin', () => {
return origin;
});
events.on('pivot.setOrigin', (o: PivotOrigin) => {
setOrigin(o === 'center' ? 'center' : 'boundCenter');
});
events.on('pivot.toggleOrigin', () => {
setOrigin(origin === 'center' ? 'boundCenter' : 'center');
});
};
export { registerPivotEvents, Pivot };