polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
143 lines (142 loc) • 5.8 kB
JavaScript
import {ShaderMaterial as ShaderMaterial2} from "three/src/materials/ShaderMaterial";
import {TypedMatNode} from "./_Base";
import {SubsurfaceScatteringShader as SubsurfaceScatteringShader2} from "../../../modules/three/examples/jsm/shaders/SubsurfaceScatteringShader";
import {SideController as SideController2, SideParamConfig} from "./utils/SideController";
import {SkinningController as SkinningController2, SkinningParamConfig} from "./utils/SkinningController";
import {TextureMapController as TextureMapController2, TextureMapParamConfig} from "./utils/TextureMapController";
import {UniformsUtils as UniformsUtils2} from "three/src/renderers/shaders/UniformsUtils";
import {TextureAlphaMapController as TextureAlphaMapController2, TextureAlphaMapParamConfig} from "./utils/TextureAlphaMapController";
function ParamOptionsFactoryColor(uniform_name) {
return {
cook: false,
callback: (node, param) => {
MeshSubsurfaceScatteringMatNode.PARAM_CALLBACK_update_uniformColor(node, param, uniform_name);
}
};
}
function ParamOptionsFactoryTexture(uniform_name) {
return {
cook: false,
callback: (node, param) => {
MeshSubsurfaceScatteringMatNode.PARAM_CALLBACK_update_uniformTexture(node, param, uniform_name);
}
};
}
function ParamOptionsFactoryN(uniform_name) {
return {
cook: false,
callback: (node, param) => {
MeshSubsurfaceScatteringMatNode.PARAM_CALLBACK_update_uniformN(node, param, uniform_name);
}
};
}
import {NodeContext as NodeContext2} from "../../poly/NodeContext";
import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig";
import {NODE_PATH_DEFAULT} from "../../../core/Walker";
class MeshSubsurfaceScatteringMatParamsConfig extends TextureMapParamConfig(TextureAlphaMapParamConfig(SkinningParamConfig(SideParamConfig(NodeParamsConfig)))) {
constructor() {
super(...arguments);
this.diffuse = ParamConfig.COLOR([1, 1, 1], {
...ParamOptionsFactoryColor("diffuse")
});
this.shininess = ParamConfig.FLOAT(1, {
range: [0, 1e3]
});
this.thicknessMap = ParamConfig.OPERATOR_PATH(NODE_PATH_DEFAULT.NODE.UV, {
nodeSelection: {context: NodeContext2.COP},
...ParamOptionsFactoryTexture("thicknessMap")
});
this.thicknessColor = ParamConfig.COLOR([0.5, 0.3, 0], {
...ParamOptionsFactoryColor("thicknessColor")
});
this.thicknessDistortion = ParamConfig.FLOAT(0.1, {
...ParamOptionsFactoryN("thicknessDistortion")
});
this.thicknessAmbient = ParamConfig.FLOAT(0.4, {
...ParamOptionsFactoryN("thicknessAmbient")
});
this.thicknessAttenuation = ParamConfig.FLOAT(0.8, {
...ParamOptionsFactoryN("thicknessAttenuation")
});
this.thicknessPower = ParamConfig.FLOAT(2, {
range: [0, 10],
...ParamOptionsFactoryN("thicknessPower")
});
this.thicknessScale = ParamConfig.FLOAT(16, {
range: [0, 100],
...ParamOptionsFactoryN("thicknessScale")
});
}
}
const ParamsConfig2 = new MeshSubsurfaceScatteringMatParamsConfig();
export class MeshSubsurfaceScatteringMatNode extends TypedMatNode {
constructor() {
super(...arguments);
this.params_config = ParamsConfig2;
this.texture_map_controller = new TextureMapController2(this, {
uniforms: true
});
this.texture_alpha_map_controller = new TextureAlphaMapController2(this, {
uniforms: true
});
}
static type() {
return "meshSubsurfaceScattering";
}
create_material() {
const uniforms = UniformsUtils2.clone(SubsurfaceScatteringShader2.uniforms);
const material = new ShaderMaterial2({
uniforms,
vertexShader: SubsurfaceScatteringShader2.vertexShader,
fragmentShader: SubsurfaceScatteringShader2.fragmentShader,
lights: true
});
material.extensions.derivatives = true;
return material;
}
initializeNode() {
this.params.onParamsCreated("init controllers", () => {
this.texture_map_controller.initializeNode();
this.texture_alpha_map_controller.initializeNode();
});
}
async cook() {
SideController2.update(this);
SkinningController2.update(this);
this.texture_map_controller.update();
this.texture_alpha_map_controller.update();
this.update_map(this.p.thicknessMap, "thicknessMap");
this.material.uniforms.diffuse.value.copy(this.pv.diffuse);
this.material.uniforms.shininess.value = this.pv.shininess;
this.material.uniforms.thicknessColor.value.copy(this.pv.thicknessColor);
this.material.uniforms.thicknessDistortion.value = this.pv.thicknessDistortion;
this.material.uniforms.thicknessAmbient.value = this.pv.thicknessAmbient;
this.material.uniforms.thicknessAttenuation.value = this.pv.thicknessAttenuation;
this.material.uniforms.thicknessPower.value = this.pv.thicknessPower;
this.material.uniforms.thicknessScale.value = this.pv.thicknessScale;
this.set_material(this.material);
}
static PARAM_CALLBACK_update_uniformN(node, param, uniform_name) {
node.material.uniforms[uniform_name].value = param.value;
}
static PARAM_CALLBACK_update_uniformColor(node, param, uniform_name) {
if (param.parent_param) {
node.material.uniforms[uniform_name].value.copy(param.parent_param.value);
}
}
static PARAM_CALLBACK_update_uniformTexture(node, param, uniform_name) {
node.update_map(param, uniform_name);
}
async update_map(param, uniform_name) {
const node = param.found_node();
if (node) {
if (node.nodeContext() == NodeContext2.COP) {
const texture_node = node;
const container = await texture_node.requestContainer();
this.material.uniforms[uniform_name].value = container.texture();
return;
}
}
this.material.uniforms[uniform_name].value = null;
}
}