87 lines
2.3 KiB
TypeScript
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 };
|