CanvasRenderer and SVGRenderer using single-material system.

Also moved `.overdraw` to Material.
Code is much simpler now :)
This commit is contained in:
Mr.doob
2011-10-23 13:50:55 +02:00
parent 806ecdfc04
commit ec00f298be
33 changed files with 1318 additions and 1470 deletions
+9 -10
View File
@@ -144,8 +144,8 @@ THREE.Projector = function() {
var near = camera.near, far = camera.far,
o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
objectMatrixWorld, objectMatrixWorldRotation, objectMaterials, objectOverdraw,
geometry, vertices, vertex, vertexPositionScreen,
objectMatrixWorld, objectMatrixWorldRotation, objectMaterial,
geometry, geometryMaterials, vertices, vertex, vertexPositionScreen,
faces, face, faceVertexNormals, normal, faceVertexUvs, uvs,
v1, v2, v3, v4;
@@ -178,14 +178,14 @@ THREE.Projector = function() {
object = _renderData.objects[ o ];
objectMatrixWorld = object.matrixWorld;
objectMaterials = object.materials;
objectOverdraw = object.overdraw;
objectMaterial = object.material;
_vertexCount = 0;
if ( object instanceof THREE.Mesh ) {
geometry = object.geometry;
geometryMaterials = object.geometry.materials;
vertices = geometry.vertices;
faces = geometry.faces;
faceVertexUvs = geometry.faceVertexUvs;
@@ -298,9 +298,8 @@ THREE.Projector = function() {
}
_face.meshMaterials = objectMaterials;
_face.faceMaterials = face.materials;
_face.overdraw = objectOverdraw;
_face.material = objectMaterial;
_face.faceMaterial = face.materialIndex !== null ? geometryMaterials[ face.materialIndex ] : null;
_face.z = _face.centroidScreen.z;
@@ -317,7 +316,7 @@ THREE.Projector = function() {
object = _renderData.lines[ o ];
objectMatrixWorld = object.matrixWorld;
objectMaterials = object.materials;
objectMaterial = object.material;
_vertexCount = 0;
@@ -354,7 +353,7 @@ THREE.Projector = function() {
_line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z );
_line.materials = objectMaterials;
_line.material = objectMaterial;
_renderData.elements.push( _line );
@@ -389,7 +388,7 @@ THREE.Projector = function() {
_particle.scale.x = object.scale.x * Math.abs( _particle.x - ( _vector4.x + camera.projectionMatrix.n11 ) / ( _vector4.w + camera.projectionMatrix.n14 ) );
_particle.scale.y = object.scale.y * Math.abs( _particle.y - ( _vector4.y + camera.projectionMatrix.n22 ) / ( _vector4.w + camera.projectionMatrix.n24 ) );
_particle.materials = object.materials;
_particle.material = object.material;
_renderData.elements.push( _particle );
+2
View File
@@ -24,6 +24,8 @@ THREE.Material = function ( parameters ) {
this.alphaTest = parameters.alphaTest !== undefined ? parameters.alphaTest : 0;
this.overdraw = parameters.overdraw !== undefined ? parameters.overdraw : false; // Boolean for fixing antialiasing gaps in CanvasRenderer
}
THREE.MaterialCount = 0;
+5 -1
View File
@@ -11,8 +11,12 @@ THREE.Mesh = function ( geometry, material ) {
this.geometry = geometry;
this.material = material;
this.overdraw = false; // TODO: Move to material?
if ( material instanceof Array ) {
console.warn( 'DEPRECATE: Material array is no longer supported. Using material 0...' );
this.material = material[ 0 ];
}
if ( this.geometry ) {
+12 -67
View File
@@ -173,7 +173,7 @@ THREE.CanvasRenderer = function ( parameters ) {
this.render = function ( scene, camera ) {
var e, el, element, m, ml, fm, fml, material;
var e, el, element, material;
this.autoClear ? this.clear() : _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf );
@@ -201,6 +201,11 @@ THREE.CanvasRenderer = function ( parameters ) {
element = _elements[ e ];
material = element.material;
material = material instanceof THREE.MeshFaceMaterial ? element.faceMaterial : material;
if ( material == null || material.opacity == 0 ) continue;
_bboxRect.empty();
if ( element instanceof THREE.RenderableParticle ) {
@@ -208,14 +213,7 @@ THREE.CanvasRenderer = function ( parameters ) {
_v1 = element;
_v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf;
m = 0; ml = element.materials.length;
while( m < ml ) {
material = element.materials[ m ++ ];
material.opacity != 0 && renderParticle( _v1, element, material, scene );
}
renderParticle( _v1, element, material, scene );
} else if ( element instanceof THREE.RenderableLine ) {
@@ -229,14 +227,7 @@ THREE.CanvasRenderer = function ( parameters ) {
if ( _clipRect.intersects( _bboxRect ) ) {
m = 0; ml = element.materials.length;
while ( m < ml ) {
material = element.materials[ m ++ ];
material.opacity != 0 && renderLine( _v1, _v2, element, material, scene );
}
renderLine( _v1, _v2, element, material, scene );
}
@@ -249,7 +240,7 @@ THREE.CanvasRenderer = function ( parameters ) {
_v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;
_v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf;
if ( element.overdraw ) {
if ( material.overdraw ) {
expand( _v1.positionScreen, _v2.positionScreen );
expand( _v2.positionScreen, _v3.positionScreen );
@@ -263,30 +254,7 @@ THREE.CanvasRenderer = function ( parameters ) {
if ( _clipRect.intersects( _bboxRect ) ) {
m = 0; ml = element.meshMaterials.length;
while ( m < ml ) {
material = element.meshMaterials[ m ++ ];
if ( material instanceof THREE.MeshFaceMaterial ) {
fm = 0; fml = element.faceMaterials.length;
while ( fm < fml ) {
material = element.faceMaterials[ fm ++ ];
material && material.opacity != 0 && renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material, scene );
}
continue;
}
material.opacity != 0 && renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material, scene );
}
renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material, scene );
}
@@ -302,7 +270,7 @@ THREE.CanvasRenderer = function ( parameters ) {
_v5.positionScreen.copy( _v2.positionScreen );
_v6.positionScreen.copy( _v4.positionScreen );
if ( element.overdraw ) {
if ( material.overdraw ) {
expand( _v1.positionScreen, _v2.positionScreen );
expand( _v2.positionScreen, _v4.positionScreen );
@@ -320,30 +288,7 @@ THREE.CanvasRenderer = function ( parameters ) {
if ( _clipRect.intersects( _bboxRect ) ) {
m = 0; ml = element.meshMaterials.length;
while ( m < ml ) {
material = element.meshMaterials[ m ++ ];
if ( material instanceof THREE.MeshFaceMaterial ) {
fm = 0; fml = element.faceMaterials.length;
while ( fm < fml ) {
material = element.faceMaterials[ fm ++ ];
material && material.opacity != 0 && renderFace4( _v1, _v2, _v3, _v4, _v5, _v6, element, material, scene );
}
continue;
}
material.opacity != 0 && renderFace4( _v1, _v2, _v3, _v4, _v5, _v6, element, material, scene );
}
material.opacity != 0 && renderFace4( _v1, _v2, _v3, _v4, _v5, _v6, element, material, scene );
}
+10 -63
View File
@@ -81,7 +81,7 @@ THREE.SVGRenderer = function () {
this.render = function ( scene, camera ) {
var e, el, m, ml, fm, fml, element, material;
var e, el, element, material;
this.autoClear && this.clear();
@@ -106,6 +106,11 @@ THREE.SVGRenderer = function () {
element = _elements[ e ];
material = element.material;
material = material instanceof THREE.MeshFaceMaterial ? element.faceMaterial : material;
if ( material == null || material.opacity == 0 ) continue;
_bboxRect.empty();
if ( element instanceof THREE.RenderableParticle ) {
@@ -115,12 +120,7 @@ THREE.SVGRenderer = function () {
m = 0; ml = element.materials.length;
while ( m < ml ) {
material = element.materials[ m ++ ];
material && renderParticle( _v1, element, material, scene );
}
renderParticle( _v1, element, material, scene );
} else if ( element instanceof THREE.RenderableLine ) {
@@ -138,14 +138,7 @@ THREE.SVGRenderer = function () {
}
m = 0; ml = element.materials.length;
while ( m < ml ) {
material = element.materials[ m ++ ];
material && material.opacity != 0 && renderLine( _v1, _v2, element, material, scene );
}
renderLine( _v1, _v2, element, material, scene );
} else if ( element instanceof THREE.RenderableFace3 ) {
@@ -165,30 +158,7 @@ THREE.SVGRenderer = function () {
}
m = 0; ml = element.meshMaterials.length;
while ( m < ml ) {
material = element.meshMaterials[ m ++ ];
if ( material instanceof THREE.MeshFaceMaterial ) {
fm = 0; fml = element.faceMaterials.length;
while ( fm < fml ) {
material = element.faceMaterials[ fm ++ ];
material && material.opacity != 0 && renderFace3( _v1, _v2, _v3, element, material, scene );
}
continue;
}
material && material.opacity != 0 && renderFace3( _v1, _v2, _v3, element, material, scene );
}
renderFace3( _v1, _v2, _v3, element, material, scene );
} else if ( element instanceof THREE.RenderableFace4 ) {
@@ -210,30 +180,7 @@ THREE.SVGRenderer = function () {
}
m = 0; ml = element.meshMaterials.length;
while ( m < ml ) {
material = element.meshMaterials[ m ++ ];
if ( material instanceof THREE.MeshFaceMaterial ) {
fm = 0; fml = element.faceMaterials.length;
while ( fm < fml ) {
material = element.faceMaterials[ fm ++ ];
material && material.opacity != 0 && renderFace4( _v1, _v2, _v3, _v4, element, material, scene );
}
continue;
}
material && material.opacity != 0 && renderFace4( _v1, _v2, _v3, _v4, element, material, scene );
}
renderFace4( _v1, _v2, _v3, _v4, element, material, scene );
}
+2 -3
View File
@@ -14,9 +14,8 @@ THREE.RenderableFace3 = function () {
this.normalWorld = new THREE.Vector3();
this.vertexNormalsWorld = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
this.meshMaterials = null;
this.faceMaterials = null;
this.overdraw = false;
this.material = null;
this.faceMaterial = null;
this.uvs = [[]];
this.z = null;
+2 -3
View File
@@ -15,9 +15,8 @@ THREE.RenderableFace4 = function () {
this.normalWorld = new THREE.Vector3();
this.vertexNormalsWorld = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
this.meshMaterials = null;
this.faceMaterials = null;
this.overdraw = false;
this.material = null;
this.faceMaterial = null;
this.uvs = [[]];
this.z = null;
+1 -1
View File
@@ -9,6 +9,6 @@ THREE.RenderableLine = function () {
this.v1 = new THREE.RenderableVertex();
this.v2 = new THREE.RenderableVertex();
this.materials = null;
this.material = null;
};
@@ -11,6 +11,6 @@ THREE.RenderableParticle = function () {
this.rotation = null;
this.scale = new THREE.Vector2();
this.materials = null;
this.material = null;
};