instance.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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.h"
  6. namespace embree
  7. {
  8. struct InstancePrimitive
  9. {
  10. struct Type : public PrimitiveType
  11. {
  12. const char* name() const;
  13. size_t sizeActive(const char* This) const;
  14. size_t sizeTotal(const char* This) const;
  15. size_t getBytes(const char* This) const;
  16. };
  17. static Type type;
  18. public:
  19. /* primitive supports multiple time segments */
  20. static const bool singleTimeSegment = false;
  21. /* Returns maximum number of stored primitives */
  22. static __forceinline size_t max_size() { return 1; }
  23. /* Returns required number of primitive blocks for N primitives */
  24. static __forceinline size_t blocks(size_t N) { return N; }
  25. public:
  26. InstancePrimitive (const Instance* instance, unsigned int instID)
  27. : instance(instance)
  28. , instID_(instID)
  29. {}
  30. __forceinline void fill(const PrimRef* prims, size_t& i, size_t end, Scene* scene)
  31. {
  32. assert(end-i == 1);
  33. const PrimRef& prim = prims[i]; i++;
  34. const unsigned int geomID = prim.geomID();
  35. const Instance* instance = scene->get<Instance>(geomID);
  36. new (this) InstancePrimitive(instance, geomID);
  37. }
  38. __forceinline LBBox3fa fillMB(const PrimRef* prims, size_t& i, size_t end, Scene* scene, size_t itime)
  39. {
  40. assert(end-i == 1);
  41. const PrimRef& prim = prims[i]; i++;
  42. const unsigned int geomID = prim.geomID();
  43. const Instance* instance = scene->get<Instance>(geomID);
  44. new (this) InstancePrimitive(instance,geomID);
  45. return instance->linearBounds(0,itime);
  46. }
  47. __forceinline LBBox3fa fillMB(const PrimRefMB* prims, size_t& i, size_t end, Scene* scene, const BBox1f time_range)
  48. {
  49. assert(end-i == 1);
  50. const PrimRefMB& prim = prims[i]; i++;
  51. const unsigned int geomID = prim.geomID();
  52. const Instance* instance = scene->get<Instance>(geomID);
  53. new (this) InstancePrimitive(instance,geomID);
  54. return instance->linearBounds(0,time_range);
  55. }
  56. /* Updates the primitive */
  57. __forceinline BBox3fa update(Instance* instance) {
  58. return instance->bounds(0);
  59. }
  60. public:
  61. const Instance* instance;
  62. const unsigned int instID_ = std::numeric_limits<unsigned int>::max ();
  63. };
  64. }