curve_intersector.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "primitive.h"
  5. #include "../subdiv/bezier_curve.h"
  6. #include "../common/primref.h"
  7. #include "bezier_hair_intersector.h"
  8. #include "bezier_ribbon_intersector.h"
  9. #include "bezier_curve_intersector.h"
  10. #include "oriented_curve_intersector.h"
  11. #include "../bvh/node_intersector1.h"
  12. // FIXME: this file seems replicate of curve_intersector_virtual.h
  13. namespace embree
  14. {
  15. namespace isa
  16. {
  17. struct VirtualCurveIntersector1
  18. {
  19. typedef unsigned char Primitive;
  20. typedef CurvePrecalculations1 Precalculations;
  21. template<int N, bool robust>
  22. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
  23. {
  24. assert(num == 1);
  25. RTCGeometryType ty = (RTCGeometryType)(*prim);
  26. assert(This->leafIntersector);
  27. VirtualCurvePrimitive::Intersectors& leafIntersector = ((VirtualCurvePrimitive*) This->leafIntersector)->vtbl[ty];
  28. leafIntersector.intersect<1>(&pre,&ray,context,prim);
  29. }
  30. template<int N, bool robust>
  31. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
  32. {
  33. assert(num == 1);
  34. RTCGeometryType ty = (RTCGeometryType)(*prim);
  35. assert(This->leafIntersector);
  36. VirtualCurvePrimitive::Intersectors& leafIntersector = ((VirtualCurvePrimitive*) This->leafIntersector)->vtbl[ty];
  37. return leafIntersector.occluded<1>(&pre,&ray,context,prim);
  38. }
  39. };
  40. template<int K>
  41. struct VirtualCurveIntersectorK
  42. {
  43. typedef unsigned char Primitive;
  44. typedef CurvePrecalculationsK<K> Precalculations;
  45. static __forceinline void intersect(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  46. {
  47. assert(num == 1);
  48. RTCGeometryType ty = (RTCGeometryType)(*prim);
  49. assert(This->leafIntersector);
  50. VirtualCurvePrimitive::Intersectors& leafIntersector = ((VirtualCurvePrimitive*) This->leafIntersector)->vtbl[ty];
  51. size_t mask = movemask(valid_i);
  52. while (mask) leafIntersector.intersect<K>(&pre,&ray,bscf(mask),context,prim);
  53. }
  54. static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  55. {
  56. assert(num == 1);
  57. RTCGeometryType ty = (RTCGeometryType)(*prim);
  58. assert(This->leafIntersector);
  59. VirtualCurvePrimitive::Intersectors& leafIntersector = ((VirtualCurvePrimitive*) This->leafIntersector)->vtbl[ty];
  60. vbool<K> valid_o = false;
  61. size_t mask = movemask(valid_i);
  62. while (mask) {
  63. size_t k = bscf(mask);
  64. if (leafIntersector.occluded<K>(&pre,&ray,k,context,prim))
  65. set(valid_o, k);
  66. }
  67. return valid_o;
  68. }
  69. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  70. {
  71. assert(num == 1);
  72. RTCGeometryType ty = (RTCGeometryType)(*prim);
  73. assert(This->leafIntersector);
  74. VirtualCurvePrimitive::Intersectors& leafIntersector = ((VirtualCurvePrimitive*) This->leafIntersector)->vtbl[ty];
  75. leafIntersector.intersect<K>(&pre,&ray,k,context,prim);
  76. }
  77. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  78. {
  79. assert(num == 1);
  80. RTCGeometryType ty = (RTCGeometryType)(*prim);
  81. assert(This->leafIntersector);
  82. VirtualCurvePrimitive::Intersectors& leafIntersector = ((VirtualCurvePrimitive*) This->leafIntersector)->vtbl[ty];
  83. return leafIntersector.occluded<K>(&pre,&ray,k,context,prim);
  84. }
  85. };
  86. }
  87. }