Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 55 additions & 4 deletions src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -1474,11 +1474,46 @@ function WebGLRenderer( parameters ) {

var shader = ShaderLib[ parameters.shaderID ];

var combinedUniforms = undefined !== material.shaderUniforms ?
UniformsUtils.merge( [ UniformsUtils.clone( shader.uniforms ), material.shaderUniforms ] ) :
UniformsUtils.clone( shader.uniforms );

var shaderUniformsGLSLFrag = '';
var shaderUniformsGLSLVert = '';

for ( var uniformName in material.shaderUniforms ) {

var uniform = material.shaderUniforms[ uniformName ];
var type = uniform.type;
var stage = uniform.stage;

if ( type ) {

if ( stage === 'vertex' ) {

shaderUniformsGLSLVert += 'uniform ' + type + ' ' + uniformName + ';\n';

} else if ( stage === 'fragment' ) {

shaderUniformsGLSLFrag += 'uniform ' + type + ' ' + uniformName + ';\n';

} else {

shaderUniformsGLSLVert += 'uniform ' + type + ' ' + uniformName + ';\n';
shaderUniformsGLSLFrag += 'uniform ' + type + ' ' + uniformName + ';\n';

}

}

}

materialProperties.shader = {
name: material.type,
uniforms: UniformsUtils.clone( shader.uniforms ),
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader
uniforms: combinedUniforms,
vertexShader: shaderUniformsGLSLVert + shader.vertexShader,
fragmentShader: shaderUniformsGLSLFrag + shader.fragmentShader

};

} else {
Expand Down Expand Up @@ -1797,8 +1832,14 @@ function WebGLRenderer( parameters ) {

}

// refresh uniforms common to several materials
//refresh custom user provided uniforms if they exist
if ( undefined !== material.shaderUniforms ) {

refreshUniformsCustom( m_uniforms, material );

}

// refresh uniforms common to several materials
if ( fog && material.fog ) {

refreshUniformsFog( m_uniforms, fog );
Expand Down Expand Up @@ -2041,6 +2082,16 @@ function WebGLRenderer( parameters ) {

}

function refreshUniformsCustom( uniforms, material ) {

for ( var uniform in material.shaderUniforms ) {

uniforms[ uniform ].value = material.shaderUniforms[ uniform ].value;

}

}

function refreshUniformsLine( uniforms, material ) {

uniforms.diffuse.value = material.color;
Expand Down
12 changes: 8 additions & 4 deletions src/renderers/webgl/WebGLProgram.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,13 +158,14 @@ function replaceClippingPlaneNums( string, parameters ) {

}

function parseIncludes( string ) {
function parseIncludes( string, materialIncludes ) {

var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm;

function replace( match, include ) {

var replace = ShaderChunk[ include ];
//if there are material includes provided use those instead of the default chunks:
var replace = undefined !== materialIncludes[ include ] ? materialIncludes[ include ] : ShaderChunk[ include ];

if ( replace === undefined ) {

Expand Down Expand Up @@ -289,6 +290,8 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters

var customDefines = generateDefines( defines );

var customIncludes = undefined !== material.shaderIncludes ? material.shaderIncludes : {}; //if the shaderIncludes dictionary is not provided

//

var program = gl.createProgram();
Expand Down Expand Up @@ -503,11 +506,12 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters

}

vertexShader = parseIncludes( vertexShader );
// provide optional chunk dictionary customIncludes
vertexShader = parseIncludes( vertexShader, customIncludes );
vertexShader = replaceLightNums( vertexShader, parameters );
vertexShader = replaceClippingPlaneNums( vertexShader, parameters );

fragmentShader = parseIncludes( fragmentShader );
fragmentShader = parseIncludes( fragmentShader, customIncludes );
fragmentShader = replaceLightNums( fragmentShader, parameters );
fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );

Expand Down