|
@@ -36,14 +36,14 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
// heuristics to create shader parameters according to lights in the scene
|
|
|
// (not to blow over maxLights budget)
|
|
|
|
|
|
- maxLightCount = allocateLights( parameters.scene, 4 );
|
|
|
+ maxLightCount = allocateLights( parameters.scene, 4 ),
|
|
|
fog = parameters.scene ? parameters.scene.fog : null,
|
|
|
-
|
|
|
+
|
|
|
antialias = parameters.antialias != undefined ? parameters.antialias : true,
|
|
|
-
|
|
|
+
|
|
|
clearColor = parameters.clearColor ? new THREE.Color( parameters.clearColor ) : new THREE.Color( 0x000000 ),
|
|
|
clearAlpha = parameters.clearAlpha ? parameters.clearAlpha : 0;
|
|
|
-
|
|
|
+
|
|
|
this.domElement = _canvas;
|
|
|
this.autoClear = true;
|
|
|
|
|
@@ -63,12 +63,12 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
};
|
|
|
|
|
|
this.setClearColor = function( hex, alpha ) {
|
|
|
-
|
|
|
+
|
|
|
var color = new THREE.Color( hex );
|
|
|
_gl.clearColor( color.r, color.g, color.b, alpha );
|
|
|
-
|
|
|
+
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
this.clear = function () {
|
|
|
|
|
|
_gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );
|
|
@@ -172,7 +172,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.createBuffers = function ( object, g ) {
|
|
|
|
|
|
- var f, fl, fi, face, vertexNormals, normal, uv, v1, v2, v3, v4, t1, t2, t3, t4, m, ml, i,
|
|
|
+ var f, fl, fi, face, vertexNormals, faceNormal, normal, uv, v1, v2, v3, v4, t1, t2, t3, t4, m, ml, i,
|
|
|
|
|
|
faceArray = [],
|
|
|
lineArray = [],
|
|
@@ -371,7 +371,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
geometryChunk.__webGLLineCount = lineArray.length;
|
|
|
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
function setMaterialShaders( material, shaders ) {
|
|
|
|
|
|
material.fragment_shader = shaders.fragment_shader;
|
|
@@ -381,36 +381,36 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
};
|
|
|
|
|
|
function refreshUniforms( material, fog ) {
|
|
|
-
|
|
|
+
|
|
|
material.uniforms.color.value.setHex( material.color.hex );
|
|
|
material.uniforms.opacity.value = material.opacity;
|
|
|
material.uniforms.map.texture = material.map;
|
|
|
-
|
|
|
+
|
|
|
material.uniforms.env_map.texture = material.env_map;
|
|
|
material.uniforms.reflectivity.value = material.reflectivity;
|
|
|
material.uniforms.refraction_ratio.value = material.refraction_ratio;
|
|
|
material.uniforms.combine.value = material.combine;
|
|
|
material.uniforms.useRefract.value = material.env_map && material.env_map.mapping instanceof THREE.CubeRefractionMapping;
|
|
|
-
|
|
|
+
|
|
|
if ( fog ) {
|
|
|
|
|
|
material.uniforms.fogColor.value.setHex( fog.color.hex );
|
|
|
-
|
|
|
+
|
|
|
if ( fog instanceof THREE.Fog ) {
|
|
|
-
|
|
|
+
|
|
|
material.uniforms.fogNear.value = fog.near;
|
|
|
material.uniforms.fogFar.value = fog.far;
|
|
|
-
|
|
|
+
|
|
|
} else if ( fog instanceof THREE.FogExp2 ) {
|
|
|
-
|
|
|
+
|
|
|
material.uniforms.fogDensity.value = fog.density;
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
this.renderBuffer = function ( camera, lights, fog, material, geometryChunk ) {
|
|
|
|
|
|
var mColor, mOpacity, mReflectivity,
|
|
@@ -423,7 +423,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( material instanceof THREE.MeshShaderMaterial ||
|
|
|
material instanceof THREE.MeshDepthMaterial ||
|
|
|
- material instanceof THREE.MeshNormalMaterial ||
|
|
|
+ material instanceof THREE.MeshNormalMaterial ||
|
|
|
material instanceof THREE.MeshBasicMaterial ) {
|
|
|
|
|
|
if ( !material.program ) {
|
|
@@ -440,11 +440,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
|
|
|
|
|
|
} else if ( material instanceof THREE.MeshBasicMaterial ) {
|
|
|
-
|
|
|
+
|
|
|
setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
|
|
|
-
|
|
|
+
|
|
|
refreshUniforms( material, fog );
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
material.program = buildProgram( material.fragment_shader, material.vertex_shader, { fog: fog, map: material.map, env_map: material.env_map } );
|
|
@@ -486,11 +486,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
this.loadMatrices( program );
|
|
|
|
|
|
if ( material instanceof THREE.MeshBasicMaterial ) {
|
|
|
-
|
|
|
+
|
|
|
refreshUniforms( material, fog );
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if ( material instanceof THREE.MeshShaderMaterial ||
|
|
|
material instanceof THREE.MeshDepthMaterial ||
|
|
|
material instanceof THREE.MeshNormalMaterial ||
|
|
@@ -536,16 +536,16 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( fog ) {
|
|
|
|
|
|
_gl.uniform3f( program.uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );
|
|
|
-
|
|
|
+
|
|
|
if ( fog instanceof THREE.Fog ) {
|
|
|
-
|
|
|
+
|
|
|
_gl.uniform1f( program.uniforms.fogNear, fog.near );
|
|
|
_gl.uniform1f( program.uniforms.fogFar, fog.far );
|
|
|
-
|
|
|
+
|
|
|
} else if ( fog instanceof THREE.FogExp2 ) {
|
|
|
-
|
|
|
+
|
|
|
_gl.uniform1f( program.uniforms.fogDensity, fog.density );
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -990,7 +990,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
|
|
|
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
function generateFragmentShader( maxDirLights, maxPointLights ) {
|
|
|
|
|
|
var chunks = [
|
|
@@ -1016,7 +1016,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
"uniform float mShininess;",
|
|
|
|
|
|
THREE.Snippets[ "fog_uniforms" ],
|
|
|
-
|
|
|
+
|
|
|
"uniform int pointLightNumber;",
|
|
|
"uniform int directionalLightNumber;",
|
|
|
|
|
@@ -1158,7 +1158,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
"}",
|
|
|
|
|
|
THREE.Snippets[ "fog_fragment" ],
|
|
|
-
|
|
|
+
|
|
|
"}" ];
|
|
|
|
|
|
return chunks.join("\n");
|
|
@@ -1273,7 +1273,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
parameters.fog ? "#define USE_FOG" : "",
|
|
|
parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
|
|
|
-
|
|
|
+
|
|
|
parameters.map ? "#define USE_MAP" : "",
|
|
|
parameters.env_map ? "#define USE_ENVMAP" : "",
|
|
|
|
|
@@ -1457,7 +1457,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
};
|
|
|
|
|
|
function initUbershader( maxDirLights, maxPointLights, fog ) {
|
|
|
-
|
|
|
+
|
|
|
var vertex_shader = generateVertexShader( maxDirLights, maxPointLights ),
|
|
|
fragment_shader = generateFragmentShader( maxDirLights, maxPointLights ),
|
|
|
program;
|
|
@@ -1580,7 +1580,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function bufferNeedsSmoothNormals( geometryChunk, object ) {
|
|
|
|
|
|
- var m, ml, i, l, needsSmoothNormals = false;
|
|
|
+ var m, ml, i, l, meshMaterial, needsSmoothNormals = false;
|
|
|
|
|
|
for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
|
|
|
|
|
@@ -1622,7 +1622,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( scene ) {
|
|
|
|
|
|
- var l, ll, light, dirLights = pointLights = maxDirLights = maxPointLights = 0;
|
|
|
+ var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
|
|
|
+ dirLights = pointLights = maxDirLights = maxPointLights = 0;
|
|
|
|
|
|
for ( l = 0, ll = scene.lights.length; l < ll; l++ ) {
|
|
|
|
|
@@ -1688,28 +1689,28 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
};
|
|
|
|
|
|
THREE.Snippets = {
|
|
|
-
|
|
|
+
|
|
|
fog_uniforms: [
|
|
|
|
|
|
"#ifdef USE_FOG",
|
|
|
-
|
|
|
+
|
|
|
"uniform vec3 fogColor;",
|
|
|
-
|
|
|
+
|
|
|
"#ifdef FOG_EXP2",
|
|
|
"uniform float fogDensity;",
|
|
|
"#else",
|
|
|
"uniform float fogNear;",
|
|
|
"uniform float fogFar;",
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
"#endif"
|
|
|
-
|
|
|
+
|
|
|
].join("\n"),
|
|
|
|
|
|
fog_fragment: [
|
|
|
|
|
|
"#ifdef USE_FOG",
|
|
|
-
|
|
|
+
|
|
|
"float depth = gl_FragCoord.z / gl_FragCoord.w;",
|
|
|
|
|
|
"#ifdef FOG_EXP2",
|
|
@@ -1719,13 +1720,13 @@ THREE.Snippets = {
|
|
|
"#else",
|
|
|
"float fogFactor = smoothstep( fogNear, fogFar, depth );",
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
"gl_FragColor = mix( gl_FragColor, vec4( fogColor, 1.0 ), fogFactor );",
|
|
|
|
|
|
"#endif"
|
|
|
-
|
|
|
+
|
|
|
].join("\n")
|
|
|
-
|
|
|
+
|
|
|
};
|
|
|
|
|
|
THREE.ShaderLib = {
|
|
@@ -1794,9 +1795,9 @@ THREE.ShaderLib = {
|
|
|
].join("\n")
|
|
|
|
|
|
},
|
|
|
-
|
|
|
+
|
|
|
'basic': {
|
|
|
-
|
|
|
+
|
|
|
uniforms: { "color" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
|
|
|
"opacity" : { type: "f", value: 1 },
|
|
|
"map" : { type: "t", value: 0, texture: null },
|
|
@@ -1810,32 +1811,32 @@ THREE.ShaderLib = {
|
|
|
"fogFar" : { type: "f", value: 2000 },
|
|
|
"fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
|
|
|
},
|
|
|
-
|
|
|
+
|
|
|
fragment_shader: [
|
|
|
-
|
|
|
+
|
|
|
"uniform vec3 color;",
|
|
|
"uniform float opacity;",
|
|
|
-
|
|
|
+
|
|
|
"#ifdef USE_MAP",
|
|
|
-
|
|
|
+
|
|
|
"varying vec2 vUv;",
|
|
|
"uniform sampler2D map;",
|
|
|
-
|
|
|
+
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
"#ifdef USE_ENVMAP",
|
|
|
-
|
|
|
+
|
|
|
"varying vec3 vReflect;",
|
|
|
"uniform float reflectivity;",
|
|
|
"uniform samplerCube env_map;",
|
|
|
"uniform int combine;",
|
|
|
-
|
|
|
+
|
|
|
"#endif",
|
|
|
|
|
|
THREE.Snippets[ "fog_uniforms" ],
|
|
|
-
|
|
|
+
|
|
|
"void main() {",
|
|
|
-
|
|
|
+
|
|
|
"vec4 mColor = vec4( color, opacity );",
|
|
|
"vec4 mapColor = vec4( 1.0, 1.0, 1.0, 1.0 );",
|
|
|
"vec4 cubeColor = vec4( 1.0, 1.0, 1.0, 1.0 );",
|
|
@@ -1849,11 +1850,11 @@ THREE.ShaderLib = {
|
|
|
"#endif",
|
|
|
|
|
|
// environment map
|
|
|
-
|
|
|
+
|
|
|
"#ifdef USE_ENVMAP",
|
|
|
|
|
|
"cubeColor = textureCube( env_map, vec3( -vReflect.x, vReflect.yz ) );",
|
|
|
-
|
|
|
+
|
|
|
"if ( combine == 1 ) {",
|
|
|
|
|
|
"gl_FragColor = mix( mColor * mapColor, cubeColor, reflectivity );",
|
|
@@ -1863,48 +1864,48 @@ THREE.ShaderLib = {
|
|
|
"gl_FragColor = mColor * mapColor * cubeColor;",
|
|
|
|
|
|
"}",
|
|
|
-
|
|
|
+
|
|
|
"#else",
|
|
|
-
|
|
|
+
|
|
|
"gl_FragColor = mColor * mapColor;",
|
|
|
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
THREE.Snippets[ "fog_fragment" ],
|
|
|
-
|
|
|
+
|
|
|
"}"
|
|
|
|
|
|
].join("\n"),
|
|
|
-
|
|
|
+
|
|
|
vertex_shader: [
|
|
|
-
|
|
|
+
|
|
|
"#ifdef USE_MAP",
|
|
|
-
|
|
|
+
|
|
|
"varying vec2 vUv;",
|
|
|
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
"#ifdef USE_ENVMAP",
|
|
|
-
|
|
|
+
|
|
|
"varying vec3 vReflect;",
|
|
|
"uniform float refraction_ratio;",
|
|
|
"uniform bool useRefract;",
|
|
|
-
|
|
|
+
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
"void main() {",
|
|
|
-
|
|
|
+
|
|
|
"#ifdef USE_MAP",
|
|
|
-
|
|
|
+
|
|
|
"vUv = uv;",
|
|
|
-
|
|
|
+
|
|
|
"#endif",
|
|
|
|
|
|
"#ifdef USE_ENVMAP",
|
|
|
-
|
|
|
+
|
|
|
"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
|
|
|
"vec3 nWorld = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;",
|
|
|
-
|
|
|
+
|
|
|
"if ( useRefract ) {",
|
|
|
|
|
|
"vReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refraction_ratio );",
|
|
@@ -1916,13 +1917,13 @@ THREE.ShaderLib = {
|
|
|
"}",
|
|
|
|
|
|
"#endif",
|
|
|
-
|
|
|
+
|
|
|
"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
|
|
|
|
|
|
"}"
|
|
|
|
|
|
].join("\n")
|
|
|
-
|
|
|
- }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
};
|