ernie-renderer 0.2.0.dev35__tar.gz → 0.2.0.dev37__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 (272) hide show
  1. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/PKG-INFO +1 -1
  3. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/ErnieFetch.cmake +10 -0
  4. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/openexr.cmake +1 -0
  5. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/CMakeLists.txt +1 -0
  6. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/scene.cpp +49 -6
  7. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/scene.h +2 -1
  8. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schema.h +26 -0
  9. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/camera.cpp +13 -0
  10. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/camera.h +12 -31
  11. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/collection.cpp +1 -2
  12. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/collection.h +2 -6
  13. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/geom.cpp +76 -0
  14. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/geom.h +22 -80
  15. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/instancer.cpp +48 -32
  16. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/instancer.h +2 -7
  17. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/laser.cpp +26 -0
  18. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/laser.h +5 -8
  19. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/lux.cpp +83 -0
  20. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/lux.h +43 -112
  21. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/mesh.cpp +7 -12
  22. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/mesh.h +5 -20
  23. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/planet.cpp +16 -32
  24. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/planet.h +8 -28
  25. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/registry.cpp +8 -0
  26. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/render.cpp +18 -0
  27. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/render.h +113 -0
  28. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/shade.cpp +4 -12
  29. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/shade.h +14 -30
  30. ernie_renderer-0.2.0.dev37/ernie/scene/schemas/vol.cpp +114 -0
  31. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schemas/vol.h +12 -35
  32. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/tokens.h +2 -16
  33. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/view.h +52 -16
  34. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/CMakeLists.txt +1 -0
  35. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/api_test.cpp +7 -7
  36. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/lux_test.cpp +23 -1
  37. ernie_renderer-0.2.0.dev37/tests/scene/render_test.cpp +48 -0
  38. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/scene_test.cpp +18 -18
  39. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/schema_test.cpp +1 -1
  40. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/xform_test.cpp +5 -5
  41. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/CMakeLists.txt +1 -0
  42. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/camera.cpp +0 -20
  43. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/geom.cpp +0 -101
  44. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/laser.cpp +0 -29
  45. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/lux.cpp +0 -96
  46. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/vol.cpp +0 -126
  47. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.clang-format +0 -0
  48. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.clang-tidy +0 -0
  49. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.dockerignore +0 -0
  50. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.gersemirc +0 -0
  51. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.gitattributes +0 -0
  52. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.github/scripts/coverage_badge.py +0 -0
  53. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.github/scripts/install-lavapipe-windows.sh +0 -0
  54. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.github/workflows/ci.yml +0 -0
  55. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.gitignore +0 -0
  56. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/.pre-commit-config.yaml +0 -0
  57. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/CMakePresets.json +0 -0
  58. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/Dockerfile +0 -0
  59. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/LICENSE +0 -0
  60. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/README.md +0 -0
  61. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/benchmarks/CMakeLists.txt +0 -0
  62. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/benchmarks/bench.h +0 -0
  63. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/benchmarks/main.cpp +0 -0
  64. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/benchmarks/scene/extents.cpp +0 -0
  65. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/benchmarks/scene/storage.cpp +0 -0
  66. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/ErnieConfig.cmake.in +0 -0
  67. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/ErnieInstall.cmake +0 -0
  68. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/ErniePackaging.cmake +0 -0
  69. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/ErnieTesting.cmake +0 -0
  70. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/ernie.pc.in +0 -0
  71. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/bc7enc.cmake +0 -0
  72. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/dlpack.cmake +0 -0
  73. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/glm.cmake +0 -0
  74. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/googletest.cmake +0 -0
  75. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/json.cmake +0 -0
  76. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/nanobind.cmake +0 -0
  77. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/stb.cmake +0 -0
  78. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/tracy.cmake +0 -0
  79. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/volk.cmake +0 -0
  80. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/cmake/third_party/vulkan_headers.cmake +0 -0
  81. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/docs/README.md +0 -0
  82. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/docs/index.md +0 -0
  83. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/docs/requirements.txt +0 -0
  84. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/CMakeLists.txt +0 -0
  85. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/app/CMakeLists.txt +0 -0
  86. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/app/main.cpp +0 -0
  87. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/device/CMakeLists.txt +0 -0
  88. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/device/vulkan_devices.cpp +0 -0
  89. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/device/vulkan_devices.h +0 -0
  90. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/geometry/CMakeLists.txt +0 -0
  91. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/geometry/bounds.h +0 -0
  92. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/graph/CMakeLists.txt +0 -0
  93. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/CMakeLists.txt +0 -0
  94. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/ies.cpp +0 -0
  95. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/ies.h +0 -0
  96. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/image.cpp +0 -0
  97. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/image.h +0 -0
  98. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/nanovdb.cpp +0 -0
  99. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/nanovdb.h +0 -0
  100. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/raster.cpp +0 -0
  101. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/raster.h +0 -0
  102. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/texture.cpp +0 -0
  103. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/io/texture.h +0 -0
  104. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/CMakeLists.txt +0 -0
  105. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/astronomy.cpp +0 -0
  106. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/astronomy.h +0 -0
  107. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/atmosphere.cpp +0 -0
  108. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/atmosphere.h +0 -0
  109. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/cloud.cpp +0 -0
  110. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/cloud.h +0 -0
  111. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/constants.h +0 -0
  112. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/reflectance_library.cpp +0 -0
  113. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/reflectance_library.h +0 -0
  114. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/reflectance_table.h +0 -0
  115. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/regolith.cpp +0 -0
  116. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/regolith.h +0 -0
  117. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/scattering.cpp +0 -0
  118. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/scattering.h +0 -0
  119. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/solar.cpp +0 -0
  120. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/solar.h +0 -0
  121. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/solar_table.h +0 -0
  122. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/spectrum.cpp +0 -0
  123. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/physics/spectrum.h +0 -0
  124. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/python/CMakeLists.txt +0 -0
  125. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/python/ernie/__init__.py +0 -0
  126. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/python/module.cpp +0 -0
  127. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/render/CMakeLists.txt +0 -0
  128. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/convert.h +0 -0
  129. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/extent_cache.cpp +0 -0
  130. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/extent_cache.h +0 -0
  131. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/path.cpp +0 -0
  132. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/path.h +0 -0
  133. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/schema.cpp +0 -0
  134. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/storage.cpp +0 -0
  135. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/storage.h +0 -0
  136. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/value.h +0 -0
  137. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/view.cpp +0 -0
  138. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/xform.cpp +0 -0
  139. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/scene/xform.h +0 -0
  140. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/CMakeLists.txt +0 -0
  141. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/algorithm.h +0 -0
  142. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/bytes.h +0 -0
  143. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/disk_cache.cpp +0 -0
  144. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/disk_cache.h +0 -0
  145. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/file.cpp +0 -0
  146. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/file.h +0 -0
  147. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/glm.h +0 -0
  148. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/hash_index.h +0 -0
  149. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/linear_algebra.h +0 -0
  150. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/log.cpp +0 -0
  151. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/log.h +0 -0
  152. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/math.h +0 -0
  153. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/noise.cpp +0 -0
  154. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/noise.h +0 -0
  155. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/numbers.h +0 -0
  156. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/parallel.h +0 -0
  157. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/profiler.cpp +0 -0
  158. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/profiler.h +0 -0
  159. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/random.h +0 -0
  160. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/tensor.cpp +0 -0
  161. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/tensor.h +0 -0
  162. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/text.h +0 -0
  163. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/version.cpp +0 -0
  164. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/version.h +0 -0
  165. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/ernie/util/worker_pool.h +0 -0
  166. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/mkdocs.yml +0 -0
  167. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/pyproject.toml +0 -0
  168. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/common.h +0 -0
  169. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/consumer/CMakeLists.txt +0 -0
  170. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/consumer/main.cpp +0 -0
  171. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/device/vulkan_devices_test.cpp +0 -0
  172. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/exr/README.md +0 -0
  173. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/exr/make_exr.py +0 -0
  174. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  175. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  176. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/exr/y_half_zips.exr +0 -0
  177. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ies/README.md +0 -0
  178. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  179. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  180. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ies/lamp.tilt +0 -0
  181. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/images/grey16.png +0 -0
  182. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ktx2/README.md +0 -0
  183. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  184. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  185. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  186. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  187. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/README.md +0 -0
  188. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  189. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/float_raw.tif +0 -0
  190. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  191. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  192. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  193. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  194. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  195. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/volumes/cube.nvdb +0 -0
  196. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/fixtures/volumes/make_nvdb.py +0 -0
  197. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/geometry/bounds_test.cpp +0 -0
  198. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/io/ies_test.cpp +0 -0
  199. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/io/image_test.cpp +0 -0
  200. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/io/nanovdb_test.cpp +0 -0
  201. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/io/raster_test.cpp +0 -0
  202. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/io/texture_test.cpp +0 -0
  203. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/astronomy_test.cpp +0 -0
  204. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/atmosphere_test.cpp +0 -0
  205. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/cloud_test.cpp +0 -0
  206. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/reflectance_library_test.cpp +0 -0
  207. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/regolith_test.cpp +0 -0
  208. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/scattering_test.cpp +0 -0
  209. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/solar_test.cpp +0 -0
  210. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/physics/spectrum_test.cpp +0 -0
  211. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/python/test_package.py +0 -0
  212. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/extent_cache_test.cpp +0 -0
  213. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/instancer_test.cpp +0 -0
  214. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/mesh_test.cpp +0 -0
  215. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/path_test.cpp +0 -0
  216. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/planet_test.cpp +0 -0
  217. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/shade_test.cpp +0 -0
  218. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/storage_test.cpp +0 -0
  219. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/scene/vol_test.cpp +0 -0
  220. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/algorithm_test.cpp +0 -0
  221. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/bytes_test.cpp +0 -0
  222. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/disk_cache_test.cpp +0 -0
  223. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/file_test.cpp +0 -0
  224. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/hash_index_test.cpp +0 -0
  225. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/linear_algebra_test.cpp +0 -0
  226. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/log_test.cpp +0 -0
  227. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/math_test.cpp +0 -0
  228. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/noise_test.cpp +0 -0
  229. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/parallel_test.cpp +0 -0
  230. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/profiler_test.cpp +0 -0
  231. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/random_test.cpp +0 -0
  232. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/tensor_test.cpp +0 -0
  233. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/text_test.cpp +0 -0
  234. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/version_test.cpp +0 -0
  235. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/tests/util/worker_pool_test.cpp +0 -0
  236. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/LICENSE +0 -0
  237. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  238. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  239. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/LICENSES/MIT.txt +0 -0
  240. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/NOTICE +0 -0
  241. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/README.md +0 -0
  242. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu.h +0 -0
  243. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  244. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  245. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  246. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  247. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  248. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  249. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  250. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  251. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  252. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  253. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  254. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  255. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  256. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
  257. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  258. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  259. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
  260. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
  261. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  262. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  263. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  264. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
  265. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  266. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  267. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  268. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/zstd/LICENSE +0 -0
  269. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/zstd/zstd.h +0 -0
  270. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/basisu/zstd/zstd_errors.h +0 -0
  271. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/nanovdb/LICENSE +0 -0
  272. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev37}/third_party/nanovdb/PNanoVDB.h +0 -0
@@ -15,7 +15,7 @@ project(
15
15
  )
16
16
 
17
17
  # Pre-release suffix such as .dev12, written by CI.
18
- set(ERNIE_VERSION_SUFFIX ".dev35" CACHE STRING "Pre-release suffix of Ernie's version")
18
+ set(ERNIE_VERSION_SUFFIX ".dev37" 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.dev35
3
+ Version: 0.2.0.dev37
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
@@ -39,3 +39,13 @@ function(ernie_fetch name)
39
39
  set(${lower}_SOURCE_DIR "${${lower}_SOURCE_DIR}" PARENT_SCOPE)
40
40
  set(${lower}_BINARY_DIR "${${lower}_BINARY_DIR}" PARENT_SCOPE)
41
41
  endfunction()
42
+
43
+ # Builds third-party targets without warnings: their code is not Ernie's to fix.
44
+ function(ernie_quiet_third_party)
45
+ foreach(target ${ARGN})
46
+ get_target_property(type ${target} TYPE)
47
+ if(NOT type STREQUAL "INTERFACE_LIBRARY")
48
+ target_compile_options(${target} PRIVATE "$<IF:$<CXX_COMPILER_ID:MSVC>,/w,-w>")
49
+ endif()
50
+ endforeach()
51
+ endfunction()
@@ -50,6 +50,7 @@ foreach(
50
50
  OpenEXRConfig
51
51
  )
52
52
  if(TARGET ${target})
53
+ ernie_quiet_third_party(${target})
53
54
  get_target_property(directories ${target} INTERFACE_INCLUDE_DIRECTORIES)
54
55
  if(directories)
55
56
  set_property(
@@ -18,6 +18,7 @@ add_library(
18
18
  schemas/mesh.cpp
19
19
  schemas/planet.cpp
20
20
  schemas/registry.cpp
21
+ schemas/render.cpp
21
22
  schemas/shade.cpp
22
23
  schemas/vol.cpp
23
24
  )
@@ -300,19 +300,27 @@ BucketId Scene::FindOrAddBucket(const SchemaDef* schema, std::vector<Token> apis
300
300
  return *found;
301
301
  }
302
302
  BucketSchema entry{schema, {}};
303
+ const std::vector<ApiName> allApis = AllApis(schema, key.apiSchemas);
304
+ // The type's fallback overrides win over its API schemas', as USD's do.
305
+ const auto fallback = [&](const AttributeDef& def, const std::string& name) -> const Value& {
306
+ const Value* override = schema != nullptr ? schema->FallbackOverride(name) : nullptr;
307
+ for (auto api = allApis.begin(); override == nullptr && api != allApis.end(); ++api) {
308
+ override = api->schema->FallbackOverride(name);
309
+ }
310
+ return override != nullptr ? *override : def.fallback;
311
+ };
303
312
  std::vector<ColumnLayout> layout;
304
313
  const auto add = [&](const SchemaDef& declaring, const ApiName& api) {
305
314
  for (const AttributeDef* def : declaring.AllAttributes()) {
306
315
  const std::string name = api.Attribute(def->name);
307
- const Value* override = schema != nullptr ? schema->FallbackOverride(name) : nullptr;
308
- layout.push_back(MakeLayout(paths, *def, name, override ? *override : def->fallback));
316
+ layout.push_back(MakeLayout(paths, *def, name, fallback(*def, name)));
309
317
  entry.declared.emplace(layout.back().attribute, def);
310
318
  }
311
319
  };
312
320
  if (schema != nullptr) {
313
321
  add(*schema, {});
314
322
  }
315
- for (const ApiName& api : AllApis(schema, key.apiSchemas)) {
323
+ for (const ApiName& api : allApis) {
316
324
  add(*api.schema, api);
317
325
  }
318
326
  const BucketId bucket = store_.AddBucket(key, layout);
@@ -333,7 +341,16 @@ const std::vector<Token>& Scene::Apis(PrimId prim) const {
333
341
  }
334
342
 
335
343
  void Scene::ApplyApi(PrimId prim, std::string_view api) {
336
- ApiName::Parse(api);
344
+ const ApiName parsed = ApiName::Parse(api);
345
+ const std::vector<std::string_view>& allowed = parsed.schema->appliesTo;
346
+ const SchemaDef* type = Schema(prim);
347
+ if (!allowed.empty() && std::ranges::none_of(allowed, [&](std::string_view name) {
348
+ return type != nullptr && type->IsA(*FindSchema(name));
349
+ })) {
350
+ throw std::invalid_argument(std::string(api) + " applies only to " +
351
+ std::string(allowed.front()) + " prims, not " +
352
+ Describe(*this, prim));
353
+ }
337
354
  std::vector<Token> apis = Apis(prim);
338
355
  apis.push_back(store_.Tokens().Intern(api));
339
356
  MoveTo(prim, Schema(prim), std::move(apis));
@@ -356,12 +373,24 @@ bool Scene::HasApi(PrimId prim, std::string_view api) const {
356
373
 
357
374
  std::vector<ApiName> Scene::AllApis(const SchemaDef* schema, std::span<const Token> applied) const {
358
375
  std::vector<ApiName> apis;
376
+ // Each API schema once, followed by those built into it (MeshLightAPI's LightAPI, LightAPI's
377
+ // light-link collections).
378
+ const auto add = [&](const auto& self, std::string_view name) -> void {
379
+ const ApiName api = ApiName::Parse(name);
380
+ if (std::ranges::find(apis, api) != apis.end()) {
381
+ return;
382
+ }
383
+ apis.push_back(api);
384
+ for (const std::string_view builtin : api.schema->AllBuiltinApis()) {
385
+ self(self, builtin);
386
+ }
387
+ };
359
388
  for (const std::string_view builtin :
360
389
  schema != nullptr ? schema->AllBuiltinApis() : std::vector<std::string_view>{}) {
361
- apis.push_back(ApiName::Parse(builtin));
390
+ add(add, builtin);
362
391
  }
363
392
  for (const Token token : applied) {
364
- apis.push_back(ApiName::Parse(store_.Tokens().Text(token)));
393
+ add(add, store_.Tokens().Text(token));
365
394
  }
366
395
  return apis;
367
396
  }
@@ -429,4 +458,18 @@ ColumnType Scene::TypeForUndeclared(PrimId prim, std::string_view attribute,
429
458
  return *type;
430
459
  }
431
460
 
461
+ std::optional<PrimId> ExtentRows::Resolve(const Target& target) const {
462
+ return target.path != kNoPath ? store.Find(target.path) : std::nullopt;
463
+ }
464
+
465
+ std::optional<Box> ExtentRows::ExtentInRowSpace(PrimId other, std::uint32_t row) const {
466
+ const std::optional<Box> extent = scene->Extent(other);
467
+ if (!extent) {
468
+ return std::nullopt;
469
+ }
470
+ const PrimId own = store.GetBucket(bucket).prims[row];
471
+ return extent->Transformed(glm::inverse(scene->WorldTransform(own)) *
472
+ scene->WorldTransform(other));
473
+ }
474
+
432
475
  } // namespace ernie
@@ -121,7 +121,8 @@ class Scene {
121
121
  /// Moves a prim to the bucket of its type and `apis`.
122
122
  void MoveTo(PrimId prim, const SchemaDef* schema, std::vector<Token> apis);
123
123
  const std::vector<Token>& Apis(PrimId prim) const;
124
- /// @return A type's built-in API schemas, then the applied ones.
124
+ /// @return A type's built-in API schemas, then the applied ones, each with those built into it,
125
+ /// each once.
125
126
  std::vector<ApiName> AllApis(const SchemaDef* schema, std::span<const Token> applied) const;
126
127
  /// @return The attribute's column when the prim authors it, or null.
127
128
  const Column* AuthoredColumn(PrimId prim, std::string_view attribute) const;
@@ -127,12 +127,35 @@ struct ExtentRows {
127
127
  std::string_view Text(Token token) const {
128
128
  return store.Paths().Names().Text(token);
129
129
  }
130
+ /// @return The live prim a relationship targets, or none.
131
+ std::optional<PrimId> Resolve(const Target& target) const;
132
+ /// @return Another prim's extent brought into a row's own space through the transforms
133
+ /// between, or none when it has none.
134
+ std::optional<Box> ExtentInRowSpace(PrimId other, std::uint32_t row) const;
130
135
  };
131
136
 
132
137
  /// Computes the extents of a bucket's rows [begin, end) into `out`, one box each, in each prim's
133
138
  /// own space. Written as a loop over columns, as the GPU kernels are.
134
139
  using ExtentFunction = void (*)(const ExtentRows& rows, RowRange range, std::span<Box> out);
135
140
 
141
+ /// @brief Fills `out` with `extent(row)` for each row of `range`: the loop every extent function
142
+ /// runs.
143
+ template <typename Extent>
144
+ void ComputeRows(RowRange range, std::span<Box> out, const Extent& extent) {
145
+ for (std::uint32_t row = range.begin; row < range.end; ++row) {
146
+ out[row - range.begin] = extent(row);
147
+ }
148
+ }
149
+
150
+ /// The extent function of prims centred on their origin. `kHalves(rows)` reads the columns once
151
+ /// and returns each row's half-size by row.
152
+ template <auto kHalves>
153
+ void CentredExtent(const ExtentRows& rows, RowRange range, std::span<Box> out) {
154
+ const auto half = kHalves(rows);
155
+ ComputeRows(range, out,
156
+ [&](std::uint32_t row) { return Box::Around(glm::dvec3(0.0), half(row)); });
157
+ }
158
+
136
159
  /// @brief How a prim type is bounded, as USD's Boundable and non-Boundable bases divide them.
137
160
  struct ExtentRule {
138
161
  enum class Kind : std::uint8_t {
@@ -179,6 +202,8 @@ struct SchemaDef {
179
202
  /// Fallbacks the type changes for attributes of its bases or built-in schemas, as
180
203
  /// DistantLight's brighter intensity.
181
204
  std::vector<std::pair<std::string_view, Value>> fallbackOverrides;
205
+ /// The prim types an API schema may be applied to, as MeshLightAPI's Mesh; any when empty.
206
+ std::vector<std::string_view> appliesTo;
182
207
 
183
208
  bool IsA(const SchemaDef& other) const;
184
209
  bool IsOpen(std::string_view attribute) const;
@@ -224,6 +249,7 @@ struct ApiName {
224
249
  std::string Attribute(std::string_view declared) const;
225
250
  /// @return The name `Parse` reads.
226
251
  std::string ToString() const;
252
+ bool operator==(const ApiName&) const = default;
227
253
  };
228
254
 
229
255
  /// @brief Checks a value against a declared attribute's limits and options; the scene checks its
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file camera.cpp
3
+ /// @brief The camera's registry entry and Ernie's camera API schemas'.
4
+ #include "ernie/scene/schemas/camera.h"
5
+
6
+ namespace ernie {
7
+
8
+ ERNIE_DEFINE_SCHEMA(Camera, Concrete, kNoExtent, ERNIE_CAMERA_ATTRIBUTES)
9
+ ERNIE_DEFINE_SCHEMA(ErnieLensAPI, SingleApply, kInheritExtent, ERNIE_LENS_API_ATTRIBUTES)
10
+ ERNIE_DEFINE_SCHEMA(ErniePolarizerAPI, SingleApply, kInheritExtent, ERNIE_POLARIZER_API_ATTRIBUTES)
11
+ ERNIE_DEFINE_SCHEMA(ErnieSensorAPI, SingleApply, kInheritExtent, ERNIE_SENSOR_API_ATTRIBUTES)
12
+
13
+ } // namespace ernie
@@ -114,12 +114,8 @@
114
114
 
115
115
  #define ERNIE_SENSOR_API_ATTRIBUTES(X) \
116
116
  X(glm::dvec2, SpectralRange, "ernie:spectral:range", glm::dvec2(380.0, 780.0), \
117
- "Wavelengths in nm the sensor sees.", .group = "Sensor", .lower = Above(0.0)) \
118
- X(int, SpectralBands, "ernie:spectral:bands", 16, "Bands across the range.", \
119
- .group = "Sensor", .lower = AtLeast(1.0)) \
120
- X(std::string, SpectralMode, "ernie:spectral:mode", "spectral", \
121
- "spectral: bands over the range; rgb: three bands of linear sRGB, faster.", \
122
- .group = "Sensor", .options = {"spectral", "rgb"}) \
117
+ "Wavelengths in nm the sensor responds to; its products sample them in bands.", \
118
+ .group = "Sensor", .lower = Above(0.0)) \
123
119
  X(std::string, SensorType, "ernie:sensor:type", "rgb", "A colour or a mono sensor.", \
124
120
  .group = "Sensor", .options = {"rgb", "mono"}) \
125
121
  X(bool, SensorNoise, "ernie:sensor:noise", true, "Whether it adds the noise below.", \
@@ -155,30 +151,15 @@
155
151
 
156
152
  namespace ernie {
157
153
 
158
- ERNIE_SCHEMA_ACCESSORS(Camera, Xformable, ERNIE_CAMERA_ATTRIBUTES);
159
- ERNIE_SCHEMA_ACCESSORS(ErnieLensAPI, SchemaView, ERNIE_LENS_API_ATTRIBUTES);
160
- ERNIE_SCHEMA_ACCESSORS(ErniePolarizerAPI, SchemaView, ERNIE_POLARIZER_API_ATTRIBUTES);
161
- ERNIE_SCHEMA_ACCESSORS(ErnieSensorAPI, SchemaView, ERNIE_SENSOR_API_ATTRIBUTES);
162
-
163
- /// A view looking down -z, y up, with a lens and film.
164
- class Camera : public CameraAccessors<Camera, Xformable> {
165
- ERNIE_SCHEMA_BODY(Camera, Xformable)
166
- ERNIE_SCHEMA_DEFINE(Camera)
167
- };
168
-
169
- /// A camera's lens beyond USD's: fisheyes, distortion, vignetting and chromatic aberration.
170
- class ErnieLensAPI : public ErnieLensAPIAccessors<ErnieLensAPI, SchemaView> {
171
- ERNIE_API_SCHEMA_BODY(ErnieLensAPI)
172
- };
173
-
174
- /// A polarizer in front of a camera's lens, or a polarization sensor's mosaic.
175
- class ErniePolarizerAPI : public ErniePolarizerAPIAccessors<ErniePolarizerAPI, SchemaView> {
176
- ERNIE_API_SCHEMA_BODY(ErniePolarizerAPI)
177
- };
178
-
179
- /// A camera's sensor: its spectral bands, noise, ADC and quantum efficiency.
180
- class ErnieSensorAPI : public ErnieSensorAPIAccessors<ErnieSensorAPI, SchemaView> {
181
- ERNIE_API_SCHEMA_BODY(ErnieSensorAPI)
182
- };
154
+ ERNIE_CONCRETE_SCHEMA(Camera, Xformable, ERNIE_CAMERA_ATTRIBUTES,
155
+ "A view looking down -z, y up, with a lens and film.");
156
+ ERNIE_API_SCHEMA(ErnieLensAPI, ERNIE_LENS_API_ATTRIBUTES,
157
+ "A camera's lens beyond USD's: fisheyes, distortion, vignetting and chromatic "
158
+ "aberration.");
159
+ ERNIE_API_SCHEMA(ErniePolarizerAPI, ERNIE_POLARIZER_API_ATTRIBUTES,
160
+ "A polarizer in front of a camera's lens, or a polarization sensor's mosaic.");
161
+ ERNIE_API_SCHEMA(ErnieSensorAPI, ERNIE_SENSOR_API_ATTRIBUTES,
162
+ "A camera's sensor: its spectral range, noise, ADC and quantum efficiency; its "
163
+ "products set how finely the range is sampled.");
183
164
 
184
165
  } // namespace ernie
@@ -5,7 +5,6 @@
5
5
 
6
6
  namespace ernie {
7
7
 
8
- ERNIE_DEFINE_SCHEMA(CollectionAPI, "CollectionAPI", nullptr, MultipleApply, kInheritExtent,
9
- "A named set of prims.", ERNIE_COLLECTION_API_ATTRIBUTES)
8
+ ERNIE_DEFINE_SCHEMA(CollectionAPI, MultipleApply, kInheritExtent, ERNIE_COLLECTION_API_ATTRIBUTES)
10
9
 
11
10
  } // namespace ernie
@@ -36,11 +36,7 @@ template <> struct ChoiceTokens<ExpansionRule> {
36
36
  "expandPrimsAndProperties"};
37
37
  };
38
38
 
39
- ERNIE_SCHEMA_ACCESSORS(CollectionAPI, SchemaView, ERNIE_COLLECTION_API_ATTRIBUTES);
40
-
41
- /// A named set of prims, as light linking and material collections use them.
42
- class CollectionAPI : public CollectionAPIAccessors<CollectionAPI, SchemaView> {
43
- ERNIE_API_SCHEMA_BODY(CollectionAPI)
44
- };
39
+ ERNIE_API_SCHEMA(CollectionAPI, ERNIE_COLLECTION_API_ATTRIBUTES,
40
+ "A named set of prims, as light linking and material collections use them.");
45
41
 
46
42
  } // namespace ernie
@@ -0,0 +1,76 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file geom.cpp
3
+ /// @brief UsdGeom's registry entries and the implicit shapes' extents, as UsdGeom computes them.
4
+ #include "ernie/scene/schemas/geom.h"
5
+
6
+ namespace ernie {
7
+ namespace {
8
+
9
+ /// @return The axis index (0, 1, 2) of an `axis` token.
10
+ int AxisIndex(const ExtentRows& rows, Token axis) {
11
+ return rows.Text(axis).front() - 'X';
12
+ }
13
+
14
+ auto CubeHalves(const ExtentRows& rows) {
15
+ return [size = rows.Column<double>(Cube::kSize)](std::uint32_t row) {
16
+ return glm::dvec3(0.5 * size[row]);
17
+ };
18
+ }
19
+
20
+ auto SphereHalves(const ExtentRows& rows) {
21
+ return [radius = rows.Column<double>(Sphere::kRadius)](std::uint32_t row) {
22
+ return glm::dvec3(radius[row]);
23
+ };
24
+ }
25
+
26
+ /// Cylinders, cones and capsules: a radius about the axis; capsules' caps add it along the axis.
27
+ template <bool kCapped> auto RoundHalves(const ExtentRows& rows) {
28
+ return [&rows, radius = rows.Column<double>(Cylinder::kRadius),
29
+ height = rows.Column<double>(Cylinder::kHeight),
30
+ axis = rows.Column<Token>(Cylinder::kAxis)](std::uint32_t row) {
31
+ glm::dvec3 half(radius[row]);
32
+ half[AxisIndex(rows, axis[row])] = 0.5 * height[row] + (kCapped ? radius[row] : 0.0);
33
+ return half;
34
+ };
35
+ }
36
+
37
+ auto PlaneHalves(const ExtentRows& rows) {
38
+ return [&rows, width = rows.Column<double>(Plane::kWidth),
39
+ length = rows.Column<double>(Plane::kLength),
40
+ axis = rows.Column<Token>(Plane::kAxis)](std::uint32_t row) {
41
+ const int normal = AxisIndex(rows, axis[row]);
42
+ // Width lies along x, or z for an X normal; length along y, or z for a Y normal.
43
+ glm::dvec3 half(0.0);
44
+ half[normal == 0 ? 2 : 0] = 0.5 * width[row];
45
+ half[normal == 1 ? 2 : 1] = 0.5 * length[row];
46
+ return half;
47
+ };
48
+ }
49
+
50
+ } // namespace
51
+
52
+ ERNIE_DEFINE_SCHEMA(Imageable, Abstract, kInheritExtent, ERNIE_IMAGEABLE_ATTRIBUTES)
53
+ ERNIE_DEFINE_SCHEMA(Xformable, Abstract, kInheritExtent, ERNIE_XFORMABLE_ATTRIBUTES,
54
+ .openNamespaces = {tokens::kXformOpPrefix})
55
+ ERNIE_DEFINE_SCHEMA(Boundable, Abstract, kInheritExtent, ERNIE_BOUNDABLE_ATTRIBUTES)
56
+ ERNIE_DEFINE_SCHEMA(Gprim, Abstract, kInheritExtent, ERNIE_GPRIM_ATTRIBUTES,
57
+ .openNamespaces = {tokens::kPrimvarsPrefix})
58
+ // Grouping prims are where custom data lives, so they take attributes of any name.
59
+ ERNIE_DEFINE_SCHEMA(Xform, Concrete, kDescendantsExtent, ERNIE_NO_ATTRIBUTES,
60
+ .openNamespaces = {"*"})
61
+ ERNIE_DEFINE_SCHEMA(Scope, Concrete, kDescendantsExtent, ERNIE_NO_ATTRIBUTES,
62
+ .openNamespaces = {"*"})
63
+ ERNIE_DEFINE_SCHEMA(Cube, Concrete, ComputedExtent(CentredExtent<CubeHalves>),
64
+ ERNIE_CUBE_ATTRIBUTES)
65
+ ERNIE_DEFINE_SCHEMA(Sphere, Concrete, ComputedExtent(CentredExtent<SphereHalves>),
66
+ ERNIE_SPHERE_ATTRIBUTES)
67
+ ERNIE_DEFINE_SCHEMA(Cylinder, Concrete, ComputedExtent(CentredExtent<RoundHalves<false>>),
68
+ ERNIE_CYLINDER_ATTRIBUTES)
69
+ ERNIE_DEFINE_SCHEMA(Cone, Concrete, ComputedExtent(CentredExtent<RoundHalves<false>>),
70
+ ERNIE_CYLINDER_ATTRIBUTES)
71
+ ERNIE_DEFINE_SCHEMA(Capsule, Concrete, ComputedExtent(CentredExtent<RoundHalves<true>>),
72
+ ERNIE_CAPSULE_ATTRIBUTES)
73
+ ERNIE_DEFINE_SCHEMA(Plane, Concrete, ComputedExtent(CentredExtent<PlaneHalves>),
74
+ ERNIE_PLANE_ATTRIBUTES)
75
+
76
+ } // namespace ernie
@@ -99,85 +99,27 @@ template <> struct ChoiceTokens<Axis> {
99
99
  static constexpr std::array<std::string_view, 3> kTokens{"X", "Y", "Z"};
100
100
  };
101
101
 
102
- ERNIE_SCHEMA_ACCESSORS(Imageable, SchemaView, ERNIE_IMAGEABLE_ATTRIBUTES);
103
- ERNIE_SCHEMA_ACCESSORS(Xformable, Imageable, ERNIE_XFORMABLE_ATTRIBUTES);
104
- ERNIE_SCHEMA_ACCESSORS(Boundable, Xformable, ERNIE_BOUNDABLE_ATTRIBUTES);
105
- ERNIE_SCHEMA_ACCESSORS(Gprim, Boundable, ERNIE_GPRIM_ATTRIBUTES);
106
- ERNIE_SCHEMA_ACCESSORS(Xform, Xformable, ERNIE_NO_ATTRIBUTES);
107
- ERNIE_SCHEMA_ACCESSORS(Scope, Imageable, ERNIE_NO_ATTRIBUTES);
108
- ERNIE_SCHEMA_ACCESSORS(Cube, Gprim, ERNIE_CUBE_ATTRIBUTES);
109
- ERNIE_SCHEMA_ACCESSORS(Sphere, Gprim, ERNIE_SPHERE_ATTRIBUTES);
110
- ERNIE_SCHEMA_ACCESSORS(Cylinder, Gprim, ERNIE_CYLINDER_ATTRIBUTES);
111
- ERNIE_SCHEMA_ACCESSORS(Cone, Gprim, ERNIE_CYLINDER_ATTRIBUTES);
112
- ERNIE_SCHEMA_ACCESSORS(Capsule, Gprim, ERNIE_CAPSULE_ATTRIBUTES);
113
- ERNIE_SCHEMA_ACCESSORS(Plane, Gprim, ERNIE_PLANE_ATTRIBUTES);
114
-
115
- /// What every prim has: visibility, purpose and the world it is in.
116
- class Imageable : public ImageableAccessors<Imageable, SchemaView> {
117
- ERNIE_SCHEMA_BODY(Imageable, SchemaView)
118
- };
119
-
120
- /// What has a transform, composed from its xformOps.
121
- class Xformable : public XformableAccessors<Xformable, Imageable> {
122
- ERNIE_SCHEMA_BODY(Xformable, Imageable)
123
- };
124
-
125
- /// What has an extent in its own space, computed from its attributes.
126
- class Boundable : public BoundableAccessors<Boundable, Xformable> {
127
- ERNIE_SCHEMA_BODY(Boundable, Xformable)
128
- };
129
-
130
- /// Geometry, drawn in a display colour or with a bound material.
131
- class Gprim : public GprimAccessors<Gprim, Boundable> {
132
- ERNIE_SCHEMA_BODY(Gprim, Boundable)
133
- };
134
-
135
- /// A transform grouping its children.
136
- class Xform : public XformAccessors<Xform, Xformable> {
137
- ERNIE_SCHEMA_BODY(Xform, Xformable)
138
- ERNIE_SCHEMA_DEFINE(Xform)
139
- };
140
-
141
- /// A grouping without a transform of its own.
142
- class Scope : public ScopeAccessors<Scope, Imageable> {
143
- ERNIE_SCHEMA_BODY(Scope, Imageable)
144
- ERNIE_SCHEMA_DEFINE(Scope)
145
- };
146
-
147
- /// A box centred on its origin, `size` along each axis.
148
- class Cube : public CubeAccessors<Cube, Gprim> {
149
- ERNIE_SCHEMA_BODY(Cube, Gprim)
150
- ERNIE_SCHEMA_DEFINE(Cube)
151
- };
152
-
153
- /// A sphere centred on its origin.
154
- class Sphere : public SphereAccessors<Sphere, Gprim> {
155
- ERNIE_SCHEMA_BODY(Sphere, Gprim)
156
- ERNIE_SCHEMA_DEFINE(Sphere)
157
- };
158
-
159
- /// A capped cylinder along its axis.
160
- class Cylinder : public CylinderAccessors<Cylinder, Gprim> {
161
- ERNIE_SCHEMA_BODY(Cylinder, Gprim)
162
- ERNIE_SCHEMA_DEFINE(Cylinder)
163
- };
164
-
165
- /// A capped cone along its axis, its apex at +height / 2.
166
- class Cone : public ConeAccessors<Cone, Gprim> {
167
- ERNIE_SCHEMA_BODY(Cone, Gprim)
168
- ERNIE_SCHEMA_DEFINE(Cone)
169
- };
170
-
171
- /// A cylinder with hemispherical caps along its axis.
172
- class Capsule : public CapsuleAccessors<Capsule, Gprim> {
173
- ERNIE_SCHEMA_BODY(Capsule, Gprim)
174
- ERNIE_SCHEMA_DEFINE(Capsule)
175
- };
176
-
177
- /// A one-sided rectangle facing along its axis.
178
- class Plane : public PlaneAccessors<Plane, Gprim> {
179
- ERNIE_SCHEMA_BODY(Plane, Gprim)
180
- ERNIE_SCHEMA_DEFINE(Plane)
181
- };
102
+ ERNIE_SCHEMA(Imageable, SchemaView, ERNIE_IMAGEABLE_ATTRIBUTES,
103
+ "What every prim has: visibility, purpose and the world it is in.");
104
+ ERNIE_SCHEMA(Xformable, Imageable, ERNIE_XFORMABLE_ATTRIBUTES,
105
+ "What has a transform, composed from its xformOps.");
106
+ ERNIE_SCHEMA(Boundable, Xformable, ERNIE_BOUNDABLE_ATTRIBUTES,
107
+ "What has an extent in its own space, computed from its attributes.");
108
+ ERNIE_SCHEMA(Gprim, Boundable, ERNIE_GPRIM_ATTRIBUTES,
109
+ "Geometry, drawn in a display colour or with a bound material.");
110
+ ERNIE_CONCRETE_SCHEMA(Xform, Xformable, ERNIE_NO_ATTRIBUTES, "A transform grouping its children.");
111
+ ERNIE_CONCRETE_SCHEMA(Scope, Imageable, ERNIE_NO_ATTRIBUTES,
112
+ "A grouping without a transform of its own.");
113
+ ERNIE_CONCRETE_SCHEMA(Cube, Gprim, ERNIE_CUBE_ATTRIBUTES,
114
+ "A box centred on its origin, size along each axis.");
115
+ ERNIE_CONCRETE_SCHEMA(Sphere, Gprim, ERNIE_SPHERE_ATTRIBUTES, "A sphere centred on its origin.");
116
+ ERNIE_CONCRETE_SCHEMA(Cylinder, Gprim, ERNIE_CYLINDER_ATTRIBUTES,
117
+ "A capped cylinder along its axis.");
118
+ ERNIE_CONCRETE_SCHEMA(Cone, Gprim, ERNIE_CYLINDER_ATTRIBUTES,
119
+ "A capped cone along its axis, its apex at +height / 2.");
120
+ ERNIE_CONCRETE_SCHEMA(Capsule, Gprim, ERNIE_CAPSULE_ATTRIBUTES,
121
+ "A cylinder with hemispherical caps along its axis.");
122
+ ERNIE_CONCRETE_SCHEMA(Plane, Gprim, ERNIE_PLANE_ATTRIBUTES,
123
+ "A one-sided rectangle facing along its axis.");
182
124
 
183
125
  } // namespace ernie
@@ -42,6 +42,36 @@ glm::dmat4 InstanceTransform(std::span<const float> position, std::span<const fl
42
42
  return m;
43
43
  }
44
44
 
45
+ /// One row's instances: its prototypes' boxes, each placed at the instances that use it.
46
+ struct Instances {
47
+ std::vector<Box> prototypes;
48
+ std::vector<std::int64_t> indices;
49
+ std::vector<float> positions;
50
+ std::vector<float> rotations;
51
+ std::vector<float> scales;
52
+ bool wFirst = false;
53
+
54
+ Box Bounds() const {
55
+ Box box;
56
+ for (std::size_t i = 0; i < positions.size() / 3; ++i) {
57
+ const std::int64_t p = i < indices.size() ? indices[i] : 0;
58
+ if (p >= 0 && static_cast<std::size_t>(p) < prototypes.size()) {
59
+ box.Extend(prototypes[static_cast<std::size_t>(p)].Transformed(InstanceTransform(
60
+ Part(positions, i, 3), Part(rotations, i, 4), Part(scales, i, 3), wFirst)));
61
+ }
62
+ }
63
+ return box;
64
+ }
65
+
66
+ private:
67
+ /// @return Instance i's `n` values, or none when the array is unset or too short.
68
+ static std::span<const float> Part(const std::vector<float>& values, std::size_t i,
69
+ std::size_t n) {
70
+ return values.size() >= (i + 1) * n ? std::span(values).subspan(i * n, n)
71
+ : std::span<const float>();
72
+ }
73
+ };
74
+
45
75
  void InstancerExtent(const ExtentRows& rows, RowRange range, std::span<Box> out) {
46
76
  const auto prototypes = rows.Column<std::vector<Target>>(PointInstancer::kPrototypes);
47
77
  const auto indices = rows.Column<Tensor>(PointInstancer::kProtoIndices);
@@ -50,44 +80,30 @@ void InstancerExtent(const ExtentRows& rows, RowRange range, std::span<Box> out)
50
80
  const auto scales = rows.Column<Tensor>(PointInstancer::kScales);
51
81
  const auto order = rows.Column<Token>(PointInstancer::kQuaternionOrder);
52
82
  const auto authored = rows.Column<std::vector<float>>(Boundable::kExtent);
53
- for (std::uint32_t row = range.begin; row < range.end; ++row) {
54
- Box& box = out[row - range.begin] = Box();
83
+ ComputeRows(range, out, [&](std::uint32_t row) {
55
84
  if (!OnHost({&indices[row], &positions[row], &orientations[row], &scales[row]})) {
56
- box = AuthoredExtent(authored[row]);
57
- continue;
85
+ return AuthoredExtent(authored[row]);
58
86
  }
59
- const std::vector<Box> protoBoxes = Map(prototypes[row], [&](const Target& target) {
60
- const std::optional<PrimId> prim = rows.store.Find(target.path);
61
- return prim ? rows.scene->BoundsInParent(*prim) : Box();
62
- });
63
- const std::vector<float> xyz = FloatsOrNone(positions[row], 3, "positions");
64
- const std::vector<float> rotations = FloatsOrNone(orientations[row], 4, "orientations");
65
- const std::vector<float> scaling = FloatsOrNone(scales[row], 3, "scales");
66
- const std::vector<std::int64_t> proto = indices[row].Empty()
67
- ? std::vector<std::int64_t>{}
68
- : CopyInts(indices[row], "protoIndices");
69
- const bool wFirst = rows.Text(order[row]) == "wxyz";
70
- const std::size_t count = xyz.size() / 3;
71
- for (std::size_t i = 0; i < count; ++i) {
72
- const std::int64_t p = i < proto.size() ? proto[i] : 0;
73
- if (p < 0 || static_cast<std::size_t>(p) >= protoBoxes.size()) {
74
- continue;
75
- }
76
- const auto part = [&](const std::vector<float>& values, std::size_t n) {
77
- return values.size() >= (i + 1) * n ? std::span(values).subspan(i * n, n)
78
- : std::span<const float>();
79
- };
80
- box.Extend(protoBoxes[static_cast<std::size_t>(p)].Transformed(
81
- InstanceTransform(part(xyz, 3), part(rotations, 4), part(scaling, 3), wFirst)));
82
- }
83
- }
87
+ const Instances instances{
88
+ .prototypes = Map(prototypes[row],
89
+ [&](const Target& target) {
90
+ const std::optional<PrimId> prim = rows.Resolve(target);
91
+ return prim ? rows.scene->BoundsInParent(*prim) : Box();
92
+ }),
93
+ .indices = indices[row].Empty() ? std::vector<std::int64_t>{}
94
+ : CopyInts(indices[row], "protoIndices"),
95
+ .positions = FloatsOrNone(positions[row], 3, "positions"),
96
+ .rotations = FloatsOrNone(orientations[row], 4, "orientations"),
97
+ .scales = FloatsOrNone(scales[row], 3, "scales"),
98
+ .wFirst = rows.Text(order[row]) == "wxyz",
99
+ };
100
+ return instances.Bounds();
101
+ });
84
102
  }
85
103
 
86
104
  } // namespace
87
105
 
88
- ERNIE_DEFINE_SCHEMA(PointInstancer, tokens::kPointInstancer, &Boundable::Definition(), Concrete,
89
- ComputedFromOtherPrims(InstancerExtent),
90
- "Prototypes placed at instances, bounded by their bounds at each instance.",
106
+ ERNIE_DEFINE_SCHEMA(PointInstancer, Concrete, ComputedFromOtherPrims(InstancerExtent),
91
107
  ERNIE_POINT_INSTANCER_ATTRIBUTES, .openNamespaces = {tokens::kPrimvarsPrefix})
92
108
 
93
109
  } // namespace ernie
@@ -52,12 +52,7 @@ template <> struct ChoiceTokens<QuaternionOrder> {
52
52
  static constexpr std::array<std::string_view, 2> kTokens{"xyzw", "wxyz"};
53
53
  };
54
54
 
55
- ERNIE_SCHEMA_ACCESSORS(PointInstancer, Boundable, ERNIE_POINT_INSTANCER_ATTRIBUTES);
56
-
57
- /// Prototypes placed at instances, bounded by their bounds at each instance.
58
- class PointInstancer : public PointInstancerAccessors<PointInstancer, Boundable> {
59
- ERNIE_SCHEMA_BODY(PointInstancer, Boundable)
60
- ERNIE_SCHEMA_DEFINE(PointInstancer)
61
- };
55
+ ERNIE_CONCRETE_SCHEMA(PointInstancer, Boundable, ERNIE_POINT_INSTANCER_ATTRIBUTES,
56
+ "Prototypes placed at instances, bounded by their bounds at each instance.");
62
57
 
63
58
  } // namespace ernie
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file laser.cpp
3
+ /// @brief The laser's registry entry and extent: its emitter, the larger of its aperture and waist.
4
+ #include "ernie/scene/schemas/laser.h"
5
+
6
+ #include <algorithm>
7
+
8
+ namespace ernie {
9
+ namespace {
10
+
11
+ auto EmitterHalves(const ExtentRows& rows) {
12
+ return [aperture = rows.Column<double>(LaserLight::kApertureRadius),
13
+ waist = rows.Column<glm::dvec2>(LaserLight::kWaistRadius)](std::uint32_t row) {
14
+ const double radius = std::max({aperture[row], waist[row].x, waist[row].y});
15
+ return glm::dvec3(radius, radius, 0.0);
16
+ };
17
+ }
18
+
19
+ } // namespace
20
+
21
+ ERNIE_DEFINE_SCHEMA(LaserLight, Concrete, ComputedExtent(CentredExtent<EmitterHalves>),
22
+ ERNIE_LASER_LIGHT_ATTRIBUTES,
23
+ .fallbackOverrides = {{"ernie:power", 0.001},
24
+ {"ernie:polarization:degree", 0.98}})
25
+
26
+ } // namespace ernie