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