Updated readability of the code.
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / renderer / octree / raytracer / RayTracer.java
index 79ae21c..52bec7d 100755 (executable)
@@ -1,14 +1,10 @@
 /*
- * Sixth 3D engine. Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 3 of the GNU Lesser General Public License
- * or later as published by the Free Software Foundation.
- *
+ * Sixth 3D engine. Author: Svjatoslav Agejenko.
+ * This project is released under Creative Commons Zero (CC0) license.
  */
-
 package eu.svjatoslav.sixth.e3d.renderer.octree.raytracer;
 
+import eu.svjatoslav.sixth.e3d.geometry.Point3D;
 import eu.svjatoslav.sixth.e3d.gui.ViewPanel;
 import eu.svjatoslav.sixth.e3d.renderer.octree.OctreeVolume;
 import eu.svjatoslav.sixth.e3d.renderer.raster.Color;
@@ -22,8 +18,8 @@ public class RayTracer implements Runnable {
     private final Camera camera;
     private final Texture texture;
     private final ViewPanel viewPanel;
-    private OctreeVolume octreeVolume;
-    private Vector<LightSource> lights;
+    private final OctreeVolume octreeVolume;
+    private final Vector<LightSource> lights;
     private int computedLights;
 
     public RayTracer(final Texture texture, final OctreeVolume octreeVolume,
@@ -56,25 +52,25 @@ public class RayTracer implements Runnable {
         final CameraView cameraView = camera.getCameraView();
 
         // calculate vertical vectors
-        final double x1p = cameraView.downLeft.x - cameraView.upLeft.x;
-        final double y1p = cameraView.downLeft.y - cameraView.upLeft.y;
-        final double z1p = cameraView.downLeft.z - cameraView.upLeft.z;
+        final double x1p = cameraView.bottomLeft.x - cameraView.topLeft.x;
+        final double y1p = cameraView.bottomLeft.y - cameraView.topLeft.y;
+        final double z1p = cameraView.bottomLeft.z - cameraView.topLeft.z;
 
-        final double x2p = cameraView.downRight.x - cameraView.upRight.x;
-        final double y2p = cameraView.downRight.y - cameraView.upRight.y;
-        final double z2p = cameraView.downRight.z - cameraView.upRight.z;
+        final double x2p = cameraView.bottomRight.x - cameraView.topRight.x;
+        final double y2p = cameraView.bottomRight.y - cameraView.topRight.y;
+        final double z2p = cameraView.bottomRight.z - cameraView.topRight.z;
 
         long nextBitmapUpdate = System.currentTimeMillis()
                 + PROGRESS_UPDATE_FREQUENCY_MILLIS;
 
         for (int y = 0; y < height; y++) {
-            final double cx1 = cameraView.upLeft.x + ((x1p * y) / height);
-            final double cy1 = cameraView.upLeft.y + ((y1p * y) / height);
-            final double cz1 = cameraView.upLeft.z + ((z1p * y) / height);
+            final double cx1 = cameraView.topLeft.x + ((x1p * y) / height);
+            final double cy1 = cameraView.topLeft.y + ((y1p * y) / height);
+            final double cz1 = cameraView.topLeft.z + ((z1p * y) / height);
 
-            final double cx2 = cameraView.upRight.x + ((x2p * y) / height);
-            final double cy2 = cameraView.upRight.y + ((y2p * y) / height);
-            final double cz2 = cameraView.upRight.z + ((z2p * y) / height);
+            final double cx2 = cameraView.topRight.x + ((x2p * y) / height);
+            final double cy2 = cameraView.topRight.y + ((y2p * y) / height);
+            final double cz2 = cameraView.topRight.z + ((z2p * y) / height);
 
             // calculate horisontal vector
             final double x3p = cx2 - cx1;
@@ -86,11 +82,15 @@ public class RayTracer implements Runnable {
                 final double cy3 = cy1 + ((y3p * x) / width);
                 final double cz3 = cz1 + ((z3p * x) / width);
 
-                final Ray r = new Ray(cameraView.camCenter.x,
-                        cameraView.camCenter.y, cameraView.camCenter.z, cx3
-                        - cameraView.camCenter.x, cy3
-                        - cameraView.camCenter.y, cz3
-                        - cameraView.camCenter.z);
+                final Ray r = new Ray(
+                        new Point3D(cameraView.cameraCenter.x,
+                                cameraView.cameraCenter.y,
+                                cameraView.cameraCenter.z),
+                        new Point3D(
+                                cx3 - cameraView.cameraCenter.x, cy3
+                                - cameraView.cameraCenter.y, cz3
+                                - cameraView.cameraCenter.z)
+                );
                 final int c = traceRay(r);
 
                 final Color color = new Color(c);
@@ -116,7 +116,7 @@ public class RayTracer implements Runnable {
 
         if (intersectingCell != -1) {
             // if lightening not computed, compute it
-            if (octreeVolume.ce3[intersectingCell] == -1)
+            if (octreeVolume.cell3[intersectingCell] == -1)
                 // if cell is larger than 1
                 if (ray.hitCellSize > 1) {
                     // break it up
@@ -127,9 +127,9 @@ public class RayTracer implements Runnable {
                     float red = 30, green = 30, blue = 30;
 
                     for (final LightSource l : lights) {
-                        final int xDist = (l.x - ray.hitCellX);
-                        final int yDist = (l.y - ray.hitCellY);
-                        final int zDist = (l.z - ray.hitCellZ);
+                        final double xDist = (l.location.x - ray.hitCellX);
+                        final double yDist = (l.location.y - ray.hitCellY);
+                        final double zDist = (l.location.z - ray.hitCellZ);
 
                         double newRed = 0, newGreen = 0, newBlue = 0;
                         double tempRed, tempGreen, tempBlue;
@@ -138,12 +138,16 @@ public class RayTracer implements Runnable {
                                 + (yDist * yDist) + (zDist * zDist));
                         distance = (distance / 3) + 1;
 
-                        final Ray r1 = new Ray(ray.hitCellX, ray.hitCellY
-                                - (float) 1.5, ray.hitCellZ,
+                        final Ray r1 = new Ray(
+                                new Point3D(
+                                        ray.hitCellX,
+                                        ray.hitCellY - (float) 1.5,
+                                        ray.hitCellZ),
 
-                                (float) l.x - (float) ray.hitCellX, l.y
-                                - (ray.hitCellY - (float) 1.5), (float) l.z
-                                - (float) ray.hitCellZ);
+                                new Point3D((float) l.location.x - (float) ray.hitCellX, l.location.y
+                                        - (ray.hitCellY - (float) 1.5), (float) l.location.z
+                                        - (float) ray.hitCellZ)
+                        );
 
                         final int rt1 = octreeVolume.traceCell(0, 0, 0,
                                 octreeVolume.masterCellSize, 0, r1);
@@ -154,12 +158,16 @@ public class RayTracer implements Runnable {
                             newBlue = (l.color.b * l.brightness) / distance;
                         }
 
-                        final Ray r2 = new Ray(ray.hitCellX - (float) 1.5,
-                                ray.hitCellY, ray.hitCellZ,
+                        final Ray r2 = new Ray(
+                                new Point3D(
+                                        ray.hitCellX - (float) 1.5,
+                                        ray.hitCellY, ray.hitCellZ),
 
-                                l.x - (ray.hitCellX - (float) 1.5), (float) l.y
-                                - (float) ray.hitCellY, (float) l.z
-                                - (float) ray.hitCellZ);
+                                new Point3D(
+                                        l.location.x - (ray.hitCellX - (float) 1.5), (float) l.location.y
+                                        - (float) ray.hitCellY, (float) l.location.z
+                                        - (float) ray.hitCellZ)
+                        );
 
                         final int rt2 = octreeVolume.traceCell(0, 0, 0,
                                 octreeVolume.masterCellSize, 0, r2);
@@ -177,12 +185,15 @@ public class RayTracer implements Runnable {
                                 newBlue = tempBlue;
                         }
 
-                        final Ray r3 = new Ray(ray.hitCellX, ray.hitCellY,
-                                ray.hitCellZ - (float) 1.5,
-
-                                (float) l.x - (float) ray.hitCellX, (float) l.y
-                                - (float) ray.hitCellY, l.z
-                                - (ray.hitCellZ - (float) 1.5));
+                        final Ray r3 = new Ray(
+                                new Point3D(
+                                        ray.hitCellX, ray.hitCellY,
+                                        ray.hitCellZ - (float) 1.5),
+                                new Point3D(
+                                        (float) l.location.x - (float) ray.hitCellX, (float) l.location.y
+                                        - (float) ray.hitCellY, l.location.z
+                                        - (ray.hitCellZ - (float) 1.5))
+                        );
 
                         final int rt3 = octreeVolume.traceCell(0, 0, 0,
                                 octreeVolume.masterCellSize, 0, r3);
@@ -199,12 +210,17 @@ public class RayTracer implements Runnable {
                                 newBlue = tempBlue;
                         }
 
-                        final Ray r4 = new Ray(ray.hitCellX, ray.hitCellY
-                                + (float) 1.5, ray.hitCellZ,
+                        final Ray r4 = new Ray(
+                                new Point3D(
+                                        ray.hitCellX,
+                                        ray.hitCellY + (float) 1.5,
+                                        ray.hitCellZ),
 
-                                (float) l.x - (float) ray.hitCellX, l.y
-                                - (ray.hitCellY + (float) 1.5), (float) l.z
-                                - (float) ray.hitCellZ);
+                                new Point3D(
+                                        (float) l.location.x - (float) ray.hitCellX, l.location.y
+                                        - (ray.hitCellY + (float) 1.5), (float) l.location.z
+                                        - (float) ray.hitCellZ)
+                        );
 
                         final int rt4 = octreeVolume.traceCell(0, 0, 0,
                                 octreeVolume.masterCellSize, 0, r4);
@@ -221,12 +237,16 @@ public class RayTracer implements Runnable {
                                 newBlue = tempBlue;
                         }
 
-                        final Ray r5 = new Ray(ray.hitCellX + (float) 1.5,
-                                ray.hitCellY, ray.hitCellZ,
+                        final Ray r5 = new Ray(
+                                new Point3D(
+                                        ray.hitCellX + (float) 1.5,
+                                        ray.hitCellY, ray.hitCellZ),
 
-                                l.x - (ray.hitCellX + (float) 1.5), (float) l.y
-                                - (float) ray.hitCellY, (float) l.z
-                                - (float) ray.hitCellZ);
+                                new Point3D(
+                                        l.location.x - (ray.hitCellX + (float) 1.5), (float) l.location.y
+                                        - (float) ray.hitCellY, (float) l.location.z
+                                        - (float) ray.hitCellZ)
+                        );
 
                         final int rt5 = octreeVolume.traceCell(0, 0, 0,
                                 octreeVolume.masterCellSize, 0, r5);
@@ -243,12 +263,16 @@ public class RayTracer implements Runnable {
                                 newBlue = tempBlue;
                         }
 
-                        final Ray r6 = new Ray(ray.hitCellX, ray.hitCellY,
-                                ray.hitCellZ + (float) 1.5,
+                        final Ray r6 = new Ray(
+                                new Point3D(
+                                        ray.hitCellX, ray.hitCellY,
+                                        ray.hitCellZ + (float) 1.5),
+
+                                new Point3D(
 
-                                (float) l.x - (float) ray.hitCellX, (float) l.y
-                                - (float) ray.hitCellY, l.z
-                                - (ray.hitCellZ + (float) 1.5));
+                                        (float) l.location.x - (float) ray.hitCellX, (float) l.location.y
+                                        - (float) ray.hitCellY, l.location.z
+                                        - (ray.hitCellZ + (float) 1.5)));
 
                         final int rt6 = octreeVolume.traceCell(0, 0, 0,
                                 octreeVolume.masterCellSize, 0, r6);
@@ -270,7 +294,7 @@ public class RayTracer implements Runnable {
 
                     }
 
-                    final int cellColor = octreeVolume.ce2[intersectingCell];
+                    final int cellColor = octreeVolume.cell2[intersectingCell];
 
                     red = (red * ((cellColor & 0xFF0000) >> 16)) / 255;
                     green = (green * ((cellColor & 0xFF00) >> 8)) / 255;
@@ -283,13 +307,13 @@ public class RayTracer implements Runnable {
                     if (blue > 255)
                         blue = 255;
 
-                    octreeVolume.ce3[intersectingCell] = (((int) red) << 16)
+                    octreeVolume.cell3[intersectingCell] = (((int) red) << 16)
                             + (((int) green) << 8) + ((int) blue);
 
                 }
-            if (octreeVolume.ce3[intersectingCell] == 0)
-                return octreeVolume.ce2[intersectingCell];
-            return octreeVolume.ce3[intersectingCell];
+            if (octreeVolume.cell3[intersectingCell] == 0)
+                return octreeVolume.cell2[intersectingCell];
+            return octreeVolume.cell3[intersectingCell];
         }
 
         // return (200 << 16) + (200 << 8) + 255;