object.h 2.8 KB

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