提交 79e58379 编写于 作者: M Mr.doob

Refactored WebGL classes.

上级 65c22da0
...@@ -4,12 +4,7 @@ export { SpritePlugin } from './renderers/webgl/plugins/SpritePlugin.js'; ...@@ -4,12 +4,7 @@ export { SpritePlugin } from './renderers/webgl/plugins/SpritePlugin.js';
export { LensFlarePlugin } from './renderers/webgl/plugins/LensFlarePlugin.js'; export { LensFlarePlugin } from './renderers/webgl/plugins/LensFlarePlugin.js';
export { WebGLUniforms } from './renderers/webgl/WebGLUniforms.js'; export { WebGLUniforms } from './renderers/webgl/WebGLUniforms.js';
export { WebGLTextures } from './renderers/webgl/WebGLTextures.js'; export { WebGLTextures } from './renderers/webgl/WebGLTextures.js';
export { export { WebGLState } from './renderers/webgl/WebGLState.js';
WebGLStencilBuffer,
WebGLDepthBuffer,
WebGLColorBuffer,
WebGLState
} from './renderers/webgl/WebGLState.js';
export { WebGLShadowMap } from './renderers/webgl/WebGLShadowMap.js'; export { WebGLShadowMap } from './renderers/webgl/WebGLShadowMap.js';
export { WebGLShader } from './renderers/webgl/WebGLShader.js'; export { WebGLShader } from './renderers/webgl/WebGLShader.js';
export { WebGLProperties } from './renderers/webgl/WebGLProperties.js'; export { WebGLProperties } from './renderers/webgl/WebGLProperties.js';
......
...@@ -1673,22 +1673,15 @@ function WebGLRenderer( parameters ) { ...@@ -1673,22 +1673,15 @@ function WebGLRenderer( parameters ) {
function setMaterial( material ) { function setMaterial( material ) {
if ( material.side !== DoubleSide ) material.side === DoubleSide
state.enable( _gl.CULL_FACE ); ? state.disable( _gl.CULL_FACE )
else : state.enable( _gl.CULL_FACE );
state.disable( _gl.CULL_FACE );
state.setFlipSided( material.side === BackSide ); state.setFlipSided( material.side === BackSide );
if ( material.transparent === true ) { material.transparent === true
? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )
state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); : state.setBlending( NoBlending );
} else {
state.setBlending( NoBlending );
}
state.setDepthFunc( material.depthFunc ); state.setDepthFunc( material.depthFunc );
state.setDepthTest( material.depthTest ); state.setDepthTest( material.depthTest );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @author mrdoob / http://mrdoob.com/ * @author mrdoob / http://mrdoob.com/
*/ */
function WebGLBufferRenderer( _gl, extensions, _infoRender ) { function WebGLBufferRenderer( gl, extensions, infoRender ) {
var mode; var mode;
...@@ -14,12 +14,12 @@ function WebGLBufferRenderer( _gl, extensions, _infoRender ) { ...@@ -14,12 +14,12 @@ function WebGLBufferRenderer( _gl, extensions, _infoRender ) {
function render( start, count ) { function render( start, count ) {
_gl.drawArrays( mode, start, count ); gl.drawArrays( mode, start, count );
_infoRender.calls ++; infoRender.calls ++;
_infoRender.vertices += count; infoRender.vertices += count;
if ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3; if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;
} }
...@@ -52,15 +52,18 @@ function WebGLBufferRenderer( _gl, extensions, _infoRender ) { ...@@ -52,15 +52,18 @@ function WebGLBufferRenderer( _gl, extensions, _infoRender ) {
} }
_infoRender.calls ++; infoRender.calls ++;
_infoRender.vertices += count * geometry.maxInstancedCount; infoRender.vertices += count * geometry.maxInstancedCount;
if ( mode === _gl.TRIANGLES ) _infoRender.faces += geometry.maxInstancedCount * count / 3;
if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;
} }
this.setMode = setMode; return {
this.render = render; setMode: setMode,
this.renderInstances = renderInstances; render: render,
renderInstances: renderInstances
};
} }
......
...@@ -56,40 +56,41 @@ function WebGLCapabilities( gl, extensions, parameters ) { ...@@ -56,40 +56,41 @@ function WebGLCapabilities( gl, extensions, parameters ) {
} }
this.getMaxAnisotropy = getMaxAnisotropy; var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
this.getMaxPrecision = getMaxPrecision; var maxPrecision = getMaxPrecision( precision );
this.precision = parameters.precision !== undefined ? parameters.precision : 'highp'; if ( maxPrecision !== precision ) {
this.logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false;
this.maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
this.maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); precision = maxPrecision;
this.maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
this.maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
this.maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); }
this.maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
this.maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
this.maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
this.vertexTextures = this.maxVertexTextures > 0; var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );
this.floatFragmentTextures = !! extensions.get( 'OES_texture_float' );
this.floatVertexTextures = this.vertexTextures && this.floatFragmentTextures;
var _maxPrecision = getMaxPrecision( this.precision ); return {
if ( _maxPrecision !== this.precision ) { getMaxAnisotropy: getMaxAnisotropy,
getMaxPrecision: getMaxPrecision,
console.warn( 'THREE.WebGLRenderer:', this.precision, 'not supported, using', _maxPrecision, 'instead.' ); precision: precision,
this.precision = _maxPrecision; logarithmicDepthBuffer: logarithmicDepthBuffer,
} maxTextures: gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ),
maxVertexTextures: gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ),
maxTextureSize: gl.getParameter( gl.MAX_TEXTURE_SIZE ),
maxCubemapSize: gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ),
if ( this.logarithmicDepthBuffer ) { maxAttributes: gl.getParameter( gl.MAX_VERTEX_ATTRIBS ),
maxVertexUniforms: gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ),
maxVaryings: gl.getParameter( gl.MAX_VARYING_VECTORS ),
maxFragmentUniforms: gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ),
this.logarithmicDepthBuffer = !! extensions.get( 'EXT_frag_depth' ); vertexTextures: this.maxVertexTextures > 0,
floatFragmentTextures: !! extensions.get( 'OES_texture_float' ),
floatVertexTextures: this.vertexTextures && this.floatFragmentTextures
} };
} }
......
...@@ -6,52 +6,56 @@ function WebGLExtensions( gl ) { ...@@ -6,52 +6,56 @@ function WebGLExtensions( gl ) {
var extensions = {}; var extensions = {};
this.get = function ( name ) { return {
if ( extensions[ name ] !== undefined ) { get: function ( name ) {
return extensions[ name ]; if ( extensions[ name ] !== undefined ) {
} return extensions[ name ];
var extension; }
switch ( name ) { var extension;
case 'WEBGL_depth_texture': switch ( name ) {
extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
break;
case 'EXT_texture_filter_anisotropic': case 'WEBGL_depth_texture':
extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
break; break;
case 'WEBGL_compressed_texture_s3tc': case 'EXT_texture_filter_anisotropic':
extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
break; break;
case 'WEBGL_compressed_texture_pvrtc': case 'WEBGL_compressed_texture_s3tc':
extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
break; break;
case 'WEBGL_compressed_texture_etc1': case 'WEBGL_compressed_texture_pvrtc':
extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );
break; break;
default: case 'WEBGL_compressed_texture_etc1':
extension = gl.getExtension( name ); extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );
break;
} default:
extension = gl.getExtension( name );
if ( extension === null ) { }
console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); if ( extension === null ) {
} console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
extensions[ name ] = extension; }
return extension; extensions[ name ] = extension;
return extension;
}
}; };
......
...@@ -8,44 +8,6 @@ function WebGLGeometries( gl, properties, info ) { ...@@ -8,44 +8,6 @@ function WebGLGeometries( gl, properties, info ) {
var geometries = {}; var geometries = {};
function get( object ) {
var geometry = object.geometry;
if ( geometries[ geometry.id ] !== undefined ) {
return geometries[ geometry.id ];
}
geometry.addEventListener( 'dispose', onGeometryDispose );
var buffergeometry;
if ( (geometry && geometry.isBufferGeometry) ) {
buffergeometry = geometry;
} else if ( (geometry && geometry.isGeometry) ) {
if ( geometry._bufferGeometry === undefined ) {
geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
}
buffergeometry = geometry._bufferGeometry;
}
geometries[ geometry.id ] = buffergeometry;
info.memory.geometries ++;
return buffergeometry;
}
function onGeometryDispose( event ) { function onGeometryDispose( event ) {
var geometry = event.target; var geometry = event.target;
...@@ -93,7 +55,7 @@ function WebGLGeometries( gl, properties, info ) { ...@@ -93,7 +55,7 @@ function WebGLGeometries( gl, properties, info ) {
function getAttributeBuffer( attribute ) { function getAttributeBuffer( attribute ) {
if ( (attribute && attribute.isInterleavedBufferAttribute) ) { if ( attribute.isInterleavedBufferAttribute ) {
return properties.get( attribute.data ).__webglBuffer; return properties.get( attribute.data ).__webglBuffer;
...@@ -128,7 +90,7 @@ function WebGLGeometries( gl, properties, info ) { ...@@ -128,7 +90,7 @@ function WebGLGeometries( gl, properties, info ) {
function removeAttributeBuffer( attribute ) { function removeAttributeBuffer( attribute ) {
if ( (attribute && attribute.isInterleavedBufferAttribute) ) { if ( attribute.isInterleavedBufferAttribute ) {
properties.delete( attribute.data ); properties.delete( attribute.data );
...@@ -140,7 +102,47 @@ function WebGLGeometries( gl, properties, info ) { ...@@ -140,7 +102,47 @@ function WebGLGeometries( gl, properties, info ) {
} }
this.get = get; return {
get: function ( object ) {
var geometry = object.geometry;
if ( geometries[ geometry.id ] !== undefined ) {
return geometries[ geometry.id ];
}
geometry.addEventListener( 'dispose', onGeometryDispose );
var buffergeometry;
if ( geometry.isBufferGeometry ) {
buffergeometry = geometry;
} else if ( geometry.isGeometry ) {
if ( geometry._bufferGeometry === undefined ) {
geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
}
buffergeometry = geometry._bufferGeometry;
}
geometries[ geometry.id ] = buffergeometry;
info.memory.geometries ++;
return buffergeometry;
}
};
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @author mrdoob / http://mrdoob.com/ * @author mrdoob / http://mrdoob.com/
*/ */
function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) { function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {
var mode; var mode;
...@@ -18,12 +18,12 @@ function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) { ...@@ -18,12 +18,12 @@ function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) {
if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {
type = _gl.UNSIGNED_INT; type = gl.UNSIGNED_INT;
size = 4; size = 4;
} else { } else {
type = _gl.UNSIGNED_SHORT; type = gl.UNSIGNED_SHORT;
size = 2; size = 2;
} }
...@@ -32,11 +32,12 @@ function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) { ...@@ -32,11 +32,12 @@ function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) {
function render( start, count ) { function render( start, count ) {
_gl.drawElements( mode, count, type, start * size ); gl.drawElements( mode, count, type, start * size );
_infoRender.calls ++; infoRender.calls ++;
_infoRender.vertices += count; infoRender.vertices += count;
if ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3;
if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;
} }
...@@ -53,15 +54,21 @@ function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) { ...@@ -53,15 +54,21 @@ function WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ) {
extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );
_infoRender.calls ++; infoRender.calls ++;
_infoRender.vertices += count * geometry.maxInstancedCount; infoRender.vertices += count * geometry.maxInstancedCount;
if ( mode === _gl.TRIANGLES ) _infoRender.faces += geometry.maxInstancedCount * count / 3;
if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;
} }
this.setMode = setMode; return {
this.setIndex = setIndex;
this.render = render; setMode: setMode,
this.renderInstances = renderInstances; setIndex: setIndex,
render: render,
renderInstances: renderInstances
};
} }
......
...@@ -10,74 +10,78 @@ function WebGLLights() { ...@@ -10,74 +10,78 @@ function WebGLLights() {
var lights = {}; var lights = {};
this.get = function ( light ) { return {
if ( lights[ light.id ] !== undefined ) { get: function ( light ) {
return lights[ light.id ]; if ( lights[ light.id ] !== undefined ) {
} return lights[ light.id ];
var uniforms; }
switch ( light.type ) {
case 'DirectionalLight':
uniforms = {
direction: new Vector3(),
color: new Color(),
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'SpotLight':
uniforms = {
position: new Vector3(),
direction: new Vector3(),
color: new Color(),
distance: 0,
coneCos: 0,
penumbraCos: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'PointLight':
uniforms = {
position: new Vector3(),
color: new Color(),
distance: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'HemisphereLight':
uniforms = {
direction: new Vector3(),
skyColor: new Color(),
groundColor: new Color()
};
break;
} var uniforms;
switch ( light.type ) {
case 'DirectionalLight':
uniforms = {
direction: new Vector3(),
color: new Color(),
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'SpotLight':
uniforms = {
position: new Vector3(),
direction: new Vector3(),
color: new Color(),
distance: 0,
coneCos: 0,
penumbraCos: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
lights[ light.id ] = uniforms; case 'PointLight':
uniforms = {
position: new Vector3(),
color: new Color(),
distance: 0,
decay: 0,
return uniforms; shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'HemisphereLight':
uniforms = {
direction: new Vector3(),
skyColor: new Color(),
groundColor: new Color()
};
break;
}
lights[ light.id ] = uniforms;
return uniforms;
}
}; };
......
...@@ -17,7 +17,7 @@ function WebGLObjects( gl, properties, info ) { ...@@ -17,7 +17,7 @@ function WebGLObjects( gl, properties, info ) {
var geometry = geometries.get( object ); var geometry = geometries.get( object );
if ( (object.geometry && object.geometry.isGeometry) ) { if ( object.geometry.isGeometry ) {
geometry.updateFromObject( object ); geometry.updateFromObject( object );
...@@ -60,7 +60,7 @@ function WebGLObjects( gl, properties, info ) { ...@@ -60,7 +60,7 @@ function WebGLObjects( gl, properties, info ) {
function updateAttribute( attribute, bufferType ) { function updateAttribute( attribute, bufferType ) {
var data = ( (attribute && attribute.isInterleavedBufferAttribute) ) ? attribute.data : attribute; var data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;
var attributeProperties = properties.get( data ); var attributeProperties = properties.get( data );
...@@ -118,7 +118,7 @@ function WebGLObjects( gl, properties, info ) { ...@@ -118,7 +118,7 @@ function WebGLObjects( gl, properties, info ) {
function getAttributeBuffer( attribute ) { function getAttributeBuffer( attribute ) {
if ( (attribute && attribute.isInterleavedBufferAttribute) ) { if ( attribute.isInterleavedBufferAttribute ) {
return properties.get( attribute.data ).__webglBuffer; return properties.get( attribute.data ).__webglBuffer;
...@@ -220,10 +220,14 @@ function WebGLObjects( gl, properties, info ) { ...@@ -220,10 +220,14 @@ function WebGLObjects( gl, properties, info ) {
} }
this.getAttributeBuffer = getAttributeBuffer; return {
this.getWireframeAttribute = getWireframeAttribute;
this.update = update; getAttributeBuffer: getAttributeBuffer,
getWireframeAttribute: getWireframeAttribute,
update: update
};
} }
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册