@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
71 lines (70 loc) • 2.31 kB
JavaScript
;
import { Vector3, Quaternion } 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 { markAttributeAsNeedsUpdateForFrame } from "../../core/geometry/Attribute";
const _q = new Quaternion();
const _q2 = new Quaternion();
const _v3 = new Vector3();
export class setPointInstanceLookAt extends ObjectNamedFunction4 {
static type() {
return "setPointInstanceLookAt";
}
func(object3D, ptnum, targetPosition, up, lerp) {
const geometry = object3D.geometry;
if (!geometry) {
return;
}
const positionAttribute = geometry.getAttribute(InstanceAttrib.POSITION);
const quaternionAttribute = geometry.getAttribute(InstanceAttrib.QUATERNION);
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 {
constructor() {
super(...arguments);
this.func = _setPointAttributeVector3Name(this, InstanceAttrib.POSITION);
}
static type() {
return "setPointInstancePosition";
}
}
export class setPointInstanceQuaternion extends ObjectNamedFunction3 {
constructor() {
super(...arguments);
this.func = _setPointAttributeQuaternionName(this, InstanceAttrib.QUATERNION);
}
static type() {
return "setPointInstanceQuaternion";
}
}
export class setPointInstanceScale extends ObjectNamedFunction4 {
constructor() {
super(...arguments);
this.func = _setPointAttributeVector3MultName(this, InstanceAttrib.SCALE);
}
static type() {
return "setPointInstanceScale";
}
}