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));
....@@ -71,7 +71,7 @@
7171 perspective = false;
7272 break;
7373 case 4: // Default light
74
- location = LA.newVector(-10, 30, 20);
74
+ location = LA.newVector(-5, 15, 10);
7575 perspective = false;
7676 break;
7777 }
....@@ -104,6 +104,15 @@
104104 focalLength = 1;
105105 setAspect(4, 3);
106106 background = LA.newVector(0.8, 0.8, 0.8);
107
+ }
108
+
109
+ void CreateMaterial(boolean multiply)
110
+ {
111
+ super.CreateMaterial(multiply);
112
+
113
+ material.shift = 90;
114
+ material.cameralight = 0.2f;
115
+ material.shadowbias = 10;
107116 }
108117
109118 void setAspect(int width, int height)
....@@ -150,6 +159,11 @@
150159 void RotatePosition(float dx, float dy)
151160 {
152161 if(hAspect != 0) return;
162
+
163
+ if (CameraPane.IMAGEFLIP)
164
+ {
165
+ dx = -dx;
166
+ }
153167
154168 if (CameraPane.ROTATECAMERA)
155169 {
....@@ -207,6 +221,11 @@
207221 void Translate(float dx, float dy, float scale)
208222 {
209223 if(hAspect != 0) return;
224
+
225
+ if (CameraPane.IMAGEFLIP)
226
+ {
227
+ dx = -dx;
228
+ }
210229
211230 if (CameraPane.ROTATECAMERA)
212231 {
....@@ -267,24 +286,34 @@
267286 if (scale == 0)
268287 {
269288 // Zoom
270
- LA.vecSub(location, lookAt, location);
271
-
272
- cVector p = location;
273
-
274289 double factor = Math.exp(-dy/300.0); // (1 + dy/100);
275290
276
- p.x *= factor;
277
- p.y *= factor;
278
- p.z *= factor;
291
+ if (viewCode != 0)
292
+ {
293
+ LA.vecSub(location, lookAt, location);
279294
280
- 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
+ }
281310 }
282311 else
283312 {
284313 LA.vecSub(location, lookAt, direction);
285314
286315 //scale /= Distance();
287
- scale /= shaper_fovy/20;
316
+ // scale /= shaper_fovy/20;
288317
289318 location.x -= dy * direction.x / scale;
290319 //location.y -= dy * direction.y / scale;
....@@ -305,21 +334,31 @@
305334
306335 void RotateInterest(float dx, float dy)
307336 {
337
+ right.mul(-1);
338
+
308339 cStatic.point1.set(location);
309340 location.set(lookAt);
310341 lookAt.set(cStatic.point1);
311
- right.mul(-1);
342
+
343
+ cStatic.point1.set(locationBuf);
344
+ locationBuf.set(lookAtBuf);
345
+ lookAtBuf.set(cStatic.point1);
312346 // UP.mul(-1);
313347
314348 RotatePosition(dx,-dy);
315349
316350 // UP.mul(-1);
317351 right.mul(-1);
352
+
318353 cStatic.point1.set(location);
319354 location.set(lookAt);
320355 lookAt.set(cStatic.point1);
321356
322
- //computeTransform();
357
+ cStatic.point1.set(locationBuf);
358
+ locationBuf.set(lookAtBuf);
359
+ lookAtBuf.set(cStatic.point1);
360
+
361
+ computeTransform();
323362 }
324363
325364 //synchronized // june 2014
....@@ -332,17 +371,52 @@
332371 fromScreen = LA.newMatrix();
333372 }
334373
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
+
335408 cVector up2 = up;
336409 cVector right2 = right;
337410
338
- up2.x = UP.x;
339
- up2.y = UP.y;
340
- up2.z = UP.z;
341
- 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);
342415 LA.vecNormalize(away);
343416 LA.vecCross(away, up2, right2);
344417 if (right2.length2() < 0.0001)
345418 {
419
+ //System.out.println("right2.length2() < 0.0001");
346420 // UP failed
347421 up2.x = UP2.x;
348422 up2.y = UP2.y;
....@@ -352,6 +426,7 @@
352426 LA.vecCross(away, up2, right2);
353427 if (!(right2.length2() > 0))
354428 {
429
+ System.exit(0);
355430 // old problem...
356431 assert (right2.length2() <= 0 || right2.length2() > 0); // weirdest thing ever
357432 up2.x = UP.x = 0;
....@@ -381,10 +456,10 @@
381456 }
382457
383458 for (int i=0; i < 3; i++)
384
- fromScreen[3][i] = location.get(i);
459
+ fromScreen[3][i] = locationBuf.get(i);
385460
386461 for (int i=0; i < 3; i++)
387
- temp[3][i] = -location.get(i);
462
+ temp[3][i] = -locationBuf.get(i);
388463
389464 LA.matConcat(temp, toScreen, toScreen);
390465
....@@ -396,9 +471,16 @@
396471 LA.matConcat(fromScreen, rotate, fromScreen);
397472 //LA.matConcat(toScreen, rotate_1, toScreen);
398473 }
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
+
399482 //if (this == CameraPane.lightCamera)
400483 //CameraPane.lighttouched = true;
401
-
402484 LA.matInvert(fromScreen, toScreen);
403485 }
404486
....@@ -464,11 +546,20 @@
464546 static final int viewFront = 2;
465547 static final int viewSide = 3;
466548 int viewCode;
549
+
467550 cVector location;
468551 cVector lookAt;
552
+
553
+ transient cVector locationBuf;
554
+ transient cVector lookAtBuf;
555
+ transient cVector upBuf;
556
+ //transient cVector up2Buf;
557
+
469558 cVector direction;
470
- double toScreen[][];
471
- double fromScreen[][];
559
+
560
+ double[][] toScreen;
561
+ double[][] fromScreen;
562
+
472563 boolean perspective;
473564 int hAspect = 0; // Free camera
474565 int vAspect;