Advertisement
Guest User

Octree Traversal

a guest
May 10th, 2024
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.34 KB | None | 0 0
  1. kernel void Draw(__global unsigned int *pPixels, __global unsigned int *pChildData, __global unsigned int *pColorData, __global float *pRayDirs, __global float *pCamPos, __global float *pRotData)
  2. {
  3.   const float largestFloat = 9999999999.f;
  4.   const float smallestFloat = 0.000000001f;
  5.  
  6.   const int octreeLayers = 12;
  7.   int id = get_global_id(0);
  8.  
  9.   float3 rayPos = (float3)(pCamPos[0], pCamPos[1], pCamPos[2]);
  10.   float3 rayDir = (float3)(pRayDirs[id * 3 + 0], pRayDirs[id * 3 + 1], pRayDirs[id * 3 + 2]);
  11.   rayDir = (float3)(rayDir.x, rayDir.y * pRotData[2] - rayDir.z * pRotData[3], rayDir.y * pRotData[3] + rayDir.z * pRotData[2]);
  12.   rayDir = (float3)(rayDir.x * pRotData[0] - rayDir.y * pRotData[1], rayDir.x * pRotData[1] + rayDir.y * pRotData[0], rayDir.z);
  13.  
  14.   unsigned int stackPtr = 0;
  15.   unsigned int nodeStack[64];
  16.   unsigned int nodeLayers[64];
  17.   float3 nodeBoxes[64];
  18.  
  19.   nodeStack[stackPtr] = 0;
  20.   nodeLayers[stackPtr] = 1;
  21.   nodeBoxes[stackPtr] = (float3)(0, 0, 0);
  22.   stackPtr = 1;
  23.  
  24.   float dirfracx = 1.0f / rayDir.x;
  25.   float dirfracy = 1.0f / rayDir.y;
  26.   float dirfracz = 1.0f / rayDir.z;
  27.  
  28.   while (stackPtr > 0)
  29.   {
  30.     unsigned int nodeID = nodeStack[stackPtr - 1];
  31.     unsigned int childID = pChildData[nodeID];
  32.     unsigned int nodeLayer = nodeLayers[stackPtr - 1];
  33.     float3 nodeBoxPos = nodeBoxes[stackPtr - 1];
  34.     float nodeBoxSize = (float)(1 << (octreeLayers - nodeLayer));
  35.     --stackPtr;
  36.  
  37.     bool hit = false;
  38.     // Ray In Box
  39.     {
  40.       if (rayPos.x >= nodeBoxPos.x && rayPos.y >= nodeBoxPos.y && rayPos.z >= nodeBoxPos.z)
  41.         if (rayPos.x < (nodeBoxPos.x + nodeBoxSize) && rayPos.y < (nodeBoxPos.y + nodeBoxSize) && rayPos.z < (nodeBoxPos.z + nodeBoxSize))
  42.           hit = true;
  43.     }
  44.     if (!hit)
  45.     {
  46.       float t1 = ((nodeBoxPos.x) - rayPos.x) * dirfracx;
  47.       float t2 = ((nodeBoxPos.x + nodeBoxSize) - rayPos.x) * dirfracx;
  48.       float t3 = ((nodeBoxPos.y) - rayPos.y) * dirfracy;
  49.       float t4 = ((nodeBoxPos.y + nodeBoxSize) - rayPos.y) * dirfracy;
  50.       float t5 = ((nodeBoxPos.z) - rayPos.z) * dirfracz;
  51.       float t6 = ((nodeBoxPos.z + nodeBoxSize) - rayPos.z) * dirfracz;
  52.       float tmax = min(min(max(t1, t2), max(t3, t4)), max(t5, t6));
  53.       if (tmax > 0)
  54.       {
  55.         float tmin = max(max(min(t1, t2), min(t3, t4)), min(t5, t6));
  56.         if (tmin < tmax)
  57.           hit = true;
  58.       }
  59.     }
  60.  
  61.     if (hit)
  62.     {
  63.       if (nodeLayer == octreeLayers)
  64.       {
  65.         pPixels[id] = pColorData[nodeID];
  66.         return;
  67.       }
  68.       else
  69.         if (childID > 0)
  70.         {
  71.           // Loop based
  72.           for (unsigned int cz = 0; cz < 2; cz++) for (unsigned int cy = 0; cy < 2; cy++) for (unsigned int cx = 0; cx < 2; cx++)
  73.           // Iterate children in order of intersection
  74.           {
  75.             unsigned int c = (cx ^ (rayDir.x > 0)) + (cy ^ (rayDir.y > 0)) * 2 + (cz ^ (rayDir.z > 0)) * 4;
  76.             if (pColorData[childID + c] == 0) continue; // Skip empty children
  77.             nodeStack[stackPtr] = childID + c;
  78.             nodeLayers[stackPtr] = nodeLayer + 1;
  79.             unsigned int subBoxSize = 1 << (octreeLayers - nodeLayer - 1);
  80.             float3 boxStart = nodeBoxPos + (float3)((c & 1) > 0, (c & 2) > 0, (c & 4) > 0) * (float)subBoxSize;
  81.             nodeBoxes[stackPtr] = boxStart;
  82.             ++stackPtr;
  83.           }
  84.         }
  85.     }
  86.   }
  87.   pPixels[id] = 0;
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement