179 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| /**
 | |
|  * `PackedPhongMaterial` inherited from THREE.MeshPhongMaterial
 | |
|  *
 | |
|  * @param {Object} parameters
 | |
|  */
 | |
| import {
 | |
| 	MeshPhongMaterial,
 | |
| 	ShaderChunk,
 | |
| 	ShaderLib,
 | |
| 	UniformsUtils,
 | |
| } from 'three';
 | |
| 
 | |
| class PackedPhongMaterial extends MeshPhongMaterial {
 | |
| 
 | |
| 	constructor( parameters ) {
 | |
| 
 | |
| 		super();
 | |
| 
 | |
| 		this.defines = {};
 | |
| 		this.type = 'PackedPhongMaterial';
 | |
| 		this.uniforms = UniformsUtils.merge( [
 | |
| 
 | |
| 			ShaderLib.phong.uniforms,
 | |
| 
 | |
| 			{
 | |
| 				quantizeMatPos: { value: null },
 | |
| 				quantizeMatUV: { value: null }
 | |
| 			}
 | |
| 
 | |
| 		] );
 | |
| 
 | |
| 		this.vertexShader = [
 | |
| 			'#define PHONG',
 | |
| 
 | |
| 			'varying vec3 vViewPosition;',
 | |
| 
 | |
| 			ShaderChunk.common,
 | |
| 			ShaderChunk.uv_pars_vertex,
 | |
| 			ShaderChunk.displacementmap_pars_vertex,
 | |
| 			ShaderChunk.envmap_pars_vertex,
 | |
| 			ShaderChunk.color_pars_vertex,
 | |
| 			ShaderChunk.fog_pars_vertex,
 | |
| 			ShaderChunk.normal_pars_vertex,
 | |
| 			ShaderChunk.morphtarget_pars_vertex,
 | |
| 			ShaderChunk.skinning_pars_vertex,
 | |
| 			ShaderChunk.shadowmap_pars_vertex,
 | |
| 			ShaderChunk.logdepthbuf_pars_vertex,
 | |
| 			ShaderChunk.clipping_planes_pars_vertex,
 | |
| 
 | |
| 			`#ifdef USE_PACKED_NORMAL
 | |
| 					#if USE_PACKED_NORMAL == 0
 | |
| 						vec3 decodeNormal(vec3 packedNormal)
 | |
| 						{
 | |
| 							float x = packedNormal.x * 2.0 - 1.0;
 | |
| 							float y = packedNormal.y * 2.0 - 1.0;
 | |
| 							vec2 scth = vec2(sin(x * PI), cos(x * PI));
 | |
| 							vec2 scphi = vec2(sqrt(1.0 - y * y), y);
 | |
| 							return normalize( vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y) );
 | |
| 						}
 | |
| 					#endif
 | |
| 
 | |
| 					#if USE_PACKED_NORMAL == 1
 | |
| 						vec3 decodeNormal(vec3 packedNormal)
 | |
| 						{
 | |
| 							vec3 v = vec3(packedNormal.xy, 1.0 - abs(packedNormal.x) - abs(packedNormal.y));
 | |
| 							if (v.z < 0.0)
 | |
| 							{
 | |
| 								v.xy = (1.0 - abs(v.yx)) * vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);
 | |
| 							}
 | |
| 							return normalize(v);
 | |
| 						}
 | |
| 					#endif
 | |
| 
 | |
| 					#if USE_PACKED_NORMAL == 2
 | |
| 						vec3 decodeNormal(vec3 packedNormal)
 | |
| 						{
 | |
| 							vec3 v = (packedNormal * 2.0) - 1.0;
 | |
| 							return normalize(v);
 | |
| 						}
 | |
| 					#endif
 | |
| 				#endif`,
 | |
| 
 | |
| 			`#ifdef USE_PACKED_POSITION
 | |
| 					#if USE_PACKED_POSITION == 0
 | |
| 						uniform mat4 quantizeMatPos;
 | |
| 					#endif
 | |
| 				#endif`,
 | |
| 
 | |
| 			`#ifdef USE_PACKED_UV
 | |
| 					#if USE_PACKED_UV == 1
 | |
| 						uniform mat3 quantizeMatUV;
 | |
| 					#endif
 | |
| 				#endif`,
 | |
| 
 | |
| 			`#ifdef USE_PACKED_UV
 | |
| 					#if USE_PACKED_UV == 0
 | |
| 						vec2 decodeUV(vec2 packedUV)
 | |
| 						{
 | |
| 							vec2 uv = (packedUV * 2.0) - 1.0;
 | |
| 							return uv;
 | |
| 						}
 | |
| 					#endif
 | |
| 
 | |
| 					#if USE_PACKED_UV == 1
 | |
| 						vec2 decodeUV(vec2 packedUV)
 | |
| 						{
 | |
| 							vec2 uv = ( vec3(packedUV, 1.0) * quantizeMatUV ).xy;
 | |
| 							return uv;
 | |
| 						}
 | |
| 					#endif
 | |
| 				#endif`,
 | |
| 
 | |
| 			'void main() {',
 | |
| 
 | |
| 			ShaderChunk.uv_vertex,
 | |
| 
 | |
| 			`#ifdef USE_MAP
 | |
| 					#ifdef USE_PACKED_UV
 | |
| 						vMapUv = decodeUV(vMapUv);
 | |
| 					#endif
 | |
| 				#endif`,
 | |
| 
 | |
| 			ShaderChunk.color_vertex,
 | |
| 			ShaderChunk.morphcolor_vertex,
 | |
| 
 | |
| 			ShaderChunk.beginnormal_vertex,
 | |
| 
 | |
| 			`#ifdef USE_PACKED_NORMAL
 | |
| 					objectNormal = decodeNormal(objectNormal);
 | |
| 				#endif
 | |
| 
 | |
| 				#ifdef USE_TANGENT
 | |
| 					vec3 objectTangent = vec3( tangent.xyz );
 | |
| 				#endif
 | |
| 				`,
 | |
| 
 | |
| 			ShaderChunk.morphnormal_vertex,
 | |
| 			ShaderChunk.skinbase_vertex,
 | |
| 			ShaderChunk.skinnormal_vertex,
 | |
| 			ShaderChunk.defaultnormal_vertex,
 | |
| 			ShaderChunk.normal_vertex,
 | |
| 
 | |
| 			ShaderChunk.begin_vertex,
 | |
| 
 | |
| 			`#ifdef USE_PACKED_POSITION
 | |
| 					#if USE_PACKED_POSITION == 0
 | |
| 						transformed = ( vec4(transformed, 1.0) * quantizeMatPos ).xyz;
 | |
| 					#endif
 | |
| 				#endif`,
 | |
| 
 | |
| 			ShaderChunk.morphtarget_vertex,
 | |
| 			ShaderChunk.skinning_vertex,
 | |
| 			ShaderChunk.displacementmap_vertex,
 | |
| 			ShaderChunk.project_vertex,
 | |
| 			ShaderChunk.logdepthbuf_vertex,
 | |
| 			ShaderChunk.clipping_planes_vertex,
 | |
| 
 | |
| 			'vViewPosition = - mvPosition.xyz;',
 | |
| 
 | |
| 			ShaderChunk.worldpos_vertex,
 | |
| 			ShaderChunk.envmap_vertex,
 | |
| 			ShaderChunk.shadowmap_vertex,
 | |
| 			ShaderChunk.fog_vertex,
 | |
| 
 | |
| 			'}',
 | |
| 		].join( '\n' );
 | |
| 
 | |
| 		// Use the original MeshPhongMaterial's fragmentShader.
 | |
| 		this.fragmentShader = ShaderLib.phong.fragmentShader;
 | |
| 
 | |
| 		this.setValues( parameters );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| export { PackedPhongMaterial };
 |