@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
109 lines (101 loc) • 3.39 kB
JavaScript
"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);
}
}