UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

96 lines (95 loc) 5.01 kB
"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); } }