ernie-renderer 0.2.0.dev45__tar.gz → 0.2.0.dev52__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ernie-renderer might be problematic. Click here for more details.

Files changed (298) hide show
  1. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/PKG-INFO +1 -1
  3. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/benchmarks/scene/extents.cpp +0 -1
  4. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/benchmarks/scene/storage.cpp +1 -1
  5. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/CMakeLists.txt +3 -2
  6. ernie_renderer-0.2.0.dev52/ernie/scene/animation.cpp +94 -0
  7. ernie_renderer-0.2.0.dev52/ernie/scene/edit_history.cpp +225 -0
  8. ernie_renderer-0.2.0.dev52/ernie/scene/edit_history.h +131 -0
  9. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/extent_cache.cpp +13 -20
  10. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/extent_cache.h +1 -0
  11. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/holder_index.cpp +21 -32
  12. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/holder_index.h +0 -2
  13. ernie_renderer-0.2.0.dev52/ernie/scene/inherit.cpp +125 -0
  14. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/json.cpp +99 -77
  15. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/json.h +10 -11
  16. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/json_value.h +5 -0
  17. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/reference.cpp +79 -164
  18. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/reference.h +3 -15
  19. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/scene.cpp +44 -26
  20. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/scene.h +50 -19
  21. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schema.cpp +11 -20
  22. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schema.h +29 -3
  23. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/camera.h +3 -5
  24. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/geom.h +2 -2
  25. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/instancer.cpp +7 -16
  26. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/lux.cpp +23 -12
  27. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/lux.h +90 -18
  28. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/mesh.cpp +2 -4
  29. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/planet.cpp +5 -11
  30. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/planet.h +5 -9
  31. ernie_renderer-0.2.0.dev52/ernie/scene/schemas/registry.cpp +104 -0
  32. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/vol.cpp +3 -5
  33. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/storage.cpp +29 -28
  34. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/storage.h +52 -86
  35. ernie_renderer-0.2.0.dev52/ernie/scene/time_samples.cpp +96 -0
  36. ernie_renderer-0.2.0.dev52/ernie/scene/time_samples.h +50 -0
  37. ernie_renderer-0.2.0.dev52/ernie/scene/usd_plugin.cpp +142 -0
  38. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/validate.cpp +2 -1
  39. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/view.cpp +1 -1
  40. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/view.h +6 -0
  41. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/tensor.cpp +11 -2
  42. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/tensor.h +7 -3
  43. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/text.h +28 -0
  44. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/CMakeLists.txt +2 -2
  45. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/common.h +37 -4
  46. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/scenes/rover.json +1 -0
  47. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/scenes/rover.saved.json +5 -0
  48. ernie_renderer-0.2.0.dev52/tests/scene/edit_history_test.cpp +114 -0
  49. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/inherit_test.cpp +55 -13
  50. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/instancer_test.cpp +2 -5
  51. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/json_test.cpp +2 -2
  52. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/lux_test.cpp +0 -1
  53. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/mesh_test.cpp +6 -6
  54. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/planet_test.cpp +3 -6
  55. ernie_renderer-0.2.0.dev52/tests/scene/reference_test.cpp +76 -0
  56. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/scene_test.cpp +74 -1
  57. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/schema_test.cpp +29 -33
  58. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/storage_test.cpp +13 -14
  59. ernie_renderer-0.2.0.dev52/tests/scene/time_samples_test.cpp +101 -0
  60. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/xform_test.cpp +3 -3
  61. ernie_renderer-0.2.0.dev45/ernie/scene/inherit.cpp +0 -120
  62. ernie_renderer-0.2.0.dev45/ernie/scene/schemas/collection.cpp +0 -10
  63. ernie_renderer-0.2.0.dev45/ernie/scene/schemas/laser.cpp +0 -26
  64. ernie_renderer-0.2.0.dev45/ernie/scene/schemas/laser.h +0 -92
  65. ernie_renderer-0.2.0.dev45/ernie/scene/schemas/registry.cpp +0 -89
  66. ernie_renderer-0.2.0.dev45/ernie/scene/usd_plugin.cpp +0 -219
  67. ernie_renderer-0.2.0.dev45/tests/scene/api_test.cpp +0 -91
  68. ernie_renderer-0.2.0.dev45/tests/scene/holder_index_test.cpp +0 -63
  69. ernie_renderer-0.2.0.dev45/tests/scene/reference_test.cpp +0 -80
  70. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.clang-format +0 -0
  71. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.clang-tidy +0 -0
  72. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.dockerignore +0 -0
  73. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.gersemirc +0 -0
  74. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.gitattributes +0 -0
  75. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.github/scripts/coverage_badge.py +0 -0
  76. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.github/scripts/install-lavapipe-windows.sh +0 -0
  77. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.github/workflows/ci.yml +0 -0
  78. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.gitignore +0 -0
  79. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/.pre-commit-config.yaml +0 -0
  80. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/CMakePresets.json +0 -0
  81. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/Dockerfile +0 -0
  82. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/LICENSE +0 -0
  83. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/README.md +0 -0
  84. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/benchmarks/CMakeLists.txt +0 -0
  85. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/benchmarks/bench.h +0 -0
  86. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/benchmarks/main.cpp +0 -0
  87. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/ErnieConfig.cmake.in +0 -0
  88. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/ErnieFetch.cmake +0 -0
  89. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/ErnieInstall.cmake +0 -0
  90. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/ErniePackaging.cmake +0 -0
  91. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/ErnieTesting.cmake +0 -0
  92. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/ernie.pc.in +0 -0
  93. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/bc7enc.cmake +0 -0
  94. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/dlpack.cmake +0 -0
  95. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/glm.cmake +0 -0
  96. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/googletest.cmake +0 -0
  97. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/json.cmake +0 -0
  98. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/nanobind.cmake +0 -0
  99. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/openexr.cmake +0 -0
  100. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/stb.cmake +0 -0
  101. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/tracy.cmake +0 -0
  102. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/volk.cmake +0 -0
  103. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/cmake/third_party/vulkan_headers.cmake +0 -0
  104. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/docs/README.md +0 -0
  105. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/docs/index.md +0 -0
  106. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/docs/requirements.txt +0 -0
  107. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/CMakeLists.txt +0 -0
  108. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/app/CMakeLists.txt +0 -0
  109. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/app/main.cpp +0 -0
  110. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/device/CMakeLists.txt +0 -0
  111. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/device/vulkan_devices.cpp +0 -0
  112. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/device/vulkan_devices.h +0 -0
  113. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/geometry/CMakeLists.txt +0 -0
  114. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/geometry/bounds.h +0 -0
  115. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/graph/CMakeLists.txt +0 -0
  116. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/CMakeLists.txt +0 -0
  117. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/ies.cpp +0 -0
  118. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/ies.h +0 -0
  119. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/image.cpp +0 -0
  120. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/image.h +0 -0
  121. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/nanovdb.cpp +0 -0
  122. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/nanovdb.h +0 -0
  123. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/raster.cpp +0 -0
  124. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/raster.h +0 -0
  125. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/texture.cpp +0 -0
  126. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/io/texture.h +0 -0
  127. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/CMakeLists.txt +0 -0
  128. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/astronomy.cpp +0 -0
  129. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/astronomy.h +0 -0
  130. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/atmosphere.cpp +0 -0
  131. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/atmosphere.h +0 -0
  132. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/cloud.cpp +0 -0
  133. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/cloud.h +0 -0
  134. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/constants.h +0 -0
  135. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/reflectance_library.cpp +0 -0
  136. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/reflectance_library.h +0 -0
  137. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/reflectance_table.h +0 -0
  138. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/regolith.cpp +0 -0
  139. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/regolith.h +0 -0
  140. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/scattering.cpp +0 -0
  141. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/scattering.h +0 -0
  142. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/solar.cpp +0 -0
  143. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/solar.h +0 -0
  144. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/solar_table.h +0 -0
  145. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/spectrum.cpp +0 -0
  146. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/physics/spectrum.h +0 -0
  147. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/python/CMakeLists.txt +0 -0
  148. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/python/ernie/__init__.py +0 -0
  149. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/python/module.cpp +0 -0
  150. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/render/CMakeLists.txt +0 -0
  151. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/convert.h +0 -0
  152. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/path.cpp +0 -0
  153. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/path.h +0 -0
  154. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/camera.cpp +0 -0
  155. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/collection.h +0 -0
  156. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/geom.cpp +0 -0
  157. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/instancer.h +0 -0
  158. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/mesh.h +0 -0
  159. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/render.cpp +0 -0
  160. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/render.h +0 -0
  161. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/shade.cpp +0 -0
  162. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/shade.h +0 -0
  163. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/schemas/vol.h +0 -0
  164. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/tokens.h +0 -0
  165. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/value.h +0 -0
  166. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/xform.cpp +0 -0
  167. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/scene/xform.h +0 -0
  168. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/CMakeLists.txt +0 -0
  169. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/algorithm.h +0 -0
  170. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/bytes.h +0 -0
  171. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/disk_cache.cpp +0 -0
  172. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/disk_cache.h +0 -0
  173. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/file.cpp +0 -0
  174. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/file.h +0 -0
  175. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/glm.h +0 -0
  176. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/hash_index.h +0 -0
  177. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/linear_algebra.h +0 -0
  178. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/log.cpp +0 -0
  179. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/log.h +0 -0
  180. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/math.h +0 -0
  181. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/noise.cpp +0 -0
  182. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/noise.h +0 -0
  183. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/numbers.h +0 -0
  184. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/parallel.h +0 -0
  185. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/profiler.cpp +0 -0
  186. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/profiler.h +0 -0
  187. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/random.h +0 -0
  188. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/version.cpp +0 -0
  189. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/version.h +0 -0
  190. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/ernie/util/worker_pool.h +0 -0
  191. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/mkdocs.yml +0 -0
  192. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/pyproject.toml +0 -0
  193. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/consumer/CMakeLists.txt +0 -0
  194. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/consumer/main.cpp +0 -0
  195. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/device/vulkan_devices_test.cpp +0 -0
  196. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/exr/README.md +0 -0
  197. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/exr/make_exr.py +0 -0
  198. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  199. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  200. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/exr/y_half_zips.exr +0 -0
  201. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ies/README.md +0 -0
  202. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  203. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  204. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ies/lamp.tilt +0 -0
  205. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/images/grey16.png +0 -0
  206. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ktx2/README.md +0 -0
  207. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  208. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  209. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  210. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  211. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/scenes/README.md +0 -0
  212. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/scenes/invalid/problems.expected +0 -0
  213. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/scenes/invalid/problems.json +0 -0
  214. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/README.md +0 -0
  215. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  216. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/float_raw.tif +0 -0
  217. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  218. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  219. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  220. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  221. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  222. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/volumes/cube.nvdb +0 -0
  223. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/fixtures/volumes/make_nvdb.py +0 -0
  224. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/geometry/bounds_test.cpp +0 -0
  225. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/io/ies_test.cpp +0 -0
  226. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/io/image_test.cpp +0 -0
  227. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/io/nanovdb_test.cpp +0 -0
  228. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/io/raster_test.cpp +0 -0
  229. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/io/texture_test.cpp +0 -0
  230. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/astronomy_test.cpp +0 -0
  231. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/atmosphere_test.cpp +0 -0
  232. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/cloud_test.cpp +0 -0
  233. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/reflectance_library_test.cpp +0 -0
  234. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/regolith_test.cpp +0 -0
  235. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/scattering_test.cpp +0 -0
  236. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/solar_test.cpp +0 -0
  237. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/physics/spectrum_test.cpp +0 -0
  238. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/python/test_package.py +0 -0
  239. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/python/test_scene_schema.py +0 -0
  240. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/extent_cache_test.cpp +0 -0
  241. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/path_test.cpp +0 -0
  242. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/render_test.cpp +0 -0
  243. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/shade_test.cpp +0 -0
  244. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/scene/vol_test.cpp +0 -0
  245. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/algorithm_test.cpp +0 -0
  246. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/bytes_test.cpp +0 -0
  247. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/disk_cache_test.cpp +0 -0
  248. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/file_test.cpp +0 -0
  249. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/hash_index_test.cpp +0 -0
  250. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/linear_algebra_test.cpp +0 -0
  251. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/log_test.cpp +0 -0
  252. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/math_test.cpp +0 -0
  253. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/noise_test.cpp +0 -0
  254. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/parallel_test.cpp +0 -0
  255. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/profiler_test.cpp +0 -0
  256. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/random_test.cpp +0 -0
  257. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/tensor_test.cpp +0 -0
  258. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/text_test.cpp +0 -0
  259. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/version_test.cpp +0 -0
  260. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/tests/util/worker_pool_test.cpp +0 -0
  261. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/CMakeLists.txt +0 -0
  262. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/LICENSE +0 -0
  263. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  264. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  265. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/LICENSES/MIT.txt +0 -0
  266. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/NOTICE +0 -0
  267. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/README.md +0 -0
  268. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu.h +0 -0
  269. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  270. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  271. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  272. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  273. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  274. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  275. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  276. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  277. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  278. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  279. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  280. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  281. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  282. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
  283. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  284. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  285. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
  286. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
  287. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  288. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  289. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  290. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
  291. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  292. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  293. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  294. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/zstd/LICENSE +0 -0
  295. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/zstd/zstd.h +0 -0
  296. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/basisu/zstd/zstd_errors.h +0 -0
  297. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/nanovdb/LICENSE +0 -0
  298. {ernie_renderer-0.2.0.dev45 → ernie_renderer-0.2.0.dev52}/third_party/nanovdb/PNanoVDB.h +0 -0
@@ -15,7 +15,7 @@ project(
15
15
  )
16
16
 
17
17
  # Pre-release suffix such as .dev12, written by CI.
18
- set(ERNIE_VERSION_SUFFIX ".dev45" CACHE STRING "Pre-release suffix of Ernie's version")
18
+ set(ERNIE_VERSION_SUFFIX ".dev52" CACHE STRING "Pre-release suffix of Ernie's version")
19
19
  set(ERNIE_VERSION "${PROJECT_VERSION}${ERNIE_VERSION_SUFFIX}")
20
20
 
21
21
  option(ERNIE_BUILD_TESTS "Build Ernie's tests" OFF)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ernie-renderer
3
- Version: 0.2.0.dev45
3
+ Version: 0.2.0.dev52
4
4
  Summary: Efficient Renderer for Natural and Interplanetary Environments: a physically based, spectral Vulkan ray tracer
5
5
  Author: Alex Maietta
6
6
  License-Expression: BSD-3-Clause
@@ -6,7 +6,6 @@
6
6
 
7
7
  #include <memory>
8
8
  #include <string>
9
- #include <vector>
10
9
 
11
10
  namespace ernie::bench {
12
11
  namespace {
@@ -25,7 +25,7 @@ struct Robots {
25
25
  transform = store->Tokens().Intern("xformOp:transform");
26
26
  bucket = store->AddBucket(
27
27
  {store->Tokens().Intern("Xform"), {}},
28
- std::vector<ColumnLayout>{ColumnLayout::Of<glm::dmat4>(transform, glm::dmat4(1.0))});
28
+ std::vector<ColumnLayout>{ColumnLayout::Make<glm::dmat4>(transform, glm::dmat4(1.0))});
29
29
  prims.clear();
30
30
  }
31
31
 
@@ -2,6 +2,8 @@
2
2
  add_library(
3
3
  ernie_scene
4
4
  OBJECT
5
+ animation.cpp
6
+ edit_history.cpp
5
7
  extent_cache.cpp
6
8
  holder_index.cpp
7
9
  inherit.cpp
@@ -11,15 +13,14 @@ add_library(
11
13
  schema.cpp
12
14
  scene.cpp
13
15
  storage.cpp
16
+ time_samples.cpp
14
17
  usd_plugin.cpp
15
18
  validate.cpp
16
19
  view.cpp
17
20
  xform.cpp
18
21
  schemas/camera.cpp
19
- schemas/collection.cpp
20
22
  schemas/geom.cpp
21
23
  schemas/instancer.cpp
22
- schemas/laser.cpp
23
24
  schemas/lux.cpp
24
25
  schemas/mesh.cpp
25
26
  schemas/planet.cpp
@@ -0,0 +1,94 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file animation.cpp
3
+ /// @brief Time-sampled attributes: their sparse samples per prim, and the clock that evaluates
4
+ /// them into the columns.
5
+ #include "ernie/scene/scene.h"
6
+
7
+ #include <algorithm>
8
+
9
+ namespace ernie {
10
+
11
+ void Scene::SetAt(PrimId prim, std::string_view attribute, double time, const Value& value) {
12
+ TimeSample sample{time, {}, {}};
13
+ Author(prim, attribute, value, &sample.value);
14
+ AddSample(prim, attribute, std::move(sample));
15
+ }
16
+
17
+ void Scene::WriteAt(PrimId prim, std::string_view attribute, double time, Tensor array) {
18
+ CheckArray(prim, attribute, array);
19
+ AddSample(prim, attribute, {time, {}, std::move(array)});
20
+ }
21
+
22
+ void Scene::AddSample(PrimId prim, std::string_view attribute, TimeSample sample) {
23
+ const AttributeId token = store_.Tokens().Intern(attribute);
24
+ Animated& animated = animated_[prim.slot];
25
+ animated.prim = prim;
26
+ std::vector<TimeSample>& samples = animated.samples[token];
27
+ // Samples are all values or all arrays: one of the other kind replaces them.
28
+ if (!samples.empty() && samples.front().tensor.Empty() != sample.tensor.Empty()) {
29
+ samples.clear();
30
+ }
31
+ const auto at = std::ranges::lower_bound(samples, sample.time, {}, &TimeSample::time);
32
+ if (at != samples.end() && at->time == sample.time) {
33
+ *at = std::move(sample);
34
+ } else {
35
+ samples.insert(at, std::move(sample));
36
+ }
37
+ Evaluate(prim, token, samples);
38
+ }
39
+
40
+ std::span<const TimeSample> Scene::Samples(PrimId prim, std::string_view attribute) const {
41
+ const auto animated = animated_.find(prim.slot);
42
+ const std::optional<Token> token = store_.Tokens().Find(attribute);
43
+ if (animated == animated_.end() || animated->second.prim != prim || !token) {
44
+ return {};
45
+ }
46
+ const auto samples = animated->second.samples.find(*token);
47
+ return samples == animated->second.samples.end() ? std::span<const TimeSample>()
48
+ : std::span(samples->second);
49
+ }
50
+
51
+ std::optional<Value> Scene::GetAt(PrimId prim, std::string_view attribute, double time) const {
52
+ const std::span<const TimeSample> samples = Samples(prim, attribute);
53
+ if (samples.empty()) {
54
+ return Get(prim, attribute);
55
+ }
56
+ Value value = ernie::Evaluate(samples, time).value;
57
+ return value.Empty() ? std::nullopt : std::optional(std::move(value));
58
+ }
59
+
60
+ bool Scene::ClearSamples(PrimId prim, std::string_view attribute) {
61
+ if (Samples(prim, attribute).empty()) {
62
+ return false;
63
+ }
64
+ const auto animated = animated_.find(prim.slot);
65
+ animated->second.samples.erase(*store_.Tokens().Find(attribute));
66
+ if (animated->second.samples.empty()) {
67
+ animated_.erase(animated);
68
+ }
69
+ return true;
70
+ }
71
+
72
+ void Scene::SetTime(double timeCode) {
73
+ time_ = timeCode;
74
+ for (const auto& [slot, animated] : animated_) {
75
+ for (const auto& [attribute, samples] : animated.samples) {
76
+ Evaluate(animated.prim, attribute, samples);
77
+ }
78
+ }
79
+ }
80
+
81
+ void Scene::Evaluate(PrimId prim, AttributeId attribute, std::span<const TimeSample> samples) {
82
+ const std::string_view name = store_.Tokens().Text(attribute);
83
+ TimeSample now = ernie::Evaluate(samples, time_);
84
+ if (!now.tensor.Empty()) {
85
+ const Tensor* current = Read(prim, name);
86
+ if (current == nullptr || current->Data() != now.tensor.Data()) {
87
+ store_.Set(prim, attribute, std::move(now.tensor));
88
+ }
89
+ } else if (Get(prim, name) != now.value) {
90
+ Author(prim, name, now.value);
91
+ }
92
+ }
93
+
94
+ } // namespace ernie
@@ -0,0 +1,225 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file edit_history.cpp
3
+ /// @brief Recording edits as steps of before and after states, and applying them either way.
4
+ #include "ernie/scene/edit_history.h"
5
+
6
+ #include "ernie/util/text.h"
7
+
8
+ #include <algorithm>
9
+ #include <stdexcept>
10
+
11
+ namespace ernie {
12
+
13
+ void EditHistory::Set(Scene& scene, const Path& path,
14
+ std::vector<std::pair<std::string, Value>> edits, bool open) {
15
+ const PrimId prim = scene.Require(path);
16
+ Step step{.path = path, .open = open};
17
+ try {
18
+ for (auto& [name, value] : edits) {
19
+ Cell before = Capture(scene, prim, name);
20
+ scene.Set(prim, name, std::move(value));
21
+ step.attributes.push_back({name, std::move(before), Capture(scene, prim, name)});
22
+ }
23
+ } catch (...) {
24
+ // What applied before the rejected edit stays undoable.
25
+ if (!step.attributes.empty()) {
26
+ Push(std::move(step));
27
+ }
28
+ throw;
29
+ }
30
+ const auto same = [&](const Step& last) {
31
+ return !last.structural && last.open && last.path == path &&
32
+ std::ranges::equal(last.attributes, step.attributes, {}, &AttributeEdit::name,
33
+ &AttributeEdit::name);
34
+ };
35
+ if (open && open_ && next_ == steps_.size() && !steps_.empty() && same(steps_.back())) {
36
+ for (std::size_t i = 0; i < step.attributes.size(); ++i) {
37
+ steps_.back().attributes[i].after = std::move(step.attributes[i].after);
38
+ }
39
+ return;
40
+ }
41
+ Push(std::move(step));
42
+ }
43
+
44
+ void EditHistory::Clear(Scene& scene, const Path& path, std::string_view attribute) {
45
+ const PrimId prim = scene.Require(path);
46
+ const std::string name(attribute);
47
+ Cell before = Capture(scene, prim, name);
48
+ scene.Clear(prim, attribute);
49
+ Push({.path = path, .attributes = {{name, std::move(before), Capture(scene, prim, name)}}});
50
+ }
51
+
52
+ void EditHistory::Define(Scene& scene, const Path& path, std::string_view type) {
53
+ if (scene.Has(path)) {
54
+ throw std::invalid_argument("'" + path.String() + "' has a prim already");
55
+ }
56
+ scene.Define(path, type);
57
+ Push({.path = path, .after = Snapshot(scene, path), .structural = true});
58
+ }
59
+
60
+ bool EditHistory::Remove(Scene& scene, const Path& path) {
61
+ if (!scene.Has(path)) {
62
+ return false;
63
+ }
64
+ Step step{.path = path, .before = Snapshot(scene, path), .structural = true};
65
+ scene.Remove(path);
66
+ Push(std::move(step));
67
+ return true;
68
+ }
69
+
70
+ void EditHistory::Add(Scene& scene, const Scene& source, const Path& path) {
71
+ if (!source.Has(path) || scene.Has(path)) {
72
+ throw std::invalid_argument("Cannot add '" + path.String() +
73
+ "': the source has no prim there or the scene has one");
74
+ }
75
+ Step step{.path = path, .after = Snapshot(source, path), .structural = true};
76
+ Restore(scene, step.after);
77
+ Push(std::move(step));
78
+ }
79
+
80
+ void EditHistory::BeginGroup() {
81
+ if (groupDepth_++ == 0) {
82
+ group_ = nextGroup_++;
83
+ }
84
+ }
85
+
86
+ void EditHistory::EndGroup() {
87
+ if (groupDepth_ > 0 && --groupDepth_ == 0) {
88
+ group_ = 0;
89
+ }
90
+ }
91
+
92
+ bool EditHistory::Undo(Scene& scene) {
93
+ return Move(scene, false);
94
+ }
95
+
96
+ bool EditHistory::Redo(Scene& scene) {
97
+ return Move(scene, true);
98
+ }
99
+
100
+ std::string EditHistory::UndoLabel() const {
101
+ return CanUndo() ? Label(steps_[next_ - 1]) : std::string();
102
+ }
103
+
104
+ std::string EditHistory::RedoLabel() const {
105
+ return CanRedo() ? Label(steps_[next_]) : std::string();
106
+ }
107
+
108
+ void EditHistory::Reset() {
109
+ *this = EditHistory();
110
+ }
111
+
112
+ EditHistory::Cell EditHistory::Capture(const Scene& scene, PrimId prim,
113
+ const std::string& attribute) {
114
+ Cell cell;
115
+ const std::span<const TimeSample> samples = scene.Samples(prim, attribute);
116
+ cell.samples.assign(samples.begin(), samples.end());
117
+ if (const Tensor* array = scene.Read(prim, attribute)) {
118
+ cell.array = *array;
119
+ } else {
120
+ cell.value = scene.Get(prim, attribute);
121
+ }
122
+ return cell;
123
+ }
124
+
125
+ void EditHistory::Apply(Scene& scene, PrimId prim, const std::string& attribute, const Cell& cell) {
126
+ if (!cell.samples.empty()) {
127
+ scene.ClearSamples(prim, attribute);
128
+ for (const TimeSample& sample : cell.samples) {
129
+ sample.tensor.Empty() ? scene.SetAt(prim, attribute, sample.time, sample.value)
130
+ : scene.WriteAt(prim, attribute, sample.time, sample.tensor);
131
+ }
132
+ } else if (!cell.array.Empty()) {
133
+ scene.Write(prim, attribute, cell.array);
134
+ } else if (cell.value) {
135
+ scene.Set(prim, attribute, *cell.value);
136
+ } else {
137
+ scene.Clear(prim, attribute);
138
+ }
139
+ }
140
+
141
+ std::vector<EditHistory::PrimSnapshot> EditHistory::Snapshot(const Scene& scene, const Path& path) {
142
+ std::vector<PrimSnapshot> prims;
143
+ std::vector<Path> pending{path};
144
+ while (!pending.empty()) {
145
+ const Path next = std::move(pending.back());
146
+ pending.pop_back();
147
+ const PrimId prim = scene.Require(next);
148
+ PrimSnapshot& snapshot = prims.emplace_back();
149
+ snapshot.path = next;
150
+ snapshot.type = std::string(scene.TypeName(prim));
151
+ snapshot.apis = scene.AppliedApis(prim);
152
+ for (const std::string& name : scene.Attributes(next)) {
153
+ snapshot.attributes.emplace(name, Capture(scene, prim, name));
154
+ }
155
+ const std::vector<Path> children = scene.Children(next);
156
+ pending.insert(pending.end(), children.rbegin(), children.rend());
157
+ }
158
+ return prims;
159
+ }
160
+
161
+ void EditHistory::Restore(Scene& scene, const std::vector<PrimSnapshot>& prims) {
162
+ for (const PrimSnapshot& snapshot : prims) {
163
+ const PrimId prim = scene.Define(snapshot.path, snapshot.type);
164
+ for (const std::string& api : snapshot.apis) {
165
+ scene.ApplyApi(prim, api);
166
+ }
167
+ for (const auto& [name, cell] : snapshot.attributes) {
168
+ Apply(scene, prim, name, cell);
169
+ }
170
+ }
171
+ }
172
+
173
+ void EditHistory::Apply(Scene& scene, const Step& step, bool forward) {
174
+ if (step.structural) {
175
+ scene.Remove(step.path);
176
+ Restore(scene, forward ? step.after : step.before);
177
+ return;
178
+ }
179
+ // Edits of a prim removed since are skipped.
180
+ const std::optional<PrimId> prim = scene.Find(step.path);
181
+ if (!prim) {
182
+ return;
183
+ }
184
+ for (std::size_t i = 0; i < step.attributes.size(); ++i) {
185
+ const AttributeEdit& edit = step.attributes[forward ? i : step.attributes.size() - 1 - i];
186
+ Apply(scene, *prim, edit.name, forward ? edit.after : edit.before);
187
+ }
188
+ }
189
+
190
+ void EditHistory::Push(Step step) {
191
+ steps_.resize(next_);
192
+ step.group = groupDepth_ > 0 ? group_ : 0;
193
+ open_ = step.open;
194
+ steps_.push_back(std::move(step));
195
+ next_ = steps_.size();
196
+ }
197
+
198
+ bool EditHistory::Move(Scene& scene, bool forward) {
199
+ open_ = false;
200
+ if (forward ? !CanRedo() : !CanUndo()) {
201
+ return false;
202
+ }
203
+ const std::uint64_t group = steps_[forward ? next_ : next_ - 1].group;
204
+ do {
205
+ if (forward) {
206
+ Apply(scene, steps_[next_++], true);
207
+ } else {
208
+ Apply(scene, steps_[--next_], false);
209
+ }
210
+ } while (group != 0 && (forward ? CanRedo() && steps_[next_].group == group
211
+ : CanUndo() && steps_[next_ - 1].group == group));
212
+ return true;
213
+ }
214
+
215
+ std::string EditHistory::Label(const Step& step) {
216
+ if (step.structural) {
217
+ return (step.before.empty() ? "Add "
218
+ : step.after.empty() ? "Remove "
219
+ : "Change ") +
220
+ step.path.String();
221
+ }
222
+ return step.path.String() + " " + Join(step.attributes, " ", &AttributeEdit::name);
223
+ }
224
+
225
+ } // namespace ernie
@@ -0,0 +1,131 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file edit_history.h
3
+ /// @brief Undo and redo of scene edits, for the viewer.
4
+ ///
5
+ /// References:
6
+ /// - E. Gamma, R. Helm, R. Johnson and J. Vlissides, "Design Patterns", the Command pattern,
7
+ /// Addison-Wesley, 1994.
8
+ #pragma once
9
+
10
+ #include "ernie/scene/scene.h"
11
+
12
+ #include <cstddef>
13
+ #include <cstdint>
14
+ #include <map>
15
+ #include <optional>
16
+ #include <string>
17
+ #include <string_view>
18
+ #include <utility>
19
+ #include <vector>
20
+
21
+ namespace ernie {
22
+
23
+ /// @brief Undo and redo for the edits made through it: attributes set or cleared, prims defined,
24
+ /// removed with their descendants, or copied in. Each step records what it changes, so `Undo`
25
+ /// puts it back and `Redo` does it again.
26
+ ///
27
+ /// Continuous edits, as dragging a slider or a gizmo, merge into one step: an `open` edit of the
28
+ /// same attributes as the last step updates it until `Close`. Edits between `BeginGroup` and
29
+ /// `EndGroup` undo and redo together. Edits made to the scene directly are not recorded.
30
+ class EditHistory {
31
+ public:
32
+ /// @brief Sets attributes of a prim as one step, dropping the undone steps. With `open`, merges
33
+ /// into the last step if that is an open edit of the same attributes.
34
+ /// @throws std::invalid_argument as `Scene::Set`.
35
+ void Set(Scene& scene, const Path& path, std::vector<std::pair<std::string, Value>> edits,
36
+ bool open = false);
37
+ void Set(Scene& scene, const Path& path, std::string_view attribute, Value value,
38
+ bool open = false) {
39
+ Set(scene, path, {{std::string(attribute), std::move(value)}}, open);
40
+ }
41
+ /// @brief Unauthors an attribute, back to its fallback.
42
+ void Clear(Scene& scene, const Path& path, std::string_view attribute);
43
+ /// @brief Defines a new prim; undoing removes it.
44
+ /// @throws std::invalid_argument as `Scene::Define`, or if a prim is there already.
45
+ void Define(Scene& scene, const Path& path, std::string_view type);
46
+ /// @brief Removes a prim and its descendants; undoing restores them, sharing their arrays.
47
+ /// @return Whether there was a prim.
48
+ bool Remove(Scene& scene, const Path& path);
49
+ /// @brief Copies a prim of `source` and its descendants to the same path of `scene`, as for
50
+ /// prims authored in a scratch scene first; undoing removes them.
51
+ /// @throws std::invalid_argument if `source` has no prim at `path` or `scene` has one.
52
+ void Add(Scene& scene, const Scene& source, const Path& path);
53
+
54
+ /// Groups the edits until `EndGroup` into one step. Groups nest; the outermost counts.
55
+ void BeginGroup();
56
+ void EndGroup();
57
+ /// Ends the open step, so the next edit starts a new one.
58
+ void Close() {
59
+ open_ = false;
60
+ }
61
+
62
+ bool CanUndo() const {
63
+ return next_ > 0;
64
+ }
65
+ bool CanRedo() const {
66
+ return next_ < steps_.size();
67
+ }
68
+ /// @brief Undoes the last step or group; edits of prims removed since are skipped.
69
+ /// @return Whether there was one.
70
+ bool Undo(Scene& scene);
71
+ bool Redo(Scene& scene);
72
+ /// @return What `Undo` or `Redo` would do, as "/World/Cube xformOp:translate".
73
+ std::string UndoLabel() const;
74
+ std::string RedoLabel() const;
75
+ /// Forgets every step, as when the viewer switches scenes.
76
+ void Reset();
77
+ /// @return The steps recorded, a group's edits each counted.
78
+ std::size_t Size() const {
79
+ return steps_.size();
80
+ }
81
+
82
+ private:
83
+ /// One attribute's authored state: unset, a value, an array or time samples.
84
+ struct Cell {
85
+ std::optional<Value> value;
86
+ Tensor array;
87
+ std::vector<TimeSample> samples;
88
+ };
89
+ /// One prim of a subtree, enough to define it again.
90
+ struct PrimSnapshot {
91
+ Path path;
92
+ std::string type;
93
+ std::vector<std::string> apis;
94
+ std::map<std::string, Cell> attributes;
95
+ };
96
+ struct AttributeEdit {
97
+ std::string name;
98
+ Cell before;
99
+ Cell after;
100
+ };
101
+ struct Step {
102
+ Path path;
103
+ std::vector<AttributeEdit> attributes;
104
+ /// Structure steps: the subtree at `path` before and after, parents first; empty for none.
105
+ std::vector<PrimSnapshot> before;
106
+ std::vector<PrimSnapshot> after;
107
+ bool structural = false;
108
+ bool open = false;
109
+ /// Steps of one non-zero group undo together.
110
+ std::uint64_t group = 0;
111
+ };
112
+
113
+ static Cell Capture(const Scene& scene, PrimId prim, const std::string& attribute);
114
+ static void Apply(Scene& scene, PrimId prim, const std::string& attribute, const Cell& cell);
115
+ static std::vector<PrimSnapshot> Snapshot(const Scene& scene, const Path& path);
116
+ static void Restore(Scene& scene, const std::vector<PrimSnapshot>& prims);
117
+ static void Apply(Scene& scene, const Step& step, bool forward);
118
+ void Push(Step step);
119
+ bool Move(Scene& scene, bool forward);
120
+ static std::string Label(const Step& step);
121
+
122
+ std::vector<Step> steps_;
123
+ /// Steps before it are done; from it on, undone.
124
+ std::size_t next_ = 0;
125
+ bool open_ = false;
126
+ int groupDepth_ = 0;
127
+ std::uint64_t group_ = 0;
128
+ std::uint64_t nextGroup_ = 1;
129
+ };
130
+
131
+ } // namespace ernie
@@ -14,28 +14,20 @@ void ExtentCache::Track(BucketId bucket, ExtentFunction compute) {
14
14
 
15
15
  void ExtentCache::Update(const PrimStore& store) {
16
16
  const ChangeSet changes = store.ChangesSince(cursor_);
17
- const auto tracked = [&](BucketId bucket) {
18
- return bucket < buckets_.size() && buckets_[bucket].compute != nullptr;
19
- };
20
- for (const BucketId bucket : changes.resets) {
21
- if (tracked(bucket)) {
22
- Resize(buckets_[bucket], 0);
23
- }
24
- }
25
17
  for (const ChangeSet::Rows& rows : changes.rows) {
26
- if (tracked(rows.bucket)) {
18
+ if (Tracked(rows.bucket)) {
27
19
  Replay(buckets_[rows.bucket], rows.change);
28
20
  }
29
21
  }
30
22
  for (const ChangeSet::Values& values : changes.values) {
31
- if (tracked(values.bucket)) {
23
+ if (Tracked(values.bucket)) {
32
24
  for (const RowRange range : values.rows) {
33
25
  buckets_[values.bucket].stale.SetRange(range.begin, range.end);
34
26
  }
35
27
  }
36
28
  }
37
29
  for (BucketId bucket = 0; bucket < buckets_.size(); ++bucket) {
38
- if (tracked(bucket) && store.GetBucket(bucket).version > cursor_) {
30
+ if (Tracked(bucket) && store.GetBucket(bucket).version > cursor_) {
39
31
  Refresh(buckets_[bucket], store, bucket);
40
32
  }
41
33
  }
@@ -44,16 +36,23 @@ void ExtentCache::Update(const PrimStore& store) {
44
36
 
45
37
  std::optional<Box> ExtentCache::Find(const PrimStore& store, BucketId bucket,
46
38
  std::uint32_t row) const {
47
- if (bucket >= buckets_.size() || buckets_[bucket].compute == nullptr ||
48
- store.GetBucket(bucket).version > cursor_ || row >= buckets_[bucket].boxes.size()) {
39
+ if (!Tracked(bucket) || store.GetBucket(bucket).version > cursor_ ||
40
+ row >= buckets_[bucket].boxes.size()) {
49
41
  return std::nullopt;
50
42
  }
51
43
  return buckets_[bucket].boxes[row];
52
44
  }
53
45
 
46
+ bool ExtentCache::Tracked(BucketId bucket) const {
47
+ return bucket < buckets_.size() && buckets_[bucket].compute != nullptr;
48
+ }
49
+
54
50
  void ExtentCache::Replay(Entry& entry, const StructuralChange& change) {
55
51
  using Kind = StructuralChange::Kind;
56
- if (change.kind == Kind::Added) {
52
+ if (change.kind == Kind::Reset) {
53
+ Resize(entry, 0);
54
+ }
55
+ if (change.kind == Kind::Added || change.kind == Kind::Reset) {
57
56
  Resize(entry, change.row + change.count);
58
57
  entry.stale.SetRange(change.row, change.row + change.count);
59
58
  } else if (change.kind == Kind::Moved) {
@@ -72,12 +71,6 @@ void ExtentCache::Resize(Entry& entry, std::uint32_t rows) {
72
71
  }
73
72
 
74
73
  void ExtentCache::Refresh(Entry& entry, const PrimStore& store, BucketId bucket) {
75
- const std::uint32_t rows = store.GetBucket(bucket).Rows();
76
- if (entry.boxes.size() != rows) {
77
- // Too far behind to replay (a reset): recompute the bucket whole.
78
- Resize(entry, rows);
79
- entry.stale.SetRange(0, rows);
80
- }
81
74
  const ExtentRows columns{store, bucket};
82
75
  entry.stale.ForEachRun([&](std::size_t begin, std::size_t end) {
83
76
  entry.compute(columns, {static_cast<std::uint32_t>(begin), static_cast<std::uint32_t>(end)},
@@ -32,6 +32,7 @@ class ExtentCache {
32
32
  BitSet stale;
33
33
  };
34
34
 
35
+ bool Tracked(BucketId bucket) const;
35
36
  static void Replay(Entry& entry, const StructuralChange& change);
36
37
  static void Resize(Entry& entry, std::uint32_t rows);
37
38
  static void Refresh(Entry& entry, const PrimStore& store, BucketId bucket);
@@ -3,6 +3,8 @@
3
3
  /// @brief Re-indexing changed relationship cells, and finding a target's live holders.
4
4
  #include "ernie/scene/holder_index.h"
5
5
 
6
+ #include "ernie/util/algorithm.h"
7
+
6
8
  #include <algorithm>
7
9
  #include <unordered_set>
8
10
 
@@ -16,18 +18,28 @@ bool IsRelationship(ColumnType type) {
16
18
  /// @return The targets of a relationship cell, without the unset one.
17
19
  std::vector<PathId> Targets(const PrimStore& store, BucketId bucket, const Column& column,
18
20
  std::uint32_t row) {
19
- std::vector<PathId> targets;
20
- if (column.values->Type() == ColumnType::Relationship) {
21
- targets.push_back(store.Read<Target>(bucket, column.attribute)[row].path);
22
- } else {
23
- for (const Target target : store.Read<std::vector<Target>>(bucket, column.attribute)[row]) {
24
- targets.push_back(target.path);
25
- }
26
- }
21
+ std::vector<PathId> targets =
22
+ column.values->Type() == ColumnType::Relationship
23
+ ? std::vector<PathId>{store.Read<Target>(bucket, column.attribute)[row].path}
24
+ : Map(store.Read<std::vector<Target>>(bucket, column.attribute)[row], &Target::path);
27
25
  std::erase(targets, kNoPath);
28
26
  return targets;
29
27
  }
30
28
 
29
+ /// @return Whether the prim is alive and its relationship still targets `target`.
30
+ bool Holds(const PrimStore& store, PrimId prim, AttributeId attribute, PathId target) {
31
+ if (!store.Alive(prim)) {
32
+ return false;
33
+ }
34
+ const BucketId bucket = store.PrimBucket(prim);
35
+ const Column* column = store.GetBucket(bucket).Find(attribute);
36
+ if (column == nullptr || !IsRelationship(column->values->Type())) {
37
+ return false;
38
+ }
39
+ const std::vector<PathId> targets = Targets(store, bucket, *column, store.PrimRow(prim));
40
+ return std::ranges::find(targets, target) != targets.end();
41
+ }
42
+
31
43
  } // namespace
32
44
 
33
45
  void HolderIndex::Update(const PrimStore& store) {
@@ -39,22 +51,12 @@ void HolderIndex::Update(const PrimStore& store) {
39
51
  continue;
40
52
  }
41
53
  for (const RowRange range : values.rows) {
42
- for (std::uint32_t row = range.begin; row < std::min(range.end, bucket.Rows()); ++row) {
54
+ for (std::uint32_t row = range.begin; row < range.end; ++row) {
43
55
  Index(bucket.prims[row], values.attribute,
44
56
  Targets(store, values.bucket, column, row));
45
57
  }
46
58
  }
47
59
  }
48
- // A bucket too far behind to replay reports every row of every column, as a fresh one does.
49
- for (const BucketId id : changes.resets) {
50
- const Bucket& bucket = store.GetBucket(id);
51
- for (const Column& column : bucket.columns) {
52
- for (std::uint32_t row = 0;
53
- IsRelationship(column.values->Type()) && row < bucket.Rows(); ++row) {
54
- Index(bucket.prims[row], column.attribute, Targets(store, id, column, row));
55
- }
56
- }
57
- }
58
60
  cursor_ = changes.version;
59
61
  }
60
62
 
@@ -95,17 +97,4 @@ std::vector<PrimId> HolderIndex::Find(const PrimStore& store, PathId target) con
95
97
  return found;
96
98
  }
97
99
 
98
- bool HolderIndex::Holds(const PrimStore& store, PrimId prim, AttributeId attribute, PathId target) {
99
- if (!store.Alive(prim)) {
100
- return false;
101
- }
102
- const BucketId bucket = store.PrimBucket(prim);
103
- const Column* column = store.GetBucket(bucket).Find(attribute);
104
- if (column == nullptr || !IsRelationship(column->values->Type())) {
105
- return false;
106
- }
107
- const std::vector<PathId> targets = Targets(store, bucket, *column, store.PrimRow(prim));
108
- return std::ranges::find(targets, target) != targets.end();
109
- }
110
-
111
100
  } // namespace ernie