object.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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, size_t end, 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. /* Updates the primitive */
  61. __forceinline BBox3fa update(AccelSet* mesh) {
  62. return mesh->bounds(primID());
  63. }
  64. private:
  65. unsigned int _geomID; //!< geometry ID
  66. unsigned int _primID; //!< primitive ID
  67. };
  68. }