UNPKG

polygonjs-engine

Version:

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

142 lines (130 loc) 5.33 kB
import {UniformsUtils} from 'three/src/renderers/shaders/UniformsUtils'; import {ShaderMaterial} from 'three/src/materials/ShaderMaterial'; import {ShaderLib} from 'three/src/renderers/shaders/ShaderLib'; import {ShaderAssemblerMaterial, CustomAssemblerMap, CustomMaterialName} from './_BaseMaterial'; import {ShaderConfig} from '../../configs/ShaderConfig'; import {VariableConfig} from '../../configs/VariableConfig'; import {GlobalsGeometryHandler} from '../../globals/Geometry'; // import {ShaderAssemblerCustomMeshDepth} from './CustomMeshDepth' // import {ShaderAssemblerCustomMeshDistance} from './CustomMeshDistance' import {ShaderAssemblerCustomLineDepthDOF} from './CustomLineDepthDOF'; import {ShaderName} from '../../../../utils/shaders/ShaderName'; import {OutputGlNode} from '../../../Output'; import {GlConnectionPointType, GlConnectionPoint} from '../../../../utils/io/connections/Gl'; const ASSEMBLER_MAP: CustomAssemblerMap = new Map([ // [CustomMaterialName.DISTANCE, ShaderAssemblerCustomMeshDistance], // [CustomMaterialName.DEPTH, ShaderAssemblerCustomMeshDepth], // [CustomMaterialName.DEPTH_DOF, ShaderAssemblerCustomMeshDepthDOF], ]); ASSEMBLER_MAP.set(CustomMaterialName.DEPTH_DOF, ShaderAssemblerCustomLineDepthDOF); const LINES_TO_REMOVE_MAP: Map<ShaderName, string[]> = new Map([ [ShaderName.VERTEX, ['#include <begin_vertex>', 'vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );']], [ShaderName.FRAGMENT, []], ]); export class ShaderAssemblerLine extends ShaderAssemblerMaterial { // _color_declaration() { return 'diffuseColor' } get _template_shader() { const template = ShaderLib.dashed; return { vertexShader: template.vertexShader, //TemplateVertex, fragmentShader: template.fragmentShader, //TemplateFragment, uniforms: template.uniforms, }; } create_material() { const template_shader = this._template_shader; // const uniforms = UniformsUtils.clone( template_shader.uniforms ) // uniforms.size.value = 10 return new ShaderMaterial({ // vertexColors: VertexColors, // side: FrontSide, // transparent: true, // fog: true, // lights: false, // size: 10, // //vertexColors: VertexColors // //blending: AdditiveBlending depthTest: true, alphaTest: 0.5, linewidth: 100, // isLineBasicMaterial: true, uniforms: UniformsUtils.clone(template_shader.uniforms), vertexShader: template_shader.vertexShader, fragmentShader: template_shader.fragmentShader, }); // material.uniforms.size.value = 10 // return material } custom_assembler_class_by_custom_name(): CustomAssemblerMap { return ASSEMBLER_MAP; // return { // // customDepthMaterial: ShaderAssemblerCustomMeshDepth, // // customDistanceMaterial: ShaderAssemblerCustomMeshDistance, // customDepthDOFMaterial: ShaderAssemblerCustomLineDepthDOF, // }; } create_shader_configs() { return [ new ShaderConfig(ShaderName.VERTEX, ['position', 'uv'], []), new ShaderConfig(ShaderName.FRAGMENT, ['color', 'alpha'], [ShaderName.VERTEX]), ]; } static output_input_connection_points() { return [ new GlConnectionPoint('position', GlConnectionPointType.VEC3), new GlConnectionPoint('color', GlConnectionPointType.VEC3), new GlConnectionPoint('alpha', GlConnectionPointType.FLOAT), new GlConnectionPoint('uv', GlConnectionPointType.VEC2), ]; // output_child.add_param(ParamType.VECTOR3, 'position', [0, 0, 0], {hidden: true}); // // output_child.add_param( ParamType.VECTOR, 'normal', [0,0,0], {hidden: true} ) // output_child.add_param(ParamType.COLOR, 'color', [1, 1, 1], {hidden: true}); // output_child.add_param(ParamType.FLOAT, 'alpha', 1, {hidden: true}); // output_child.add_param(ParamType.VECTOR2, 'uv', [0, 0], {hidden: true}); } add_output_inputs(output_child: OutputGlNode) { output_child.io.inputs.setNamedInputConnectionPoints(ShaderAssemblerLine.output_input_connection_points()); } static create_globals_node_output_connections() { return [ new GlConnectionPoint('position', GlConnectionPointType.VEC3), // new Connection.Vec3('normal'), new GlConnectionPoint('color', GlConnectionPointType.VEC3), new GlConnectionPoint('uv', GlConnectionPointType.VEC2), new GlConnectionPoint('gl_FragCoord', GlConnectionPointType.VEC4), new GlConnectionPoint('resolution', GlConnectionPointType.VEC2), // new Connection.Vec2('gl_PointCoord'), // new TypedConnectionVec2('uv'), new GlConnectionPoint('time', GlConnectionPointType.FLOAT), ]; } create_globals_node_output_connections() { return ShaderAssemblerLine.create_globals_node_output_connections(); } create_variable_configs() { return [ new VariableConfig('position', { default: 'vec3( position )', prefix: 'vec3 transformed = ', suffix: ';vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 )', }), // new VariableConfig('normal', { // prefix: 'objectNormal = ' // }), new VariableConfig('color', { prefix: 'diffuseColor.xyz = ', }), new VariableConfig('alpha', { prefix: 'diffuseColor.w = ', }), new VariableConfig('uv', { // default_from_attribute: true, prefix: 'vUv = ', if: GlobalsGeometryHandler.IF_RULE.uv, }), ]; } protected lines_to_remove(shader_name: ShaderName) { return LINES_TO_REMOVE_MAP.get(shader_name); } }