UNPKG

@polygonjs/polygonjs

Version:

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

109 lines (101 loc) 3.39 kB
"use strict"; import { ShaderMaterial } from "three"; import { FrontSide } from "three"; import { PrimitiveMatNode } from "./_Base"; import { NodeParamsConfig, ParamConfig } from "../utils/params/ParamsConfig"; import { AdvancedCommonController, AdvancedCommonParamConfig } from "./utils/AdvancedCommonController"; import { UniformsTransparencyParamConfig, UniformsTransparencyController } from "./utils/UniformsTransparencyController"; import { WireframeShaderMaterialController, WireframeShaderMaterialParamsConfig } from "./utils/WireframeShaderMaterialController"; import { FogController, FogParamConfig } from "./utils/FogController"; import { AdvancedFolderParamConfig } from "./utils/AdvancedFolder"; import { StringParamLanguage } from "../../params/utils/OptionsController"; import { isBooleanTrue } from "../../../core/Type"; export const VERTEX_DEFAULT = ` varying vec3 vWorldPosition; void main() { vec4 worldPosition = modelMatrix * vec4( position, 1.0 ); vWorldPosition = worldPosition.xyz; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); }`; const FRAGMENT_DEFAULT = ` varying vec3 vWorldPosition; void main() { gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); }`; export function CodeParamConfig(Base) { return class Mixin extends Base { constructor() { super(...arguments); this.vertexShader = ParamConfig.FOLDER(null); this.vertex = ParamConfig.STRING(VERTEX_DEFAULT, { language: StringParamLanguage.GLSL, hideLabel: true }); this.fragmentShader = ParamConfig.FOLDER(null); this.fragment = ParamConfig.STRING(FRAGMENT_DEFAULT, { language: StringParamLanguage.GLSL, hideLabel: true }); this.extensions = ParamConfig.FOLDER(null); this.clipCullDistance = ParamConfig.BOOLEAN(1); this.multiDraw = ParamConfig.BOOLEAN(1); } }; } class CodeMatParamsConfig extends FogParamConfig( WireframeShaderMaterialParamsConfig( AdvancedCommonParamConfig( UniformsTransparencyParamConfig( /* advanced */ AdvancedFolderParamConfig( /* textures */ CodeParamConfig(NodeParamsConfig) ) ) ) ) ) { } const ParamsConfig = new CodeMatParamsConfig(); export class CodeMatNode extends PrimitiveMatNode { constructor() { super(...arguments); this.paramsConfig = ParamsConfig; this.controllers = { advancedCommon: new AdvancedCommonController(this), fog: new FogController(this), uniformTransparency: new UniformsTransparencyController(this), wireframeShader: new WireframeShaderMaterialController(this) }; this.controllersList = Object.values(this.controllers); } static type() { return "code"; } createMaterial() { return new ShaderMaterial({ vertexColors: false, side: FrontSide, opacity: 1 }); } async cook() { this._material = this._material || this.createMaterial(); await Promise.all(this.controllersPromises(this._material)); this._material.vertexShader = this.pv.vertex; this._material.fragmentShader = this.pv.fragment; this._material.extensions.clipCullDistance = isBooleanTrue(this.pv.clipCullDistance); this._material.extensions.multiDraw = isBooleanTrue(this.pv.multiDraw); this._material.needsUpdate = true; this.setMaterial(this._material); } }