X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=sixth-3d.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Frenderer%2Foctree%2FOctreeVolume.java;h=e1b7269fb24db80a592b72cbaca340b406699740;hp=27b948888bbeb4fc18532bbac730d5c939945908;hb=3f589bbc56ebfb1bd35b538b8a77d4019396b5aa;hpb=cad5276b56cfbd0b194dbacb894fea20b9dd5b15 diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/octree/OctreeVolume.java b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/octree/OctreeVolume.java index 27b9488..e1b7269 100755 --- a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/octree/OctreeVolume.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/octree/OctreeVolume.java @@ -4,6 +4,7 @@ */ package eu.svjatoslav.sixth.e3d.renderer.octree; +import eu.svjatoslav.sixth.e3d.geometry.Point3D; import eu.svjatoslav.sixth.e3d.renderer.octree.raytracer.Ray; import eu.svjatoslav.sixth.e3d.renderer.raster.Color; import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.line.LineAppearance; @@ -34,17 +35,15 @@ public class OctreeVolume { // unused cell private static final int CELL_STATE_UNUSED = -1; - final LineAppearance factory = new LineAppearance(); - - public int ce1[]; - public int ce2[]; - public int ce3[]; - public int ce4[]; - public int ce5[]; - public int ce6[]; - public int ce7[]; - public int ce8[]; + public int[] ce1; + public int[] ce2; + public int[] ce3; + public int[] ce4; + public int[] ce5; + public int[] ce6; + public int[] ce7; + public int[] ce8; public int cellAllocationPointer = 0; public int usedCellsCount = 0; public int masterCellSize; @@ -89,120 +88,112 @@ public class OctreeVolume { final int cubeSize, final Ray r) { // ray starts inside the cube - if ((cubeX - cubeSize) < r.x) - if ((cubeX + cubeSize) > r.x) - if ((cubeY - cubeSize) < r.y) - if ((cubeY + cubeSize) > r.y) - if ((cubeZ - cubeSize) < r.z) - if ((cubeZ + cubeSize) > r.z) { - r.hitX = r.x; - r.hitY = r.y; - r.hitZ = r.z; + if ((cubeX - cubeSize) < r.origin.x) + if ((cubeX + cubeSize) > r.origin.x) + if ((cubeY - cubeSize) < r.origin.y) + if ((cubeY + cubeSize) > r.origin.y) + if ((cubeZ - cubeSize) < r.origin.z) + if ((cubeZ + cubeSize) > r.origin.z) { + r.hitPoint = r.origin.clone(); return 1; } // back face - if (r.zp > 0) - if ((cubeZ - cubeSize) > r.z) { - final double mult = ((cubeZ - cubeSize) - r.z) / r.zp; - final double hitX = (r.xp * mult) + r.x; + if (r.direction.z > 0) + if ((cubeZ - cubeSize) > r.origin.z) { + final double mult = ((cubeZ - cubeSize) - r.origin.z) / r.direction.z; + final double hitX = (r.direction.x * mult) + r.origin.x; if ((cubeX - cubeSize) < hitX) if ((cubeX + cubeSize) > hitX) { - final double hitY = (r.yp * mult) + r.y; + final double hitY = (r.direction.y * mult) + r.origin.y; if ((cubeY - cubeSize) < hitY) if ((cubeY + cubeSize) > hitY) { - r.hitX = hitX; - r.hitY = hitY; - r.hitZ = cubeZ - cubeSize; + r.hitPoint = new Point3D(hitX, hitY, cubeZ + - cubeSize); return 2; } } } // up face - if (r.yp > 0) - if ((cubeY - cubeSize) > r.y) { - final double mult = ((cubeY - cubeSize) - r.y) / r.yp; - final double hitX = (r.xp * mult) + r.x; + if (r.direction.y > 0) + if ((cubeY - cubeSize) > r.origin.y) { + final double mult = ((cubeY - cubeSize) - r.origin.y) / r.direction.y; + final double hitX = (r.direction.x * mult) + r.origin.x; if ((cubeX - cubeSize) < hitX) if ((cubeX + cubeSize) > hitX) { - final double hitZ = (r.zp * mult) + r.z; + final double hitZ = (r.direction.z * mult) + r.origin.z; if ((cubeZ - cubeSize) < hitZ) if ((cubeZ + cubeSize) > hitZ) { - r.hitX = hitX; - r.hitY = cubeY - cubeSize; - r.hitZ = hitZ; + r.hitPoint = new Point3D(hitX, cubeY - cubeSize, + hitZ); return 3; } } } // left face - if (r.xp > 0) - if ((cubeX - cubeSize) > r.x) { - final double mult = ((cubeX - cubeSize) - r.x) / r.xp; - final double hitY = (r.yp * mult) + r.y; + if (r.direction.x > 0) + if ((cubeX - cubeSize) > r.origin.x) { + final double mult = ((cubeX - cubeSize) - r.origin.x) / r.direction.x; + final double hitY = (r.direction.y * mult) + r.origin.y; if ((cubeY - cubeSize) < hitY) if ((cubeY + cubeSize) > hitY) { - final double hitZ = (r.zp * mult) + r.z; + final double hitZ = (r.direction.z * mult) + r.origin.z; if ((cubeZ - cubeSize) < hitZ) if ((cubeZ + cubeSize) > hitZ) { - r.hitX = cubeX - cubeSize; - r.hitY = hitY; - r.hitZ = hitZ; + r.hitPoint = new Point3D(cubeX - cubeSize, hitY, + hitZ); return 4; } } } // front face - if (r.zp < 0) - if ((cubeZ + cubeSize) < r.z) { - final double mult = ((cubeZ + cubeSize) - r.z) / r.zp; - final double hitX = (r.xp * mult) + r.x; + if (r.direction.z < 0) + if ((cubeZ + cubeSize) < r.origin.z) { + final double mult = ((cubeZ + cubeSize) - r.origin.z) / r.direction.z; + final double hitX = (r.direction.x * mult) + r.origin.x; if ((cubeX - cubeSize) < hitX) if ((cubeX + cubeSize) > hitX) { - final double hitY = (r.yp * mult) + r.y; + final double hitY = (r.direction.y * mult) + r.origin.y; if ((cubeY - cubeSize) < hitY) if ((cubeY + cubeSize) > hitY) { - r.hitX = hitX; - r.hitY = hitY; - r.hitZ = cubeZ + cubeSize; + r.hitPoint = new Point3D(hitX, hitY, cubeZ + + cubeSize); return 5; } } } // down face - if (r.yp < 0) - if ((cubeY + cubeSize) < r.y) { - final double mult = ((cubeY + cubeSize) - r.y) / r.yp; - final double hitX = (r.xp * mult) + r.x; + if (r.direction.y < 0) + if ((cubeY + cubeSize) < r.origin.y) { + final double mult = ((cubeY + cubeSize) - r.origin.y) / r.direction.y; + final double hitX = (r.direction.x * mult) + r.origin.x; if ((cubeX - cubeSize) < hitX) if ((cubeX + cubeSize) > hitX) { - final double hitZ = (r.zp * mult) + r.z; + final double hitZ = (r.direction.z * mult) + r.origin.z; if ((cubeZ - cubeSize) < hitZ) if ((cubeZ + cubeSize) > hitZ) { - r.hitX = hitX; - r.hitY = cubeY + cubeSize; - r.hitZ = hitZ; + r.hitPoint = new Point3D(hitX, cubeY + cubeSize, + hitZ); return 6; } } } // right face - if (r.xp < 0) - if ((cubeX + cubeSize) < r.x) { - final double mult = ((cubeX + cubeSize) - r.x) / r.xp; - final double hitY = (r.yp * mult) + r.y; + if (r.direction.x < 0) + if ((cubeX + cubeSize) < r.origin.x) { + final double mult = ((cubeX + cubeSize) - r.origin.x) / r.direction.x; + final double hitY = (r.direction.y * mult) + r.origin.y; if ((cubeY - cubeSize) < hitY) if ((cubeY + cubeSize) > hitY) { - final double hitZ = (r.zp * mult) + r.z; + final double hitZ = (r.direction.z * mult) + r.origin.z; if ((cubeZ - cubeSize) < hitZ) if ((cubeZ + cubeSize) > hitZ) { - r.hitX = cubeX + cubeSize; - r.hitY = hitY; - r.hitZ = hitZ; + r.hitPoint = new Point3D(cubeX + cubeSize, hitY, + hitZ); return 7; } } @@ -328,7 +319,7 @@ public class OctreeVolume { } // decide witch subcube to use - int subCubeArray[]; + int[] subCubeArray; int subX, subY, subZ; if (x > cellX) { @@ -431,9 +422,9 @@ public class OctreeVolume { final int halfOfCellSize = cellSize / 2; int rayIntersectionResult; - if (ray.x > cellX) { - if (ray.y > cellY) { - if (ray.z > cellZ) { + if (ray.origin.x > cellX) { + if (ray.origin.y > cellY) { + if (ray.origin.z > cellZ) { // 7 // 6 8 3 5 2 4 1 @@ -578,7 +569,7 @@ public class OctreeVolume { } } - } else if (ray.z > cellZ) { + } else if (ray.origin.z > cellZ) { // 6 // 5 2 7 8 1 3 4 if (ce6[pointer] != 0) { @@ -720,8 +711,8 @@ public class OctreeVolume { } } - } else if (ray.y > cellY) { - if (ray.z > cellZ) { + } else if (ray.origin.y > cellY) { + if (ray.origin.z > cellZ) { // 8 // 5 7 4 1 6 3 2 @@ -866,7 +857,7 @@ public class OctreeVolume { } } - } else if (ray.z > cellZ) { + } else if (ray.origin.z > cellZ) { // 5 // 1 6 8 4 2 7 3