Normand Briere
2019-09-18 f9325048496d7cdbcad233f8a6b84c88e79adcc2
Camera.java
....@@ -52,7 +52,7 @@
5252 perspective = true;
5353 break;
5454 case 1: // '\001'
55
- location = LA.newVector(4, 0, 0);
55
+ location = LA.newVector(0, 0, 4); // Needed for translation direction
5656 perspective = false;
5757 break;
5858 case 2: // '\002'
....@@ -63,7 +63,7 @@
6363 //LA.matXRotate(fromScreen, LA.toRadians(90));
6464 break;
6565 case 3: // '\003'
66
- location = LA.newVector(0, 0, 4);
66
+ location = LA.newVector(4, 0, 0); // Needed for translation direction
6767 //LA.matZRotate(toScreen, LA.toRadians(-90));
6868 //LA.matXRotate(toScreen, LA.toRadians(-90));
6969 //LA.matXRotate(fromScreen, LA.toRadians(90));
....@@ -160,6 +160,11 @@
160160 {
161161 if(hAspect != 0) return;
162162
163
+ if (CameraPane.IMAGEFLIP)
164
+ {
165
+ dx = -dx;
166
+ }
167
+
163168 if (CameraPane.ROTATECAMERA)
164169 {
165170 float t = dx;
....@@ -216,6 +221,11 @@
216221 void Translate(float dx, float dy, float scale)
217222 {
218223 if(hAspect != 0) return;
224
+
225
+ if (CameraPane.IMAGEFLIP)
226
+ {
227
+ dx = -dx;
228
+ }
219229
220230 if (CameraPane.ROTATECAMERA)
221231 {
....@@ -276,24 +286,34 @@
276286 if (scale == 0)
277287 {
278288 // Zoom
279
- LA.vecSub(location, lookAt, location);
280
-
281
- cVector p = location;
282
-
283289 double factor = Math.exp(-dy/300.0); // (1 + dy/100);
284290
285
- p.x *= factor;
286
- p.y *= factor;
287
- p.z *= factor;
291
+ if (viewCode != 0)
292
+ {
293
+ LA.vecSub(location, lookAt, location);
288294
289
- LA.vecAdd(location, lookAt, location);
295
+ cVector p = location;
296
+
297
+ p.x *= factor;
298
+ p.y *= factor;
299
+ p.z *= factor;
300
+
301
+ LA.vecAdd(location, lookAt, location);
302
+ }
303
+ else
304
+ if (//shaper_fovy < 180 && factor > 1 ||
305
+ shaper_fovy * factor < 150)
306
+ {
307
+ shaper_fovy *= factor;
308
+ //System.out.println("fovy = " + shaper_fovy);
309
+ }
290310 }
291311 else
292312 {
293313 LA.vecSub(location, lookAt, direction);
294314
295315 //scale /= Distance();
296
- scale /= shaper_fovy/20;
316
+ // scale /= shaper_fovy/20;
297317
298318 location.x -= dy * direction.x / scale;
299319 //location.y -= dy * direction.y / scale;
....@@ -314,21 +334,31 @@
314334
315335 void RotateInterest(float dx, float dy)
316336 {
337
+ right.mul(-1);
338
+
317339 cStatic.point1.set(location);
318340 location.set(lookAt);
319341 lookAt.set(cStatic.point1);
320
- right.mul(-1);
342
+
343
+ cStatic.point1.set(locationBuf);
344
+ locationBuf.set(lookAtBuf);
345
+ lookAtBuf.set(cStatic.point1);
321346 // UP.mul(-1);
322347
323348 RotatePosition(dx,-dy);
324349
325350 // UP.mul(-1);
326351 right.mul(-1);
352
+
327353 cStatic.point1.set(location);
328354 location.set(lookAt);
329355 lookAt.set(cStatic.point1);
330356
331
- //computeTransform();
357
+ cStatic.point1.set(locationBuf);
358
+ locationBuf.set(lookAtBuf);
359
+ lookAtBuf.set(cStatic.point1);
360
+
361
+ computeTransform();
332362 }
333363
334364 //synchronized // june 2014
....@@ -341,17 +371,52 @@
341371 fromScreen = LA.newMatrix();
342372 }
343373
374
+ if (locationBuf == null)
375
+ {
376
+ locationBuf = new cVector();
377
+ locationBuf.set(location);
378
+ lookAtBuf = new cVector();
379
+ lookAtBuf.set(lookAt);
380
+ upBuf = new cVector();
381
+ upBuf.set(UP);
382
+// up2Buf = new cVector();
383
+// up2Buf.set(UP2);
384
+ }
385
+ else
386
+ {
387
+ double K = 0.25;
388
+
389
+ locationBuf.y = location.y * K + locationBuf.y * (1 - K);
390
+ lookAtBuf.y = lookAt.y * K + lookAtBuf.y * (1 - K);
391
+
392
+ upBuf.x = UP.x * K + upBuf.x * (1 - K);
393
+ upBuf.y = UP.y * K + upBuf.y * (1 - K);
394
+ upBuf.z = UP.z * K + upBuf.z * (1 - K);
395
+ upBuf.normalize();
396
+// up2Buf.x = UP2.x * K + up2Buf.x * (1 - K);
397
+// up2Buf.y = UP2.y * K + up2Buf.y * (1 - K);
398
+// up2Buf.z = UP2.z * K + up2Buf.z * (1 - K);
399
+
400
+ K = 1;
401
+
402
+ locationBuf.x = location.x * K + locationBuf.x * (1 - K);
403
+ locationBuf.z = location.z * K + locationBuf.z * (1 - K);
404
+ lookAtBuf.x = lookAt.x * K + lookAtBuf.x * (1 - K);
405
+ lookAtBuf.z = lookAt.z * K + lookAtBuf.z * (1 - K);
406
+ }
407
+
344408 cVector up2 = up;
345409 cVector right2 = right;
346410
347
- up2.x = UP.x;
348
- up2.y = UP.y;
349
- up2.z = UP.z;
350
- LA.vecSub(lookAt, location, away);
411
+ up2.x = upBuf.x;
412
+ up2.y = upBuf.y;
413
+ up2.z = upBuf.z;
414
+ LA.vecSub(lookAtBuf, locationBuf, away);
351415 LA.vecNormalize(away);
352416 LA.vecCross(away, up2, right2);
353417 if (right2.length2() < 0.0001)
354418 {
419
+ //System.out.println("right2.length2() < 0.0001");
355420 // UP failed
356421 up2.x = UP2.x;
357422 up2.y = UP2.y;
....@@ -361,6 +426,7 @@
361426 LA.vecCross(away, up2, right2);
362427 if (!(right2.length2() > 0))
363428 {
429
+ System.exit(0);
364430 // old problem...
365431 assert (right2.length2() <= 0 || right2.length2() > 0); // weirdest thing ever
366432 up2.x = UP.x = 0;
....@@ -390,10 +456,10 @@
390456 }
391457
392458 for (int i=0; i < 3; i++)
393
- fromScreen[3][i] = location.get(i);
459
+ fromScreen[3][i] = locationBuf.get(i);
394460
395461 for (int i=0; i < 3; i++)
396
- temp[3][i] = -location.get(i);
462
+ temp[3][i] = -locationBuf.get(i);
397463
398464 LA.matConcat(temp, toScreen, toScreen);
399465
....@@ -405,9 +471,16 @@
405471 LA.matConcat(fromScreen, rotate, fromScreen);
406472 //LA.matConcat(toScreen, rotate_1, toScreen);
407473 }
474
+
475
+ if (CameraPane.IMAGEFLIP)
476
+ {
477
+ double[][] flip = { { -1,0,0,0 }, { 0,1,0,0}, { 0,0,1,0}, { 0,0,0,1 } };
478
+
479
+ LA.matConcat(fromScreen, flip, fromScreen);
480
+ }
481
+
408482 //if (this == CameraPane.lightCamera)
409483 //CameraPane.lighttouched = true;
410
-
411484 LA.matInvert(fromScreen, toScreen);
412485 }
413486
....@@ -473,11 +546,20 @@
473546 static final int viewFront = 2;
474547 static final int viewSide = 3;
475548 int viewCode;
549
+
476550 cVector location;
477551 cVector lookAt;
552
+
553
+ transient cVector locationBuf;
554
+ transient cVector lookAtBuf;
555
+ transient cVector upBuf;
556
+ //transient cVector up2Buf;
557
+
478558 cVector direction;
479
- double toScreen[][];
480
- double fromScreen[][];
559
+
560
+ double[][] toScreen;
561
+ double[][] fromScreen;
562
+
481563 boolean perspective;
482564 int hAspect = 0; // Free camera
483565 int vAspect;