|
|
@@ -89,9 +89,10 @@ class Frustum {
|
|
|
*
|
|
|
* @param {Matrix4} m - The projection matrix.
|
|
|
* @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.
|
|
|
+ * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.
|
|
|
* @return {Frustum} A reference to this frustum.
|
|
|
*/
|
|
|
- setFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {
|
|
|
+ setFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {
|
|
|
|
|
|
const planes = this.planes;
|
|
|
const me = m.elements;
|
|
|
@@ -104,19 +105,29 @@ class Frustum {
|
|
|
planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
|
|
|
planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
|
|
|
planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
|
|
|
- planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
|
|
|
|
|
|
- if ( coordinateSystem === WebGLCoordinateSystem ) {
|
|
|
+ if ( reversedDepth ) {
|
|
|
|
|
|
- planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
|
|
|
+ planes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far
|
|
|
+ planes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near
|
|
|
|
|
|
- } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
|
|
|
+ } else {
|
|
|
|
|
|
- planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();
|
|
|
+ planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far
|
|
|
|
|
|
- } else {
|
|
|
+ if ( coordinateSystem === WebGLCoordinateSystem ) {
|
|
|
+
|
|
|
+ planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near
|
|
|
+
|
|
|
+ } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
|
|
|
|
|
|
- throw new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );
|
|
|
+ planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ throw new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|