提交 3ded4a40 编写于 作者: A alteredq

Changed Projector to use Frustum.

Also some bugfixes in ShadowMapPlugin and SpritePlugin.
上级 0c78ae95
因为 它太大了无法显示 source diff 。你可以改为 查看blob
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -20,38 +20,13 @@ THREE.Projector = function() {
_projScreenMatrix = new THREE.Matrix4(),
_projScreenobjectMatrixWorld = new THREE.Matrix4(),
_frustum = [
new THREE.Vector4(),
new THREE.Vector4(),
new THREE.Vector4(),
new THREE.Vector4(),
new THREE.Vector4(),
new THREE.Vector4()
],
_frustum = new THREE.Frustum(),
_clippedVertex1PositionScreen = new THREE.Vector4(),
_clippedVertex2PositionScreen = new THREE.Vector4(),
_face3VertexNormals;
this.computeFrustum = function ( m ) {
_frustum[ 0 ].set( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 );
_frustum[ 1 ].set( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 );
_frustum[ 2 ].set( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 );
_frustum[ 3 ].set( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 );
_frustum[ 4 ].set( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 );
_frustum[ 5 ].set( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 );
for ( var i = 0; i < 6; i ++ ) {
var plane = _frustum[ i ];
plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );
}
}
this.projectVector = function ( vector, camera ) {
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
......@@ -111,7 +86,7 @@ THREE.Projector = function() {
if ( object.visible === false ) return;
if ( ( object instanceof THREE.Mesh || object instanceof THREE.Line ) &&
( object.frustumCulled === false || isInFrustum( object ) ) ) {
( object.frustumCulled === false || _frustum.contains( object ) ) ) {
_projScreenMatrix.multiplyVector3( _vector3.copy( object.position ) );
......@@ -182,7 +157,7 @@ THREE.Projector = function() {
_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
this.computeFrustum( _projScreenMatrix );
_frustum.setFromMatrix( _projScreenMatrix );
_renderData = this.projectGraph( scene, false );
......@@ -474,22 +449,6 @@ THREE.Projector = function() {
}
function isInFrustum( object ) {
var distance, matrix = object.matrixWorld,
radius = - object.geometry.boundingSphere.radius * Math.max( object.scale.x, Math.max( object.scale.y, object.scale.z ) );
for ( var i = 0; i < 6; i ++ ) {
distance = _frustum[ i ].x * matrix.n14 + _frustum[ i ].y * matrix.n24 + _frustum[ i ].z * matrix.n34 + _frustum[ i ].w;
if ( distance <= radius ) return false;
}
return true;
};
function clipLine( s1, s2 ) {
var alpha1 = 0, alpha2 = 1,
......
......@@ -203,8 +203,6 @@ THREE.ShadowMapPlugin = function ( ) {
if ( object.visible && object.castShadow ) {
_currentGeometryGroupHash = -1;
if( object.matrixAutoUpdate ) {
object.matrixWorld.flattenToArray( object._objectMatrixArray );
......@@ -213,19 +211,7 @@ THREE.ShadowMapPlugin = function ( ) {
object._modelViewMatrix.multiplyToArray( _cameraLight.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
_renderer.setObjectFaces( object );
program = _renderer.setProgram( _cameraLight, lights, fog, _depthMaterial, object );
if ( object.immediateRenderCallback ) {
object.immediateRenderCallback( program, _gl, _frustum );
} else {
object.render( function( object ) { _renderer.renderBufferImmediate( object, program, _depthMaterial.shading ); } );
}
_renderer.renderImmediateObject( _cameraLight, lights, fog, _depthMaterial, object );
}
......
......@@ -92,7 +92,6 @@ THREE.SpritePlugin = function ( ) {
// setup gl
_gl.useProgram( _sprite.program );
_currentProgram = _sprite.program;
if ( ! _sprite.attributesEnabled ) {
......
......@@ -3277,8 +3277,6 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( object.visible ) {
_currentGeometryGroupHash = -1;
if ( overrideMaterial ) {
material = overrideMaterial;
......@@ -3297,21 +3295,29 @@ THREE.WebGLRenderer = function ( parameters ) {
}
_this.setObjectFaces( object );
_this.renderImmediateObject( camera, lights, fog, material, object );
program = setProgram( camera, lights, fog, material, object );
}
if ( object.immediateRenderCallback ) {
}
object.immediateRenderCallback( program, _gl, _frustum );
};
} else {
this.renderImmediateObject = function ( camera, lights, fog, material, object ) {
object.render( function( object ) { _this.renderBufferImmediate( object, program, material.shading ); } );
var program = setProgram( camera, lights, fog, material, object );
}
_currentGeometryGroupHash = -1;
}
_this.setObjectFaces( object );
if ( object.immediateRenderCallback ) {
object.immediateRenderCallback( program, _gl, _frustum );
} else {
object.render( function( object ) { _this.renderBufferImmediate( object, program, material.shading ); } );
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册