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 };
|