Advertisement
Zgragselus

While loop

Apr 7th, 2023
627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1.     // Traversal (use for for testing)
  2.     while (node_id != 0xFFFFFFFF)
  3.     {
  4.         BVHNode n = ASTreeData[node_id];
  5.  
  6.         temp.x += 0.1f;
  7.  
  8.         [branch] if (n.PrimitiveCount == 0)
  9.         {
  10.             // Fetch children bounding boxes
  11.             float4 n0xy = n.LXY;
  12.             float4 n1xy = n.RXY;
  13.             float4 nz = n.LRZ;
  14.  
  15.             // Test against child AABBs
  16.             float c0lox = n0xy.x * inv.x - oinv.x;
  17.             float c0hix = n0xy.y * inv.x - oinv.x;
  18.             float c0loy = n0xy.z * inv.y - oinv.y;
  19.             float c0hiy = n0xy.w * inv.y - oinv.y;
  20.             float c0loz = nz.x * inv.z - oinv.z;
  21.             float c0hiz = nz.y * inv.z - oinv.z;
  22.             float c1loz = nz.z * inv.z - oinv.z;
  23.             float c1hiz = nz.w * inv.z - oinv.z;
  24.             float c0min = max(max(min(c0lox, c0hix), min(c0loy, c0hiy)), max(min(c0loz, c0hiz), tmin));
  25.             float c0max = min(min(max(c0lox, c0hix), max(c0loy, c0hiy)), min(max(c0loz, c0hiz), tmax));
  26.             float c1lox = n1xy.x * inv.x - oinv.x;
  27.             float c1hix = n1xy.y * inv.x - oinv.x;
  28.             float c1loy = n1xy.z * inv.y - oinv.y;
  29.             float c1hiy = n1xy.w * inv.y - oinv.y;
  30.             float c1min = max(max(min(c1lox, c1hix), min(c1loy, c1hiy)), max(min(c1loz, c1hiz), tmin));
  31.             float c1max = min(min(max(c1lox, c1hix), max(c1loy, c1hiy)), min(max(c1loz, c1hiz), tmax));
  32.  
  33.             bool traverseChild0 = (c0max >= c0min);
  34.             bool traverseChild1 = (c1max >= c1min);
  35.  
  36.             // If no children was hit, get node from stack
  37.             if (!traverseChild0 && !traverseChild1)
  38.             {
  39.                 if (stack_ptr == meshbvh_stack_ptr)
  40.                 {
  41.                     meshbvh_stack_ptr = -1;
  42.                     o = r.Origin;
  43.                     d = r.Direction;
  44.                     inv = r.Inverse;
  45.                     oinv = o * inv;
  46.                 }
  47.  
  48.                 node_id = stack[stack_ptr];
  49.                 stack_ptr--;
  50.             }
  51.             else if (traverseChild0 || traverseChild1)
  52.             {
  53.                 uint first_child = node_id + 1;
  54.                 uint second_child = n.PrimitiveOffset;
  55.                 node_id = (traverseChild0) ? first_child : second_child;
  56.  
  57.                 if (traverseChild0 && traverseChild1)
  58.                 {
  59.                     if (c1min < c0min)
  60.                     {
  61.                         node_id = second_child;
  62.                         stack_ptr++;
  63.                         stack[stack_ptr] = first_child;
  64.                     }
  65.                     else
  66.                     {
  67.                         stack_ptr++;
  68.                         stack[stack_ptr] = second_child;
  69.                     }
  70.                 }
  71.             }
  72.         }
  73.         else if (n.PrimitiveCount == -1)
  74.         {
  75.             meshbvh_stack_ptr = stack_ptr;
  76.  
  77.             uint blas_offset = n.PrimitiveOffset;
  78.             uint instance_index = ASIndexData[blas_offset];
  79.             instance = Instances[instance_index];
  80.  
  81.             node_id = ASTreeNodes[Geometries[instance.GeometryNode].BVHNode + 1].Offset / 64;
  82.  
  83.             o = mul(r.Origin, instance.TransformInverse);
  84.             d = mul(r.Direction, instance.TransformInverse);
  85.             inv = rcp(d);
  86.             oinv = o * inv;
  87.         }
  88.         else
  89.         {
  90.             if (n.PrimitiveCount > 0)
  91.             {
  92.                 GeometryNode geom = Geometries[instance.GeometryNode];
  93.                 //MemoryNode vbo = VertexNodes[geom.VertexBufferNode];
  94.                 //MemoryNode ibo = IndexNodes[geom.IndexBufferNode];
  95.                 MemoryNode wbo = WoopNodes[geom.WoopBufferNode];
  96.  
  97.                 uint index_offset = ASIndexNodes[n.PrimitiveOffset].Offset / 4;
  98.  
  99.                 for (uint j = 0; j < n.PrimitiveCount; j++)
  100.                 {
  101.                     // Don't trash cache by reading index through it
  102.                     uint tri_idx = ASIndexData[n.PrimitiveOffset + j] * 3;
  103.                     float4 r = WoopData[wbo.Offset / 16 + tri_idx + 0];
  104.                     float4 p = WoopData[wbo.Offset / 16 + tri_idx + 1];
  105.                     float4 q = WoopData[wbo.Offset / 16 + tri_idx + 2];
  106.  
  107.                     float o_z = r.w - o.x * r.x - o.y * r.y - o.z * r.z;
  108.                     float i_z = 1.0f / (d.x * r.x + d.y * r.y + d.z * r.z);
  109.                     float t = o_z * i_z;
  110.  
  111.                     if (t > tmin && t < tmax)
  112.                     {
  113.                         float o_x = p.w + o.x * p.x + o.y * p.y + o.z * p.z;
  114.                         float d_x = d.x * p.x + d.y * p.y + d.z * p.z;
  115.                         float u = o_x + t * d_x;
  116.  
  117.                         if (u >= 0.0f && u <= 1.0f)
  118.                         {
  119.                             float o_y = q.w + o.x * q.x + o.y * q.y + o.z * q.z;
  120.                             float d_y = d.x * q.x + d.y * q.y + d.z * q.z;
  121.                             float v = o_y + t * d_y;
  122.  
  123.                             if (v >= 0.0f && u + v <= 1.0f)
  124.                             {
  125.                                 tmax = t;
  126.                                 bU = u;
  127.                                 bV = v;
  128.                                 hit = true;
  129.  
  130.                                 //id = prims_ids[n];
  131.                             }
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.  
  137.             if (stack_ptr == meshbvh_stack_ptr)
  138.             {
  139.                 meshbvh_stack_ptr = -1;
  140.                 o = r.Origin;
  141.                 d = r.Direction;
  142.                 inv = r.Inverse;
  143.                 oinv = o * inv;
  144.             }
  145.  
  146.             node_id = stack[stack_ptr];
  147.             stack_ptr--;
  148.         }
  149.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement