ernie-renderer 0.2.0.dev19__tar.gz → 0.2.0.dev20__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 (215) hide show
  1. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/PKG-INFO +1 -1
  3. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/benchmarks/CMakeLists.txt +1 -1
  4. ernie_renderer-0.2.0.dev19/benchmarks/scene_storage.cpp → ernie_renderer-0.2.0.dev20/benchmarks/scene/storage.cpp +2 -2
  5. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/CMakeLists.txt +2 -0
  6. ernie_renderer-0.2.0.dev20/ernie/geometry/CMakeLists.txt +3 -0
  7. ernie_renderer-0.2.0.dev20/ernie/geometry/bounds.h +69 -0
  8. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/CMakeLists.txt +1 -1
  9. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/nanovdb.cpp +4 -14
  10. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/nanovdb.h +5 -5
  11. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/scene/storage.cpp +49 -13
  12. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/scene/storage.h +12 -0
  13. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/io/nanovdb_test.cpp +3 -5
  14. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/scene/storage_test.cpp +29 -0
  15. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.clang-format +0 -0
  16. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.clang-tidy +0 -0
  17. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.dockerignore +0 -0
  18. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.gersemirc +0 -0
  19. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.gitattributes +0 -0
  20. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.github/scripts/coverage_badge.py +0 -0
  21. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.github/scripts/install-lavapipe-windows.sh +0 -0
  22. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.github/workflows/ci.yml +0 -0
  23. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.gitignore +0 -0
  24. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/.pre-commit-config.yaml +0 -0
  25. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/CMakePresets.json +0 -0
  26. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/Dockerfile +0 -0
  27. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/LICENSE +0 -0
  28. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/README.md +0 -0
  29. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/benchmarks/bench.h +0 -0
  30. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/benchmarks/main.cpp +0 -0
  31. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/ErnieConfig.cmake.in +0 -0
  32. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/ErnieFetch.cmake +0 -0
  33. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/ErnieInstall.cmake +0 -0
  34. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/ErniePackaging.cmake +0 -0
  35. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/ErnieTesting.cmake +0 -0
  36. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/ernie.pc.in +0 -0
  37. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/bc7enc.cmake +0 -0
  38. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/dlpack.cmake +0 -0
  39. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/glm.cmake +0 -0
  40. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/googletest.cmake +0 -0
  41. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/json.cmake +0 -0
  42. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/nanobind.cmake +0 -0
  43. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/openexr.cmake +0 -0
  44. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/stb.cmake +0 -0
  45. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/tracy.cmake +0 -0
  46. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/volk.cmake +0 -0
  47. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/cmake/third_party/vulkan_headers.cmake +0 -0
  48. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/docs/README.md +0 -0
  49. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/docs/index.md +0 -0
  50. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/docs/requirements.txt +0 -0
  51. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/app/CMakeLists.txt +0 -0
  52. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/app/main.cpp +0 -0
  53. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/device/CMakeLists.txt +0 -0
  54. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/device/vulkan_devices.cpp +0 -0
  55. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/device/vulkan_devices.h +0 -0
  56. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/graph/CMakeLists.txt +0 -0
  57. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/ies.cpp +0 -0
  58. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/ies.h +0 -0
  59. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/image.cpp +0 -0
  60. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/image.h +0 -0
  61. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/raster.cpp +0 -0
  62. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/raster.h +0 -0
  63. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/texture.cpp +0 -0
  64. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/io/texture.h +0 -0
  65. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/CMakeLists.txt +0 -0
  66. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/astronomy.cpp +0 -0
  67. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/astronomy.h +0 -0
  68. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/atmosphere.cpp +0 -0
  69. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/atmosphere.h +0 -0
  70. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/cloud.cpp +0 -0
  71. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/cloud.h +0 -0
  72. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/constants.h +0 -0
  73. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/reflectance_library.cpp +0 -0
  74. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/reflectance_library.h +0 -0
  75. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/reflectance_table.h +0 -0
  76. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/regolith.cpp +0 -0
  77. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/regolith.h +0 -0
  78. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/scattering.cpp +0 -0
  79. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/scattering.h +0 -0
  80. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/solar.cpp +0 -0
  81. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/solar.h +0 -0
  82. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/solar_table.h +0 -0
  83. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/spectrum.cpp +0 -0
  84. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/physics/spectrum.h +0 -0
  85. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/python/CMakeLists.txt +0 -0
  86. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/python/ernie/__init__.py +0 -0
  87. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/python/module.cpp +0 -0
  88. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/render/CMakeLists.txt +0 -0
  89. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/scene/CMakeLists.txt +0 -0
  90. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/scene/path.cpp +0 -0
  91. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/scene/path.h +0 -0
  92. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/CMakeLists.txt +0 -0
  93. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/bytes.h +0 -0
  94. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/disk_cache.cpp +0 -0
  95. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/disk_cache.h +0 -0
  96. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/file.cpp +0 -0
  97. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/file.h +0 -0
  98. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/glm.h +0 -0
  99. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/hash_index.h +0 -0
  100. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/linear_algebra.h +0 -0
  101. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/log.cpp +0 -0
  102. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/log.h +0 -0
  103. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/math.h +0 -0
  104. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/noise.cpp +0 -0
  105. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/noise.h +0 -0
  106. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/numbers.h +0 -0
  107. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/parallel.h +0 -0
  108. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/profiler.cpp +0 -0
  109. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/profiler.h +0 -0
  110. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/random.h +0 -0
  111. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/tensor.cpp +0 -0
  112. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/tensor.h +0 -0
  113. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/text.h +0 -0
  114. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/version.cpp +0 -0
  115. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/version.h +0 -0
  116. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/ernie/util/worker_pool.h +0 -0
  117. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/mkdocs.yml +0 -0
  118. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/pyproject.toml +0 -0
  119. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/CMakeLists.txt +0 -0
  120. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/common.h +0 -0
  121. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/consumer/CMakeLists.txt +0 -0
  122. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/consumer/main.cpp +0 -0
  123. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/device/vulkan_devices_test.cpp +0 -0
  124. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/exr/README.md +0 -0
  125. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/exr/make_exr.py +0 -0
  126. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  127. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  128. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/exr/y_half_zips.exr +0 -0
  129. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ies/README.md +0 -0
  130. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  131. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  132. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ies/lamp.tilt +0 -0
  133. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/images/grey16.png +0 -0
  134. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ktx2/README.md +0 -0
  135. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  136. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  137. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  138. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  139. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/README.md +0 -0
  140. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  141. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/float_raw.tif +0 -0
  142. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  143. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  144. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  145. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  146. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  147. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/volumes/cube.nvdb +0 -0
  148. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/fixtures/volumes/make_nvdb.py +0 -0
  149. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/io/ies_test.cpp +0 -0
  150. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/io/image_test.cpp +0 -0
  151. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/io/raster_test.cpp +0 -0
  152. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/io/texture_test.cpp +0 -0
  153. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/astronomy_test.cpp +0 -0
  154. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/atmosphere_test.cpp +0 -0
  155. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/cloud_test.cpp +0 -0
  156. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/reflectance_library_test.cpp +0 -0
  157. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/regolith_test.cpp +0 -0
  158. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/scattering_test.cpp +0 -0
  159. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/solar_test.cpp +0 -0
  160. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/physics/spectrum_test.cpp +0 -0
  161. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/python/test_package.py +0 -0
  162. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/scene/path_test.cpp +0 -0
  163. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/bytes_test.cpp +0 -0
  164. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/disk_cache_test.cpp +0 -0
  165. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/file_test.cpp +0 -0
  166. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/hash_index_test.cpp +0 -0
  167. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/linear_algebra_test.cpp +0 -0
  168. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/log_test.cpp +0 -0
  169. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/math_test.cpp +0 -0
  170. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/noise_test.cpp +0 -0
  171. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/parallel_test.cpp +0 -0
  172. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/profiler_test.cpp +0 -0
  173. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/random_test.cpp +0 -0
  174. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/tensor_test.cpp +0 -0
  175. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/text_test.cpp +0 -0
  176. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/version_test.cpp +0 -0
  177. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/tests/util/worker_pool_test.cpp +0 -0
  178. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/CMakeLists.txt +0 -0
  179. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/LICENSE +0 -0
  180. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  181. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  182. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/LICENSES/MIT.txt +0 -0
  183. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/NOTICE +0 -0
  184. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/README.md +0 -0
  185. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu.h +0 -0
  186. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  187. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  188. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  189. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  190. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  191. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  192. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  193. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  194. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  195. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  196. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  197. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  198. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  199. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
  200. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  201. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  202. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
  203. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
  204. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  205. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  206. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  207. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
  208. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  209. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  210. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  211. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/zstd/LICENSE +0 -0
  212. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/zstd/zstd.h +0 -0
  213. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/basisu/zstd/zstd_errors.h +0 -0
  214. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/third_party/nanovdb/LICENSE +0 -0
  215. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev20}/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 ".dev19" CACHE STRING "Pre-release suffix of Ernie's version")
18
+ set(ERNIE_VERSION_SUFFIX ".dev20" 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.dev19
3
+ Version: 0.2.0.dev20
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
@@ -1,3 +1,3 @@
1
1
  # SPDX-License-Identifier: BSD-3-Clause
2
- add_executable(ernie_benchmarks main.cpp scene_storage.cpp)
2
+ add_executable(ernie_benchmarks main.cpp scene/storage.cpp)
3
3
  target_link_libraries(ernie_benchmarks PRIVATE ernie_static ernie_build_options)
@@ -1,8 +1,8 @@
1
1
  // SPDX-License-Identifier: BSD-3-Clause
2
- /// @file scene_storage.cpp
2
+ /// @file storage.cpp
3
3
  /// @brief The prim store at 100,000 prims: create, first sync, one edit, edit all, add and remove.
4
- #include "benchmarks/bench.h"
5
4
  #include "ernie/scene/storage.h"
5
+ #include "benchmarks/bench.h"
6
6
 
7
7
  #include <memory>
8
8
  #include <string>
@@ -22,6 +22,7 @@ set_target_properties(
22
22
 
23
23
  # One object library per layer; a layer links only the layers below it.
24
24
  add_subdirectory(util)
25
+ add_subdirectory(geometry)
25
26
  add_subdirectory(physics)
26
27
  add_subdirectory(io)
27
28
  add_subdirectory(scene)
@@ -31,6 +32,7 @@ add_subdirectory(render)
31
32
 
32
33
  set(ernie_layers
33
34
  ernie_util
35
+ ernie_geometry
34
36
  ernie_physics
35
37
  ernie_io
36
38
  ernie_scene
@@ -0,0 +1,3 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ add_library(ernie_geometry INTERFACE)
3
+ target_link_libraries(ernie_geometry INTERFACE ernie_util)
@@ -0,0 +1,69 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file bounds.h
3
+ /// @brief Axis-aligned boxes in double precision.
4
+ #pragma once
5
+
6
+ #include <glm/glm.hpp>
7
+
8
+ #include <cmath>
9
+ #include <limits>
10
+
11
+ namespace ernie {
12
+
13
+ /// @brief An axis-aligned box; the default one is empty and grows to hold what it is given.
14
+ struct Box {
15
+ glm::dvec3 min{std::numeric_limits<double>::infinity()};
16
+ glm::dvec3 max{-std::numeric_limits<double>::infinity()};
17
+
18
+ static Box Around(const glm::dvec3& center, const glm::dvec3& halfSize) {
19
+ return {center - halfSize, center + halfSize};
20
+ }
21
+
22
+ bool Empty() const {
23
+ return !(min.x <= max.x && min.y <= max.y && min.z <= max.z);
24
+ }
25
+ glm::dvec3 Center() const {
26
+ return 0.5 * (min + max);
27
+ }
28
+ glm::dvec3 Size() const {
29
+ return Empty() ? glm::dvec3(0.0) : max - min;
30
+ }
31
+
32
+ Box& Extend(const glm::dvec3& point) {
33
+ min = glm::min(min, point);
34
+ max = glm::max(max, point);
35
+ return *this;
36
+ }
37
+ Box& Extend(const Box& other) {
38
+ if (!other.Empty()) {
39
+ min = glm::min(min, other.min);
40
+ max = glm::max(max, other.max);
41
+ }
42
+ return *this;
43
+ }
44
+ Box Grown(double margin) const {
45
+ return Empty() ? *this : Box{min - margin, max + margin};
46
+ }
47
+
48
+ /// @return The box holding this one after `transform` (Arvo's method, exact for affine maps).
49
+ Box Transformed(const glm::dmat4& transform) const {
50
+ if (Empty()) {
51
+ return *this;
52
+ }
53
+ const glm::dvec3 translation(transform[3]);
54
+ Box out{translation, translation};
55
+ for (int column = 0; column < 3; ++column) {
56
+ for (int row = 0; row < 3; ++row) {
57
+ const double a = transform[column][row] * min[column];
58
+ const double b = transform[column][row] * max[column];
59
+ out.min[row] += std::min(a, b);
60
+ out.max[row] += std::max(a, b);
61
+ }
62
+ }
63
+ return out;
64
+ }
65
+
66
+ bool operator==(const Box&) const = default;
67
+ };
68
+
69
+ } // namespace ernie
@@ -10,7 +10,7 @@ add_library(
10
10
  )
11
11
  target_link_libraries(
12
12
  ernie_io
13
- PUBLIC ernie_util
13
+ PUBLIC ernie_geometry
14
14
  PRIVATE
15
15
  ernie_build_options
16
16
  ernie_basisu
@@ -222,22 +222,12 @@ bool NanoVdbGrid::Vector() const {
222
222
  return type == NanoVdbType::Vec3f;
223
223
  }
224
224
 
225
- void NanoVdbGrid::GridBounds(glm::dvec3& min, glm::dvec3& max) const {
226
- min = glm::dvec3(std::numeric_limits<double>::infinity());
227
- max = -min;
225
+ Box NanoVdbGrid::GridBounds() const {
228
226
  if (Empty()) {
229
- min = max = glm::dvec3(indexToGrid[3]);
230
- return;
231
- }
232
- const glm::dvec3 lo = glm::dvec3(indexMin) - 1.0;
233
- const glm::dvec3 hi = glm::dvec3(indexMax) + 1.0;
234
- for (int corner = 0; corner < 8; ++corner) {
235
- const glm::dvec3 index{(corner & 1) != 0 ? hi.x : lo.x, (corner & 2) != 0 ? hi.y : lo.y,
236
- (corner & 4) != 0 ? hi.z : lo.z};
237
- const glm::dvec3 point = glm::dvec3(indexToGrid * glm::dvec4(index, 1.0));
238
- min = glm::min(min, point);
239
- max = glm::max(max, point);
227
+ const glm::dvec3 origin(indexToGrid[3]);
228
+ return {origin, origin};
240
229
  }
230
+ return Box{glm::dvec3(indexMin) - 1.0, glm::dvec3(indexMax) + 1.0}.Transformed(indexToGrid);
241
231
  }
242
232
 
243
233
  std::vector<NanoVdbGrid> ParseNanoVdbGrids(std::span<const std::uint8_t> bytes) {
@@ -3,6 +3,8 @@
3
3
  /// @brief NanoVDB grids: reading .nvdb/.vdb files and building grids.
4
4
  #pragma once
5
5
 
6
+ #include "ernie/geometry/bounds.h"
7
+
6
8
  #include <glm/glm.hpp>
7
9
 
8
10
  #include <cstdint>
@@ -79,11 +81,9 @@ struct NanoVdbGrid {
79
81
  bool Scalar() const;
80
82
  /// @return Whether volumes sample a 3-vector per voxel.
81
83
  bool Vector() const;
82
- /// @brief Active bounds in the grid frame, grown by a voxel on
83
- /// each side for trilinear sampling.
84
- /// @param min Receives the lower corner.
85
- /// @param max Receives the upper corner.
86
- void GridBounds(glm::dvec3& min, glm::dvec3& max) const;
84
+ /// @return Active bounds in the grid frame, grown by a voxel on each side for trilinear
85
+ /// sampling; the grid's origin when it has no active voxels.
86
+ Box GridBounds() const;
87
87
  };
88
88
 
89
89
  /// @brief Reads every grid of a NanoVDB file, in file order.
@@ -113,26 +113,66 @@ std::vector<PrimId> PrimStore::DefineMany(std::span<const PathId> paths, BucketI
113
113
  throw std::invalid_argument("Prim " + paths_.ToPath(path).String() + " already exists");
114
114
  }
115
115
  }
116
- Bucket& b = *buckets_[bucket];
117
- const std::uint32_t first = b.Rows();
118
116
  const auto count = static_cast<std::uint32_t>(paths.size());
119
- for (Column& column : b.columns) {
120
- column.values->Grow(count);
121
- column.Resize(first + count);
122
- }
117
+ const std::uint32_t first = AddRows(bucket, count);
118
+ Bucket& b = *buckets_[bucket];
123
119
  std::vector<PrimId> prims;
124
120
  prims.reserve(count);
125
- b.prims.reserve(first + count);
126
121
  for (std::uint32_t i = 0; i < count; ++i) {
127
122
  prims.push_back(AddSlot(paths[i], bucket, first + i));
128
- b.prims.push_back(prims.back());
123
+ b.prims[first + i] = prims.back();
129
124
  }
130
- Log(b, {Next(), StructuralChange::Kind::Added, first, count, 0});
131
125
  return prims;
132
126
  }
133
127
 
128
+ std::uint32_t PrimStore::AddRows(BucketId bucket, std::uint32_t count) {
129
+ Bucket& b = *buckets_[bucket];
130
+ const std::uint32_t first = b.Rows();
131
+ for (Column& column : b.columns) {
132
+ column.values->Grow(count);
133
+ column.Resize(first + count);
134
+ }
135
+ b.prims.resize(first + count);
136
+ Log(b, {Next(), StructuralChange::Kind::Added, first, count, 0});
137
+ return first;
138
+ }
139
+
134
140
  void PrimStore::Remove(PrimId prim) {
135
141
  SlotData& slot = const_cast<SlotData&>(Slot(prim));
142
+ DropRow(slot);
143
+ pathSlots_[slot.path] = kNoSlot;
144
+ slot.alive = false;
145
+ ++slot.generation;
146
+ free_.push_back(prim.slot);
147
+ }
148
+
149
+ void PrimStore::Move(PrimId prim, BucketId bucket) {
150
+ SlotData& slot = const_cast<SlotData&>(Slot(prim));
151
+ if (slot.bucket == bucket) {
152
+ return;
153
+ }
154
+ const std::uint32_t row = AddRows(bucket, 1);
155
+ Bucket& to = *buckets_[bucket];
156
+ const Bucket& from = *buckets_[slot.bucket];
157
+ to.prims[row] = prim;
158
+ const std::uint64_t version = Next();
159
+ for (const Column& source : from.columns) {
160
+ const auto found = to.columnIndex.find(source.attribute);
161
+ if (found == to.columnIndex.end() || !source.authored.Test(slot.row)) {
162
+ continue;
163
+ }
164
+ Column& column = to.columns[found->second];
165
+ if (column.values->Type() == source.values->Type()) {
166
+ column.values->CopyRow(row, *source.values, slot.row);
167
+ Stamp(bucket, column, row, row + 1, version);
168
+ }
169
+ }
170
+ DropRow(slot);
171
+ slot.bucket = bucket;
172
+ slot.row = row;
173
+ }
174
+
175
+ void PrimStore::DropRow(const SlotData& slot) {
136
176
  Bucket& b = *buckets_[slot.bucket];
137
177
  const std::uint32_t row = slot.row;
138
178
  const std::uint32_t last = b.Rows() - 1;
@@ -149,10 +189,6 @@ void PrimStore::Remove(PrimId prim) {
149
189
  column.authored.Set(row, column.authored.Test(last));
150
190
  column.Resize(last);
151
191
  }
152
- pathSlots_[slot.path] = kNoSlot;
153
- slot.alive = false;
154
- ++slot.generation;
155
- free_.push_back(prim.slot);
156
192
  }
157
193
 
158
194
  void PrimStore::Clear(PrimId prim, AttributeId attribute) {
@@ -108,6 +108,8 @@ class ColumnValues {
108
108
  virtual void SwapRemove(std::size_t row) = 0;
109
109
  /// Puts the fallback back in `row`.
110
110
  virtual void Reset(std::size_t row) = 0;
111
+ /// Copies `source`'s value at `from` into `row`; `source` holds the same type.
112
+ virtual void CopyRow(std::size_t row, const ColumnValues& source, std::size_t from) = 0;
111
113
  };
112
114
 
113
115
  template <typename T> class TypedColumn final : public ColumnValues {
@@ -132,6 +134,9 @@ template <typename T> class TypedColumn final : public ColumnValues {
132
134
  void Reset(std::size_t row) override {
133
135
  values_[row] = fallback_;
134
136
  }
137
+ void CopyRow(std::size_t row, const ColumnValues& source, std::size_t from) override {
138
+ values_[row] = static_cast<const TypedColumn&>(source).values_[from];
139
+ }
135
140
 
136
141
  std::vector<T>& Values() {
137
142
  return values_;
@@ -290,6 +295,9 @@ class PrimStore {
290
295
  std::vector<PrimId> DefineMany(std::span<const PathId> paths, BucketId bucket);
291
296
  /// @brief Removes a prim; the bucket's last row moves into its place.
292
297
  void Remove(PrimId prim);
298
+ /// @brief Moves a prim to another bucket, keeping its id and the authored values of the
299
+ /// attributes both buckets have.
300
+ void Move(PrimId prim, BucketId bucket);
293
301
 
294
302
  bool Alive(PrimId prim) const;
295
303
  std::optional<PrimId> Find(PathId path) const;
@@ -362,6 +370,10 @@ class PrimStore {
362
370
  }
363
371
  const SlotData& Slot(PrimId prim) const;
364
372
  PrimId AddSlot(PathId path, BucketId bucket, std::uint32_t row);
373
+ /// Appends `count` rows at their fallbacks to a bucket, logged as one change.
374
+ std::uint32_t AddRows(BucketId bucket, std::uint32_t count);
375
+ /// Drops a prim's row from its bucket, the last row moving into its place.
376
+ void DropRow(const SlotData& slot);
365
377
  void Log(Bucket& bucket, StructuralChange change);
366
378
  /// Marks rows [begin, end) authored and changed at `version`.
367
379
  void Stamp(BucketId bucket, Column& column, std::uint32_t begin, std::uint32_t end,
@@ -62,11 +62,9 @@ TEST(NanoVdb, ReadsWarpsFile) {
62
62
  EXPECT_EQ(grid.maxValue, 0.0);
63
63
 
64
64
  // Grown by a voxel each side, what trilinear sampling reaches.
65
- glm::dvec3 min;
66
- glm::dvec3 max;
67
- grid.GridBounds(min, max);
68
- EXPECT_NEAR(min.x, -0.85, kFloat);
69
- EXPECT_NEAR(max.y, 0.85, kFloat);
65
+ const Box bounds = grid.GridBounds();
66
+ EXPECT_NEAR(bounds.min.x, -0.85, kFloat);
67
+ EXPECT_NEAR(bounds.max.y, 0.85, kFloat);
70
68
  }
71
69
 
72
70
  TEST(NanoVdb, RawBufferMatchesTheFile) {
@@ -48,6 +48,35 @@ TEST(PrimStore, DefinesFindsAndRemovesPrims) {
48
48
  EXPECT_FALSE(s.store.Alive(a));
49
49
  }
50
50
 
51
+ TEST(PrimStore, MovingToAnotherBucketKeepsTheIdAndSharedAuthoredValues) {
52
+ Spheres s;
53
+ const AttributeId height = s.store.Tokens().Intern("height");
54
+ const BucketId cylinders =
55
+ s.store.AddBucket({s.store.Tokens().Intern("Cylinder"), {}},
56
+ std::vector<ColumnLayout>{ColumnLayout::Of<double>(s.radius, 1.0),
57
+ ColumnLayout::Of<double>(height, 2.0)});
58
+ const PrimId a = s.Define("/A");
59
+ const PrimId b = s.Define("/B");
60
+ s.store.Set(a, s.radius, 3.0);
61
+ s.store.Set(a, s.color, glm::dvec3(1.0));
62
+ const std::uint64_t cursor = s.store.Version();
63
+
64
+ s.store.Move(a, cylinders);
65
+ EXPECT_TRUE(s.store.Alive(a));
66
+ EXPECT_EQ(s.store.BucketOf(a), cylinders);
67
+ EXPECT_EQ(*s.store.Get<double>(a, s.radius), 3.0) << "both buckets have radius";
68
+ EXPECT_EQ(s.store.Get<double>(a, height), nullptr) << "unauthored in its new bucket";
69
+ EXPECT_EQ(s.store.RowOf(b), 0u) << "the old bucket's last row filled the gap";
70
+
71
+ const ChangeSet changes = s.store.ChangesSince(cursor);
72
+ ASSERT_EQ(changes.rows.size(), 3u) << "removed and moved in one bucket, added in the other";
73
+ EXPECT_EQ(changes.rows[0].bucket, s.bucket);
74
+ EXPECT_EQ(changes.rows[0].change.kind, StructuralChange::Kind::Removed);
75
+ EXPECT_EQ(changes.rows[1].change.kind, StructuralChange::Kind::Moved);
76
+ EXPECT_EQ(changes.rows[2].bucket, cylinders);
77
+ EXPECT_EQ(changes.rows[2].change.kind, StructuralChange::Kind::Added);
78
+ }
79
+
51
80
  TEST(PrimStore, UnauthoredRowsHoldTheFallbackForWholeColumnReads) {
52
81
  Spheres s;
53
82
  const PrimId a = s.Define("/A");