@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
96 lines (95 loc) • 5.01 kB
JavaScript
"use strict";
import { TypedGlNode } from "./_Base";
import { ThreeToGl } from "../../../core/ThreeToGl";
import { Attribute } from "../../../core/geometry/Attribute";
import { InstanceAttrib } from "../../../core/geometry/Instancer";
import QuaternionMethods from "./gl/quaternion.glsl";
import { NodeParamsConfig, ParamConfig } from "../utils/params/ParamsConfig";
import { GlConnectionPointType, GlConnectionPoint } from "../utils/io/connections/Gl";
import { FunctionGLDefinition } from "./utils/GLDefinition";
const VARS = {
position: Attribute.POSITION,
normal: Attribute.NORMAL,
instancePosition: InstanceAttrib.POSITION,
instanceQuaternion: InstanceAttrib.QUATERNION,
instanceScale: InstanceAttrib.SCALE
};
class InstanceTransformGlParamsConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
this.position = ParamConfig.VECTOR3([0, 0, 0]);
this.normal = ParamConfig.VECTOR3([0, 0, 1]);
this.instancePosition = ParamConfig.VECTOR3([0, 0, 0]);
this.instanceQuaternion = ParamConfig.VECTOR4([0, 0, 0, 0]);
this.instanceScale = ParamConfig.VECTOR3([1, 1, 1]);
}
}
const ParamsConfig = new InstanceTransformGlParamsConfig();
export class InstanceTransformGlNode extends TypedGlNode {
constructor() {
super(...arguments);
this.paramsConfig = ParamsConfig;
}
static type() {
return "instanceTransform";
}
initializeNode() {
super.initializeNode();
this.io.outputs.setNamedOutputConnectionPoints([
new GlConnectionPoint(this.gl_output_name_position(), GlConnectionPointType.VEC3),
new GlConnectionPoint(this.gl_output_name_normal(), GlConnectionPointType.VEC3)
]);
}
setLines(shaders_collection_controller) {
const bodyLines = [];
const functionDeclarationLines = [];
functionDeclarationLines.push(new FunctionGLDefinition(this, QuaternionMethods));
const inputPosition = this.io.inputs.named_input(this.p.position.name());
const position = inputPosition ? ThreeToGl.float(this.variableForInputParam(this.p.position)) : this._defaultPosition();
const inputNormal = this.io.inputs.named_input(this.p.normal.name());
const normal = inputNormal ? ThreeToGl.float(this.variableForInputParam(this.p.normal)) : this._defaultNormal();
const inputInstancePosition = this.io.inputs.named_input(this.p.instancePosition.name());
const instancePosition = inputInstancePosition ? ThreeToGl.float(this.variableForInputParam(this.p.instancePosition)) : this._defaultInstancePosition(shaders_collection_controller);
const inputInstanceQuaternion = this.io.inputs.named_input(this.p.instanceQuaternion.name());
const instanceQuaternion = inputInstanceQuaternion ? ThreeToGl.float(this.variableForInputParam(this.p.instanceQuaternion)) : this._defaultInputInstanceQuaternion(shaders_collection_controller);
const inputInstanceScale = this.io.inputs.named_input(this.p.instanceScale.name());
const instanceScale = inputInstanceScale ? ThreeToGl.float(this.variableForInputParam(this.p.instanceScale)) : this._defaultInputInstanceScale(shaders_collection_controller);
const resultPosition = this.glVarName(this.gl_output_name_position());
const resultNormal = this.glVarName(this.gl_output_name_normal());
bodyLines.push(`vec3 ${resultPosition} = vec3(${position})`);
bodyLines.push(`${resultPosition} *= ${instanceScale}`);
bodyLines.push(`${resultPosition} = rotateWithQuat( ${resultPosition}, ${instanceQuaternion} )`);
bodyLines.push(`${resultPosition} += ${instancePosition}`);
bodyLines.push(`vec3 ${resultNormal} = vec3(${normal})`);
bodyLines.push(`${resultNormal} = rotateWithQuat( ${resultNormal}, ${instanceQuaternion} )`);
shaders_collection_controller.addBodyLines(this, bodyLines);
shaders_collection_controller.addDefinitions(this, functionDeclarationLines);
}
gl_output_name_position() {
return "position";
}
gl_output_name_normal() {
return "normal";
}
_defaultPosition() {
return VARS.position;
}
_defaultNormal() {
return VARS.normal;
}
_defaultInstancePosition(shaders_collection_controller) {
var _a;
const assembler = shaders_collection_controller.assembler();
return (_a = assembler.globalsHandler()) == null ? void 0 : _a.readAttribute(this, GlConnectionPointType.VEC3, VARS.instancePosition, shaders_collection_controller);
}
_defaultInputInstanceQuaternion(shaders_collection_controller) {
var _a;
const assembler = shaders_collection_controller.assembler();
return (_a = assembler.globalsHandler()) == null ? void 0 : _a.readAttribute(this, GlConnectionPointType.VEC4, VARS.instanceQuaternion, shaders_collection_controller);
}
_defaultInputInstanceScale(shaders_collection_controller) {
var _a;
const assembler = shaders_collection_controller.assembler();
return (_a = assembler.globalsHandler()) == null ? void 0 : _a.readAttribute(this, GlConnectionPointType.VEC3, VARS.instanceScale, shaders_collection_controller);
}
}