Skip to main content
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
added 708 characters in body
Source Link

Edit: Yes, the chunks are stored fine. OctrA stands for OctreeA, which is the chunk. Edit: I reversed the ray for two steps after hitting a chunk. Although the glitches have gotten better, there is still the same problem.

 float cameraX = x/(float)HALFRESX -1;// -1 to 1 struct Point3D rayd; rayd.x = dir.x + plane.x * cameraX; rayd.y = dir.y + plane.y * cameraX; struct Point3D delta; delta.x = fabsf(1/rayd.x); delta.y = fabsf(1/rayd.y); int zy = -HALFRESY; struct pos map; map.x = (char)pos.x; map.y = (char)pos.y; float sdistX; float sdistY; struct pos s; struct pos step; struct Point3D sdist; if(rayd.x < 0) { step.x = -1; s.x = 1; sdistX = (pos.x - map.x) * delta.x; } else { step.x = 1; s.x = 0; sdistX = (map.x + 1 - pos.x) * delta.x; } if(rayd.y < 0) { step.y = -1; s.y = 1; sdistY = (pos.y - map.y) * delta.y; } else { step.y = 1; s.y = 0; sdistY = (map.y + 1 - pos.y) * delta.y; } for(int y = 0; y < RESY; y += 1) { zy++; float cameraY = y/(float)HALFRESY - 1; rayd.z = dir.z + plane.z * cameraY; delta.z = fabsf(1/rayd.z); map.x = (char)pos.x; map.y = (char)pos.y; map.z = (char)pos.z; sdist.x = sdistX; sdist.y = sdistY; if(rayd.z < 0) { step.z = -1; s.z = 1; sdist.z = (pos.z - map.z) * delta.z; } else { step.z = 1; s.z = 0; sdist.z = (map.z + 1 - pos.z) * delta.z; } #ifdef USE_OCTREE while( !octrA[map.x/2][map.y/2][map.z/2]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y*2; map.y += step.y*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x*2; map.x += step.x*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } }  if(octr) { if(sdist.y > sdist.x ) { if(sdist.y > sdist.z) { sdist.y -= delta.y*2; map.y -= step.y*2; } else { sdist.z -= delta.z*2; map.z -= step.z*2; } } else { if(sdist.x > sdist.z) { sdist.x -= delta.x*2; map.x -= step.x*2; } else { sdist.z -= delta.z*2; map.z -= step.z*2; } } }  #endif char side; //either 0 (NS), or 1 (EW), or 2(UD) while( !MAP[map.x][map.y][map.z]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; side = 1; // y } else { sdist.z += delta.z; map.z += step.z; side = 2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; side = 0; } else { sdist.z += delta.z; map.z += step.z; side = 2; } } } 

Edit: Yes, the chunks are stored fine. OctrA stands for OctreeA, which is the chunk.

 float cameraX = x/(float)HALFRESX -1;// -1 to 1 struct Point3D rayd; rayd.x = dir.x + plane.x * cameraX; rayd.y = dir.y + plane.y * cameraX; struct Point3D delta; delta.x = fabsf(1/rayd.x); delta.y = fabsf(1/rayd.y); int zy = -HALFRESY; struct pos map; map.x = (char)pos.x; map.y = (char)pos.y; float sdistX; float sdistY; struct pos s; struct pos step; struct Point3D sdist; if(rayd.x < 0) { step.x = -1; s.x = 1; sdistX = (pos.x - map.x) * delta.x; } else { step.x = 1; s.x = 0; sdistX = (map.x + 1 - pos.x) * delta.x; } if(rayd.y < 0) { step.y = -1; s.y = 1; sdistY = (pos.y - map.y) * delta.y; } else { step.y = 1; s.y = 0; sdistY = (map.y + 1 - pos.y) * delta.y; } for(int y = 0; y < RESY; y += 1) { zy++; float cameraY = y/(float)HALFRESY - 1; rayd.z = dir.z + plane.z * cameraY; delta.z = fabsf(1/rayd.z); map.x = (char)pos.x; map.y = (char)pos.y; map.z = (char)pos.z; sdist.x = sdistX; sdist.y = sdistY; if(rayd.z < 0) { step.z = -1; s.z = 1; sdist.z = (pos.z - map.z) * delta.z; } else { step.z = 1; s.z = 0; sdist.z = (map.z + 1 - pos.z) * delta.z; } #ifdef USE_OCTREE while( !octrA[map.x/2][map.y/2][map.z/2]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y*2; map.y += step.y*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x*2; map.x += step.x*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } } #endif char side; //either 0 (NS), or 1 (EW), or 2(UD) while( !MAP[map.x][map.y][map.z]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; side = 1; // y } else { sdist.z += delta.z; map.z += step.z; side = 2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; side = 0; } else { sdist.z += delta.z; map.z += step.z; side = 2; } } } 

Edit: Yes, the chunks are stored fine. OctrA stands for OctreeA, which is the chunk. Edit: I reversed the ray for two steps after hitting a chunk. Although the glitches have gotten better, there is still the same problem.

 float cameraX = x/(float)HALFRESX -1;// -1 to 1 struct Point3D rayd; rayd.x = dir.x + plane.x * cameraX; rayd.y = dir.y + plane.y * cameraX; struct Point3D delta; delta.x = fabsf(1/rayd.x); delta.y = fabsf(1/rayd.y); int zy = -HALFRESY; struct pos map; map.x = (char)pos.x; map.y = (char)pos.y; float sdistX; float sdistY; struct pos s; struct pos step; struct Point3D sdist; if(rayd.x < 0) { step.x = -1; s.x = 1; sdistX = (pos.x - map.x) * delta.x; } else { step.x = 1; s.x = 0; sdistX = (map.x + 1 - pos.x) * delta.x; } if(rayd.y < 0) { step.y = -1; s.y = 1; sdistY = (pos.y - map.y) * delta.y; } else { step.y = 1; s.y = 0; sdistY = (map.y + 1 - pos.y) * delta.y; } for(int y = 0; y < RESY; y += 1) { zy++; float cameraY = y/(float)HALFRESY - 1; rayd.z = dir.z + plane.z * cameraY; delta.z = fabsf(1/rayd.z); map.x = (char)pos.x; map.y = (char)pos.y; map.z = (char)pos.z; sdist.x = sdistX; sdist.y = sdistY; if(rayd.z < 0) { step.z = -1; s.z = 1; sdist.z = (pos.z - map.z) * delta.z; } else { step.z = 1; s.z = 0; sdist.z = (map.z + 1 - pos.z) * delta.z; } #ifdef USE_OCTREE while( !octrA[map.x/2][map.y/2][map.z/2]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y*2; map.y += step.y*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x*2; map.x += step.x*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } }  if(octr) { if(sdist.y > sdist.x ) { if(sdist.y > sdist.z) { sdist.y -= delta.y*2; map.y -= step.y*2; } else { sdist.z -= delta.z*2; map.z -= step.z*2; } } else { if(sdist.x > sdist.z) { sdist.x -= delta.x*2; map.x -= step.x*2; } else { sdist.z -= delta.z*2; map.z -= step.z*2; } } }  #endif char side; //either 0 (NS), or 1 (EW), or 2(UD) while( !MAP[map.x][map.y][map.z]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; side = 1; // y } else { sdist.z += delta.z; map.z += step.z; side = 2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; side = 0; } else { sdist.z += delta.z; map.z += step.z; side = 2; } } } 
added 87 characters in body
Source Link

Edit: Yes, the chunks are stored fine. OctrA stands for OctreeA, which is the chunk.

Edit: Yes, the chunks are stored fine. OctrA stands for OctreeA, which is the chunk.

deleted 1020 characters in body
Source Link
 float cameraX = x/(float)HALFRESX -1;// -1 to 1 struct Point3D rayd; rayd.x = dir.x + plane.x * cameraX; rayd.y = dir.y + plane.y * cameraX; struct Point3D delta; delta.x = fabsf(1/rayd.x); delta.y = fabsf(1/rayd.y); int zy = -HALFRESY; struct pos map; map.x = (char)pos.x; map.y = (char)pos.y; float sdistX; float sdistY; struct pos s; struct pos step; struct Point3D sdist; if(rayd.x < 0) { step.x = -1; s.x = 1; sdistX = (pos.x - map.x) * delta.x; } else { step.x = 1; s.x = 0; sdistX = (map.x + 1 - pos.x) * delta.x; } if(rayd.y < 0) { step.y = -1; s.y = 1; sdistY = (pos.y - map.y) * delta.y; } else { step.y = 1; s.y = 0; sdistY = (map.y + 1 - pos.y) * delta.y; } for(int y = 0; y < RESY; y += 1) { zy++; float cameraY = y/(float)HALFRESY - 1; rayd.z = dir.z + plane.z * cameraY; delta.z = fabsf(1/rayd.z); map.x = (char)pos.x; map.y = (char)pos.y; map.z = (char)pos.z; sdist.x = sdistX; sdist.y = sdistY; if(rayd.z < 0) { step.z = -1; s.z = 1; sdist.z = (pos.z - map.z) * delta.z; } else { step.z = 1; s.z = 0; sdist.z = (map.z + 1 - pos.z) * delta.z; } #ifdef USE_OCTREE  if(sdist.y < sdist.x ) { //prevent rendering artifacts when inside octree if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; } else { sdist.z += delta.z; map.z += step.z; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; } else { sdist.z += delta.z; map.z += step.z; } } if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; } else { sdist.z += delta.z; map.z += step.z; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; } else { sdist.z += delta.z; map.z += step.z; } }  while( !octrA[map.x/2][map.y/2][map.z/2]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y*2; map.y += step.y*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x*2; map.x += step.x*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } } #endif char side; //either 0 (NS), or 1 (EW), or 2(UD) while( !MAP[map.x][map.y][map.z]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; side = 1; // y } else { sdist.z += delta.z; map.z += step.z; side = 2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; side = 0; } else { sdist.z += delta.z; map.z += step.z; side = 2; } } } 
 float cameraX = x/(float)HALFRESX -1;// -1 to 1 struct Point3D rayd; rayd.x = dir.x + plane.x * cameraX; rayd.y = dir.y + plane.y * cameraX; struct Point3D delta; delta.x = fabsf(1/rayd.x); delta.y = fabsf(1/rayd.y); int zy = -HALFRESY; struct pos map; map.x = (char)pos.x; map.y = (char)pos.y; float sdistX; float sdistY; struct pos s; struct pos step; struct Point3D sdist; if(rayd.x < 0) { step.x = -1; s.x = 1; sdistX = (pos.x - map.x) * delta.x; } else { step.x = 1; s.x = 0; sdistX = (map.x + 1 - pos.x) * delta.x; } if(rayd.y < 0) { step.y = -1; s.y = 1; sdistY = (pos.y - map.y) * delta.y; } else { step.y = 1; s.y = 0; sdistY = (map.y + 1 - pos.y) * delta.y; } for(int y = 0; y < RESY; y += 1) { zy++; float cameraY = y/(float)HALFRESY - 1; rayd.z = dir.z + plane.z * cameraY; delta.z = fabsf(1/rayd.z); map.x = (char)pos.x; map.y = (char)pos.y; map.z = (char)pos.z; sdist.x = sdistX; sdist.y = sdistY; if(rayd.z < 0) { step.z = -1; s.z = 1; sdist.z = (pos.z - map.z) * delta.z; } else { step.z = 1; s.z = 0; sdist.z = (map.z + 1 - pos.z) * delta.z; } #ifdef USE_OCTREE  if(sdist.y < sdist.x ) { //prevent rendering artifacts when inside octree if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; } else { sdist.z += delta.z; map.z += step.z; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; } else { sdist.z += delta.z; map.z += step.z; } } if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; } else { sdist.z += delta.z; map.z += step.z; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; } else { sdist.z += delta.z; map.z += step.z; } }  while( !octrA[map.x/2][map.y/2][map.z/2]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y*2; map.y += step.y*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x*2; map.x += step.x*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } } #endif char side; //either 0 (NS), or 1 (EW), or 2(UD) while( !MAP[map.x][map.y][map.z]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; side = 1; // y } else { sdist.z += delta.z; map.z += step.z; side = 2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; side = 0; } else { sdist.z += delta.z; map.z += step.z; side = 2; } } } 
 float cameraX = x/(float)HALFRESX -1;// -1 to 1 struct Point3D rayd; rayd.x = dir.x + plane.x * cameraX; rayd.y = dir.y + plane.y * cameraX; struct Point3D delta; delta.x = fabsf(1/rayd.x); delta.y = fabsf(1/rayd.y); int zy = -HALFRESY; struct pos map; map.x = (char)pos.x; map.y = (char)pos.y; float sdistX; float sdistY; struct pos s; struct pos step; struct Point3D sdist; if(rayd.x < 0) { step.x = -1; s.x = 1; sdistX = (pos.x - map.x) * delta.x; } else { step.x = 1; s.x = 0; sdistX = (map.x + 1 - pos.x) * delta.x; } if(rayd.y < 0) { step.y = -1; s.y = 1; sdistY = (pos.y - map.y) * delta.y; } else { step.y = 1; s.y = 0; sdistY = (map.y + 1 - pos.y) * delta.y; } for(int y = 0; y < RESY; y += 1) { zy++; float cameraY = y/(float)HALFRESY - 1; rayd.z = dir.z + plane.z * cameraY; delta.z = fabsf(1/rayd.z); map.x = (char)pos.x; map.y = (char)pos.y; map.z = (char)pos.z; sdist.x = sdistX; sdist.y = sdistY; if(rayd.z < 0) { step.z = -1; s.z = 1; sdist.z = (pos.z - map.z) * delta.z; } else { step.z = 1; s.z = 0; sdist.z = (map.z + 1 - pos.z) * delta.z; } #ifdef USE_OCTREE while( !octrA[map.x/2][map.y/2][map.z/2]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y*2; map.y += step.y*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x*2; map.x += step.x*2; } else { sdist.z += delta.z*2; map.z += step.z*2; } } } #endif char side; //either 0 (NS), or 1 (EW), or 2(UD) while( !MAP[map.x][map.y][map.z]) { if(sdist.y < sdist.x ) { if(sdist.y < sdist.z) { sdist.y += delta.y; map.y += step.y; side = 1; // y } else { sdist.z += delta.z; map.z += step.z; side = 2; } } else { if(sdist.x < sdist.z) { sdist.x += delta.x; map.x += step.x; side = 0; } else { sdist.z += delta.z; map.z += step.z; side = 2; } } } 
Source Link
Loading