ernie-renderer 0.2.0.dev19__tar.gz → 0.2.0.dev21__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 (236) hide show
  1. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/PKG-INFO +1 -1
  3. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/benchmarks/CMakeLists.txt +1 -1
  4. ernie_renderer-0.2.0.dev19/benchmarks/scene_storage.cpp → ernie_renderer-0.2.0.dev21/benchmarks/scene/storage.cpp +2 -2
  5. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/CMakeLists.txt +2 -0
  6. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/device/vulkan_devices.cpp +2 -5
  7. ernie_renderer-0.2.0.dev21/ernie/geometry/CMakeLists.txt +3 -0
  8. ernie_renderer-0.2.0.dev21/ernie/geometry/bounds.h +69 -0
  9. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/CMakeLists.txt +1 -1
  10. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/nanovdb.cpp +4 -14
  11. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/nanovdb.h +5 -5
  12. ernie_renderer-0.2.0.dev21/ernie/scene/CMakeLists.txt +14 -0
  13. ernie_renderer-0.2.0.dev21/ernie/scene/convert.h +191 -0
  14. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/scene/path.h +7 -0
  15. ernie_renderer-0.2.0.dev21/ernie/scene/scene.cpp +324 -0
  16. ernie_renderer-0.2.0.dev21/ernie/scene/scene.h +106 -0
  17. ernie_renderer-0.2.0.dev21/ernie/scene/schema.cpp +124 -0
  18. ernie_renderer-0.2.0.dev21/ernie/scene/schema.h +182 -0
  19. ernie_renderer-0.2.0.dev21/ernie/scene/schemas/geom.cpp +99 -0
  20. ernie_renderer-0.2.0.dev21/ernie/scene/schemas/geom.h +174 -0
  21. ernie_renderer-0.2.0.dev21/ernie/scene/schemas/registry.cpp +18 -0
  22. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/scene/storage.cpp +50 -14
  23. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/scene/storage.h +78 -41
  24. ernie_renderer-0.2.0.dev21/ernie/scene/tokens.h +35 -0
  25. ernie_renderer-0.2.0.dev21/ernie/scene/value.h +53 -0
  26. ernie_renderer-0.2.0.dev21/ernie/scene/view.cpp +38 -0
  27. ernie_renderer-0.2.0.dev21/ernie/scene/view.h +211 -0
  28. ernie_renderer-0.2.0.dev21/ernie/scene/xform.cpp +227 -0
  29. ernie_renderer-0.2.0.dev21/ernie/scene/xform.h +49 -0
  30. ernie_renderer-0.2.0.dev21/ernie/util/algorithm.h +26 -0
  31. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/text.h +7 -0
  32. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/CMakeLists.txt +8 -1
  33. ernie_renderer-0.2.0.dev21/tests/geometry/bounds_test.cpp +39 -0
  34. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/io/nanovdb_test.cpp +3 -5
  35. ernie_renderer-0.2.0.dev21/tests/scene/scene_test.cpp +150 -0
  36. ernie_renderer-0.2.0.dev21/tests/scene/schema_test.cpp +116 -0
  37. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/scene/storage_test.cpp +34 -5
  38. ernie_renderer-0.2.0.dev21/tests/scene/xform_test.cpp +570 -0
  39. ernie_renderer-0.2.0.dev21/tests/util/algorithm_test.cpp +22 -0
  40. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/text_test.cpp +6 -0
  41. ernie_renderer-0.2.0.dev19/ernie/scene/CMakeLists.txt +0 -3
  42. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.clang-format +0 -0
  43. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.clang-tidy +0 -0
  44. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.dockerignore +0 -0
  45. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.gersemirc +0 -0
  46. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.gitattributes +0 -0
  47. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.github/scripts/coverage_badge.py +0 -0
  48. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.github/scripts/install-lavapipe-windows.sh +0 -0
  49. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.github/workflows/ci.yml +0 -0
  50. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.gitignore +0 -0
  51. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/.pre-commit-config.yaml +0 -0
  52. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/CMakePresets.json +0 -0
  53. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/Dockerfile +0 -0
  54. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/LICENSE +0 -0
  55. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/README.md +0 -0
  56. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/benchmarks/bench.h +0 -0
  57. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/benchmarks/main.cpp +0 -0
  58. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/ErnieConfig.cmake.in +0 -0
  59. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/ErnieFetch.cmake +0 -0
  60. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/ErnieInstall.cmake +0 -0
  61. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/ErniePackaging.cmake +0 -0
  62. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/ErnieTesting.cmake +0 -0
  63. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/ernie.pc.in +0 -0
  64. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/bc7enc.cmake +0 -0
  65. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/dlpack.cmake +0 -0
  66. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/glm.cmake +0 -0
  67. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/googletest.cmake +0 -0
  68. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/json.cmake +0 -0
  69. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/nanobind.cmake +0 -0
  70. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/openexr.cmake +0 -0
  71. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/stb.cmake +0 -0
  72. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/tracy.cmake +0 -0
  73. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/volk.cmake +0 -0
  74. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/cmake/third_party/vulkan_headers.cmake +0 -0
  75. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/docs/README.md +0 -0
  76. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/docs/index.md +0 -0
  77. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/docs/requirements.txt +0 -0
  78. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/app/CMakeLists.txt +0 -0
  79. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/app/main.cpp +0 -0
  80. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/device/CMakeLists.txt +0 -0
  81. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/device/vulkan_devices.h +0 -0
  82. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/graph/CMakeLists.txt +0 -0
  83. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/ies.cpp +0 -0
  84. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/ies.h +0 -0
  85. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/image.cpp +0 -0
  86. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/image.h +0 -0
  87. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/raster.cpp +0 -0
  88. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/raster.h +0 -0
  89. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/texture.cpp +0 -0
  90. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/io/texture.h +0 -0
  91. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/CMakeLists.txt +0 -0
  92. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/astronomy.cpp +0 -0
  93. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/astronomy.h +0 -0
  94. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/atmosphere.cpp +0 -0
  95. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/atmosphere.h +0 -0
  96. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/cloud.cpp +0 -0
  97. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/cloud.h +0 -0
  98. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/constants.h +0 -0
  99. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/reflectance_library.cpp +0 -0
  100. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/reflectance_library.h +0 -0
  101. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/reflectance_table.h +0 -0
  102. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/regolith.cpp +0 -0
  103. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/regolith.h +0 -0
  104. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/scattering.cpp +0 -0
  105. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/scattering.h +0 -0
  106. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/solar.cpp +0 -0
  107. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/solar.h +0 -0
  108. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/solar_table.h +0 -0
  109. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/spectrum.cpp +0 -0
  110. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/physics/spectrum.h +0 -0
  111. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/python/CMakeLists.txt +0 -0
  112. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/python/ernie/__init__.py +0 -0
  113. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/python/module.cpp +0 -0
  114. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/render/CMakeLists.txt +0 -0
  115. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/scene/path.cpp +0 -0
  116. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/CMakeLists.txt +0 -0
  117. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/bytes.h +0 -0
  118. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/disk_cache.cpp +0 -0
  119. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/disk_cache.h +0 -0
  120. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/file.cpp +0 -0
  121. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/file.h +0 -0
  122. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/glm.h +0 -0
  123. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/hash_index.h +0 -0
  124. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/linear_algebra.h +0 -0
  125. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/log.cpp +0 -0
  126. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/log.h +0 -0
  127. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/math.h +0 -0
  128. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/noise.cpp +0 -0
  129. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/noise.h +0 -0
  130. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/numbers.h +0 -0
  131. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/parallel.h +0 -0
  132. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/profiler.cpp +0 -0
  133. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/profiler.h +0 -0
  134. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/random.h +0 -0
  135. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/tensor.cpp +0 -0
  136. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/tensor.h +0 -0
  137. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/version.cpp +0 -0
  138. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/version.h +0 -0
  139. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/ernie/util/worker_pool.h +0 -0
  140. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/mkdocs.yml +0 -0
  141. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/pyproject.toml +0 -0
  142. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/common.h +0 -0
  143. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/consumer/CMakeLists.txt +0 -0
  144. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/consumer/main.cpp +0 -0
  145. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/device/vulkan_devices_test.cpp +0 -0
  146. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/exr/README.md +0 -0
  147. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/exr/make_exr.py +0 -0
  148. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  149. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  150. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/exr/y_half_zips.exr +0 -0
  151. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ies/README.md +0 -0
  152. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  153. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  154. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ies/lamp.tilt +0 -0
  155. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/images/grey16.png +0 -0
  156. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ktx2/README.md +0 -0
  157. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  158. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  159. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  160. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  161. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/README.md +0 -0
  162. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  163. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/float_raw.tif +0 -0
  164. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  165. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  166. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  167. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  168. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  169. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/volumes/cube.nvdb +0 -0
  170. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/fixtures/volumes/make_nvdb.py +0 -0
  171. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/io/ies_test.cpp +0 -0
  172. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/io/image_test.cpp +0 -0
  173. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/io/raster_test.cpp +0 -0
  174. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/io/texture_test.cpp +0 -0
  175. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/astronomy_test.cpp +0 -0
  176. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/atmosphere_test.cpp +0 -0
  177. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/cloud_test.cpp +0 -0
  178. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/reflectance_library_test.cpp +0 -0
  179. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/regolith_test.cpp +0 -0
  180. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/scattering_test.cpp +0 -0
  181. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/solar_test.cpp +0 -0
  182. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/physics/spectrum_test.cpp +0 -0
  183. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/python/test_package.py +0 -0
  184. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/scene/path_test.cpp +0 -0
  185. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/bytes_test.cpp +0 -0
  186. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/disk_cache_test.cpp +0 -0
  187. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/file_test.cpp +0 -0
  188. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/hash_index_test.cpp +0 -0
  189. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/linear_algebra_test.cpp +0 -0
  190. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/log_test.cpp +0 -0
  191. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/math_test.cpp +0 -0
  192. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/noise_test.cpp +0 -0
  193. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/parallel_test.cpp +0 -0
  194. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/profiler_test.cpp +0 -0
  195. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/random_test.cpp +0 -0
  196. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/tensor_test.cpp +0 -0
  197. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/version_test.cpp +0 -0
  198. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/tests/util/worker_pool_test.cpp +0 -0
  199. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/CMakeLists.txt +0 -0
  200. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/LICENSE +0 -0
  201. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  202. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  203. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/LICENSES/MIT.txt +0 -0
  204. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/NOTICE +0 -0
  205. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/README.md +0 -0
  206. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu.h +0 -0
  207. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  208. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  209. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  210. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  211. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  212. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  213. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  214. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  215. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  216. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  217. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  218. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  219. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  220. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
  221. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  222. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  223. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
  224. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
  225. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  226. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  227. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  228. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
  229. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  230. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  231. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  232. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/zstd/LICENSE +0 -0
  233. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/zstd/zstd.h +0 -0
  234. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/basisu/zstd/zstd_errors.h +0 -0
  235. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/third_party/nanovdb/LICENSE +0 -0
  236. {ernie_renderer-0.2.0.dev19 → ernie_renderer-0.2.0.dev21}/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 ".dev21" 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.dev21
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
@@ -2,11 +2,11 @@
2
2
  /// @file vulkan_devices.cpp
3
3
  /// @brief Lists Vulkan devices through a short-lived instance.
4
4
  #include "ernie/device/vulkan_devices.h"
5
+ #include "ernie/util/algorithm.h"
5
6
 
6
7
  #include <volk.h>
7
8
 
8
9
  #include <algorithm>
9
- #include <iterator>
10
10
  #include <stdexcept>
11
11
  #include <string_view>
12
12
 
@@ -107,10 +107,7 @@ std::vector<VulkanDeviceInfo> ListVulkanDevices() {
107
107
  std::vector<VkPhysicalDevice> devices(count);
108
108
  vkEnumeratePhysicalDevices(instance.Get(), &count, devices.data());
109
109
 
110
- std::vector<VulkanDeviceInfo> infos;
111
- infos.reserve(devices.size());
112
- std::ranges::transform(devices, std::back_inserter(infos), ReadDeviceInfo);
113
- return infos;
110
+ return Map(devices, ReadDeviceInfo);
114
111
  }
115
112
 
116
113
  const char* ToString(VulkanDeviceType type) {
@@ -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.
@@ -0,0 +1,14 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ add_library(
3
+ ernie_scene
4
+ OBJECT
5
+ path.cpp
6
+ schema.cpp
7
+ scene.cpp
8
+ storage.cpp
9
+ view.cpp
10
+ xform.cpp
11
+ schemas/geom.cpp
12
+ schemas/registry.cpp
13
+ )
14
+ target_link_libraries(ernie_scene PUBLIC ernie_physics ernie_io PRIVATE ernie_build_options)
@@ -0,0 +1,191 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file convert.h
3
+ /// @brief Conversions between `Value`s and column elements.
4
+ #pragma once
5
+
6
+ #include "ernie/scene/storage.h"
7
+ #include "ernie/scene/value.h"
8
+ #include "ernie/util/algorithm.h"
9
+
10
+ #include <cmath>
11
+ #include <optional>
12
+ #include <type_traits>
13
+ #include <vector>
14
+
15
+ namespace ernie {
16
+
17
+ /// @return A number of any width, or none.
18
+ inline std::optional<double> ToNumber(const Value& value) {
19
+ if (const auto* d = value.Get<double>()) {
20
+ return *d;
21
+ }
22
+ if (const auto* f = value.Get<float>()) {
23
+ return *f;
24
+ }
25
+ if (const auto* i = value.Get<int>()) {
26
+ return *i;
27
+ }
28
+ return std::nullopt;
29
+ }
30
+
31
+ /// @return A vector of N doubles from one of floats, doubles or (for two) ints, or none.
32
+ template <glm::length_t N> std::optional<glm::vec<N, double>> ToVector(const Value& value) {
33
+ if (const auto* d = value.Get<glm::vec<N, double>>()) {
34
+ return *d;
35
+ }
36
+ if (const auto* f = value.Get<glm::vec<N, float>>()) {
37
+ return glm::vec<N, double>(*f);
38
+ }
39
+ if constexpr (N == 2) {
40
+ if (const auto* i = value.Get<glm::ivec2>()) {
41
+ return glm::dvec2(*i);
42
+ }
43
+ }
44
+ return std::nullopt;
45
+ }
46
+
47
+ /// @return The numbers of a number, or the components of a vector; none for other values.
48
+ inline std::vector<double> ToNumbers(const Value& value) {
49
+ if (const std::optional<double> number = ToNumber(value)) {
50
+ return {*number};
51
+ }
52
+ const auto components = [](const auto& vector) {
53
+ std::vector<double> numbers(static_cast<std::size_t>(vector.length()));
54
+ for (glm::length_t i = 0; i < vector.length(); ++i) {
55
+ numbers[static_cast<std::size_t>(i)] = vector[i];
56
+ }
57
+ return numbers;
58
+ };
59
+ if (const auto v = ToVector<2>(value)) {
60
+ return components(*v);
61
+ }
62
+ if (const auto v = ToVector<3>(value)) {
63
+ return components(*v);
64
+ }
65
+ if (const auto v = ToVector<4>(value)) {
66
+ return components(*v);
67
+ }
68
+ return {};
69
+ }
70
+
71
+ /// @return `value` as a column element, interning tokens and paths; none if it is another kind.
72
+ template <typename T> std::optional<T> ToElement(PathTable& paths, const Value& value) {
73
+ if constexpr (std::is_same_v<T, std::uint8_t>) {
74
+ if (const auto* b = value.Get<bool>()) {
75
+ return static_cast<std::uint8_t>(*b);
76
+ }
77
+ if (const auto* i = value.Get<int>(); i && (*i == 0 || *i == 1)) {
78
+ return static_cast<std::uint8_t>(*i);
79
+ }
80
+ } else if constexpr (std::is_same_v<T, std::int32_t>) {
81
+ if (const std::optional<double> n = ToNumber(value); n && std::trunc(*n) == *n) {
82
+ return static_cast<std::int32_t>(*n);
83
+ }
84
+ } else if constexpr (std::is_same_v<T, double>) {
85
+ return ToNumber(value);
86
+ } else if constexpr (std::is_same_v<T, glm::dvec2> || std::is_same_v<T, glm::dvec3> ||
87
+ std::is_same_v<T, glm::dvec4>) {
88
+ return ToVector<T::length()>(value);
89
+ } else if constexpr (std::is_same_v<T, glm::dquat>) {
90
+ if (const auto* q = value.Get<glm::dquat>()) {
91
+ return *q;
92
+ }
93
+ } else if constexpr (std::is_same_v<T, glm::dmat4>) {
94
+ if (const auto* m = value.Get<glm::dmat4>()) {
95
+ return *m;
96
+ }
97
+ } else if constexpr (std::is_same_v<T, Token>) {
98
+ if (const auto* text = value.Get<std::string>()) {
99
+ return paths.Names().Intern(*text);
100
+ }
101
+ } else if constexpr (std::is_same_v<T, Target>) {
102
+ if (const auto* path = value.Get<Path>()) {
103
+ return Target{path->IsEmpty() ? kNoPath : paths.Intern(*path)};
104
+ }
105
+ } else if constexpr (std::is_same_v<T, std::vector<Target>>) {
106
+ if (const auto* path = value.Get<Path>()) {
107
+ return std::vector<Target>{{paths.Intern(*path)}};
108
+ }
109
+ if (const auto* list = value.Get<std::vector<Path>>()) {
110
+ return Map(*list, [&](const Path& path) { return Target{paths.Intern(path)}; });
111
+ }
112
+ } else if constexpr (std::is_same_v<T, std::vector<float>>) {
113
+ if (const auto* floats = value.Get<std::vector<float>>()) {
114
+ return *floats;
115
+ }
116
+ if (const std::optional<double> n = ToNumber(value)) {
117
+ return std::vector<float>{static_cast<float>(*n)};
118
+ }
119
+ } else if constexpr (std::is_same_v<T, std::vector<Token>>) {
120
+ if (const auto* texts = value.Get<std::vector<std::string>>()) {
121
+ return Map(*texts, [&](const std::string& text) { return paths.Names().Intern(text); });
122
+ }
123
+ // An empty list, as Python and JSON pass one.
124
+ if (const auto* floats = value.Get<std::vector<float>>(); floats && floats->empty()) {
125
+ return std::vector<Token>{};
126
+ }
127
+ }
128
+ return std::nullopt;
129
+ }
130
+
131
+ /// @return A column element as a `Value`; tensors have none.
132
+ template <typename T> Value ToValue(const PathTable& paths, const T& element) {
133
+ if constexpr (std::is_same_v<T, std::uint8_t>) {
134
+ return element != 0;
135
+ } else if constexpr (std::is_same_v<T, std::int32_t>) {
136
+ return static_cast<int>(element);
137
+ } else if constexpr (std::is_same_v<T, Token>) {
138
+ return std::string(paths.Names().Text(element));
139
+ } else if constexpr (std::is_same_v<T, Target>) {
140
+ return element.path == kNoPath ? Path() : paths.ToPath(element.path);
141
+ } else if constexpr (std::is_same_v<T, std::vector<Target>>) {
142
+ return Map(element, [&](const Target& target) { return paths.ToPath(target.path); });
143
+ } else if constexpr (std::is_same_v<T, std::vector<Token>>) {
144
+ return Map(element, [&](Token token) { return std::string(paths.Names().Text(token)); });
145
+ } else if constexpr (std::is_same_v<T, Tensor>) {
146
+ return Value();
147
+ } else {
148
+ return element;
149
+ }
150
+ }
151
+
152
+ /// @return The column type an undeclared attribute's first value makes, or none.
153
+ inline std::optional<ColumnType> InferColumnType(const Value& value) {
154
+ return std::visit(
155
+ [](const auto& v) -> std::optional<ColumnType> {
156
+ using V = std::decay_t<decltype(v)>;
157
+ if constexpr (std::is_same_v<V, bool>) {
158
+ return ColumnType::Bool;
159
+ } else if constexpr (std::is_same_v<V, int>) {
160
+ return ColumnType::Int;
161
+ } else if constexpr (std::is_same_v<V, float> || std::is_same_v<V, double>) {
162
+ return ColumnType::Double;
163
+ } else if constexpr (std::is_same_v<V, glm::ivec2> || std::is_same_v<V, glm::vec2> ||
164
+ std::is_same_v<V, glm::dvec2>) {
165
+ return ColumnType::Vec2;
166
+ } else if constexpr (std::is_same_v<V, glm::vec3> || std::is_same_v<V, glm::dvec3>) {
167
+ return ColumnType::Vec3;
168
+ } else if constexpr (std::is_same_v<V, glm::vec4> || std::is_same_v<V, glm::dvec4>) {
169
+ return ColumnType::Vec4;
170
+ } else if constexpr (std::is_same_v<V, glm::dquat>) {
171
+ return ColumnType::Quat;
172
+ } else if constexpr (std::is_same_v<V, glm::dmat4>) {
173
+ return ColumnType::Matrix;
174
+ } else if constexpr (std::is_same_v<V, std::string>) {
175
+ return ColumnType::TokenValue;
176
+ } else if constexpr (std::is_same_v<V, Path>) {
177
+ return ColumnType::Relationship;
178
+ } else if constexpr (std::is_same_v<V, std::vector<Path>>) {
179
+ return ColumnType::Relationships;
180
+ } else if constexpr (std::is_same_v<V, std::vector<float>>) {
181
+ return ColumnType::FloatArray;
182
+ } else if constexpr (std::is_same_v<V, std::vector<std::string>>) {
183
+ return ColumnType::TokenArray;
184
+ } else {
185
+ return std::nullopt;
186
+ }
187
+ },
188
+ value.Raw());
189
+ }
190
+
191
+ } // namespace ernie
@@ -113,6 +113,13 @@ class PathTable {
113
113
  PathId NextSibling(PathId id) const {
114
114
  return nodes_[id].nextSibling;
115
115
  }
116
+ /// Calls `visit(child)` for each child of `id`, in the order they were added.
117
+ template <typename Visit> void ForEachChild(PathId id, const Visit& visit) const {
118
+ for (PathId child = nodes_[id].firstChild; child != kNoPath;
119
+ child = nodes_[child].nextSibling) {
120
+ visit(child);
121
+ }
122
+ }
116
123
  /// @return Whether `id` is `ancestor` or lies below it.
117
124
  bool HasPrefix(PathId id, PathId ancestor) const;
118
125