instance_array.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "primitive.h"
  5. #include "../common/scene_instance_array.h"
  6. namespace embree
  7. {
  8. //template<int M>
  9. struct InstanceArrayPrimitive
  10. {
  11. struct Type : public PrimitiveType
  12. {
  13. const char* name() const;
  14. size_t sizeActive(const char* This) const;
  15. size_t sizeTotal(const char* This) const;
  16. size_t getBytes(const char* This) const;
  17. };
  18. static Type type;
  19. public:
  20. /* primitive supports multiple time segments */
  21. static const bool singleTimeSegment = false;
  22. /* Returns maximum number of stored primitives */
  23. static __forceinline size_t max_size() { return 1; }
  24. /* Returns required number of primitive blocks for N primitives */
  25. static __forceinline size_t blocks(size_t N) { return N; }
  26. public:
  27. InstanceArrayPrimitive (const uint32_t geomID, const uint32_t primID)
  28. : primID_(primID)
  29. , instID_(geomID)
  30. {}
  31. __forceinline bool valid() const {
  32. return primID_ != -1;
  33. }
  34. void fill(const PrimRef* prims, size_t& i, size_t end, Scene* scene)
  35. {
  36. assert(end-i == 1);
  37. const PrimRef& prim = prims[i]; i++;
  38. const unsigned int geomID = prim.geomID();
  39. const unsigned int primID = prim.primID();
  40. new (this) InstanceArrayPrimitive(geomID, primID);
  41. }
  42. __forceinline LBBox3fa fillMB(const PrimRef* prims, size_t& i, size_t end, Scene* scene, size_t itime)
  43. {
  44. assert(end-i == 1);
  45. const PrimRef& prim = prims[i]; i++;
  46. const unsigned int geomID = prim.geomID();
  47. const size_t primID = prim.primID();
  48. new (this) InstanceArrayPrimitive(geomID, primID);
  49. const InstanceArray* instanceArray = scene->get<InstanceArray>(geomID);
  50. return instanceArray->linearBounds(primID,itime);
  51. }
  52. __forceinline LBBox3fa fillMB(const PrimRefMB* prims, size_t& i, size_t end, Scene* scene, const BBox1f time_range)
  53. {
  54. assert(end-i == 1);
  55. const PrimRefMB& prim = prims[i]; i++;
  56. const unsigned int geomID = prim.geomID();
  57. const size_t primID = prim.primID();
  58. new (this) InstanceArrayPrimitive(geomID, primID);
  59. const InstanceArray* instanceArray = scene->get<InstanceArray>(geomID);
  60. return instanceArray->linearBounds(primID,time_range);
  61. }
  62. /* Updates the primitive */
  63. __forceinline BBox3fa update(InstanceArray* instanceArray) {
  64. return instanceArray->bounds(0);
  65. }
  66. public:
  67. unsigned int primID_;
  68. unsigned int instID_;
  69. };
  70. }