acceln.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include "acceln.h"
  4. #include "ray.h"
  5. #include "../../include/embree4/rtcore_ray.h"
  6. #include "../../common/algorithms/parallel_for.h"
  7. namespace embree
  8. {
  9. AccelN::AccelN()
  10. : Accel(AccelData::TY_ACCELN), accels() {}
  11. AccelN::~AccelN()
  12. {
  13. for (size_t i=0; i<accels.size(); i++)
  14. delete accels[i];
  15. }
  16. void AccelN::accels_add(Accel* accel)
  17. {
  18. assert(accel);
  19. accels.push_back(accel);
  20. }
  21. void AccelN::accels_init()
  22. {
  23. for (size_t i=0; i<accels.size(); i++)
  24. delete accels[i];
  25. accels.clear();
  26. }
  27. bool AccelN::pointQuery (Accel::Intersectors* This_in, PointQuery* query, PointQueryContext* context)
  28. {
  29. bool changed = false;
  30. AccelN* This = (AccelN*)This_in->ptr;
  31. for (size_t i=0; i<This->accels.size(); i++)
  32. if (!This->accels[i]->isEmpty())
  33. changed |= This->accels[i]->intersectors.pointQuery(query,context);
  34. return changed;
  35. }
  36. void AccelN::intersect (Accel::Intersectors* This_in, RTCRayHit& ray, RayQueryContext* context)
  37. {
  38. AccelN* This = (AccelN*)This_in->ptr;
  39. for (size_t i=0; i<This->accels.size(); i++)
  40. if (!This->accels[i]->isEmpty())
  41. This->accels[i]->intersectors.intersect(ray,context);
  42. }
  43. void AccelN::intersect4 (const void* valid, Accel::Intersectors* This_in, RTCRayHit4& ray, RayQueryContext* context)
  44. {
  45. AccelN* This = (AccelN*)This_in->ptr;
  46. for (size_t i=0; i<This->accels.size(); i++)
  47. if (!This->accels[i]->isEmpty())
  48. This->accels[i]->intersectors.intersect4(valid,ray,context);
  49. }
  50. void AccelN::intersect8 (const void* valid, Accel::Intersectors* This_in, RTCRayHit8& ray, RayQueryContext* context)
  51. {
  52. AccelN* This = (AccelN*)This_in->ptr;
  53. for (size_t i=0; i<This->accels.size(); i++)
  54. if (!This->accels[i]->isEmpty())
  55. This->accels[i]->intersectors.intersect8(valid,ray,context);
  56. }
  57. void AccelN::intersect16 (const void* valid, Accel::Intersectors* This_in, RTCRayHit16& ray, RayQueryContext* context)
  58. {
  59. AccelN* This = (AccelN*)This_in->ptr;
  60. for (size_t i=0; i<This->accels.size(); i++)
  61. if (!This->accels[i]->isEmpty())
  62. This->accels[i]->intersectors.intersect16(valid,ray,context);
  63. }
  64. void AccelN::occluded (Accel::Intersectors* This_in, RTCRay& ray, RayQueryContext* context)
  65. {
  66. AccelN* This = (AccelN*)This_in->ptr;
  67. for (size_t i=0; i<This->accels.size(); i++) {
  68. if (This->accels[i]->isEmpty()) continue;
  69. This->accels[i]->intersectors.occluded(ray,context);
  70. if (ray.tfar < 0.0f) break;
  71. }
  72. }
  73. void AccelN::occluded4 (const void* valid, Accel::Intersectors* This_in, RTCRay4& ray, RayQueryContext* context)
  74. {
  75. AccelN* This = (AccelN*)This_in->ptr;
  76. for (size_t i=0; i<This->accels.size(); i++) {
  77. if (This->accels[i]->isEmpty()) continue;
  78. This->accels[i]->intersectors.occluded4(valid,ray,context);
  79. #if defined(__SSE2__) || defined(__ARM_NEON)
  80. vbool4 valid0 = asBool(((vint4*)valid)[0]);
  81. vbool4 hit0 = ((vfloat4*)ray.tfar)[0] >= vfloat4(zero);
  82. if (unlikely(none(valid0 & hit0))) break;
  83. #endif
  84. }
  85. }
  86. void AccelN::occluded8 (const void* valid, Accel::Intersectors* This_in, RTCRay8& ray, RayQueryContext* context)
  87. {
  88. AccelN* This = (AccelN*)This_in->ptr;
  89. for (size_t i=0; i<This->accels.size(); i++) {
  90. if (This->accels[i]->isEmpty()) continue;
  91. This->accels[i]->intersectors.occluded8(valid,ray,context);
  92. #if defined(__SSE2__) || defined(__ARM_NEON) // FIXME: use higher ISA
  93. vbool4 valid0 = asBool(((vint4*)valid)[0]);
  94. vbool4 hit0 = ((vfloat4*)ray.tfar)[0] >= vfloat4(zero);
  95. vbool4 valid1 = asBool(((vint4*)valid)[1]);
  96. vbool4 hit1 = ((vfloat4*)ray.tfar)[1] >= vfloat4(zero);
  97. if (unlikely((none((valid0 & hit0) | (valid1 & hit1))))) break;
  98. #endif
  99. }
  100. }
  101. void AccelN::occluded16 (const void* valid, Accel::Intersectors* This_in, RTCRay16& ray, RayQueryContext* context)
  102. {
  103. AccelN* This = (AccelN*)This_in->ptr;
  104. for (size_t i=0; i<This->accels.size(); i++) {
  105. if (This->accels[i]->isEmpty()) continue;
  106. This->accels[i]->intersectors.occluded16(valid,ray,context);
  107. #if defined(__SSE2__) || defined(__ARM_NEON) // FIXME: use higher ISA
  108. vbool4 valid0 = asBool(((vint4*)valid)[0]);
  109. vbool4 hit0 = ((vfloat4*)ray.tfar)[0] >= vfloat4(zero);
  110. vbool4 valid1 = asBool(((vint4*)valid)[1]);
  111. vbool4 hit1 = ((vfloat4*)ray.tfar)[1] >= vfloat4(zero);
  112. vbool4 valid2 = asBool(((vint4*)valid)[2]);
  113. vbool4 hit2 = ((vfloat4*)ray.tfar)[2] >= vfloat4(zero);
  114. vbool4 valid3 = asBool(((vint4*)valid)[3]);
  115. vbool4 hit3 = ((vfloat4*)ray.tfar)[3] >= vfloat4(zero);
  116. if (unlikely((none((valid0 & hit0) | (valid1 & hit1) | (valid2 & hit2) | (valid3 & hit3))))) break;
  117. #endif
  118. }
  119. }
  120. void AccelN::accels_print(size_t ident)
  121. {
  122. for (size_t i=0; i<accels.size(); i++)
  123. {
  124. for (size_t j=0; j<ident; j++) std::cout << " ";
  125. std::cout << "accels[" << i << "]" << std::endl;
  126. accels[i]->intersectors.print(ident+2);
  127. }
  128. }
  129. void AccelN::accels_immutable()
  130. {
  131. for (size_t i=0; i<accels.size(); i++)
  132. accels[i]->immutable();
  133. }
  134. void AccelN::accels_build ()
  135. {
  136. /* reduce memory consumption */
  137. accels.shrink_to_fit();
  138. /* build all acceleration structures in parallel */
  139. parallel_for (accels.size(), [&] (size_t i) {
  140. accels[i]->build();
  141. });
  142. /* create list of non-empty acceleration structures */
  143. bool valid1 = true;
  144. bool valid4 = true;
  145. bool valid8 = true;
  146. bool valid16 = true;
  147. for (size_t i=0; i<accels.size(); i++) {
  148. valid1 &= (bool) accels[i]->intersectors.intersector1;
  149. valid4 &= (bool) accels[i]->intersectors.intersector4;
  150. valid8 &= (bool) accels[i]->intersectors.intersector8;
  151. valid16 &= (bool) accels[i]->intersectors.intersector16;
  152. }
  153. if (accels.size() == 1) {
  154. type = accels[0]->type; // FIXME: should just assign entire Accel
  155. bounds = accels[0]->bounds;
  156. intersectors = accels[0]->intersectors;
  157. }
  158. else
  159. {
  160. type = AccelData::TY_ACCELN;
  161. intersectors.ptr = this;
  162. intersectors.intersector1 = Intersector1(&intersect,&occluded,&pointQuery,valid1 ? "AccelN::intersector1": nullptr);
  163. intersectors.intersector4 = Intersector4(&intersect4,&occluded4,valid4 ? "AccelN::intersector4" : nullptr);
  164. intersectors.intersector8 = Intersector8(&intersect8,&occluded8,valid8 ? "AccelN::intersector8" : nullptr);
  165. intersectors.intersector16 = Intersector16(&intersect16,&occluded16,valid16 ? "AccelN::intersector16": nullptr);
  166. /*! calculate bounds */
  167. bounds = empty;
  168. for (size_t i=0; i<accels.size(); i++)
  169. bounds.extend(accels[i]->bounds);
  170. }
  171. }
  172. void AccelN::accels_select(bool filter)
  173. {
  174. for (size_t i=0; i<accels.size(); i++)
  175. accels[i]->intersectors.select(filter);
  176. }
  177. void AccelN::accels_deleteGeometry(size_t geomID)
  178. {
  179. for (size_t i=0; i<accels.size(); i++)
  180. accels[i]->deleteGeometry(geomID);
  181. }
  182. void AccelN::accels_clear()
  183. {
  184. for (size_t i=0; i<accels.size(); i++) {
  185. accels[i]->clear();
  186. }
  187. }
  188. }