@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
61 lines (51 loc) • 2.16 kB
text/typescript
import {Number3} from '../../../../../types/GlobalTypes';
import {RaycastEventNode} from '../../Raycast';
import {Vector3} from 'three';
import {ParamType} from '../../../../poly/ParamType';
import {Vector3Param} from '../../../../params/Vector3';
// import {Poly} from '../../../../Poly';
import {isBooleanTrue} from '../../../../../core/BooleanValue';
export enum CPUIntersectWith {
GEOMETRY = 'geometry',
PLANE = 'plane',
}
export const CPU_INTERSECT_WITH_OPTIONS: CPUIntersectWith[] = [CPUIntersectWith.GEOMETRY, CPUIntersectWith.PLANE];
export class RaycastCPUVelocityController {
constructor(private _node: RaycastEventNode) {}
private _prevPosition: Vector3 | undefined;
// private _set_pos_timestamp = -1;
private _foundVelocityTargetParam: Vector3Param | undefined;
private _hitVelocity: Vector3 = new Vector3(0, 0, 0);
private _hitVelocityArray: Number3 = [0, 0, 0];
process(hitPosition: Vector3) {
if (!isBooleanTrue(this._node.pv.tvelocity)) {
return;
}
if (!this._prevPosition) {
this._prevPosition = this._prevPosition || new Vector3();
this._prevPosition.copy(hitPosition);
return;
}
// const performance = Poly.performance.performanceManager();
// const now = performance.now();
const delta = this._node.scene().timeController.delta(); //now - this._set_pos_timestamp;
// console.log(delta, this._node.scene().timeController.delta());
// this._set_pos_timestamp = now;
// multiply by 1000 since delta is in ms
this._hitVelocity.copy(hitPosition).sub(this._prevPosition).divideScalar(delta).multiplyScalar(1000);
this._hitVelocity.toArray(this._hitVelocityArray);
if (isBooleanTrue(this._node.pv.tvelocityTarget)) {
if (this._foundVelocityTargetParam == null || isBooleanTrue(this._foundVelocityTargetParam.disposed())) {
const targetParam = this._node.pv.velocityTarget;
this._foundVelocityTargetParam = targetParam.paramWithType(ParamType.VECTOR3);
}
this._foundVelocityTargetParam?.set(this._hitVelocityArray);
} else {
this._node.p.velocity.set(this._hitVelocityArray);
}
this._prevPosition.copy(hitPosition);
}
reset() {
this._prevPosition = undefined;
}
}