grid_intersector.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "grid_soa.h"
  5. #include "grid_soa_intersector1.h"
  6. #include "grid_soa_intersector_packet.h"
  7. #include "../common/ray.h"
  8. namespace embree
  9. {
  10. namespace isa
  11. {
  12. template<typename T>
  13. class SubdivPatch1Precalculations : public T
  14. {
  15. public:
  16. __forceinline SubdivPatch1Precalculations (const Ray& ray, const void* ptr)
  17. : T(ray,ptr) {}
  18. };
  19. template<int K, typename T>
  20. class SubdivPatch1PrecalculationsK : public T
  21. {
  22. public:
  23. __forceinline SubdivPatch1PrecalculationsK (const vbool<K>& valid, RayK<K>& ray)
  24. : T(valid,ray) {}
  25. };
  26. class Grid1Intersector1
  27. {
  28. public:
  29. typedef GridSOA Primitive;
  30. typedef Grid1Precalculations<GridSOAIntersector1::Precalculations> Precalculations;
  31. /*! Intersect a ray with the primitive. */
  32. static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
  33. {
  34. GridSOAIntersector1::intersect(pre,ray,context,prim,lazy_node);
  35. }
  36. static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
  37. intersect(pre,ray,context,prim,ty,lazy_node);
  38. }
  39. /*! Test if the ray is occluded by the primitive */
  40. static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
  41. {
  42. GridSOAIntersector1::occluded(pre,ray,context,prim,lazy_node);
  43. }
  44. static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
  45. return occluded(pre,ray,context,prim,ty,lazy_node);
  46. }
  47. static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node) {
  48. assert(false && "not implemented");
  49. return false;
  50. }
  51. static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
  52. assert(false && "not implemented");
  53. return false;
  54. }
  55. };
  56. template <int K>
  57. struct GridIntersectorK
  58. {
  59. typedef GridSOA Primitive;
  60. typedef SubdivPatch1PrecalculationsK<K,typename GridSOAIntersectorK<K>::Precalculations> Precalculations;
  61. static __forceinline void intersect(const vbool<K>& valid, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
  62. {
  63. GridSOAIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);
  64. }
  65. static __forceinline vbool<K> occluded(const vbool<K>& valid, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
  66. {
  67. GridSOAIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);
  68. }
  69. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
  70. {
  71. GridSOAIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);
  72. }
  73. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
  74. {
  75. GridSOAIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);
  76. }
  77. };
  78. typedef Grid1IntersectorK<4> SubdivPatch1Intersector4;
  79. typedef Grid1IntersectorK<8> SubdivPatch1Intersector8;
  80. typedef Grid1IntersectorK<16> SubdivPatch1Intersector16;
  81. }
  82. }