1 | import { Vector3 } from './Vector3.js';
|
2 | import { Sphere } from './Sphere.js';
|
3 | import { Plane } from './Plane.js';
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | function Frustum( p0, p1, p2, p3, p4, p5 ) {
|
12 |
|
13 | this.planes = [
|
14 |
|
15 | ( p0 !== undefined ) ? p0 : new Plane(),
|
16 | ( p1 !== undefined ) ? p1 : new Plane(),
|
17 | ( p2 !== undefined ) ? p2 : new Plane(),
|
18 | ( p3 !== undefined ) ? p3 : new Plane(),
|
19 | ( p4 !== undefined ) ? p4 : new Plane(),
|
20 | ( p5 !== undefined ) ? p5 : new Plane()
|
21 |
|
22 | ];
|
23 |
|
24 | }
|
25 |
|
26 | Object.assign( Frustum.prototype, {
|
27 |
|
28 | set: function ( p0, p1, p2, p3, p4, p5 ) {
|
29 |
|
30 | var planes = this.planes;
|
31 |
|
32 | planes[ 0 ].copy( p0 );
|
33 | planes[ 1 ].copy( p1 );
|
34 | planes[ 2 ].copy( p2 );
|
35 | planes[ 3 ].copy( p3 );
|
36 | planes[ 4 ].copy( p4 );
|
37 | planes[ 5 ].copy( p5 );
|
38 |
|
39 | return this;
|
40 |
|
41 | },
|
42 |
|
43 | clone: function () {
|
44 |
|
45 | return new this.constructor().copy( this );
|
46 |
|
47 | },
|
48 |
|
49 | copy: function ( frustum ) {
|
50 |
|
51 | var planes = this.planes;
|
52 |
|
53 | for ( var i = 0; i < 6; i ++ ) {
|
54 |
|
55 | planes[ i ].copy( frustum.planes[ i ] );
|
56 |
|
57 | }
|
58 |
|
59 | return this;
|
60 |
|
61 | },
|
62 |
|
63 | setFromMatrix: function ( m ) {
|
64 |
|
65 | var planes = this.planes;
|
66 | var me = m.elements;
|
67 | var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
|
68 | var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
|
69 | var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
|
70 | var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
|
71 |
|
72 | planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
|
73 | planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
|
74 | planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
|
75 | planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
|
76 | planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
|
77 | planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
|
78 |
|
79 | return this;
|
80 |
|
81 | },
|
82 |
|
83 | intersectsObject: function () {
|
84 |
|
85 | var sphere = new Sphere();
|
86 |
|
87 | return function intersectsObject( object ) {
|
88 |
|
89 | var geometry = object.geometry;
|
90 |
|
91 | if ( geometry.boundingSphere === null )
|
92 | geometry.computeBoundingSphere();
|
93 |
|
94 | sphere.copy( geometry.boundingSphere )
|
95 | .applyMatrix4( object.matrixWorld );
|
96 |
|
97 | return this.intersectsSphere( sphere );
|
98 |
|
99 | };
|
100 |
|
101 | }(),
|
102 |
|
103 | intersectsSprite: function () {
|
104 |
|
105 | var sphere = new Sphere();
|
106 |
|
107 | return function intersectsSprite( sprite ) {
|
108 |
|
109 | sphere.center.set( 0, 0, 0 );
|
110 | sphere.radius = 0.7071067811865476;
|
111 | sphere.applyMatrix4( sprite.matrixWorld );
|
112 |
|
113 | return this.intersectsSphere( sphere );
|
114 |
|
115 | };
|
116 |
|
117 | }(),
|
118 |
|
119 | intersectsSphere: function ( sphere ) {
|
120 |
|
121 | var planes = this.planes;
|
122 | var center = sphere.center;
|
123 | var negRadius = - sphere.radius;
|
124 |
|
125 | for ( var i = 0; i < 6; i ++ ) {
|
126 |
|
127 | var distance = planes[ i ].distanceToPoint( center );
|
128 |
|
129 | if ( distance < negRadius ) {
|
130 |
|
131 | return false;
|
132 |
|
133 | }
|
134 |
|
135 | }
|
136 |
|
137 | return true;
|
138 |
|
139 | },
|
140 |
|
141 | intersectsBox: function () {
|
142 |
|
143 | var p1 = new Vector3(),
|
144 | p2 = new Vector3();
|
145 |
|
146 | return function intersectsBox( box ) {
|
147 |
|
148 | var planes = this.planes;
|
149 |
|
150 | for ( var i = 0; i < 6; i ++ ) {
|
151 |
|
152 | var plane = planes[ i ];
|
153 |
|
154 | p1.x = plane.normal.x > 0 ? box.min.x : box.max.x;
|
155 | p2.x = plane.normal.x > 0 ? box.max.x : box.min.x;
|
156 | p1.y = plane.normal.y > 0 ? box.min.y : box.max.y;
|
157 | p2.y = plane.normal.y > 0 ? box.max.y : box.min.y;
|
158 | p1.z = plane.normal.z > 0 ? box.min.z : box.max.z;
|
159 | p2.z = plane.normal.z > 0 ? box.max.z : box.min.z;
|
160 |
|
161 | var d1 = plane.distanceToPoint( p1 );
|
162 | var d2 = plane.distanceToPoint( p2 );
|
163 |
|
164 |
|
165 |
|
166 | if ( d1 < 0 && d2 < 0 ) {
|
167 |
|
168 | return false;
|
169 |
|
170 | }
|
171 |
|
172 | }
|
173 |
|
174 | return true;
|
175 |
|
176 | };
|
177 |
|
178 | }(),
|
179 |
|
180 | containsPoint: function ( point ) {
|
181 |
|
182 | var planes = this.planes;
|
183 |
|
184 | for ( var i = 0; i < 6; i ++ ) {
|
185 |
|
186 | if ( planes[ i ].distanceToPoint( point ) < 0 ) {
|
187 |
|
188 | return false;
|
189 |
|
190 | }
|
191 |
|
192 | }
|
193 |
|
194 | return true;
|
195 |
|
196 | }
|
197 |
|
198 | } );
|
199 |
|
200 |
|
201 | export { Frustum };
|