Created
January 19, 2016 17:53
-
-
Save karimbeyrouti/790d2e1a8c0137b16bae to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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