ernie-renderer 0.2.0.dev40__tar.gz → 0.2.0.dev45__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 (289) hide show
  1. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.github/workflows/ci.yml +12 -2
  2. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.gitignore +3 -0
  3. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/CMakeLists.txt +1 -1
  4. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/PKG-INFO +1 -1
  5. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/benchmarks/scene/extents.cpp +21 -6
  6. ernie_renderer-0.2.0.dev45/docs/README.md +10 -0
  7. ernie_renderer-0.2.0.dev45/ernie/app/main.cpp +110 -0
  8. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/CMakeLists.txt +11 -1
  9. ernie_renderer-0.2.0.dev45/ernie/scene/holder_index.cpp +111 -0
  10. ernie_renderer-0.2.0.dev45/ernie/scene/holder_index.h +42 -0
  11. ernie_renderer-0.2.0.dev45/ernie/scene/inherit.cpp +120 -0
  12. ernie_renderer-0.2.0.dev45/ernie/scene/json.cpp +528 -0
  13. ernie_renderer-0.2.0.dev45/ernie/scene/json.h +77 -0
  14. ernie_renderer-0.2.0.dev45/ernie/scene/json_value.h +32 -0
  15. ernie_renderer-0.2.0.dev45/ernie/scene/reference.cpp +534 -0
  16. ernie_renderer-0.2.0.dev45/ernie/scene/reference.h +60 -0
  17. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/scene.cpp +33 -10
  18. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/scene.h +46 -4
  19. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schema.cpp +22 -0
  20. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schema.h +13 -1
  21. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/geom.h +4 -4
  22. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/shade.h +1 -1
  23. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/storage.h +19 -0
  24. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/tokens.h +2 -0
  25. ernie_renderer-0.2.0.dev45/ernie/scene/usd_plugin.cpp +219 -0
  26. ernie_renderer-0.2.0.dev45/ernie/scene/validate.cpp +98 -0
  27. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/file.cpp +7 -0
  28. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/file.h +5 -0
  29. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/text.h +19 -0
  30. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/mkdocs.yml +10 -0
  31. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/CMakeLists.txt +8 -1
  32. ernie_renderer-0.2.0.dev45/tests/fixtures/scenes/README.md +7 -0
  33. ernie_renderer-0.2.0.dev45/tests/fixtures/scenes/invalid/problems.expected +11 -0
  34. ernie_renderer-0.2.0.dev45/tests/fixtures/scenes/invalid/problems.json +17 -0
  35. ernie_renderer-0.2.0.dev45/tests/fixtures/scenes/rover.json +64 -0
  36. ernie_renderer-0.2.0.dev45/tests/fixtures/scenes/rover.saved.json +107 -0
  37. ernie_renderer-0.2.0.dev45/tests/python/test_scene_schema.py +70 -0
  38. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/extent_cache_test.cpp +3 -3
  39. ernie_renderer-0.2.0.dev45/tests/scene/holder_index_test.cpp +63 -0
  40. ernie_renderer-0.2.0.dev45/tests/scene/inherit_test.cpp +129 -0
  41. ernie_renderer-0.2.0.dev45/tests/scene/json_test.cpp +113 -0
  42. ernie_renderer-0.2.0.dev45/tests/scene/reference_test.cpp +80 -0
  43. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/vol_test.cpp +1 -1
  44. ernie_renderer-0.2.0.dev40/docs/README.md +0 -7
  45. ernie_renderer-0.2.0.dev40/ernie/app/main.cpp +0 -44
  46. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.clang-format +0 -0
  47. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.clang-tidy +0 -0
  48. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.dockerignore +0 -0
  49. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.gersemirc +0 -0
  50. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.gitattributes +0 -0
  51. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.github/scripts/coverage_badge.py +0 -0
  52. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.github/scripts/install-lavapipe-windows.sh +0 -0
  53. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/.pre-commit-config.yaml +0 -0
  54. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/CMakePresets.json +0 -0
  55. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/Dockerfile +0 -0
  56. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/LICENSE +0 -0
  57. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/README.md +0 -0
  58. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/benchmarks/CMakeLists.txt +0 -0
  59. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/benchmarks/bench.h +0 -0
  60. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/benchmarks/main.cpp +0 -0
  61. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/benchmarks/scene/storage.cpp +0 -0
  62. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/ErnieConfig.cmake.in +0 -0
  63. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/ErnieFetch.cmake +0 -0
  64. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/ErnieInstall.cmake +0 -0
  65. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/ErniePackaging.cmake +0 -0
  66. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/ErnieTesting.cmake +0 -0
  67. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/ernie.pc.in +0 -0
  68. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/bc7enc.cmake +0 -0
  69. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/dlpack.cmake +0 -0
  70. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/glm.cmake +0 -0
  71. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/googletest.cmake +0 -0
  72. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/json.cmake +0 -0
  73. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/nanobind.cmake +0 -0
  74. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/openexr.cmake +0 -0
  75. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/stb.cmake +0 -0
  76. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/tracy.cmake +0 -0
  77. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/volk.cmake +0 -0
  78. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/cmake/third_party/vulkan_headers.cmake +0 -0
  79. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/docs/index.md +0 -0
  80. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/docs/requirements.txt +0 -0
  81. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/CMakeLists.txt +0 -0
  82. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/app/CMakeLists.txt +0 -0
  83. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/device/CMakeLists.txt +0 -0
  84. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/device/vulkan_devices.cpp +0 -0
  85. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/device/vulkan_devices.h +0 -0
  86. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/geometry/CMakeLists.txt +0 -0
  87. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/geometry/bounds.h +0 -0
  88. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/graph/CMakeLists.txt +0 -0
  89. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/CMakeLists.txt +0 -0
  90. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/ies.cpp +0 -0
  91. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/ies.h +0 -0
  92. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/image.cpp +0 -0
  93. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/image.h +0 -0
  94. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/nanovdb.cpp +0 -0
  95. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/nanovdb.h +0 -0
  96. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/raster.cpp +0 -0
  97. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/raster.h +0 -0
  98. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/texture.cpp +0 -0
  99. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/io/texture.h +0 -0
  100. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/CMakeLists.txt +0 -0
  101. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/astronomy.cpp +0 -0
  102. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/astronomy.h +0 -0
  103. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/atmosphere.cpp +0 -0
  104. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/atmosphere.h +0 -0
  105. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/cloud.cpp +0 -0
  106. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/cloud.h +0 -0
  107. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/constants.h +0 -0
  108. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/reflectance_library.cpp +0 -0
  109. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/reflectance_library.h +0 -0
  110. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/reflectance_table.h +0 -0
  111. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/regolith.cpp +0 -0
  112. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/regolith.h +0 -0
  113. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/scattering.cpp +0 -0
  114. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/scattering.h +0 -0
  115. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/solar.cpp +0 -0
  116. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/solar.h +0 -0
  117. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/solar_table.h +0 -0
  118. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/spectrum.cpp +0 -0
  119. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/physics/spectrum.h +0 -0
  120. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/python/CMakeLists.txt +0 -0
  121. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/python/ernie/__init__.py +0 -0
  122. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/python/module.cpp +0 -0
  123. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/render/CMakeLists.txt +0 -0
  124. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/convert.h +0 -0
  125. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/extent_cache.cpp +0 -0
  126. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/extent_cache.h +0 -0
  127. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/path.cpp +0 -0
  128. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/path.h +0 -0
  129. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/camera.cpp +0 -0
  130. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/camera.h +0 -0
  131. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/collection.cpp +0 -0
  132. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/collection.h +0 -0
  133. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/geom.cpp +0 -0
  134. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/instancer.cpp +0 -0
  135. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/instancer.h +0 -0
  136. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/laser.cpp +0 -0
  137. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/laser.h +0 -0
  138. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/lux.cpp +0 -0
  139. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/lux.h +0 -0
  140. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/mesh.cpp +0 -0
  141. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/mesh.h +0 -0
  142. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/planet.cpp +0 -0
  143. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/planet.h +0 -0
  144. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/registry.cpp +0 -0
  145. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/render.cpp +0 -0
  146. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/render.h +0 -0
  147. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/shade.cpp +0 -0
  148. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/vol.cpp +0 -0
  149. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/schemas/vol.h +0 -0
  150. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/storage.cpp +0 -0
  151. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/value.h +0 -0
  152. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/view.cpp +0 -0
  153. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/view.h +0 -0
  154. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/xform.cpp +0 -0
  155. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/scene/xform.h +0 -0
  156. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/CMakeLists.txt +0 -0
  157. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/algorithm.h +0 -0
  158. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/bytes.h +0 -0
  159. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/disk_cache.cpp +0 -0
  160. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/disk_cache.h +0 -0
  161. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/glm.h +0 -0
  162. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/hash_index.h +0 -0
  163. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/linear_algebra.h +0 -0
  164. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/log.cpp +0 -0
  165. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/log.h +0 -0
  166. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/math.h +0 -0
  167. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/noise.cpp +0 -0
  168. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/noise.h +0 -0
  169. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/numbers.h +0 -0
  170. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/parallel.h +0 -0
  171. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/profiler.cpp +0 -0
  172. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/profiler.h +0 -0
  173. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/random.h +0 -0
  174. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/tensor.cpp +0 -0
  175. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/tensor.h +0 -0
  176. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/version.cpp +0 -0
  177. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/version.h +0 -0
  178. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/ernie/util/worker_pool.h +0 -0
  179. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/pyproject.toml +0 -0
  180. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/common.h +0 -0
  181. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/consumer/CMakeLists.txt +0 -0
  182. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/consumer/main.cpp +0 -0
  183. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/device/vulkan_devices_test.cpp +0 -0
  184. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/exr/README.md +0 -0
  185. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/exr/make_exr.py +0 -0
  186. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  187. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  188. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/exr/y_half_zips.exr +0 -0
  189. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ies/README.md +0 -0
  190. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  191. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  192. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ies/lamp.tilt +0 -0
  193. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/images/grey16.png +0 -0
  194. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ktx2/README.md +0 -0
  195. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  196. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  197. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  198. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  199. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/README.md +0 -0
  200. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  201. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/float_raw.tif +0 -0
  202. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  203. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  204. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  205. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  206. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  207. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/volumes/cube.nvdb +0 -0
  208. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/fixtures/volumes/make_nvdb.py +0 -0
  209. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/geometry/bounds_test.cpp +0 -0
  210. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/io/ies_test.cpp +0 -0
  211. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/io/image_test.cpp +0 -0
  212. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/io/nanovdb_test.cpp +0 -0
  213. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/io/raster_test.cpp +0 -0
  214. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/io/texture_test.cpp +0 -0
  215. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/astronomy_test.cpp +0 -0
  216. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/atmosphere_test.cpp +0 -0
  217. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/cloud_test.cpp +0 -0
  218. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/reflectance_library_test.cpp +0 -0
  219. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/regolith_test.cpp +0 -0
  220. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/scattering_test.cpp +0 -0
  221. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/solar_test.cpp +0 -0
  222. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/physics/spectrum_test.cpp +0 -0
  223. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/python/test_package.py +0 -0
  224. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/api_test.cpp +0 -0
  225. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/instancer_test.cpp +0 -0
  226. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/lux_test.cpp +0 -0
  227. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/mesh_test.cpp +0 -0
  228. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/path_test.cpp +0 -0
  229. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/planet_test.cpp +0 -0
  230. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/render_test.cpp +0 -0
  231. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/scene_test.cpp +0 -0
  232. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/schema_test.cpp +0 -0
  233. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/shade_test.cpp +0 -0
  234. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/storage_test.cpp +0 -0
  235. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/scene/xform_test.cpp +0 -0
  236. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/algorithm_test.cpp +0 -0
  237. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/bytes_test.cpp +0 -0
  238. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/disk_cache_test.cpp +0 -0
  239. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/file_test.cpp +0 -0
  240. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/hash_index_test.cpp +0 -0
  241. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/linear_algebra_test.cpp +0 -0
  242. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/log_test.cpp +0 -0
  243. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/math_test.cpp +0 -0
  244. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/noise_test.cpp +0 -0
  245. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/parallel_test.cpp +0 -0
  246. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/profiler_test.cpp +0 -0
  247. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/random_test.cpp +0 -0
  248. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/tensor_test.cpp +0 -0
  249. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/text_test.cpp +0 -0
  250. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/version_test.cpp +0 -0
  251. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/tests/util/worker_pool_test.cpp +0 -0
  252. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/CMakeLists.txt +0 -0
  253. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/LICENSE +0 -0
  254. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  255. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  256. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/LICENSES/MIT.txt +0 -0
  257. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/NOTICE +0 -0
  258. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/README.md +0 -0
  259. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu.h +0 -0
  260. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  261. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  262. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  263. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  264. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  265. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  266. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  267. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  268. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  269. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  270. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  271. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  272. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  273. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
  274. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  275. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  276. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
  277. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
  278. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  279. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  280. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  281. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
  282. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  283. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  284. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  285. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/zstd/LICENSE +0 -0
  286. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/zstd/zstd.h +0 -0
  287. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/basisu/zstd/zstd_errors.h +0 -0
  288. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/nanovdb/LICENSE +0 -0
  289. {ernie_renderer-0.2.0.dev40 → ernie_renderer-0.2.0.dev45}/third_party/nanovdb/PNanoVDB.h +0 -0
@@ -134,7 +134,7 @@ jobs:
134
134
  - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
135
135
  with:
136
136
  python-version: "3.12"
137
- - run: python -m pip install pytest
137
+ - run: python -m pip install pytest jsonschema
138
138
  - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
139
139
  with:
140
140
  name: build-${{ matrix.os }}
@@ -213,8 +213,10 @@ jobs:
213
213
  path: coverage
214
214
  retention-days: 14
215
215
 
216
- # The documentation, built strictly so broken links and warnings fail.
216
+ # The documentation, built strictly so broken links and warnings fail, with the schema reference
217
+ # pages and the scene files' JSON Schema generated by the Linux build.
217
218
  docs:
219
+ needs: build
218
220
  runs-on: ubuntu-24.04
219
221
  timeout-minutes: 10
220
222
  steps:
@@ -222,6 +224,14 @@ jobs:
222
224
  - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
223
225
  with:
224
226
  python-version: "3.12"
227
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
228
+ with:
229
+ name: build-ubuntu-24.04
230
+ - name: Generate the schema reference
231
+ run: |
232
+ tar -xf build-ci.tar
233
+ build/ci/bin/ernie schema --json-schema docs/schema/ernie-scene.schema.json \
234
+ --markdown docs/reference
225
235
  - run: python -m pip install -r docs/requirements.txt
226
236
  - run: mkdocs build --strict
227
237
  - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
@@ -7,6 +7,9 @@ build/
7
7
  dist/
8
8
  site/
9
9
  .deps/
10
+ # Generated by `ernie schema` before the docs build
11
+ /docs/reference/
12
+ /docs/schema/
10
13
  *.egg-info/
11
14
  __pycache__/
12
15
  .venv/
@@ -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 ".dev40" CACHE STRING "Pre-release suffix of Ernie's version")
18
+ set(ERNIE_VERSION_SUFFIX ".dev45" 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.dev40
3
+ Version: 0.2.0.dev45
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,6 +1,6 @@
1
1
  // SPDX-License-Identifier: BSD-3-Clause
2
2
  /// @file extents.cpp
3
- /// @brief Cached extents at 100,000 prims: the first update, and one edit's.
3
+ /// @brief Scene updates at 100,000 prims: the first, one edit's, and one inherited edit's.
4
4
  #include "benchmarks/bench.h"
5
5
  #include "ernie/scene/schemas/geom.h"
6
6
 
@@ -21,20 +21,35 @@ std::unique_ptr<Scene> MakeSpheres() {
21
21
  return scene;
22
22
  }
23
23
 
24
- const bool kFirstUpdate = Register("scene.extents.first_update_100k", [] {
24
+ const bool kFirstUpdate = Register("scene.update.first_100k", [] {
25
25
  std::unique_ptr<Scene> scene;
26
- return Timing{Fastest([&] { scene = MakeSpheres(); }, [&] { scene->UpdateExtents(); }), 10.0};
26
+ return Timing{Fastest([&] { scene = MakeSpheres(); }, [&] { scene->Update(); }), 10.0};
27
27
  });
28
28
 
29
- const bool kOneEdit = Register("scene.extents.update_after_one_edit_of_100k", [] {
29
+ const bool kOneEdit = Register("scene.update.after_one_edit_of_100k", [] {
30
30
  std::unique_ptr<Scene> scene = MakeSpheres();
31
- scene->UpdateExtents();
31
+ scene->Update();
32
32
  const PrimId ball = *scene->Find("/World/Ball_54321");
33
33
  double radius = 1.0;
34
34
  const double ms = Fastest([&] { scene->Set(ball, Sphere::kRadius, radius += 1.0); },
35
- [&] { scene->UpdateExtents(); });
35
+ [&] { scene->Update(); });
36
36
  return Timing{ms, 1.0};
37
37
  });
38
38
 
39
+ const bool kInheritedEdit = Register("scene.update.after_hiding_the_parent_of_100k", [] {
40
+ std::unique_ptr<Scene> scene = MakeSpheres();
41
+ scene->Define("/World", "Xform");
42
+ scene->Update();
43
+ const PrimId world = *scene->Find("/World");
44
+ bool hidden = false;
45
+ const double ms = Fastest(
46
+ [&] {
47
+ hidden = !hidden;
48
+ scene->Set(world, Imageable::kVisibility, hidden ? "invisible" : "inherited");
49
+ },
50
+ [&] { scene->Update(); });
51
+ return Timing{ms, 10.0};
52
+ });
53
+
39
54
  } // namespace
40
55
  } // namespace ernie::bench
@@ -0,0 +1,10 @@
1
+ # Docs
2
+
3
+ The schema reference pages and the scene files' JSON Schema are generated from the schema registry by a build of `ernie`, before the site is built:
4
+
5
+ ```sh
6
+ ernie schema --json-schema docs/schema/ernie-scene.schema.json --markdown docs/reference
7
+ python -m pip install -r docs/requirements.txt
8
+ mkdocs serve # live preview at http://127.0.0.1:8000
9
+ mkdocs build # static site in site/
10
+ ```
@@ -0,0 +1,110 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file main.cpp
3
+ /// @brief The ernie program.
4
+ #include "ernie/device/vulkan_devices.h"
5
+ #include "ernie/scene/reference.h"
6
+ #include "ernie/util/file.h"
7
+ #include "ernie/util/version.h"
8
+
9
+ #include <cstdio>
10
+ #include <exception>
11
+ #include <filesystem>
12
+ #include <string_view>
13
+ #include <vector>
14
+
15
+ namespace {
16
+
17
+ namespace fs = std::filesystem;
18
+
19
+ void PrintUsage() {
20
+ std::puts("Usage: ernie [--version] [--devices] [--help]\n"
21
+ " ernie schema [--json-schema FILE] [--markdown DIR] [--usda DIR]\n"
22
+ " ernie validate SCENE.json...");
23
+ }
24
+
25
+ int PrintDevices() {
26
+ for (const ernie::VulkanDeviceInfo& device : ernie::ListVulkanDevices()) {
27
+ std::printf("%s (%s, Vulkan %u.%u%s)\n", device.name.c_str(), ernie::ToString(device.type),
28
+ device.apiMajor, device.apiMinor, device.rayQuery ? ", ray queries" : "");
29
+ }
30
+ return 0;
31
+ }
32
+
33
+ void Write(const fs::path& path, std::string_view text) {
34
+ if (path.has_parent_path()) {
35
+ fs::create_directories(path.parent_path());
36
+ }
37
+ ernie::WriteTextFile(path, text);
38
+ }
39
+
40
+ /// Writes the views of the schema registry that `arguments` ask for.
41
+ int Schema(const std::vector<std::string_view>& arguments) {
42
+ if (arguments.empty() || arguments.size() % 2 != 0) {
43
+ PrintUsage();
44
+ return 2;
45
+ }
46
+ for (std::size_t i = 0; i < arguments.size(); i += 2) {
47
+ const fs::path out(arguments[i + 1]);
48
+ if (arguments[i] == "--json-schema") {
49
+ Write(out, ernie::SceneJsonSchema());
50
+ } else if (arguments[i] == "--markdown") {
51
+ for (const ernie::SchemaFamily& family : ernie::SchemaFamilies()) {
52
+ Write(out / (std::string(family.name) + ".md"), ernie::ReferencePage(family));
53
+ }
54
+ } else if (arguments[i] == "--usda") {
55
+ const ernie::UsdSchemaPlugin plugin = ernie::ErnieUsdSchemaPlugin();
56
+ Write(out / "generatedSchema.usda", plugin.generatedSchema);
57
+ Write(out / "plugInfo.json", plugin.plugInfo);
58
+ } else {
59
+ PrintUsage();
60
+ return 2;
61
+ }
62
+ }
63
+ return 0;
64
+ }
65
+
66
+ /// Prints every problem of the scene files; fails if any has one.
67
+ int Validate(const std::vector<std::string_view>& files) {
68
+ if (files.empty()) {
69
+ PrintUsage();
70
+ return 2;
71
+ }
72
+ int status = 0;
73
+ for (const std::string_view file : files) {
74
+ for (const ernie::SceneProblem& problem :
75
+ ernie::ValidateScene(ernie::ReadTextFile(fs::path(file)))) {
76
+ std::printf("%.*s: %s\n", static_cast<int>(file.size()), file.data(),
77
+ problem.Message().c_str());
78
+ status = 1;
79
+ }
80
+ }
81
+ return status;
82
+ }
83
+
84
+ } // namespace
85
+
86
+ int main(int argc, char** argv) {
87
+ const std::string_view option = argc > 1 ? argv[1] : "--help";
88
+ const std::vector<std::string_view> rest(argv + std::min(argc, 2), argv + argc);
89
+ try {
90
+ if (option == "--version") {
91
+ std::printf("ernie %.*s\n", static_cast<int>(ernie::Version().size()),
92
+ ernie::Version().data());
93
+ return 0;
94
+ }
95
+ if (option == "--devices") {
96
+ return PrintDevices();
97
+ }
98
+ if (option == "schema") {
99
+ return Schema(rest);
100
+ }
101
+ if (option == "validate") {
102
+ return Validate(rest);
103
+ }
104
+ PrintUsage();
105
+ return option == "--help" ? 0 : 2;
106
+ } catch (const std::exception& error) {
107
+ std::fprintf(stderr, "ernie: %s\n", error.what());
108
+ return 1;
109
+ }
110
+ }
@@ -3,10 +3,16 @@ add_library(
3
3
  ernie_scene
4
4
  OBJECT
5
5
  extent_cache.cpp
6
+ holder_index.cpp
7
+ inherit.cpp
8
+ json.cpp
6
9
  path.cpp
10
+ reference.cpp
7
11
  schema.cpp
8
12
  scene.cpp
9
13
  storage.cpp
14
+ usd_plugin.cpp
15
+ validate.cpp
10
16
  view.cpp
11
17
  xform.cpp
12
18
  schemas/camera.cpp
@@ -22,4 +28,8 @@ add_library(
22
28
  schemas/shade.cpp
23
29
  schemas/vol.cpp
24
30
  )
25
- target_link_libraries(ernie_scene PUBLIC ernie_physics ernie_io PRIVATE ernie_build_options)
31
+ target_link_libraries(
32
+ ernie_scene
33
+ PUBLIC ernie_physics ernie_io
34
+ PRIVATE ernie_json ernie_build_options
35
+ )
@@ -0,0 +1,111 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file holder_index.cpp
3
+ /// @brief Re-indexing changed relationship cells, and finding a target's live holders.
4
+ #include "ernie/scene/holder_index.h"
5
+
6
+ #include <algorithm>
7
+ #include <unordered_set>
8
+
9
+ namespace ernie {
10
+ namespace {
11
+
12
+ bool IsRelationship(ColumnType type) {
13
+ return type == ColumnType::Relationship || type == ColumnType::Relationships;
14
+ }
15
+
16
+ /// @return The targets of a relationship cell, without the unset one.
17
+ std::vector<PathId> Targets(const PrimStore& store, BucketId bucket, const Column& column,
18
+ 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
+ }
27
+ std::erase(targets, kNoPath);
28
+ return targets;
29
+ }
30
+
31
+ } // namespace
32
+
33
+ void HolderIndex::Update(const PrimStore& store) {
34
+ const ChangeSet changes = store.ChangesSince(cursor_);
35
+ for (const ChangeSet::Values& values : changes.values) {
36
+ const Bucket& bucket = store.GetBucket(values.bucket);
37
+ const Column& column = *bucket.Find(values.attribute);
38
+ if (!IsRelationship(column.values->Type())) {
39
+ continue;
40
+ }
41
+ for (const RowRange range : values.rows) {
42
+ for (std::uint32_t row = range.begin; row < std::min(range.end, bucket.Rows()); ++row) {
43
+ Index(bucket.prims[row], values.attribute,
44
+ Targets(store, values.bucket, column, row));
45
+ }
46
+ }
47
+ }
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
+ cursor_ = changes.version;
59
+ }
60
+
61
+ void HolderIndex::Index(PrimId prim, AttributeId attribute, std::vector<PathId> targets) {
62
+ const Cell cell = Key(prim, attribute);
63
+ const auto found = targets_.find(cell);
64
+ if (found != targets_.end()) {
65
+ for (const PathId old : found->second) {
66
+ holders_[old].erase(cell);
67
+ }
68
+ }
69
+ for (const PathId target : targets) {
70
+ holders_[target][cell] = prim.generation;
71
+ }
72
+ if (!targets.empty()) {
73
+ targets_[cell] = std::move(targets);
74
+ } else if (found != targets_.end()) {
75
+ targets_.erase(found);
76
+ }
77
+ }
78
+
79
+ std::vector<PrimId> HolderIndex::Find(const PrimStore& store, PathId target) const {
80
+ std::vector<PrimId> found;
81
+ const auto holders = holders_.find(target);
82
+ if (holders == holders_.end()) {
83
+ return found;
84
+ }
85
+ std::unordered_set<std::uint32_t> slots;
86
+ for (const auto& [cell, generation] : holders->second) {
87
+ const PrimId prim{static_cast<std::uint32_t>(cell >> 32), generation};
88
+ // Cells of removed prims, or of prims since moved to a bucket without the attribute, stay
89
+ // until their slot's next prim writes them.
90
+ if (Holds(store, prim, static_cast<AttributeId>(cell), target) &&
91
+ slots.insert(prim.slot).second) {
92
+ found.push_back(prim);
93
+ }
94
+ }
95
+ return found;
96
+ }
97
+
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
+ } // namespace ernie
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file holder_index.h
3
+ /// @brief The reverse index of relationships: which prims target each path.
4
+ #pragma once
5
+
6
+ #include "ernie/scene/storage.h"
7
+
8
+ #include <cstdint>
9
+ #include <unordered_map>
10
+ #include <vector>
11
+
12
+ namespace ernie {
13
+
14
+ /// @brief Which prims' relationships target each path, kept up to date from the store's changes,
15
+ /// so an edit to a target reaches its holders: a prototype its instancers, a material the prims
16
+ /// bound to it (through their resolved bindings), a body its terrains.
17
+ class HolderIndex {
18
+ public:
19
+ /// Re-indexes the relationship cells that changed since the last update.
20
+ void Update(const PrimStore& store);
21
+ /// @return The live prims with a relationship targeting `target`, each once.
22
+ std::vector<PrimId> Find(const PrimStore& store, PathId target) const;
23
+
24
+ private:
25
+ /// A relationship cell: the prim's slot and the attribute, packed.
26
+ using Cell = std::uint64_t;
27
+ static Cell Key(PrimId prim, AttributeId attribute) {
28
+ return (std::uint64_t{prim.slot} << 32) | attribute;
29
+ }
30
+
31
+ void Index(PrimId prim, AttributeId attribute, std::vector<PathId> targets);
32
+ /// @return Whether the prim is alive and its relationship still targets `target`.
33
+ static bool Holds(const PrimStore& store, PrimId prim, AttributeId attribute, PathId target);
34
+
35
+ /// Each target's holding cells, with the generation of the prim that wrote them.
36
+ std::unordered_map<PathId, std::unordered_map<Cell, std::uint32_t>> holders_;
37
+ /// Each cell's targets, to unindex them when it changes.
38
+ std::unordered_map<Cell, std::vector<PathId>> targets_;
39
+ std::uint64_t cursor_ = 0;
40
+ };
41
+
42
+ } // namespace ernie
@@ -0,0 +1,120 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file inherit.cpp
3
+ /// @brief Resolving inherited attributes from the nearest authoring ancestor into their resolved
4
+ /// columns, for only the subtrees whose authored values or prims changed.
5
+ #include "ernie/scene/convert.h"
6
+ #include "ernie/scene/scene.h"
7
+
8
+ #include <algorithm>
9
+ #include <concepts>
10
+ #include <limits>
11
+
12
+ namespace ernie {
13
+
14
+ void Scene::Resolve() {
15
+ const ChangeSet changes = store_.ChangesSince(resolved_);
16
+ for (const AttributeDef* def : InheritedAttributes()) {
17
+ const AttributeId attribute = store_.Tokens().Intern(def->name);
18
+ const AttributeId resolved = store_.Tokens().Intern(ResolvedName(def->name));
19
+ WithColumnType(def->type, [&]<typename T>(std::type_identity<T>) {
20
+ if constexpr (std::equality_comparable<T> && !std::same_as<T, Tensor>) {
21
+ const T fallback = ToElement<T>(store_.Paths(), def->fallback).value_or(T{});
22
+ BitSet roots = ResolveRoots(changes, attribute);
23
+ std::vector<PathId> order;
24
+ roots.ForEachRun([&](std::size_t begin, std::size_t end) {
25
+ for (std::size_t path = begin; path < end; ++path) {
26
+ order.push_back(static_cast<PathId>(path));
27
+ }
28
+ });
29
+ // Ancestors intern first, so most roots are reached from one above them.
30
+ for (const PathId root : order) {
31
+ if (roots.Test(root)) {
32
+ ResolveSubtree<T>(root, attribute, resolved, fallback, roots);
33
+ }
34
+ }
35
+ }
36
+ });
37
+ }
38
+ // Its own writes are to resolved columns, which no resolve reads.
39
+ resolved_ = store_.Version();
40
+ }
41
+
42
+ BitSet Scene::ResolveRoots(const ChangeSet& changes, AttributeId attribute) const {
43
+ BitSet roots;
44
+ roots.Resize(store_.Paths().Size());
45
+ const auto add = [&](BucketId bucket, std::uint32_t begin, std::uint32_t end) {
46
+ const Bucket& rows = store_.GetBucket(bucket);
47
+ for (std::uint32_t row = begin; row < std::min(end, rows.Rows()); ++row) {
48
+ roots.Set(store_.PrimPath(rows.prims[row]));
49
+ }
50
+ };
51
+ for (const BucketId bucket : changes.resets) {
52
+ add(bucket, 0, std::numeric_limits<std::uint32_t>::max());
53
+ }
54
+ for (const ChangeSet::Rows& rows : changes.rows) {
55
+ if (rows.change.kind == StructuralChange::Kind::Added) {
56
+ add(rows.bucket, rows.change.row, rows.change.row + rows.change.count);
57
+ }
58
+ }
59
+ for (const ChangeSet::Values& values : changes.values) {
60
+ if (values.attribute == attribute) {
61
+ for (const RowRange range : values.rows) {
62
+ add(values.bucket, range.begin, range.end);
63
+ }
64
+ }
65
+ }
66
+ return roots;
67
+ }
68
+
69
+ template <typename T> const T* Scene::Inheritable(PrimId prim, AttributeId attribute) const {
70
+ const BucketId bucket = store_.PrimBucket(prim);
71
+ const Column* column = store_.GetBucket(bucket).Find(attribute);
72
+ const std::uint32_t row = store_.PrimRow(prim);
73
+ if (column == nullptr || !column->authored.Test(row) ||
74
+ column->values->Type() != kColumnType<T>) {
75
+ return nullptr;
76
+ }
77
+ const T* own = &store_.Read<T>(bucket, attribute)[row];
78
+ if constexpr (std::same_as<T, Token>) {
79
+ return *own == inherited_ ? nullptr : own;
80
+ }
81
+ return own;
82
+ }
83
+
84
+ template <typename T> T Scene::Above(PathId path, AttributeId attribute, const T& fallback) const {
85
+ const PathTable& paths = store_.Paths();
86
+ for (PathId above = paths.Parent(path); above != kRootPath; above = paths.Parent(above)) {
87
+ const std::optional<PrimId> prim = store_.Find(above);
88
+ if (const T* own = prim ? Inheritable<T>(*prim, attribute) : nullptr) {
89
+ return *own;
90
+ }
91
+ }
92
+ return fallback;
93
+ }
94
+
95
+ template <typename T>
96
+ void Scene::ResolveSubtree(PathId root, AttributeId attribute, AttributeId resolved,
97
+ const T& fallback, BitSet& roots) {
98
+ std::vector<std::pair<PathId, T>> pending{{root, Above<T>(root, attribute, fallback)}};
99
+ while (!pending.empty()) {
100
+ const auto [path, above] = std::move(pending.back());
101
+ pending.pop_back();
102
+ const std::optional<PrimId> prim = store_.Find(path);
103
+ if (!prim) {
104
+ continue;
105
+ }
106
+ const bool isRoot = roots.Test(path);
107
+ roots.Set(path, false);
108
+ const T* own = Inheritable<T>(*prim, attribute);
109
+ const T value = own != nullptr ? *own : above;
110
+ // Prims without the column (typeless ones, materials) pass the value through.
111
+ const bool stored = store_.GetBucket(store_.PrimBucket(*prim)).Find(resolved) != nullptr;
112
+ // An unchanged prim's descendants are unchanged too, unless they are roots themselves.
113
+ if (store_.Derive(*prim, resolved, value) || isRoot || !stored) {
114
+ store_.Paths().ForEachChild(path,
115
+ [&](PathId child) { pending.emplace_back(child, value); });
116
+ }
117
+ }
118
+ }
119
+
120
+ } // namespace ernie