polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
97 lines (96 loc) • 3.77 kB
JavaScript
import {TypedObjNode} from "./_Base";
import {Group as Group2} from "three/src/objects/Group";
import {FlagsControllerD} from "../utils/FlagsController";
import {AxesHelper as AxesHelper2} from "three/src/helpers/AxesHelper";
import {HierarchyController as HierarchyController2} from "./utils/HierarchyController";
import {Matrix4 as Matrix42} from "three/src/math/Matrix4";
import {Vector3 as Vector32} from "three/src/math/Vector3";
import {MathUtils as MathUtils2} from "three/src/math/MathUtils";
import {Quaternion as Quaternion2} from "three/src/math/Quaternion";
import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig";
class PolarTransformObjParamConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
this.center = ParamConfig.VECTOR3([0, 0, 0]);
this.longitude = ParamConfig.FLOAT(0, {
range: [0, 360]
});
this.latitude = ParamConfig.FLOAT(0, {
range: [-180, 180]
});
this.depth = ParamConfig.FLOAT(1, {
range: [0, 10]
});
}
}
const ParamsConfig2 = new PolarTransformObjParamConfig();
const HOOK_NAME = "_cook_main_without_inputs_when_dirty";
const AXIS_VERTICAL = new Vector32(0, 1, 0);
const AXIS_HORIZONTAL = new Vector32(-1, 0, 0);
export class PolarTransformObjNode extends TypedObjNode {
constructor() {
super(...arguments);
this.params_config = ParamsConfig2;
this.hierarchy_controller = new HierarchyController2(this);
this.flags = new FlagsControllerD(this);
this._helper = new AxesHelper2(1);
this._cook_main_without_inputs_when_dirty_bound = this._cook_main_without_inputs_when_dirty.bind(this);
this._centerMatrix = new Matrix42();
this._longitudeMatrix = new Matrix42();
this._latitudeMatrix = new Matrix42();
this._depthMatrix = new Matrix42();
this._fullMatrix = new Matrix42();
this._decomposed = {
t: new Vector32(),
q: new Quaternion2(),
s: new Vector32()
};
}
static type() {
return "polarTransform";
}
create_object() {
const group = new Group2();
group.matrixAutoUpdate = false;
return group;
}
initializeNode() {
this.hierarchy_controller.initializeNode();
if (!this.dirtyController.has_hook(HOOK_NAME)) {
this.dirtyController.addPostDirtyHook(HOOK_NAME, this._cook_main_without_inputs_when_dirty_bound);
}
this._updateHelperHierarchy();
this._helper.matrixAutoUpdate = false;
this.flags.display.add_hook(() => {
this._updateHelperHierarchy();
});
}
_updateHelperHierarchy() {
if (this.flags.display.active()) {
this.object.add(this._helper);
} else {
this.object.remove(this._helper);
}
}
async _cook_main_without_inputs_when_dirty() {
await this.cookController.cook_main_without_inputs();
}
cook() {
const object = this.object;
this._centerMatrix.identity();
this._longitudeMatrix.identity();
this._latitudeMatrix.identity();
this._depthMatrix.identity();
this._centerMatrix.makeTranslation(this.pv.center.x, this.pv.center.y, this.pv.center.z);
this._longitudeMatrix.makeRotationAxis(AXIS_VERTICAL, MathUtils2.degToRad(this.pv.longitude));
this._latitudeMatrix.makeRotationAxis(AXIS_HORIZONTAL, MathUtils2.degToRad(this.pv.latitude));
this._depthMatrix.makeTranslation(0, 0, this.pv.depth);
this._fullMatrix.copy(this._centerMatrix).multiply(this._longitudeMatrix).multiply(this._latitudeMatrix).multiply(this._depthMatrix);
this._fullMatrix.decompose(this._decomposed.t, this._decomposed.q, this._decomposed.s);
object.position.copy(this._decomposed.t);
object.quaternion.copy(this._decomposed.q);
object.scale.copy(this._decomposed.s);
object.updateMatrix();
this.cookController.end_cook();
}
}