Added data object ( vertices, faces ) to Canvas/SVG/WebGLRenderer to get some render counts from the last render call.

This commit is contained in:
Mr.doob
2011-04-12 09:25:22 +01:00
parent ae327f8ba1
commit 92d702d95d
9 changed files with 592 additions and 551 deletions
+18 -2
View File
@@ -4,7 +4,8 @@
THREE.CanvasRenderer = function () {
var _renderList = null,
var _this = this,
_renderList = null,
_projector = new THREE.Projector(),
_canvas = document.createElement( 'canvas' ),
@@ -81,6 +82,13 @@ THREE.CanvasRenderer = function () {
this.sortObjects = true;
this.sortElements = true;
this.data = {
vertices: 0,
faces: 0
}
this.setSize = function ( width, height ) {
_canvasWidth = width;
@@ -152,6 +160,9 @@ THREE.CanvasRenderer = function () {
this.autoClear ? this.clear() : _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf );
_this.data.vertices = 0;
_this.data.faces = 0;
_renderList = _projector.projectScene( scene, camera, this.sortElements );
/* DEBUG
@@ -538,6 +549,9 @@ THREE.CanvasRenderer = function () {
function renderFace3( v1, v2, v3, uv1, uv2, uv3, element, material, scene ) {
_this.data.vertices += 3;
_this.data.faces ++;
setOpacity( material.opacity );
setBlending( material.blending );
@@ -561,7 +575,6 @@ THREE.CanvasRenderer = function () {
} else if ( material.envMap ) {
if ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) {
var cameraMatrix = camera.matrixWorldInverse;
@@ -684,6 +697,9 @@ THREE.CanvasRenderer = function () {
function renderFace4( v1, v2, v3, v4, v5, v6, element, material, scene ) {
_this.data.vertices += 4;
_this.data.faces ++;
setOpacity( material.opacity );
setBlending( material.blending );
+18 -5
View File
@@ -4,7 +4,8 @@
THREE.SVGRenderer = function () {
var _renderList = null,
var _this = this,
_renderList = null,
_projector = new THREE.Projector(),
_svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
_svgWidth, _svgHeight, _svgWidthHalf, _svgHeightHalf,
@@ -34,6 +35,13 @@ THREE.SVGRenderer = function () {
this.sortObjects = true;
this.sortElements = true;
this.data = {
vertices: 0,
faces: 0
}
this.setQuality = function( quality ) {
switch(quality) {
@@ -72,11 +80,10 @@ THREE.SVGRenderer = function () {
var e, el, m, ml, fm, fml, element, material;
if ( this.autoClear ) {
this.autoClear && this.clear();
this.clear();
}
_this.data.vertices = 0;
_this.data.faces = 0;
_renderList = _projector.projectScene( scene, camera, this.sortElements );
@@ -368,6 +375,9 @@ THREE.SVGRenderer = function () {
function renderFace3( v1, v2, v3, element, material, scene ) {
_this.data.vertices += 3;
_this.data.faces ++;
_svgNode = getPathNode( _pathCount ++ );
_svgNode.setAttribute( 'd', 'M ' + v1.positionScreen.x + ' ' + v1.positionScreen.y + ' L ' + v2.positionScreen.x + ' ' + v2.positionScreen.y + ' L ' + v3.positionScreen.x + ',' + v3.positionScreen.y + 'z' );
@@ -424,6 +434,9 @@ THREE.SVGRenderer = function () {
function renderFace4( v1, v2, v3, v4, element, material, scene ) {
_this.data.vertices += 4;
_this.data.faces ++;
_svgNode = getPathNode( _pathCount ++ );
_svgNode.setAttribute( 'd', 'M ' + v1.positionScreen.x + ' ' + v1.positionScreen.y + ' L ' + v2.positionScreen.x + ' ' + v2.positionScreen.y + ' L ' + v3.positionScreen.x + ',' + v3.positionScreen.y + ' L ' + v4.positionScreen.x + ',' + v4.positionScreen.y + 'z' );
+61 -52
View File
@@ -20,15 +20,13 @@ THREE.WebGLRenderer = function ( parameters ) {
// See http://code.google.com/p/chromium/issues/detail?id=63491
var _gl,
_canvas = document.createElement( 'canvas' ),
var _this = this,
_gl, _canvas = document.createElement( 'canvas' ),
_programs = [],
_currentProgram = null,
_currentFramebuffer = null,
_currentDepthMask = true,
_this = this,
// gl state cache
_oldDoubleSided = null,
@@ -79,6 +77,12 @@ THREE.WebGLRenderer = function ( parameters ) {
clearColor = parameters.clearColor !== undefined ? new THREE.Color( parameters.clearColor ) : new THREE.Color( 0x000000 );
clearAlpha = parameters.clearAlpha !== undefined ? parameters.clearAlpha : 0;
this.data = {
vertices: 0,
faces: 0
}
this.maxMorphTargets = 8;
this.domElement = _canvas;
@@ -2576,6 +2580,9 @@ THREE.WebGLRenderer = function ( parameters ) {
}
_this.data.vertices += geometryGroup.__webglFaceCount;
_this.data.faces += geometryGroup.__webglFaceCount / 3;
// render lines
} else if ( object instanceof THREE.Line ) {
@@ -2924,6 +2931,9 @@ THREE.WebGLRenderer = function ( parameters ) {
lights = scene.lights,
fog = scene.fog;
_this.data.vertices = 0;
_this.data.faces = 0;
camera.matrixAutoUpdate && camera.update( undefined, true );
scene.update( undefined, false, camera );
@@ -3550,96 +3560,95 @@ THREE.WebGLRenderer = function ( parameters ) {
// screen cull
if( _lensFlare.hasVertexTexture ||
( screenPositionPixels[ 0 ] > 0 &&
if ( _lensFlare.hasVertexTexture || ( screenPositionPixels[ 0 ] > 0 &&
screenPositionPixels[ 0 ] < _viewportWidth &&
screenPositionPixels[ 1 ] > 0 &&
screenPositionPixels[ 1 ] < _viewportHeight )) {
// save current RGB to temp texture
_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );
_gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16, 0 );
// render pink quad
_gl.uniform1i( uniforms.renderType, 0 );
_gl.uniform2fv( uniforms.scale, scale );
_gl.uniform3fv( uniforms.screenPosition, screenPosition );
_gl.disable( _gl.BLEND );
_gl.enable( _gl.DEPTH_TEST );
_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
// copy result to occlusionMap
_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture );
_gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16, 0 );
// restore graphics
_gl.uniform1i( uniforms.renderType, 1 );
_gl.disable( _gl.DEPTH_TEST );
_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );
_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
// update object positions
object.positionScreen.x = screenPosition[ 0 ];
object.positionScreen.y = screenPosition[ 1 ];
object.positionScreen.z = screenPosition[ 2 ];
if ( object.customUpdateCallback ) {
object.customUpdateCallback( object );
} else {
object.updateLensFlares();
}
// render flares
_gl.uniform1i( uniforms.renderType, 2 );
_gl.enable( _gl.BLEND );
for ( f = 0, fl = object.lensFlares.length; f < fl; f ++ ) {
flare = object.lensFlares[ f ];
if ( flare.opacity > 0.001 && flare.scale > 0.001 ) {
screenPosition[ 0 ] = flare.x;
screenPosition[ 1 ] = flare.y;
screenPosition[ 2 ] = flare.z;
size = flare.size * flare.scale / _viewportHeight;
scale[ 0 ] = size * invAspect;
scale[ 1 ] = size;
_gl.uniform3fv( uniforms.screenPosition, screenPosition );
_gl.uniform2fv( uniforms.scale, scale );
_gl.uniform1f( uniforms.rotation, flare.rotation );
_gl.uniform1f( uniforms.opacity, flare.opacity );
setBlending( flare.blending );
setTexture( flare.texture, 1 );
_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
}
}
}
}
@@ -4211,7 +4220,7 @@ THREE.WebGLRenderer = function ( parameters ) {
}
}
//console.log( "building new program " );
//
@@ -4629,29 +4638,29 @@ THREE.WebGLRenderer = function ( parameters ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webglFramebuffer );
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webglTexture, 0 );
if( renderTexture.depthBuffer && !renderTexture.stencilBuffer ) {
if ( renderTexture.depthBuffer && !renderTexture.stencilBuffer ) {
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webglRenderbuffer );
/* For some reason this is not working. Defaulting to RGBA4.
/* For some reason this is not working. Defaulting to RGBA4.
} else if( !renderTexture.depthBuffer && renderTexture.stencilBuffer ) {
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTexture.width, renderTexture.height );
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webglRenderbuffer );
*/
} else if( renderTexture.depthBuffer && renderTexture.stencilBuffer ) {
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTexture.width, renderTexture.height );
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webglRenderbuffer );
} else {
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTexture.width, renderTexture.height );
}
// Release everything