mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-26 05:15:58 +10:00
CanvasRenderer and SVGRenderer using single-material system.
Also moved `.overdraw` to Material. Code is much simpler now :)
This commit is contained in:
+9
-10
@@ -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 );
|
||||
|
||||
|
||||
@@ -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
@@ -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 ) {
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user