| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | ( function () {	/** * MMD Toon Shader * * This shader is extended from MeshPhongMaterial, and merged algorithms with * MeshToonMaterial and MeshMetcapMaterial. * Ideas came from https://github.com/mrdoob/three.js/issues/19609 * * Combining steps: *  * Declare matcap uniform. *  * Add gradientmap_pars_fragment. *  * Use gradient irradiances instead of dotNL irradiance from MeshPhongMaterial. *    (Replace lights_phong_pars_fragment with lights_mmd_toon_pars_fragment) *  * Add mmd_toon_matcap_fragment. */	const lights_mmd_toon_pars_fragment = `varying vec3 vViewPosition;struct BlinnPhongMaterial {	vec3 diffuseColor;	vec3 specularColor;	float specularShininess;	float specularStrength;};void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {	vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;	reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );	reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;}void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {	reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );}#define RE_Direct				RE_Direct_BlinnPhong#define RE_IndirectDiffuse		RE_IndirectDiffuse_BlinnPhong#define Material_LightProbeLOD( material )	(0)`;	const mmd_toon_matcap_fragment = `#ifdef USE_MATCAP	vec3 viewDir = normalize( vViewPosition );	vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );	vec3 y = cross( viewDir, x );	vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks	vec4 matcapColor = texture2D( matcap, uv );	matcapColor = matcapTexelToLinear( matcapColor );	#ifdef MATCAP_BLENDING_MULTIPLY		outgoingLight *= matcapColor.rgb;	#elif defined( MATCAP_BLENDING_ADD )		outgoingLight += matcapColor.rgb;	#endif#endif`;	const MMDToonShader = {		defines: {			TOON: true,			MATCAP: true,			MATCAP_BLENDING_ADD: true		},		uniforms: THREE.UniformsUtils.merge( [ THREE.ShaderLib.toon.uniforms, THREE.ShaderLib.phong.uniforms, THREE.ShaderLib.matcap.uniforms ] ),		vertexShader: THREE.ShaderLib.phong.vertexShader,		fragmentShader: THREE.ShaderLib.phong.fragmentShader.replace( '#include <common>', `					#ifdef USE_MATCAP						uniform sampler2D matcap;					#endif					#include <common>				` ).replace( '#include <envmap_common_pars_fragment>', `					#include <gradientmap_pars_fragment>					#include <envmap_common_pars_fragment>				` ).replace( '#include <lights_phong_pars_fragment>', lights_mmd_toon_pars_fragment ).replace( '#include <envmap_fragment>', `					#include <envmap_fragment>					${mmd_toon_matcap_fragment}				` )	};	THREE.MMDToonShader = MMDToonShader;} )();
 |