123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /**
- * @author alteredq / http://alteredqualia.com/
- */
- THREE.DeferredHelper = function ( parameters ) {
- var width = parameters.width;
- var height = parameters.height;
- var black = new THREE.Color( 0x000000 );
- var colorShader = THREE.ShaderDeferred[ "color" ];
- var normalShader = THREE.ShaderDeferred[ "normals" ];
- var bumpShader = THREE.ShaderDeferred[ "bump" ];
- var clipDepthShader = THREE.ShaderDeferred[ "clipDepth" ];
- this.unlitShader = THREE.ShaderDeferred[ "unlit" ];
- this.lightShader = THREE.ShaderDeferred[ "light" ];
- this.compositeShader = THREE.ShaderDeferred[ "composite" ];
- this.unlitShader.uniforms[ "viewWidth" ].value = width;
- this.unlitShader.uniforms[ "viewHeight" ].value = height;
- this.lightShader.uniforms[ "viewWidth" ].value = width;
- this.lightShader.uniforms[ "viewHeight" ].value = height;
- var matNormal = new THREE.ShaderMaterial( {
- uniforms: THREE.UniformsUtils.clone( normalShader.uniforms ),
- vertexShader: normalShader.vertexShader,
- fragmentShader: normalShader.fragmentShader
- } );
- var matClipDepth = new THREE.ShaderMaterial( {
- uniforms: THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
- vertexShader: clipDepthShader.vertexShader,
- fragmentShader: clipDepthShader.fragmentShader
- } );
- this.addDeferredMaterials = function ( object ) {
- object.traverse( function( node ) {
- if ( !node.material ) return;
- var originalMaterial = node.material;
- // color material
- // diffuse color
- // specular color
- // shininess
- // diffuse map
- // vertex colors
- // alphaTest
- // morphs
- var uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );
- var defines = { "USE_MAP": !! originalMaterial.map, "GAMMA_INPUT": true };
- var material = new THREE.ShaderMaterial( {
- fragmentShader: colorShader.fragmentShader,
- vertexShader: colorShader.vertexShader,
- uniforms: uniforms,
- defines: defines,
- shading: originalMaterial.shading
- } );
- var diffuse = originalMaterial.color;
- var specular = originalMaterial.specular !== undefined ? originalMaterial.specular : black;
- var shininess = originalMaterial.shininess !== undefined ? originalMaterial.shininess : 1;
- uniforms.diffuse.value.copy( diffuse );
- uniforms.specular.value.copy( specular );
- uniforms.shininess.value = shininess;
- uniforms.map.value = originalMaterial.map;
- material.vertexColors = originalMaterial.vertexColors;
- material.morphTargets = originalMaterial.morphTargets;
- material.morphNormals = originalMaterial.morphNormals;
- material.alphaTest = originalMaterial.alphaTest;
- if ( originalMaterial.bumpMap ) {
- var offset = originalMaterial.bumpMap.offset;
- var repeat = originalMaterial.bumpMap.repeat;
- uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
- }
- node.properties.colorMaterial = material;
- // normal material
- // vertex normals
- // morph normals
- // bump map
- // bump scale
- if ( originalMaterial.bumpMap ) {
- var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
- var normalMaterial = new THREE.ShaderMaterial( {
- uniforms: uniforms,
- vertexShader: bumpShader.vertexShader,
- fragmentShader: bumpShader.fragmentShader,
- defines: { "USE_BUMPMAP": true }
- } );
- uniforms.bumpMap.value = originalMaterial.bumpMap;
- uniforms.bumpScale.value = originalMaterial.bumpScale;
- var offset = originalMaterial.bumpMap.offset;
- var repeat = originalMaterial.bumpMap.repeat;
- uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
- node.properties.normalMaterial = normalMaterial;
- } else if ( originalMaterial.morphTargets ) {
- var normalMaterial = new THREE.ShaderMaterial( {
- uniforms: THREE.UniformsUtils.clone( normalShader.uniforms ),
- vertexShader: normalShader.vertexShader,
- fragmentShader: normalShader.fragmentShader,
- shading: originalMaterial.shading
- } );
- normalMaterial.morphTargets = originalMaterial.morphTargets;
- normalMaterial.morphNormals = originalMaterial.morphNormals;
- node.properties.normalMaterial = normalMaterial;
- } else {
- node.properties.normalMaterial = matNormal;
- }
- // depth material
- if ( originalMaterial.morphTargets ) {
- var depthMaterial = new THREE.ShaderMaterial( {
- uniforms: THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
- vertexShader: clipDepthShader.vertexShader,
- fragmentShader: clipDepthShader.fragmentShader
- } );
- depthMaterial.morphTargets = originalMaterial.morphTargets;
- node.properties.depthMaterial = depthMaterial;
- } else {
- node.properties.depthMaterial = matClipDepth;
- }
- } );
- }
- };
|