Skip to content

Instantly share code, notes, and snippets.

@karimbeyrouti
Created January 19, 2016 17:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save karimbeyrouti/790d2e1a8c0137b16bae to your computer and use it in GitHub Desktop.
Save karimbeyrouti/790d2e1a8c0137b16bae to your computer and use it in GitHub Desktop.
import THREE from 'three';
export class MeshBasicTintMaterial extends THREE.ShaderMaterial {
constructor(parameters) {
parameters = parameters || {};
var defines = {};
var uniforms = THREE.UniformsUtils.merge( [
THREE.UniformsLib[ "common" ],
THREE.UniformsLib[ "aomap" ],
THREE.UniformsLib[ "fog" ],
THREE.UniformsLib[ "shadowmap" ],
{
"tintColor": {
type: 'c',
value: new THREE.Color( 0x00FF00FF )
},
"tintFlag": {
type: 'v2',
value: new THREE.Vector2( 0 , 0 )
}
}
] );
var vertexShader = [
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "uv_pars_vertex" ],
THREE.ShaderChunk[ "uv2_pars_vertex" ],
THREE.ShaderChunk[ "envmap_pars_vertex" ],
THREE.ShaderChunk[ "color_pars_vertex" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "skinning_pars_vertex" ],
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
"uniform vec3 tintColor;",
"varying vec3 vTintColor;",
"uniform vec2 tintFlag;",
"varying vec2 vTintFlag;",
"void main() {",
"vTintColor = tintColor;",
"vTintFlag = tintFlag;",
THREE.ShaderChunk[ "uv_vertex" ],
THREE.ShaderChunk[ "uv2_vertex" ],
THREE.ShaderChunk[ "color_vertex" ],
THREE.ShaderChunk[ "skinbase_vertex" ],
" #ifdef USE_ENVMAP",
THREE.ShaderChunk[ "beginnormal_vertex" ],
THREE.ShaderChunk[ "morphnormal_vertex" ],
THREE.ShaderChunk[ "skinnormal_vertex" ],
THREE.ShaderChunk[ "defaultnormal_vertex" ],
" #endif",
THREE.ShaderChunk[ "begin_vertex" ],
THREE.ShaderChunk[ "morphtarget_vertex" ],
THREE.ShaderChunk[ "skinning_vertex" ],
THREE.ShaderChunk[ "project_vertex" ],
THREE.ShaderChunk[ "logdepthbuf_vertex" ],
THREE.ShaderChunk[ "worldpos_vertex" ],
THREE.ShaderChunk[ "envmap_vertex" ],
THREE.ShaderChunk[ "shadowmap_vertex" ],
"}"
].join( "\n" );
var fragmentShader = [
"uniform vec3 diffuse;",
"uniform float opacity;",
"varying vec3 vTintColor;",
"varying vec2 vTintFlag;",
THREE.ShaderChunk[ "common" ],
THREE.ShaderChunk[ "color_pars_fragment" ],
THREE.ShaderChunk[ "uv_pars_fragment" ],
THREE.ShaderChunk[ "uv2_pars_fragment" ],
THREE.ShaderChunk[ "map_pars_fragment" ],
THREE.ShaderChunk[ "alphamap_pars_fragment" ],
THREE.ShaderChunk[ "aomap_pars_fragment" ],
THREE.ShaderChunk[ "envmap_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
THREE.ShaderChunk[ "specularmap_pars_fragment" ],
THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
"void main() {",
" vec3 outgoingLight = vec3( 0.0 );",
" vec4 diffuseColor = vec4( diffuse, opacity );",
" vec3 totalAmbientLight = vec3( 1.0 );", // hardwired
" vec3 shadowMask = vec3( 1.0 );",
THREE.ShaderChunk[ "logdepthbuf_fragment" ],
THREE.ShaderChunk[ "map_fragment" ],
THREE.ShaderChunk[ "color_fragment" ],
THREE.ShaderChunk[ "alphamap_fragment" ],
THREE.ShaderChunk[ "alphatest_fragment" ],
THREE.ShaderChunk[ "specularmap_fragment" ],
THREE.ShaderChunk[ "aomap_fragment" ],
THREE.ShaderChunk[ "shadowmap_fragment" ],
" outgoingLight = diffuseColor.rgb * totalAmbientLight * shadowMask;",
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
" if ( vTintFlag.x > 0.0) {",
" gl_FragColor = vec4( vTintColor , diffuseColor.a );",
" } else { ",
" gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
" }",
"}"
].join( "\n" );
super({
vertexShader:vertexShader,
fragmentShader:fragmentShader,
uniforms:uniforms,
defines:defines
});
this.setValues( parameters );
}
set map( v ){
this.uniforms.offsetRepeat.value.set( v.offset.x, v.offset.y, v.repeat.x, v.repeat.y );
this.uniforms.map.value = v;//THREE.ImageUtils.loadTexture(texture)
}
get map(){
return this.uniforms.map.value;
}
set color( v ){
this.uniforms.diffuse.value = v;
}
get color( ){
return this.uniforms.diffuse.value;
}
set tint( v ){
this.uniforms.tintColor.value = v;
}
get tint(){
return this.uniforms.tintColor.value;
}
set enableTint( v ){
this.uniforms.tintFlag.value.x = ( v === true ) ? 1 : 0 ;
}
get enableTint(){
return ( this.uniforms.tintFlag.value.x === 1 );
}
set opacity( v ){
if ( this.uniforms ){
this.uniforms.opacity.value = v;
} else {
super.opacity = v;
}
}
get opacity( ){
return this.uniforms.opacity.value;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment