UNPKG

@polygonjs/polygonjs

Version:

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

113 lines (102 loc) 4.22 kB
// import {UniformsUtils} from 'three'; // import {ShaderMaterial} from 'three'; import {ShaderLib} from 'three'; import {ShaderAssemblerMaterial, CustomAssemblerMap} from './_BaseMaterial'; import {ShaderConfig} from '../../configs/ShaderConfig'; import {VariableConfig} from '../../configs/VariableConfig'; import {BaseGlShaderAssembler} from '../_Base'; import {ShaderAssemblerCustomPointsDepth} from './custom/points/CustomPointsDepth'; import {ShaderAssemblerCustomPointsDistance} from './custom/points/CustomPointsDistance'; import {ShaderAssemblerCustomPointsDepthDOF} from './custom/points/CustomPointsDepthDOF'; import {OutputGlNode} from '../../../Output'; import {GlConnectionPointType, GlConnectionPoint} from '../../../../utils/io/connections/Gl'; import {ShaderName} from '../../../../utils/shaders/ShaderName'; import {VaryingWriteGlNode} from '../../../VaryingWrite'; import {PointsMaterial} from 'three'; import {CustomMaterialName} from '../../../../../../core/geometry/Material'; import {GlobalsOutput} from './common/GlobalOutput'; const LINES_TO_REMOVE_MAP: Map<ShaderName, string[]> = new Map([ [ShaderName.VERTEX, ['#include <begin_vertex>', 'gl_PointSize = size;']], [ShaderName.FRAGMENT, []], ]); const CUSTOM_ASSEMBLER_MAP: CustomAssemblerMap = new Map(); CUSTOM_ASSEMBLER_MAP.set(CustomMaterialName.DISTANCE, ShaderAssemblerCustomPointsDistance); CUSTOM_ASSEMBLER_MAP.set(CustomMaterialName.DEPTH, ShaderAssemblerCustomPointsDepth); CUSTOM_ASSEMBLER_MAP.set(CustomMaterialName.DEPTH_DOF, ShaderAssemblerCustomPointsDepthDOF); export class ShaderAssemblerPoints extends ShaderAssemblerMaterial { override customAssemblerClassByCustomName(): CustomAssemblerMap { return CUSTOM_ASSEMBLER_MAP; } override templateShader() { const template = ShaderLib.points; return { vertexShader: template.vertexShader, fragmentShader: template.fragmentShader, uniforms: template.uniforms, }; } override createMaterial() { const material = new PointsMaterial(); // const template_shader = this.templateShader(); // // const uniforms = UniformsUtils.clone( template_shader.uniforms ) // // uniforms.size.value = 10 // const material = new ShaderMaterial({ // transparent: true, // fog: true, // // size: 10, // // //blending: AdditiveBlending // // depthTest: true, // // depthwrite: true, // // alphaTest: 0.5, // defines: { // // ALPHATEST: 0.5, // USE_SIZEATTENUATION: 1, // }, // uniforms: UniformsUtils.clone(template_shader.uniforms), // vertexShader: template_shader.vertexShader, // fragmentShader: template_shader.fragmentShader, // }); this._addCustomMaterials(material); return material; } // protected insertBodyAfter(shader_name){ // return { // vertex: 'gl_PointSize = size;', // fragment: 'vec4 diffuseColor = vec4( diffuse, opacity );' // }[shader_name] // } // those shadow shaders should ideally be overriden // to properly take into account point size override add_output_inputs(output_child: OutputGlNode) { const list = BaseGlShaderAssembler.output_input_connection_points(); list.push(new GlConnectionPoint(GlobalsOutput.GL_POINTSIZE, GlConnectionPointType.FLOAT)); output_child.io.inputs.setNamedInputConnectionPoints(list); } override create_globals_node_output_connections() { return BaseGlShaderAssembler.create_globals_node_output_connections().concat([ new GlConnectionPoint(GlobalsOutput.GL_POINTCOORD, GlConnectionPointType.VEC2), ]); } override create_shader_configs() { return [ new ShaderConfig( ShaderName.VERTEX, ['position', 'normal', 'uv', GlobalsOutput.GL_POINTSIZE, VaryingWriteGlNode.INPUT_NAME], [] ), new ShaderConfig(ShaderName.FRAGMENT, ['color', 'alpha'], [ShaderName.VERTEX]), ]; } override create_variable_configs() { return BaseGlShaderAssembler.create_variable_configs().concat([ new VariableConfig(GlobalsOutput.GL_POINTSIZE, { default: '1.0', prefix: `${GlobalsOutput.GL_POINTSIZE} = `, suffix: ' * size * 10.0', // currently using 10 as 1 seems really small }), ]); } protected override linesToRemove(shader_name: ShaderName) { return LINES_TO_REMOVE_MAP.get(shader_name); } }