@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
65 lines (61 loc) • 2.44 kB
text/typescript
import {Object3D, Vector3, Quaternion, BufferAttribute} from 'three';
import {ObjectNamedFunction3, ObjectNamedFunction4} from './_Base';
import {InstanceAttrib} from '../../core/geometry/Instancer';
import {
_setPointAttributeVector3Name,
_setPointAttributeQuaternionName,
_setPointAttributeVector3MultName,
} from './_SetPoint';
import {quatLookAt} from '../../core/LookAt';
import {Object3DWithGeometry} from '../../core/geometry/Group';
import {markAttributeAsNeedsUpdateForFrame} from '../../core/geometry/Attribute';
const _q = new Quaternion();
const _q2 = new Quaternion();
const _v3 = new Vector3();
export class setPointInstanceLookAt extends ObjectNamedFunction4<[number, Vector3, Vector3, number]> {
static override type() {
return 'setPointInstanceLookAt';
}
func(object3D: Object3D, ptnum: number, targetPosition: Vector3, up: Vector3, lerp: number): void {
const geometry = (object3D as Object3DWithGeometry).geometry;
if (!geometry) {
return;
}
const positionAttribute = geometry.getAttribute(InstanceAttrib.POSITION) as BufferAttribute | undefined;
const quaternionAttribute = geometry.getAttribute(InstanceAttrib.QUATERNION) as BufferAttribute | undefined;
if (!(positionAttribute && quaternionAttribute)) {
return;
}
_v3.fromBufferAttribute(positionAttribute, ptnum);
quatLookAt(_v3, targetPosition, up, _q);
if (lerp >= 1) {
_q.toArray(quaternionAttribute.array, ptnum * 4);
} else {
if (!quaternionAttribute) {
return;
}
_q2.fromBufferAttribute(quaternionAttribute, ptnum);
_q2.slerp(_q, lerp);
_q2.toArray(quaternionAttribute.array, ptnum * 4);
}
markAttributeAsNeedsUpdateForFrame(quaternionAttribute, this.timeController.frame());
}
}
export class setPointInstancePosition extends ObjectNamedFunction3<[number, Vector3, number]> {
static override type() {
return 'setPointInstancePosition';
}
func = _setPointAttributeVector3Name(this, InstanceAttrib.POSITION);
}
export class setPointInstanceQuaternion extends ObjectNamedFunction3<[number, Quaternion, number]> {
static override type() {
return 'setPointInstanceQuaternion';
}
func = _setPointAttributeQuaternionName(this, InstanceAttrib.QUATERNION);
}
export class setPointInstanceScale extends ObjectNamedFunction4<[number, Vector3, number, number]> {
static override type() {
return 'setPointInstanceScale';
}
func = _setPointAttributeVector3MultName(this, InstanceAttrib.SCALE);
}