提交 55e0a843 编写于 作者: M Mr.doob

Projector now negates (inverts?) the normals when culled and flipSided || doubleSided. Fixes #1270.

上级 b716ed40
因为 它太大了无法显示 source diff 。你可以改为 查看blob
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -101,7 +101,6 @@
geometry.computeVertexNormals();
mesh = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: 0xffffff, overdraw: true } ) );
mesh.overdraw = true;
scene.add( mesh );
} );
......
......@@ -130,9 +130,9 @@ THREE.Projector = function() {
this.projectScene = function ( scene, camera, sort ) {
var near = camera.near, far = camera.far,
var near = camera.near, far = camera.far, visible = false,
o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
objectMatrixWorld, objectMatrixWorldRotation, objectMaterial,
objectMatrixWorld, objectMatrixWorldRotation,
geometry, geometryMaterials, vertices, vertex, vertexPositionScreen,
faces, face, faceVertexNormals, normal, faceVertexUvs, uvs,
v1, v2, v3, v4;
......@@ -166,7 +166,6 @@ THREE.Projector = function() {
object = _renderData.objects[ o ].object;
objectMatrixWorld = object.matrixWorld;
objectMaterial = object.material;
_vertexCount = 0;
......@@ -207,16 +206,24 @@ THREE.Projector = function() {
v2 = _vertexPool[ face.b ];
v3 = _vertexPool[ face.c ];
if ( v1.visible && v2.visible && v3.visible &&
( object.doubleSided || ( object.flipSided !=
( v3.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
( v3.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ) ) ) {
if ( v1.visible && v2.visible && v3.visible ) {
_face = getNextFace3InPool();
visible = ( ( v3.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
( v3.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) ) < 0;
_face.v1.copy( v1 );
_face.v2.copy( v2 );
_face.v3.copy( v3 );
if ( object.doubleSided || visible != object.flipSided ) {
_face = getNextFace3InPool();
_face.v1.copy( v1 );
_face.v2.copy( v2 );
_face.v3.copy( v3 );
} else {
continue;
}
} else {
......@@ -231,19 +238,28 @@ THREE.Projector = function() {
v3 = _vertexPool[ face.c ];
v4 = _vertexPool[ face.d ];
if ( v1.visible && v2.visible && v3.visible && v4.visible &&
( object.doubleSided || ( object.flipSided !=
( ( v4.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
( v4.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ||
( v2.positionScreen.x - v3.positionScreen.x ) * ( v4.positionScreen.y - v3.positionScreen.y ) -
( v2.positionScreen.y - v3.positionScreen.y ) * ( v4.positionScreen.x - v3.positionScreen.x ) < 0 ) ) ) ) {
if ( v1.visible && v2.visible && v3.visible && v4.visible ) {
visible = ( v4.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
( v4.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ||
( v2.positionScreen.x - v3.positionScreen.x ) * ( v4.positionScreen.y - v3.positionScreen.y ) -
( v2.positionScreen.y - v3.positionScreen.y ) * ( v4.positionScreen.x - v3.positionScreen.x ) < 0;
if ( object.doubleSided || visible != object.flipSided ) {
_face = getNextFace4InPool();
_face.v1.copy( v1 );
_face.v2.copy( v2 );
_face.v3.copy( v3 );
_face.v4.copy( v4 );
} else {
_face = getNextFace4InPool();
continue;
_face.v1.copy( v1 );
_face.v2.copy( v2 );
_face.v3.copy( v3 );
_face.v4.copy( v4 );
}
} else {
......@@ -254,6 +270,7 @@ THREE.Projector = function() {
}
_face.normalWorld.copy( face.normal );
if ( !visible && ( object.flipSided || object.doubleSided ) ) _face.normalWorld.negate();
objectMatrixWorldRotation.multiplyVector3( _face.normalWorld );
_face.centroidWorld.copy( face.centroid );
......@@ -268,6 +285,7 @@ THREE.Projector = function() {
normal = _face.vertexNormalsWorld[ n ];
normal.copy( faceVertexNormals[ n ] );
if ( !visible && ( object.flipSided || object.doubleSided ) ) normal.negate();
objectMatrixWorldRotation.multiplyVector3( normal );
}
......@@ -286,7 +304,7 @@ THREE.Projector = function() {
}
_face.material = objectMaterial;
_face.material = object.material;
_face.faceMaterial = face.materialIndex !== null ? geometryMaterials[ face.materialIndex ] : null;
_face.z = _face.centroidScreen.z;
......@@ -328,7 +346,7 @@ THREE.Projector = function() {
_line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z );
_line.material = objectMaterial;
_line.material = object.material;
_renderData.elements.push( _line );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册