6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package javafx.scene;
27
28 import com.sun.javafx.geom.Vec3d;
29 import com.sun.javafx.geom.transform.Affine3D;
30 import com.sun.javafx.geom.transform.GeneralTransform3D;
31 import com.sun.javafx.sg.prism.NGNode;
32 import com.sun.javafx.sg.prism.NGParallelCamera;
33 import com.sun.javafx.sg.prism.NGPerspectiveCamera;
34 import com.sun.javafx.test.TransformHelper;
35 import com.sun.javafx.tk.Toolkit;
36 import javafx.scene.transform.NonInvertibleTransformException;
37 import javafx.stage.Stage;
38 import org.junit.Test;
39
40 import static org.junit.Assert.*;
41
42 public class CameraTest {
43
44 static final GeneralTransform3D DEFAULT_PROJVIEW_TX;
45 static {
46 GeneralTransform3D expected = new GeneralTransform3D();
47 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
48 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
49 Affine3D view = new Affine3D();
50 final double scale = 2.0 * tanOfHalfFOV / 200;
51 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
52 view.translate(0, 0, -1);
53 view.rotate(Math.PI, 1, 0, 0);
54 view.scale(scale, scale, scale);
55 expected.mul(view);
56 DEFAULT_PROJVIEW_TX = expected;
57 }
58
59 /**
60 * Test of setNearClip method, of class Camera.
61 */
62 @Test
63 public void testSetNearClip() {
64 Camera camera = new PerspectiveCamera();
65 camera.setTranslateZ(-10);
66 camera.setNearClip(10);
67
68 assertEquals(10, camera.getNearClip(), 1e-3);
69 assertEquals(90, camera.getFarClipInScene(), 1e-3);
70 assertEquals(0, camera.getNearClipInScene(), 1e-3);
71 }
72
73 /**
74 * Test of getNearClipInScene method, of class Camera.
75 */
76 @Test
77 public void testGetNearClipInScene() {
78 Camera camera = new PerspectiveCamera();
79 camera.setTranslateZ(-10);
80
81 assertEquals(-9.9, camera.getNearClipInScene(), 1e-3);
82 }
83
84 /**
85 * Test of setFarClip method, of class Camera.
86 */
87 @Test
88 public void testSetFarClip() {
89 Camera camera = new PerspectiveCamera();
90 camera.setTranslateZ(-10);
91 camera.setFarClip(200);
92
93 assertEquals(200, camera.getFarClip(), 1e-3);
94 assertEquals(-9.9, camera.getNearClipInScene(), 1e-3);
95 assertEquals(190, camera.getFarClipInScene(), 1e-3);
96 }
97
98 /**
99 * Test of getFarClipInScene method, of class Camera.
100 */
101 @Test
102 public void testGetFarClipInScene() {
103 Camera camera = new PerspectiveCamera();
104 camera.setTranslateZ(-10);
105 camera.setFarClip(60);
106
107 assertEquals(50, camera.getFarClipInScene(), 1e-3);
108 }
109
110 @Test
111 public void testLocalToSceneTxChange() {
112 Camera camera = new PerspectiveCamera();
113 camera.setTranslateZ(-10);
114 assertEquals(0.1, camera.getNearClip(), 1e-3);
115 assertEquals(100, camera.getFarClip(), 1e-3);
116 assertEquals(-9.9, camera.getNearClipInScene(), 1e-3);
117 assertEquals(90, camera.getFarClipInScene(), 1e-3);
118
119 camera.setTranslateZ(100);
120 assertEquals(0.1, camera.getNearClip(), 1e-3);
121 assertEquals(100, camera.getFarClip(), 1e-3);
122 assertEquals(100.1, camera.getNearClipInScene(), 1e-3);
123 assertEquals(200, camera.getFarClipInScene(), 1e-3);
124 }
125
126 /**
127 * Test of getSceneToLocalTransform method, of class Camera.
128 */
129 @Test
130 public void testGetSceneToLocalTransform() {
131 Camera camera = new PerspectiveCamera();
132 new Scene(new Group(camera));
133 camera.setTranslateX(300);
134 camera.getParent().setTranslateY(100);
135 Affine3D expected = new Affine3D();
136 try {
137 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
138 } catch (NonInvertibleTransformException ex) {
139 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
140 }
141 assertEquals(expected, camera.getSceneToLocalTransform());
142
143 camera.setTranslateZ(-10);
144 camera.setScaleX(10);
145 expected.setToIdentity();
146 try {
147 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
148 } catch (NonInvertibleTransformException ex) {
149 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
150 }
151 assertEquals(expected, camera.getSceneToLocalTransform());
152 }
153
154 /**
155 * Test of getSceneToLocalTransform method when camera is not in scene.
156 */
157 @Test
158 public void testGetSceneToLocalTransformWhenNotInScene() {
159 Camera camera = new PerspectiveCamera();
160 Affine3D expected = new Affine3D();
161 assertEquals(expected, camera.getSceneToLocalTransform());
162
163 try {
164 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
165 } catch (NonInvertibleTransformException ex) {
166 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
167 }
168 assertEquals(expected, camera.getSceneToLocalTransform());
169
170 camera.setTranslateZ(-10);
171 camera.setScaleX(10);
172 expected.setToIdentity();
173 try {
174 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
175 } catch (NonInvertibleTransformException ex) {
176 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
177 }
178 assertEquals(expected, camera.getSceneToLocalTransform());
179 }
180
181 @Test
182 public void testViewSize() {
183 final Scene scene = new Scene(new Group(), 300, 200);
184 Camera camera = new PerspectiveCamera();
185 scene.setCamera(camera);
186 assertEquals(300.0, camera.getViewWidth(), 1.0e-20);
187 assertEquals(200.0, camera.getViewHeight(), 1.0e-20);
188 }
189
190 @Test
191 public void testDefaultCamera() {
192 final Scene scene = new Scene(new Group(), 300, 200);
193 Camera camera = scene.getEffectiveCamera();
194
195 assertTrue(camera instanceof ParallelCamera);
196 assertEquals(300.0, camera.getViewWidth(), 1.0e-20);
197 assertEquals(200.0, camera.getViewHeight(), 1.0e-20);
198 }
199
200 @Test
201 public void testParallelProjViewTx() {
202 final Scene scene = new Scene(new Group(), 300, 200);
203 Camera camera = new ParallelCamera();
204 scene.setCamera(camera);
205
206 GeneralTransform3D expected = new GeneralTransform3D();
207 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
208
209 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
210 }
211
212 @Test
213 public void testParallelProjViewTxWithMovedCamera() {
214 final Scene scene = new Scene(new Group(), 300, 200);
215 Camera camera = new ParallelCamera();
216 scene.setCamera(camera);
217 scene.getRoot().getChildren().add(camera);
218 scene.getRoot().setTranslateX(50);
219 camera.setTranslateY(60);
220
221 GeneralTransform3D expected = new GeneralTransform3D();
222 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
223 expected.mul(Affine3D.getTranslateInstance(-50, -60));
224
225 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
226 }
227
228 @Test
229 public void testParallelProjViewTxWithMovedCameraNotInScene() {
230 final Scene scene = new Scene(new Group(), 300, 200);
231 Camera camera = new ParallelCamera();
232 scene.setCamera(camera);
233 scene.getRoot().setTranslateX(50);
234 camera.setTranslateX(50);
235 camera.setTranslateY(60);
236
237 GeneralTransform3D expected = new GeneralTransform3D();
238 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
239 expected.mul(Affine3D.getTranslateInstance(-50, -60));
240
241 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
242 }
243
244 @Test
245 public void testParallelProjViewTxWithMovedCameraNotInScene2() {
246 final Scene scene = new Scene(new Group(), 300, 200);
247 Camera camera = new ParallelCamera();
248 scene.setCamera(camera);
249 scene.getRoot().setTranslateX(50);
250 new Group(camera);
251 camera.getParent().setTranslateX(50);
252 camera.setTranslateY(60);
253
254 GeneralTransform3D expected = new GeneralTransform3D();
255 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
256 expected.mul(Affine3D.getTranslateInstance(-50, -60));
257
258 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
259 }
260
261 @Test
262 public void testPerspectiveProjViewTx() {
263 final Scene scene = new Scene(new Group(), 300, 200);
264 PerspectiveCamera camera = new PerspectiveCamera();
265 scene.setCamera(camera);
266
267 TransformHelper.assertMatrix(camera.getProjViewTransform(), DEFAULT_PROJVIEW_TX);
268 }
269
270 @Test
271 public void testPerspectiveProjViewTxWithModifiedParams() {
272 final Scene scene = new Scene(new Group(), 300, 200);
273 PerspectiveCamera camera = new PerspectiveCamera();
274 camera.setVerticalFieldOfView(false);
275 camera.setFieldOfView(40);
276 camera.setNearClip(1);
277 camera.setFarClip(200);
278 scene.setCamera(camera);
279
280 GeneralTransform3D expected = new GeneralTransform3D();
281 expected.perspective(false, Math.toRadians(40), 1.5, 1.0, 200);
282
283 final double tanOfHalfFOV = Math.tan(Math.toRadians(40) / 2.0);
284
285 Affine3D view = new Affine3D();
286 final double scale = 2.0 * tanOfHalfFOV / 300;
287
288 view.setToTranslation(-tanOfHalfFOV, tanOfHalfFOV / 1.5, 0.0);
289 view.translate(0, 0, -1);
290 view.rotate(Math.PI, 1, 0, 0);
291 view.scale(scale, scale, scale);
292
293 expected.mul(view);
294
295 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
296 }
297
298 @Test
299 public void testPerspectiveProjViewTxWithMovedCamera() {
300 final Scene scene = new Scene(new Group(), 300, 200);
301 PerspectiveCamera camera = new PerspectiveCamera();
302 scene.setCamera(camera);
303 scene.getRoot().getChildren().add(camera);
304 scene.getRoot().setTranslateX(50);
305 camera.setTranslateY(60);
306
307 GeneralTransform3D expected = new GeneralTransform3D();
308 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
309
310 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
311
312 Affine3D view = new Affine3D();
313 final double scale = 2.0 * tanOfHalfFOV / 200;
314
315 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
316 view.translate(0, 0, -1);
317 view.rotate(Math.PI, 1, 0, 0);
318 view.scale(scale, scale, scale);
319
320 expected.mul(view);
321 expected.mul(Affine3D.getTranslateInstance(-50, -60));
322
323 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
324 }
325
326 @Test
327 public void testPerspectiveProjViewTxWithMovedCameraNotInScene() {
328 final Scene scene = new Scene(new Group(), 300, 200);
329 PerspectiveCamera camera = new PerspectiveCamera();
330 scene.setCamera(camera);
331 scene.getRoot().setTranslateX(50);
332 camera.setTranslateX(50);
333 camera.setTranslateY(60);
334
335 GeneralTransform3D expected = new GeneralTransform3D();
336 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
337
338 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
339
340 Affine3D view = new Affine3D();
341 final double scale = 2.0 * tanOfHalfFOV / 200;
342
343 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
344 view.translate(0, 0, -1);
345 view.rotate(Math.PI, 1, 0, 0);
346 view.scale(scale, scale, scale);
347
348 expected.mul(view);
349 expected.mul(Affine3D.getTranslateInstance(-50, -60));
350
351 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
352 }
353
354 @Test
355 public void testPerspectiveProjViewTxWithMovedCameraNotInScene2() {
356 final Scene scene = new Scene(new Group(), 300, 200);
357 PerspectiveCamera camera = new PerspectiveCamera();
358 scene.setCamera(camera);
359 scene.getRoot().setTranslateX(50);
360 new Group(camera);
361 camera.getParent().setTranslateX(50);
362 camera.setTranslateY(60);
363
364 GeneralTransform3D expected = new GeneralTransform3D();
365 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
366
367 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
368
369 Affine3D view = new Affine3D();
370 final double scale = 2.0 * tanOfHalfFOV / 200;
371
372 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
373 view.translate(0, 0, -1);
374 view.rotate(Math.PI, 1, 0, 0);
375 view.scale(scale, scale, scale);
376
377 expected.mul(view);
378 expected.mul(Affine3D.getTranslateInstance(-50, -60));
379
380 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
381 }
382
383 @Test
384 public void testPerspectiveProjViewTxWithFixedEye() {
385 final Scene scene = new Scene(new Group(), 300, 200);
386 PerspectiveCamera camera = new PerspectiveCamera(true);
387 scene.setCamera(camera);
388
389 GeneralTransform3D expected = new GeneralTransform3D();
390 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
391
392 Affine3D view = new Affine3D();
393 view.rotate(Math.PI, 1, 0, 0);
394
395 expected.mul(view);
396
397 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
398 }
399
400 @Test
401 public void testPerspectiveProjViewTxWithFixedEyeAndModifiedParams() {
402 final Scene scene = new Scene(new Group(), 300, 200);
403 PerspectiveCamera camera = new PerspectiveCamera(true);
404 camera.setVerticalFieldOfView(false);
405 camera.setFieldOfView(40);
406 camera.setNearClip(1);
407 camera.setFarClip(200);
408 scene.setCamera(camera);
409
410 GeneralTransform3D expected = new GeneralTransform3D();
411 expected.perspective(false, Math.toRadians(40), 1.5, 1.0, 200);
412
413 Affine3D view = new Affine3D();
414 view.rotate(Math.PI, 1, 0, 0);
415
416 expected.mul(view);
417
418 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
419 }
420
421 @Test
422 public void testPerspectiveProjViewTxWithFixedEyeAndMovedCamera() {
423 final Scene scene = new Scene(new Group(), 300, 200);
424 PerspectiveCamera camera = new PerspectiveCamera(true);
425 scene.setCamera(camera);
426 scene.getRoot().getChildren().add(camera);
427 scene.getRoot().setTranslateX(50);
428 camera.setTranslateY(60);
429
430 GeneralTransform3D expected = new GeneralTransform3D();
431 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
432
433 Affine3D view = new Affine3D();
434 view.rotate(Math.PI, 1, 0, 0);
435
436 expected.mul(view);
437 expected.mul(Affine3D.getTranslateInstance(-50, -60));
438
439 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
440 }
441
442 @Test
443 public void testPerspectiveProjViewTxWithFixedEyeAndMovedCameraNotInScene() {
444 final Scene scene = new Scene(new Group(), 300, 200);
445 PerspectiveCamera camera = new PerspectiveCamera(true);
446 scene.setCamera(camera);
447 scene.getRoot().setTranslateX(50);
448 camera.setTranslateX(50);
449 camera.setTranslateY(60);
450
451 GeneralTransform3D expected = new GeneralTransform3D();
452 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
453
454 Affine3D view = new Affine3D();
455 view.rotate(Math.PI, 1, 0, 0);
456
457 expected.mul(view);
458 expected.mul(Affine3D.getTranslateInstance(-50, -60));
459
460 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
461 }
462
463 @Test
464 public void testPerspectiveProjViewTxWithFixedEyeAndMovedCameraNotInScene2() {
465 final Scene scene = new Scene(new Group(), 300, 200);
466 PerspectiveCamera camera = new PerspectiveCamera(true);
467 scene.setCamera(camera);
468 scene.getRoot().setTranslateX(50);
469 new Group(camera);
470 camera.getParent().setTranslateX(50);
471 camera.setTranslateY(60);
472
473 GeneralTransform3D expected = new GeneralTransform3D();
474 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
475
476 Affine3D view = new Affine3D();
477 view.rotate(Math.PI, 1, 0, 0);
478
479 expected.mul(view);
480 expected.mul(Affine3D.getTranslateInstance(-50, -60));
481
482 TransformHelper.assertMatrix(camera.getProjViewTransform(), expected);
483 }
484
485 @Test
486 public void testParallelCameraPosition() {
487 Scene scene = new Scene(new Group(), 300, 200);
488 Camera cam = new ParallelCamera();
489 scene.setCamera(cam);
490 Vec3d v = cam.computePosition(null);
491 assertEquals(150.0, v.x, 0.000001);
492 assertEquals(100.0, v.y, 0.000001);
493 assertEquals(-373.205080, v.z, 0.000001);
494 }
495
496 @Test
497 public void testPerspectiveCameraPositionWithFixedEye() {
498 Scene scene = new Scene(new Group(), 300, 200);
499 Camera cam = new PerspectiveCamera(true);
500 scene.setCamera(cam);
501 Vec3d v = cam.computePosition(null);
502 assertEquals(0.0, v.x, 0.000001);
503 assertEquals(0.0, v.y, 0.000001);
504 assertEquals(0.0, v.z, 0.000001);
505 }
506
507 @Test
508 public void testPerspectiveCameraPosition() {
509 Scene scene = new Scene(new Group(), 300, 200);
510 Camera cam = new PerspectiveCamera();
511 scene.setCamera(cam);
512 Vec3d v = cam.computePosition(null);
513 assertEquals(150.0, v.x, 0.000001);
514 assertEquals(100.0, v.y, 0.000001);
515 assertEquals(-373.205080, v.z, 0.000001);
516 }
517
518 @Test
519 public void perspectiveCameraShouldSyncWhenAssignedToScene() {
520 final Scene scene = new Scene(new Group(), 300, 200);
521 PerspectiveCamera camera = new StubPerspectiveCamera();
522 scene.setCamera(camera);
523 Stage stage = new Stage();
524 stage.setScene(scene);
525 stage.show();
526
527 Toolkit.getToolkit().firePulse();
528
529 StubNGPerspectiveCamera pc = camera.impl_getPeer();
530
531 assertEquals(300, pc.getViewWidth(), 0.00001);
532 assertEquals(200, pc.getViewHeight(), 0.00001);
609 GeneralTransform3D expected = new GeneralTransform3D();
610 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
611
612 TransformHelper.assertMatrix(pc.getProjViewTx(), expected);
613 assertEquals(150.0, pc.getPosition().x, 0.000001);
614 assertEquals(100.0, pc.getPosition().y, 0.000001);
615 assertEquals(-373.205080, pc.getPosition().z, 0.000001);
616 }
617
618 @Test
619 public void sceneDefaultCameraShouldSyncInTheBeginning() {
620 final Scene scene = new Scene(new Group(), 300, 200);
621 ParallelCamera camera = new StubParallelCamera();
622 scene.setCamera(camera);
623 Stage stage = new Stage();
624 stage.setScene(scene);
625 stage.show();
626
627 Toolkit.getToolkit().firePulse();
628
629 StubNGParallelCamera pc = scene.getEffectiveCamera().impl_getPeer();
630
631 assertEquals(300, pc.getViewWidth(), 0.00001);
632 assertEquals(200, pc.getViewHeight(), 0.00001);
633
634 GeneralTransform3D expected = new GeneralTransform3D();
635 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
636
637 TransformHelper.assertMatrix(pc.getProjViewTx(), expected);
638 assertEquals(150.0, pc.getPosition().x, 0.000001);
639 assertEquals(100.0, pc.getPosition().y, 0.000001);
640 assertEquals(-373.205080, pc.getPosition().z, 0.000001);
641 }
642
643 @Test
644 public void subSceneDefaultCameraShouldSyncInTheBeginning() {
645 SubScene sub = new SubScene(new Group(), 300, 200);
646 final Scene scene = new Scene(new Group(sub), 600, 300);
647 ParallelCamera camera = new StubParallelCamera();
648 sub.setCamera(camera);
649 Stage stage = new Stage();
650 stage.setScene(scene);
651 stage.show();
652
653 Toolkit.getToolkit().firePulse();
654
655 StubNGParallelCamera pc = sub.getEffectiveCamera().impl_getPeer();
656
657 assertEquals(300, pc.getViewWidth(), 0.00001);
658 assertEquals(200, pc.getViewHeight(), 0.00001);
659
660 GeneralTransform3D expected = new GeneralTransform3D();
661 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
662
663 TransformHelper.assertMatrix(pc.getProjViewTx(), expected);
664 assertEquals(150.0, pc.getPosition().x, 0.000001);
665 assertEquals(100.0, pc.getPosition().y, 0.000001);
666 assertEquals(-373.205080, pc.getPosition().z, 0.000001);
667 }
668
669 @Test
670 public void resizeShouldTriggerSync() {
671 SubScene sub = new SubScene(new Group(), 400, 300);
672 final Scene scene = new Scene(new Group(sub), 600, 300);
673 PerspectiveCamera camera = new StubPerspectiveCamera();
674 sub.setCamera(camera);
675 Stage stage = new Stage();
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package test.javafx.scene;
27
28 import com.sun.javafx.geom.Vec3d;
29 import com.sun.javafx.geom.transform.Affine3D;
30 import com.sun.javafx.geom.transform.GeneralTransform3D;
31 import com.sun.javafx.sg.prism.NGNode;
32 import com.sun.javafx.sg.prism.NGParallelCamera;
33 import com.sun.javafx.sg.prism.NGPerspectiveCamera;
34 import test.com.sun.javafx.test.TransformHelper;
35 import com.sun.javafx.tk.Toolkit;
36 import javafx.scene.Camera;
37 import javafx.scene.CameraShim;
38 import javafx.scene.Group;
39 import javafx.scene.ParallelCamera;
40 import javafx.scene.ParentShim;
41 import javafx.scene.PerspectiveCamera;
42 import javafx.scene.Scene;
43 import javafx.scene.SceneShim;
44 import javafx.scene.SubScene;
45 import javafx.scene.SubSceneShim;
46 import javafx.scene.transform.NonInvertibleTransformException;
47 import javafx.stage.Stage;
48 import org.junit.Test;
49
50 import static org.junit.Assert.*;
51
52 public class CameraTest {
53
54 static final GeneralTransform3D DEFAULT_PROJVIEW_TX;
55 static {
56 GeneralTransform3D expected = new GeneralTransform3D();
57 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
58 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
59 Affine3D view = new Affine3D();
60 final double scale = 2.0 * tanOfHalfFOV / 200;
61 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
62 view.translate(0, 0, -1);
63 view.rotate(Math.PI, 1, 0, 0);
64 view.scale(scale, scale, scale);
65 expected.mul(view);
66 DEFAULT_PROJVIEW_TX = expected;
67 }
68
69 /**
70 * Test of setNearClip method, of class Camera.
71 */
72 @Test
73 public void testSetNearClip() {
74 Camera camera = new PerspectiveCamera();
75 camera.setTranslateZ(-10);
76 camera.setNearClip(10);
77
78 assertEquals(10, camera.getNearClip(), 1e-3);
79 assertEquals(90, CameraShim.getFarClipInScene(camera), 1e-3);
80 assertEquals(0, CameraShim.getNearClipInScene(camera), 1e-3);
81 }
82
83 /**
84 * Test of getNearClipInScene method, of class Camera.
85 */
86 @Test
87 public void testGetNearClipInScene() {
88 Camera camera = new PerspectiveCamera();
89 camera.setTranslateZ(-10);
90
91 assertEquals(-9.9, CameraShim.getNearClipInScene(camera), 1e-3);
92 }
93
94 /**
95 * Test of setFarClip method, of class Camera.
96 */
97 @Test
98 public void testSetFarClip() {
99 Camera camera = new PerspectiveCamera();
100 camera.setTranslateZ(-10);
101 camera.setFarClip(200);
102
103 assertEquals(200, camera.getFarClip(), 1e-3);
104 assertEquals(-9.9, CameraShim.getNearClipInScene(camera), 1e-3);
105 assertEquals(190, CameraShim.getFarClipInScene(camera), 1e-3);
106 }
107
108 /**
109 * Test of getFarClipInScene method, of class Camera.
110 */
111 @Test
112 public void testGetFarClipInScene() {
113 Camera camera = new PerspectiveCamera();
114 camera.setTranslateZ(-10);
115 camera.setFarClip(60);
116
117 assertEquals(50, CameraShim.getFarClipInScene(camera), 1e-3);
118 }
119
120 @Test
121 public void testLocalToSceneTxChange() {
122 Camera camera = new PerspectiveCamera();
123 camera.setTranslateZ(-10);
124 assertEquals(0.1, camera.getNearClip(), 1e-3);
125 assertEquals(100, camera.getFarClip(), 1e-3);
126 assertEquals(-9.9, CameraShim.getNearClipInScene(camera), 1e-3);
127 assertEquals(90, CameraShim.getFarClipInScene(camera), 1e-3);
128
129 camera.setTranslateZ(100);
130 assertEquals(0.1, camera.getNearClip(), 1e-3);
131 assertEquals(100, camera.getFarClip(), 1e-3);
132 assertEquals(100.1, CameraShim.getNearClipInScene(camera), 1e-3);
133 assertEquals(200, CameraShim.getFarClipInScene(camera), 1e-3);
134 }
135
136 /**
137 * Test of getSceneToLocalTransform method, of class Camera.
138 */
139 @Test
140 public void testGetSceneToLocalTransform() {
141 Camera camera = new PerspectiveCamera();
142 new Scene(new Group(camera));
143 camera.setTranslateX(300);
144 camera.getParent().setTranslateY(100);
145 Affine3D expected = new Affine3D();
146 try {
147 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
148 } catch (NonInvertibleTransformException ex) {
149 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
150 }
151 assertEquals(expected, CameraShim.getSceneToLocalTransform(camera));
152
153 camera.setTranslateZ(-10);
154 camera.setScaleX(10);
155 expected.setToIdentity();
156 try {
157 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
158 } catch (NonInvertibleTransformException ex) {
159 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
160 }
161 assertEquals(expected, CameraShim.getSceneToLocalTransform(camera));
162 }
163
164 /**
165 * Test of getSceneToLocalTransform method when camera is not in scene.
166 */
167 @Test
168 public void testGetSceneToLocalTransformWhenNotInScene() {
169 Camera camera = new PerspectiveCamera();
170 Affine3D expected = new Affine3D();
171 assertEquals(expected, CameraShim.getSceneToLocalTransform(camera));
172
173 try {
174 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
175 } catch (NonInvertibleTransformException ex) {
176 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
177 }
178 assertEquals(expected, CameraShim.getSceneToLocalTransform(camera));
179
180 camera.setTranslateZ(-10);
181 camera.setScaleX(10);
182 expected.setToIdentity();
183 try {
184 camera.getLocalToSceneTransform().createInverse().impl_apply(expected);
185 } catch (NonInvertibleTransformException ex) {
186 fail("NonInvertibleTransformException when compute sceneToLocalTx.");
187 }
188 assertEquals(expected, CameraShim.getSceneToLocalTransform(camera));
189 }
190
191 @Test
192 public void testViewSize() {
193 final Scene scene = new Scene(new Group(), 300, 200);
194 Camera camera = new PerspectiveCamera();
195 scene.setCamera(camera);
196 assertEquals(300.0, CameraShim.getViewWidth(camera), 1.0e-20);
197 assertEquals(200.0, CameraShim.getViewHeight(camera), 1.0e-20);
198 }
199
200 @Test
201 public void testDefaultCamera() {
202 final Scene scene = new Scene(new Group(), 300, 200);
203 Camera camera = SceneShim.getEffectiveCamera(scene);
204
205 assertTrue(camera instanceof ParallelCamera);
206 assertEquals(300.0, CameraShim.getViewWidth(camera), 1.0e-20);
207 assertEquals(200.0, CameraShim.getViewHeight(camera), 1.0e-20);
208 }
209
210 @Test
211 public void testParallelProjViewTx() {
212 final Scene scene = new Scene(new Group(), 300, 200);
213 Camera camera = new ParallelCamera();
214 scene.setCamera(camera);
215
216 GeneralTransform3D expected = new GeneralTransform3D();
217 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
218
219 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
220 }
221
222 @Test
223 public void testParallelProjViewTxWithMovedCamera() {
224 final Scene scene = new Scene(new Group(), 300, 200);
225 Camera camera = new ParallelCamera();
226 scene.setCamera(camera);
227 ParentShim.getChildren(scene.getRoot()).add(camera);
228 scene.getRoot().setTranslateX(50);
229 camera.setTranslateY(60);
230
231 GeneralTransform3D expected = new GeneralTransform3D();
232 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
233 expected.mul(Affine3D.getTranslateInstance(-50, -60));
234
235 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
236 }
237
238 @Test
239 public void testParallelProjViewTxWithMovedCameraNotInScene() {
240 final Scene scene = new Scene(new Group(), 300, 200);
241 Camera camera = new ParallelCamera();
242 scene.setCamera(camera);
243 scene.getRoot().setTranslateX(50);
244 camera.setTranslateX(50);
245 camera.setTranslateY(60);
246
247 GeneralTransform3D expected = new GeneralTransform3D();
248 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
249 expected.mul(Affine3D.getTranslateInstance(-50, -60));
250
251 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
252 }
253
254 @Test
255 public void testParallelProjViewTxWithMovedCameraNotInScene2() {
256 final Scene scene = new Scene(new Group(), 300, 200);
257 Camera camera = new ParallelCamera();
258 scene.setCamera(camera);
259 scene.getRoot().setTranslateX(50);
260 new Group(camera);
261 camera.getParent().setTranslateX(50);
262 camera.setTranslateY(60);
263
264 GeneralTransform3D expected = new GeneralTransform3D();
265 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
266 expected.mul(Affine3D.getTranslateInstance(-50, -60));
267
268 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
269 }
270
271 @Test
272 public void testPerspectiveProjViewTx() {
273 final Scene scene = new Scene(new Group(), 300, 200);
274 PerspectiveCamera camera = new PerspectiveCamera();
275 scene.setCamera(camera);
276
277 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), DEFAULT_PROJVIEW_TX);
278 }
279
280 @Test
281 public void testPerspectiveProjViewTxWithModifiedParams() {
282 final Scene scene = new Scene(new Group(), 300, 200);
283 PerspectiveCamera camera = new PerspectiveCamera();
284 camera.setVerticalFieldOfView(false);
285 camera.setFieldOfView(40);
286 camera.setNearClip(1);
287 camera.setFarClip(200);
288 scene.setCamera(camera);
289
290 GeneralTransform3D expected = new GeneralTransform3D();
291 expected.perspective(false, Math.toRadians(40), 1.5, 1.0, 200);
292
293 final double tanOfHalfFOV = Math.tan(Math.toRadians(40) / 2.0);
294
295 Affine3D view = new Affine3D();
296 final double scale = 2.0 * tanOfHalfFOV / 300;
297
298 view.setToTranslation(-tanOfHalfFOV, tanOfHalfFOV / 1.5, 0.0);
299 view.translate(0, 0, -1);
300 view.rotate(Math.PI, 1, 0, 0);
301 view.scale(scale, scale, scale);
302
303 expected.mul(view);
304
305 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
306 }
307
308 @Test
309 public void testPerspectiveProjViewTxWithMovedCamera() {
310 final Scene scene = new Scene(new Group(), 300, 200);
311 PerspectiveCamera camera = new PerspectiveCamera();
312 scene.setCamera(camera);
313 ParentShim.getChildren(scene.getRoot()).add(camera);
314 scene.getRoot().setTranslateX(50);
315 camera.setTranslateY(60);
316
317 GeneralTransform3D expected = new GeneralTransform3D();
318 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
319
320 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
321
322 Affine3D view = new Affine3D();
323 final double scale = 2.0 * tanOfHalfFOV / 200;
324
325 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
326 view.translate(0, 0, -1);
327 view.rotate(Math.PI, 1, 0, 0);
328 view.scale(scale, scale, scale);
329
330 expected.mul(view);
331 expected.mul(Affine3D.getTranslateInstance(-50, -60));
332
333 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
334 }
335
336 @Test
337 public void testPerspectiveProjViewTxWithMovedCameraNotInScene() {
338 final Scene scene = new Scene(new Group(), 300, 200);
339 PerspectiveCamera camera = new PerspectiveCamera();
340 scene.setCamera(camera);
341 scene.getRoot().setTranslateX(50);
342 camera.setTranslateX(50);
343 camera.setTranslateY(60);
344
345 GeneralTransform3D expected = new GeneralTransform3D();
346 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
347
348 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
349
350 Affine3D view = new Affine3D();
351 final double scale = 2.0 * tanOfHalfFOV / 200;
352
353 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
354 view.translate(0, 0, -1);
355 view.rotate(Math.PI, 1, 0, 0);
356 view.scale(scale, scale, scale);
357
358 expected.mul(view);
359 expected.mul(Affine3D.getTranslateInstance(-50, -60));
360
361 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
362 }
363
364 @Test
365 public void testPerspectiveProjViewTxWithMovedCameraNotInScene2() {
366 final Scene scene = new Scene(new Group(), 300, 200);
367 PerspectiveCamera camera = new PerspectiveCamera();
368 scene.setCamera(camera);
369 scene.getRoot().setTranslateX(50);
370 new Group(camera);
371 camera.getParent().setTranslateX(50);
372 camera.setTranslateY(60);
373
374 GeneralTransform3D expected = new GeneralTransform3D();
375 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
376
377 final double tanOfHalfFOV = Math.tan(Math.toRadians(30) / 2.0);
378
379 Affine3D view = new Affine3D();
380 final double scale = 2.0 * tanOfHalfFOV / 200;
381
382 view.setToTranslation(-tanOfHalfFOV * 1.5, tanOfHalfFOV, 0.0);
383 view.translate(0, 0, -1);
384 view.rotate(Math.PI, 1, 0, 0);
385 view.scale(scale, scale, scale);
386
387 expected.mul(view);
388 expected.mul(Affine3D.getTranslateInstance(-50, -60));
389
390 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
391 }
392
393 @Test
394 public void testPerspectiveProjViewTxWithFixedEye() {
395 final Scene scene = new Scene(new Group(), 300, 200);
396 PerspectiveCamera camera = new PerspectiveCamera(true);
397 scene.setCamera(camera);
398
399 GeneralTransform3D expected = new GeneralTransform3D();
400 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
401
402 Affine3D view = new Affine3D();
403 view.rotate(Math.PI, 1, 0, 0);
404
405 expected.mul(view);
406
407 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
408 }
409
410 @Test
411 public void testPerspectiveProjViewTxWithFixedEyeAndModifiedParams() {
412 final Scene scene = new Scene(new Group(), 300, 200);
413 PerspectiveCamera camera = new PerspectiveCamera(true);
414 camera.setVerticalFieldOfView(false);
415 camera.setFieldOfView(40);
416 camera.setNearClip(1);
417 camera.setFarClip(200);
418 scene.setCamera(camera);
419
420 GeneralTransform3D expected = new GeneralTransform3D();
421 expected.perspective(false, Math.toRadians(40), 1.5, 1.0, 200);
422
423 Affine3D view = new Affine3D();
424 view.rotate(Math.PI, 1, 0, 0);
425
426 expected.mul(view);
427
428 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
429 }
430
431 @Test
432 public void testPerspectiveProjViewTxWithFixedEyeAndMovedCamera() {
433 final Scene scene = new Scene(new Group(), 300, 200);
434 PerspectiveCamera camera = new PerspectiveCamera(true);
435 scene.setCamera(camera);
436 ParentShim.getChildren(scene.getRoot()).add(camera);
437 scene.getRoot().setTranslateX(50);
438 camera.setTranslateY(60);
439
440 GeneralTransform3D expected = new GeneralTransform3D();
441 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
442
443 Affine3D view = new Affine3D();
444 view.rotate(Math.PI, 1, 0, 0);
445
446 expected.mul(view);
447 expected.mul(Affine3D.getTranslateInstance(-50, -60));
448
449 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
450 }
451
452 @Test
453 public void testPerspectiveProjViewTxWithFixedEyeAndMovedCameraNotInScene() {
454 final Scene scene = new Scene(new Group(), 300, 200);
455 PerspectiveCamera camera = new PerspectiveCamera(true);
456 scene.setCamera(camera);
457 scene.getRoot().setTranslateX(50);
458 camera.setTranslateX(50);
459 camera.setTranslateY(60);
460
461 GeneralTransform3D expected = new GeneralTransform3D();
462 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
463
464 Affine3D view = new Affine3D();
465 view.rotate(Math.PI, 1, 0, 0);
466
467 expected.mul(view);
468 expected.mul(Affine3D.getTranslateInstance(-50, -60));
469
470 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
471 }
472
473 @Test
474 public void testPerspectiveProjViewTxWithFixedEyeAndMovedCameraNotInScene2() {
475 final Scene scene = new Scene(new Group(), 300, 200);
476 PerspectiveCamera camera = new PerspectiveCamera(true);
477 scene.setCamera(camera);
478 scene.getRoot().setTranslateX(50);
479 new Group(camera);
480 camera.getParent().setTranslateX(50);
481 camera.setTranslateY(60);
482
483 GeneralTransform3D expected = new GeneralTransform3D();
484 expected.perspective(true, Math.toRadians(30), 1.5, 0.1, 100);
485
486 Affine3D view = new Affine3D();
487 view.rotate(Math.PI, 1, 0, 0);
488
489 expected.mul(view);
490 expected.mul(Affine3D.getTranslateInstance(-50, -60));
491
492 TransformHelper.assertMatrix(CameraShim.getProjViewTransform(camera), expected);
493 }
494
495 @Test
496 public void testParallelCameraPosition() {
497 Scene scene = new Scene(new Group(), 300, 200);
498 Camera cam = new ParallelCamera();
499 scene.setCamera(cam);
500 Vec3d v = CameraShim.computePosition(cam,null);
501 assertEquals(150.0, v.x, 0.000001);
502 assertEquals(100.0, v.y, 0.000001);
503 assertEquals(-373.205080, v.z, 0.000001);
504 }
505
506 @Test
507 public void testPerspectiveCameraPositionWithFixedEye() {
508 Scene scene = new Scene(new Group(), 300, 200);
509 Camera cam = new PerspectiveCamera(true);
510 scene.setCamera(cam);
511 Vec3d v = CameraShim.computePosition(cam,null);
512 assertEquals(0.0, v.x, 0.000001);
513 assertEquals(0.0, v.y, 0.000001);
514 assertEquals(0.0, v.z, 0.000001);
515 }
516
517 @Test
518 public void testPerspectiveCameraPosition() {
519 Scene scene = new Scene(new Group(), 300, 200);
520 Camera cam = new PerspectiveCamera();
521 scene.setCamera(cam);
522 Vec3d v = CameraShim.computePosition(cam,null);
523 assertEquals(150.0, v.x, 0.000001);
524 assertEquals(100.0, v.y, 0.000001);
525 assertEquals(-373.205080, v.z, 0.000001);
526 }
527
528 @Test
529 public void perspectiveCameraShouldSyncWhenAssignedToScene() {
530 final Scene scene = new Scene(new Group(), 300, 200);
531 PerspectiveCamera camera = new StubPerspectiveCamera();
532 scene.setCamera(camera);
533 Stage stage = new Stage();
534 stage.setScene(scene);
535 stage.show();
536
537 Toolkit.getToolkit().firePulse();
538
539 StubNGPerspectiveCamera pc = camera.impl_getPeer();
540
541 assertEquals(300, pc.getViewWidth(), 0.00001);
542 assertEquals(200, pc.getViewHeight(), 0.00001);
619 GeneralTransform3D expected = new GeneralTransform3D();
620 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
621
622 TransformHelper.assertMatrix(pc.getProjViewTx(), expected);
623 assertEquals(150.0, pc.getPosition().x, 0.000001);
624 assertEquals(100.0, pc.getPosition().y, 0.000001);
625 assertEquals(-373.205080, pc.getPosition().z, 0.000001);
626 }
627
628 @Test
629 public void sceneDefaultCameraShouldSyncInTheBeginning() {
630 final Scene scene = new Scene(new Group(), 300, 200);
631 ParallelCamera camera = new StubParallelCamera();
632 scene.setCamera(camera);
633 Stage stage = new Stage();
634 stage.setScene(scene);
635 stage.show();
636
637 Toolkit.getToolkit().firePulse();
638
639 StubNGParallelCamera pc = SceneShim.getEffectiveCamera(scene).impl_getPeer();
640
641 assertEquals(300, pc.getViewWidth(), 0.00001);
642 assertEquals(200, pc.getViewHeight(), 0.00001);
643
644 GeneralTransform3D expected = new GeneralTransform3D();
645 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
646
647 TransformHelper.assertMatrix(pc.getProjViewTx(), expected);
648 assertEquals(150.0, pc.getPosition().x, 0.000001);
649 assertEquals(100.0, pc.getPosition().y, 0.000001);
650 assertEquals(-373.205080, pc.getPosition().z, 0.000001);
651 }
652
653 @Test
654 public void subSceneDefaultCameraShouldSyncInTheBeginning() {
655 SubScene sub = new SubScene(new Group(), 300, 200);
656 final Scene scene = new Scene(new Group(sub), 600, 300);
657 ParallelCamera camera = new StubParallelCamera();
658 sub.setCamera(camera);
659 Stage stage = new Stage();
660 stage.setScene(scene);
661 stage.show();
662
663 Toolkit.getToolkit().firePulse();
664
665 StubNGParallelCamera pc = SubSceneShim.getEffectiveCamera(sub).impl_getPeer();
666
667 assertEquals(300, pc.getViewWidth(), 0.00001);
668 assertEquals(200, pc.getViewHeight(), 0.00001);
669
670 GeneralTransform3D expected = new GeneralTransform3D();
671 expected.ortho(0.0, 300, 200, 0.0, -150, 150);
672
673 TransformHelper.assertMatrix(pc.getProjViewTx(), expected);
674 assertEquals(150.0, pc.getPosition().x, 0.000001);
675 assertEquals(100.0, pc.getPosition().y, 0.000001);
676 assertEquals(-373.205080, pc.getPosition().z, 0.000001);
677 }
678
679 @Test
680 public void resizeShouldTriggerSync() {
681 SubScene sub = new SubScene(new Group(), 400, 300);
682 final Scene scene = new Scene(new Group(sub), 600, 300);
683 PerspectiveCamera camera = new StubPerspectiveCamera();
684 sub.setCamera(camera);
685 Stage stage = new Stage();
|