Spaces:
Running
Running
| import { Vector3 } from "../math/Vector3"; | |
| import { Quaternion } from "../math/Quaternion"; | |
| import { EventDispatcher } from "../events/EventDispatcher"; | |
| import { Matrix4 } from "../math/Matrix4"; | |
| import { ObjectChangedEvent } from "../events/Events"; | |
| abstract class Object3D extends EventDispatcher { | |
| public positionChanged: boolean = false; | |
| public rotationChanged: boolean = false; | |
| public scaleChanged: boolean = false; | |
| protected _position: Vector3 = new Vector3(); | |
| protected _rotation: Quaternion = new Quaternion(); | |
| protected _scale: Vector3 = new Vector3(1, 1, 1); | |
| protected _transform: Matrix4 = new Matrix4(); | |
| protected _changeEvent = new ObjectChangedEvent(this); | |
| update: () => void; | |
| applyPosition: () => void; | |
| applyRotation: () => void; | |
| applyScale: () => void; | |
| raiseChangeEvent: () => void; | |
| constructor() { | |
| super(); | |
| this.update = () => {}; | |
| this.applyPosition = () => { | |
| this.position = new Vector3(); | |
| }; | |
| this.applyRotation = () => { | |
| this.rotation = new Quaternion(); | |
| }; | |
| this.applyScale = () => { | |
| this.scale = new Vector3(1, 1, 1); | |
| }; | |
| this.raiseChangeEvent = () => { | |
| this.dispatchEvent(this._changeEvent); | |
| }; | |
| } | |
| protected _updateMatrix() { | |
| this._transform = Matrix4.Compose(this._position, this._rotation, this._scale); | |
| } | |
| get position() { | |
| return this._position; | |
| } | |
| set position(position: Vector3) { | |
| if (!this._position.equals(position)) { | |
| this._position = position; | |
| this.positionChanged = true; | |
| this._updateMatrix(); | |
| this.dispatchEvent(this._changeEvent); | |
| } | |
| } | |
| get rotation() { | |
| return this._rotation; | |
| } | |
| set rotation(rotation: Quaternion) { | |
| if (!this._rotation.equals(rotation)) { | |
| this._rotation = rotation; | |
| this.rotationChanged = true; | |
| this._updateMatrix(); | |
| this.dispatchEvent(this._changeEvent); | |
| } | |
| } | |
| get scale() { | |
| return this._scale; | |
| } | |
| set scale(scale: Vector3) { | |
| if (!this._scale.equals(scale)) { | |
| this._scale = scale; | |
| this.scaleChanged = true; | |
| this._updateMatrix(); | |
| this.dispatchEvent(this._changeEvent); | |
| } | |
| } | |
| get forward() { | |
| let forward = new Vector3(0, 0, 1); | |
| forward = this.rotation.apply(forward); | |
| return forward; | |
| } | |
| get transform() { | |
| return this._transform; | |
| } | |
| } | |
| export { Object3D }; | |