rtcore_ray.isph 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // ======================================================================== //
  2. // Copyright 2009-2018 Intel Corporation //
  3. // //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); //
  5. // you may not use this file except in compliance with the License. //
  6. // You may obtain a copy of the License at //
  7. // //
  8. // http://www.apache.org/licenses/LICENSE-2.0 //
  9. // //
  10. // Unless required by applicable law or agreed to in writing, software //
  11. // distributed under the License is distributed on an "AS IS" BASIS, //
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
  13. // See the License for the specific language governing permissions and //
  14. // limitations under the License. //
  15. // ======================================================================== //
  16. #ifndef __RTC_RAY_ISPH__
  17. #define __RTC_RAY_ISPH__
  18. #include "rtcore_common.isph"
  19. /* Ray structure */
  20. struct RTC_ALIGN(16) RTCRay
  21. {
  22. float org_x; // x coordinate of ray origin
  23. float org_y; // y coordinate of ray origin
  24. float org_z; // z coordinate of ray origin
  25. float tnear; // start of ray segment
  26. float dir_x; // x coordinate of ray direction
  27. float dir_y; // y coordinate of ray direction
  28. float dir_z; // z coordinate of ray direction
  29. float time; // time of this ray for motion blur
  30. float tfar; // end of ray segment (set to hit distance)
  31. unsigned int mask; // ray mask
  32. unsigned int id; // ray ID
  33. unsigned int flags; // ray flags
  34. };
  35. /* Hit structure */
  36. struct RTCHit
  37. {
  38. float Ng_x; // x coordinate of geometry normal
  39. float Ng_y; // y coordinate of geometry normal
  40. float Ng_z; // z coordinate of geometry normal
  41. float u; // barycentric u coordinate of hit
  42. float v; // barycentric v coordinate of hit
  43. unsigned int primID; // primitive ID
  44. unsigned int geomID; // geometry ID
  45. unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT]; // instance ID
  46. };
  47. /* Combined ray/hit structure */
  48. struct RTCRayHit
  49. {
  50. RTCRay ray;
  51. RTCHit hit;
  52. };
  53. struct RTCRayN;
  54. struct RTCHitN;
  55. struct RTCRayHitN;
  56. /* Helper functions to access ray packets of runtime size N */
  57. RTC_FORCEINLINE varying float& RTCRayN_org_x(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[0*N+i]); }
  58. RTC_FORCEINLINE varying float& RTCRayN_org_y(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[1*N+i]); }
  59. RTC_FORCEINLINE varying float& RTCRayN_org_z(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[2*N+i]); }
  60. RTC_FORCEINLINE varying float& RTCRayN_tnear(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[3*N+i]); }
  61. RTC_FORCEINLINE varying float& RTCRayN_dir_x(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[4*N+i]); }
  62. RTC_FORCEINLINE varying float& RTCRayN_dir_y(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[5*N+i]); }
  63. RTC_FORCEINLINE varying float& RTCRayN_dir_z(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[6*N+i]); }
  64. RTC_FORCEINLINE varying float& RTCRayN_time (RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[7*N+i]); }
  65. RTC_FORCEINLINE varying float& RTCRayN_tfar (RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((uniform float*)ray)[8*N+i]); }
  66. RTC_FORCEINLINE varying unsigned int& RTCRayN_mask (RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying unsigned int* uniform) &((uniform unsigned int*)ray)[9*N+i]); }
  67. RTC_FORCEINLINE varying unsigned int& RTCRayN_id (RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying unsigned int* uniform) &((uniform unsigned int*)ray)[10*N+i]); }
  68. RTC_FORCEINLINE varying unsigned int& RTCRayN_flags(RTCRayN* uniform ray, uniform unsigned int N, uniform unsigned int i) { return *((varying unsigned int* uniform) &((uniform unsigned int*)ray)[11*N+i]); }
  69. /* Helper functions to access hit packets of runtime size N */
  70. RTC_FORCEINLINE varying float& RTCHitN_Ng_x(const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((float* uniform)hit)[0*N+i]); }
  71. RTC_FORCEINLINE varying float& RTCHitN_Ng_y(const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((float* uniform)hit)[1*N+i]); }
  72. RTC_FORCEINLINE varying float& RTCHitN_Ng_z(const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((float* uniform)hit)[2*N+i]); }
  73. RTC_FORCEINLINE varying float& RTCHitN_u (const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((float* uniform)hit)[3*N+i]); }
  74. RTC_FORCEINLINE varying float& RTCHitN_v (const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying float* uniform) &((float* uniform)hit)[4*N+i]); }
  75. RTC_FORCEINLINE varying unsigned int& RTCHitN_primID(const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying unsigned int* uniform) &((unsigned int* uniform )hit)[5*N+i]); }
  76. RTC_FORCEINLINE varying unsigned int& RTCHitN_geomID(const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i) { return *((varying unsigned int* uniform) &((unsigned int* uniform )hit)[6*N+i]); }
  77. RTC_FORCEINLINE varying unsigned int& RTCHitN_instID(const RTCHitN* uniform hit, uniform unsigned int N, uniform unsigned int i, uniform unsigned int l) { return *((varying unsigned int* uniform) &((unsigned int* uniform)hit)[7*N+i+l*N]); }
  78. /* Helper functions to extract RTCRayN and RTCHitN from RTCRayHitN */
  79. RTC_FORCEINLINE RTCRayN* uniform RTCRayHitN_RayN(RTCRayHitN* uniform rayhit, uniform unsigned int N) { return (RTCRayN* uniform)&((uniform float* uniform)rayhit)[0*N]; }
  80. RTC_FORCEINLINE RTCHitN* uniform RTCRayHitN_HitN(RTCRayHitN* uniform rayhit, uniform unsigned int N) { return (RTCHitN* uniform)&((uniform float* uniform)rayhit)[12*N]; }
  81. /* Ray structure for a packet/stream of N rays in pointer SOA layout */
  82. struct RTCRayNp
  83. {
  84. uniform float* uniform org_x;
  85. uniform float* uniform org_y;
  86. uniform float* uniform org_z;
  87. uniform float* uniform tnear;
  88. uniform float* uniform dir_x;
  89. uniform float* uniform dir_y;
  90. uniform float* uniform dir_z;
  91. uniform float* uniform time;
  92. uniform float* uniform tfar;
  93. uniform unsigned int* uniform mask;
  94. uniform unsigned int* uniform id;
  95. uniform unsigned int* uniform flags;
  96. };
  97. /* Hit structure for a packet/stream of N rays in pointer SOA layout */
  98. struct RTCHitNp
  99. {
  100. uniform float* uniform Ng_x;
  101. uniform float* uniform Ng_y;
  102. uniform float* uniform Ng_z;
  103. uniform float* uniform u;
  104. uniform float* uniform v;
  105. uniform unsigned int* uniform primID;
  106. uniform unsigned int* uniform geomID;
  107. uniform unsigned int* uniform instID[RTC_MAX_INSTANCE_LEVEL_COUNT];
  108. };
  109. /* Combined ray/hit structure for a packet/stream of N rays in pointer SOA layout */
  110. struct RTCRayHitNp
  111. {
  112. RTCRayNp ray;
  113. RTCHitNp hit;
  114. };
  115. RTC_FORCEINLINE RTCRay rtcGetRayFromRayN(RTCRayN* uniform rayN, uniform unsigned int N, uniform unsigned int i)
  116. {
  117. RTCRay ray;
  118. ray.org_x = RTCRayN_org_x(rayN,N,i);
  119. ray.org_y = RTCRayN_org_y(rayN,N,i);
  120. ray.org_z = RTCRayN_org_z(rayN,N,i);
  121. ray.tnear = RTCRayN_tnear(rayN,N,i);
  122. ray.dir_x = RTCRayN_dir_x(rayN,N,i);
  123. ray.dir_y = RTCRayN_dir_y(rayN,N,i);
  124. ray.dir_z = RTCRayN_dir_z(rayN,N,i);
  125. ray.time = RTCRayN_time(rayN,N,i);
  126. ray.tfar = RTCRayN_tfar(rayN,N,i);
  127. ray.mask = RTCRayN_mask(rayN,N,i);
  128. ray.id = RTCRayN_id(rayN,N,i);
  129. ray.flags = RTCRayN_flags(rayN,N,i);
  130. return ray;
  131. }
  132. RTC_FORCEINLINE RTCHit rtcGetHitFromHitN(RTCHitN* uniform hitN, uniform unsigned int N, uniform unsigned int i)
  133. {
  134. RTCHit hit;
  135. hit.Ng_x = RTCHitN_Ng_x(hitN,N,i);
  136. hit.Ng_y = RTCHitN_Ng_y(hitN,N,i);
  137. hit.Ng_z = RTCHitN_Ng_z(hitN,N,i);
  138. hit.u = RTCHitN_u(hitN,N,i);
  139. hit.v = RTCHitN_v(hitN,N,i);
  140. hit.primID = RTCHitN_primID(hitN,N,i);
  141. hit.geomID = RTCHitN_geomID(hitN,N,i);
  142. for (uniform unsigned int l = 0; l < RTC_MAX_INSTANCE_LEVEL_COUNT; l++)
  143. hit.instID[l] = RTCHitN_instID(hitN,N,i,l);
  144. return hit;
  145. }
  146. RTC_FORCEINLINE void rtcCopyHitToHitN(RTCHitN* uniform hitN, const varying RTCHit* uniform hit, uniform unsigned int N, uniform unsigned int i)
  147. {
  148. RTCHitN_Ng_x(hitN,N,i) = hit->Ng_x;
  149. RTCHitN_Ng_y(hitN,N,i) = hit->Ng_y;
  150. RTCHitN_Ng_z(hitN,N,i) = hit->Ng_z;
  151. RTCHitN_u(hitN,N,i) = hit->u;
  152. RTCHitN_v(hitN,N,i) = hit->v;
  153. RTCHitN_primID(hitN,N,i) = hit->primID;
  154. RTCHitN_geomID(hitN,N,i) = hit->geomID;
  155. for (uniform unsigned int l = 0; l < RTC_MAX_INSTANCE_LEVEL_COUNT; l++)
  156. RTCHitN_instID(hitN,N,i,l) = hit->instID[l];
  157. }
  158. RTC_FORCEINLINE RTCRayHit rtcGetRayHitFromRayHitN(RTCRayHitN* uniform rayhitN, uniform unsigned int N, uniform unsigned int i)
  159. {
  160. RTCRayHit rh;
  161. RTCRayN* uniform ray = RTCRayHitN_RayN(rayhitN,N);
  162. rh.ray.org_x = RTCRayN_org_x(ray,N,i);
  163. rh.ray.org_y = RTCRayN_org_y(ray,N,i);
  164. rh.ray.org_z = RTCRayN_org_z(ray,N,i);
  165. rh.ray.tnear = RTCRayN_tnear(ray,N,i);
  166. rh.ray.dir_x = RTCRayN_dir_x(ray,N,i);
  167. rh.ray.dir_y = RTCRayN_dir_y(ray,N,i);
  168. rh.ray.dir_z = RTCRayN_dir_z(ray,N,i);
  169. rh.ray.time = RTCRayN_time(ray,N,i);
  170. rh.ray.tfar = RTCRayN_tfar(ray,N,i);
  171. rh.ray.mask = RTCRayN_mask(ray,N,i);
  172. rh.ray.id = RTCRayN_id(ray,N,i);
  173. rh.ray.flags = RTCRayN_flags(ray,N,i);
  174. RTCHitN* uniform hit = RTCRayHitN_HitN(rayhitN,N);
  175. rh.hit.Ng_x = RTCHitN_Ng_x(hit,N,i);
  176. rh.hit.Ng_y = RTCHitN_Ng_y(hit,N,i);
  177. rh.hit.Ng_z = RTCHitN_Ng_z(hit,N,i);
  178. rh.hit.u = RTCHitN_u(hit,N,i);
  179. rh.hit.v = RTCHitN_v(hit,N,i);
  180. rh.hit.primID = RTCHitN_primID(hit,N,i);
  181. rh.hit.geomID = RTCHitN_geomID(hit,N,i);
  182. for (uniform unsigned int l = 0; l < RTC_MAX_INSTANCE_LEVEL_COUNT; l++)
  183. rh.hit.instID[l] = RTCHitN_instID(hit,N,i,l);
  184. return rh;
  185. }
  186. #endif