instance_array_intersector.h 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "instance_array.h"
  5. #include "../common/ray.h"
  6. #include "../common/point_query.h"
  7. #include "../common/scene.h"
  8. namespace embree
  9. {
  10. namespace isa
  11. {
  12. struct InstanceArrayIntersector1
  13. {
  14. typedef InstanceArrayPrimitive Primitive;
  15. struct Precalculations {
  16. __forceinline Precalculations (const Ray& ray, const void *ptr) {}
  17. };
  18. static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
  19. static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
  20. static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
  21. };
  22. struct InstanceArrayIntersector1MB
  23. {
  24. typedef InstanceArrayPrimitive Primitive;
  25. struct Precalculations {
  26. __forceinline Precalculations (const Ray& ray, const void *ptr) {}
  27. };
  28. static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
  29. static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
  30. static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
  31. };
  32. template<int K>
  33. struct InstanceArrayIntersectorK
  34. {
  35. typedef InstanceArrayPrimitive Primitive;
  36. struct Precalculations {
  37. __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
  38. };
  39. static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
  40. static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
  41. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  42. intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
  43. }
  44. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  45. occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
  46. return ray.tfar[k] < 0.0f;
  47. }
  48. };
  49. template<int K>
  50. struct InstanceArrayIntersectorKMB
  51. {
  52. typedef InstanceArrayPrimitive Primitive;
  53. struct Precalculations {
  54. __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
  55. };
  56. static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
  57. static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
  58. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  59. intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
  60. }
  61. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  62. occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
  63. return ray.tfar[k] < 0.0f;
  64. }
  65. };
  66. }
  67. }