ernie-renderer 0.2.0.dev30__tar.gz → 0.2.0.dev32__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 (263) hide show
  1. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/PKG-INFO +1 -1
  3. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/CMakeLists.txt +1 -0
  4. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/scene.cpp +24 -11
  5. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/scene.h +2 -0
  6. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schema.cpp +18 -0
  7. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schema.h +11 -1
  8. ernie_renderer-0.2.0.dev32/ernie/scene/schemas/camera.cpp +20 -0
  9. ernie_renderer-0.2.0.dev32/ernie/scene/schemas/camera.h +184 -0
  10. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/geom.cpp +6 -4
  11. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/instancer.cpp +1 -1
  12. ernie_renderer-0.2.0.dev32/ernie/scene/schemas/laser.cpp +29 -0
  13. ernie_renderer-0.2.0.dev32/ernie/scene/schemas/laser.h +95 -0
  14. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/lux.cpp +27 -3
  15. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/lux.h +133 -14
  16. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/registry.cpp +10 -0
  17. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/shade.cpp +1 -1
  18. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/vol.cpp +1 -1
  19. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/view.h +12 -9
  20. ernie_renderer-0.2.0.dev32/tests/scene/lux_test.cpp +148 -0
  21. ernie_renderer-0.2.0.dev30/ernie/scene/schemas/camera.cpp +0 -11
  22. ernie_renderer-0.2.0.dev30/ernie/scene/schemas/camera.h +0 -63
  23. ernie_renderer-0.2.0.dev30/tests/scene/lux_test.cpp +0 -75
  24. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.clang-format +0 -0
  25. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.clang-tidy +0 -0
  26. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.dockerignore +0 -0
  27. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.gersemirc +0 -0
  28. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.gitattributes +0 -0
  29. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.github/scripts/coverage_badge.py +0 -0
  30. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.github/scripts/install-lavapipe-windows.sh +0 -0
  31. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.github/workflows/ci.yml +0 -0
  32. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.gitignore +0 -0
  33. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/.pre-commit-config.yaml +0 -0
  34. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/CMakePresets.json +0 -0
  35. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/Dockerfile +0 -0
  36. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/LICENSE +0 -0
  37. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/README.md +0 -0
  38. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/benchmarks/CMakeLists.txt +0 -0
  39. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/benchmarks/bench.h +0 -0
  40. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/benchmarks/main.cpp +0 -0
  41. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/benchmarks/scene/extents.cpp +0 -0
  42. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/benchmarks/scene/storage.cpp +0 -0
  43. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/ErnieConfig.cmake.in +0 -0
  44. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/ErnieFetch.cmake +0 -0
  45. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/ErnieInstall.cmake +0 -0
  46. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/ErniePackaging.cmake +0 -0
  47. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/ErnieTesting.cmake +0 -0
  48. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/ernie.pc.in +0 -0
  49. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/bc7enc.cmake +0 -0
  50. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/dlpack.cmake +0 -0
  51. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/glm.cmake +0 -0
  52. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/googletest.cmake +0 -0
  53. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/json.cmake +0 -0
  54. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/nanobind.cmake +0 -0
  55. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/openexr.cmake +0 -0
  56. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/stb.cmake +0 -0
  57. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/tracy.cmake +0 -0
  58. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/volk.cmake +0 -0
  59. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/cmake/third_party/vulkan_headers.cmake +0 -0
  60. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/docs/README.md +0 -0
  61. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/docs/index.md +0 -0
  62. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/docs/requirements.txt +0 -0
  63. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/CMakeLists.txt +0 -0
  64. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/app/CMakeLists.txt +0 -0
  65. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/app/main.cpp +0 -0
  66. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/device/CMakeLists.txt +0 -0
  67. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/device/vulkan_devices.cpp +0 -0
  68. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/device/vulkan_devices.h +0 -0
  69. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/geometry/CMakeLists.txt +0 -0
  70. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/geometry/bounds.h +0 -0
  71. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/graph/CMakeLists.txt +0 -0
  72. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/CMakeLists.txt +0 -0
  73. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/ies.cpp +0 -0
  74. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/ies.h +0 -0
  75. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/image.cpp +0 -0
  76. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/image.h +0 -0
  77. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/nanovdb.cpp +0 -0
  78. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/nanovdb.h +0 -0
  79. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/raster.cpp +0 -0
  80. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/raster.h +0 -0
  81. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/texture.cpp +0 -0
  82. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/io/texture.h +0 -0
  83. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/CMakeLists.txt +0 -0
  84. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/astronomy.cpp +0 -0
  85. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/astronomy.h +0 -0
  86. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/atmosphere.cpp +0 -0
  87. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/atmosphere.h +0 -0
  88. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/cloud.cpp +0 -0
  89. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/cloud.h +0 -0
  90. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/constants.h +0 -0
  91. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/reflectance_library.cpp +0 -0
  92. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/reflectance_library.h +0 -0
  93. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/reflectance_table.h +0 -0
  94. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/regolith.cpp +0 -0
  95. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/regolith.h +0 -0
  96. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/scattering.cpp +0 -0
  97. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/scattering.h +0 -0
  98. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/solar.cpp +0 -0
  99. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/solar.h +0 -0
  100. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/solar_table.h +0 -0
  101. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/spectrum.cpp +0 -0
  102. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/physics/spectrum.h +0 -0
  103. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/python/CMakeLists.txt +0 -0
  104. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/python/ernie/__init__.py +0 -0
  105. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/python/module.cpp +0 -0
  106. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/render/CMakeLists.txt +0 -0
  107. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/convert.h +0 -0
  108. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/extent_cache.cpp +0 -0
  109. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/extent_cache.h +0 -0
  110. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/path.cpp +0 -0
  111. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/path.h +0 -0
  112. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/collection.cpp +0 -0
  113. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/collection.h +0 -0
  114. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/geom.h +0 -0
  115. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/instancer.h +0 -0
  116. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/mesh.cpp +0 -0
  117. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/mesh.h +0 -0
  118. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/shade.h +0 -0
  119. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/vol.h +0 -0
  120. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/storage.cpp +0 -0
  121. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/storage.h +0 -0
  122. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/tokens.h +0 -0
  123. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/value.h +0 -0
  124. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/view.cpp +0 -0
  125. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/xform.cpp +0 -0
  126. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/scene/xform.h +0 -0
  127. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/CMakeLists.txt +0 -0
  128. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/algorithm.h +0 -0
  129. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/bytes.h +0 -0
  130. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/disk_cache.cpp +0 -0
  131. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/disk_cache.h +0 -0
  132. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/file.cpp +0 -0
  133. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/file.h +0 -0
  134. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/glm.h +0 -0
  135. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/hash_index.h +0 -0
  136. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/linear_algebra.h +0 -0
  137. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/log.cpp +0 -0
  138. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/log.h +0 -0
  139. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/math.h +0 -0
  140. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/noise.cpp +0 -0
  141. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/noise.h +0 -0
  142. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/numbers.h +0 -0
  143. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/parallel.h +0 -0
  144. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/profiler.cpp +0 -0
  145. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/profiler.h +0 -0
  146. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/random.h +0 -0
  147. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/tensor.cpp +0 -0
  148. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/tensor.h +0 -0
  149. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/text.h +0 -0
  150. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/version.cpp +0 -0
  151. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/version.h +0 -0
  152. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/ernie/util/worker_pool.h +0 -0
  153. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/mkdocs.yml +0 -0
  154. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/pyproject.toml +0 -0
  155. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/CMakeLists.txt +0 -0
  156. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/common.h +0 -0
  157. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/consumer/CMakeLists.txt +0 -0
  158. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/consumer/main.cpp +0 -0
  159. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/device/vulkan_devices_test.cpp +0 -0
  160. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/README.md +0 -0
  161. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/make_exr.py +0 -0
  162. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  163. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  164. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/y_half_zips.exr +0 -0
  165. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/README.md +0 -0
  166. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  167. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  168. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/lamp.tilt +0 -0
  169. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/images/grey16.png +0 -0
  170. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/README.md +0 -0
  171. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  172. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  173. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  174. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  175. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/README.md +0 -0
  176. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  177. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/float_raw.tif +0 -0
  178. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  179. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  180. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  181. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  182. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  183. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/volumes/cube.nvdb +0 -0
  184. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/fixtures/volumes/make_nvdb.py +0 -0
  185. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/geometry/bounds_test.cpp +0 -0
  186. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/io/ies_test.cpp +0 -0
  187. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/io/image_test.cpp +0 -0
  188. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/io/nanovdb_test.cpp +0 -0
  189. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/io/raster_test.cpp +0 -0
  190. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/io/texture_test.cpp +0 -0
  191. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/astronomy_test.cpp +0 -0
  192. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/atmosphere_test.cpp +0 -0
  193. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/cloud_test.cpp +0 -0
  194. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/reflectance_library_test.cpp +0 -0
  195. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/regolith_test.cpp +0 -0
  196. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/scattering_test.cpp +0 -0
  197. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/solar_test.cpp +0 -0
  198. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/physics/spectrum_test.cpp +0 -0
  199. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/python/test_package.py +0 -0
  200. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/api_test.cpp +0 -0
  201. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/extent_cache_test.cpp +0 -0
  202. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/instancer_test.cpp +0 -0
  203. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/mesh_test.cpp +0 -0
  204. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/path_test.cpp +0 -0
  205. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/scene_test.cpp +0 -0
  206. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/schema_test.cpp +0 -0
  207. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/storage_test.cpp +0 -0
  208. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/vol_test.cpp +0 -0
  209. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/scene/xform_test.cpp +0 -0
  210. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/algorithm_test.cpp +0 -0
  211. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/bytes_test.cpp +0 -0
  212. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/disk_cache_test.cpp +0 -0
  213. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/file_test.cpp +0 -0
  214. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/hash_index_test.cpp +0 -0
  215. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/linear_algebra_test.cpp +0 -0
  216. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/log_test.cpp +0 -0
  217. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/math_test.cpp +0 -0
  218. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/noise_test.cpp +0 -0
  219. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/parallel_test.cpp +0 -0
  220. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/profiler_test.cpp +0 -0
  221. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/random_test.cpp +0 -0
  222. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/tensor_test.cpp +0 -0
  223. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/text_test.cpp +0 -0
  224. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/version_test.cpp +0 -0
  225. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/tests/util/worker_pool_test.cpp +0 -0
  226. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/CMakeLists.txt +0 -0
  227. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSE +0 -0
  228. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  229. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  230. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSES/MIT.txt +0 -0
  231. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/NOTICE +0 -0
  232. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/README.md +0 -0
  233. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu.h +0 -0
  234. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  235. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  236. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  237. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  238. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  239. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  240. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  241. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  242. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  243. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  244. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  245. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  246. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  247. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
  248. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  249. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  250. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
  251. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
  252. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  253. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  254. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  255. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
  256. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  257. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  258. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  259. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/zstd/LICENSE +0 -0
  260. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/zstd/zstd.h +0 -0
  261. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/basisu/zstd/zstd_errors.h +0 -0
  262. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/third_party/nanovdb/LICENSE +0 -0
  263. {ernie_renderer-0.2.0.dev30 → ernie_renderer-0.2.0.dev32}/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 ".dev30" CACHE STRING "Pre-release suffix of Ernie's version")
18
+ set(ERNIE_VERSION_SUFFIX ".dev32" 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.dev30
3
+ Version: 0.2.0.dev32
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
@@ -13,6 +13,7 @@ add_library(
13
13
  schemas/collection.cpp
14
14
  schemas/geom.cpp
15
15
  schemas/instancer.cpp
16
+ schemas/laser.cpp
16
17
  schemas/lux.cpp
17
18
  schemas/mesh.cpp
18
19
  schemas/registry.cpp
@@ -16,14 +16,15 @@
16
16
  namespace ernie {
17
17
  namespace {
18
18
 
19
- /// @return A column layout for the attribute `name` holding `def`'s fallback in unauthored rows.
20
- ColumnLayout MakeLayout(PathTable& paths, const AttributeDef& def, std::string_view name) {
19
+ /// @return A column layout for the attribute `name` holding `fallback` in unauthored rows.
20
+ ColumnLayout MakeLayout(PathTable& paths, const AttributeDef& def, std::string_view name,
21
+ const Value& fallback) {
21
22
  const AttributeId attribute = paths.Names().Intern(name);
22
23
  return WithColumnType(def.type, [&]<typename T>(std::type_identity<T>) {
23
24
  if constexpr (std::is_same_v<T, Tensor>) {
24
25
  return ColumnLayout::Of<T>(attribute);
25
26
  } else {
26
- return ColumnLayout::Of<T>(attribute, ToElement<T>(paths, def.fallback).value_or(T{}));
27
+ return ColumnLayout::Of<T>(attribute, ToElement<T>(paths, fallback).value_or(T{}));
27
28
  }
28
29
  });
29
30
  }
@@ -302,15 +303,16 @@ BucketId Scene::FindOrAddBucket(const SchemaDef* schema, std::vector<Token> apis
302
303
  std::vector<ColumnLayout> layout;
303
304
  const auto add = [&](const SchemaDef& declaring, const ApiName& api) {
304
305
  for (const AttributeDef* def : declaring.AllAttributes()) {
305
- layout.push_back(MakeLayout(paths, *def, api.Attribute(def->name)));
306
+ 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));
306
309
  entry.declared.emplace(layout.back().attribute, def);
307
310
  }
308
311
  };
309
312
  if (schema != nullptr) {
310
313
  add(*schema, {});
311
314
  }
312
- for (const Token token : key.apiSchemas) {
313
- const ApiName api = ApiName::Parse(paths.Names().Text(token));
315
+ for (const ApiName& api : AllApis(schema, key.apiSchemas)) {
314
316
  add(*api.schema, api);
315
317
  }
316
318
  const BucketId bucket = store_.AddBucket(key, layout);
@@ -348,8 +350,20 @@ bool Scene::RemoveApi(PrimId prim, std::string_view api) {
348
350
  }
349
351
 
350
352
  bool Scene::HasApi(PrimId prim, std::string_view api) const {
351
- const std::optional<Token> token = store_.Tokens().Find(api);
352
- return token && std::ranges::find(Apis(prim), *token) != Apis(prim).end();
353
+ return std::ranges::any_of(AllApis(Schema(prim), Apis(prim)),
354
+ [&](const ApiName& name) { return name.ToString() == api; });
355
+ }
356
+
357
+ std::vector<ApiName> Scene::AllApis(const SchemaDef* schema, std::span<const Token> applied) const {
358
+ std::vector<ApiName> apis;
359
+ for (const std::string_view builtin :
360
+ schema != nullptr ? schema->AllBuiltinApis() : std::vector<std::string_view>{}) {
361
+ apis.push_back(ApiName::Parse(builtin));
362
+ }
363
+ for (const Token token : applied) {
364
+ apis.push_back(ApiName::Parse(store_.Tokens().Text(token)));
365
+ }
366
+ return apis;
353
367
  }
354
368
 
355
369
  std::vector<std::string> Scene::AppliedApis(PrimId prim) const {
@@ -393,9 +407,8 @@ Dirty Scene::Classify(const ChangeSet::Values& change) const {
393
407
  bool Scene::TakesUndeclared(PrimId prim, std::string_view attribute) const {
394
408
  const SchemaDef* schema = Schema(prim);
395
409
  return schema == nullptr || schema->IsOpen(attribute) ||
396
- std::ranges::any_of(Apis(prim), [&](Token api) {
397
- return ApiName::Parse(store_.Tokens().Text(api)).schema->IsOpen(attribute);
398
- });
410
+ std::ranges::any_of(AllApis(schema, Apis(prim)),
411
+ [&](const ApiName& api) { return api.schema->IsOpen(attribute); });
399
412
  }
400
413
 
401
414
  ColumnType Scene::TypeForUndeclared(PrimId prim, std::string_view attribute,
@@ -121,6 +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.
125
+ std::vector<ApiName> AllApis(const SchemaDef* schema, std::span<const Token> applied) const;
124
126
  /// @return The attribute's column when the prim authors it, or null.
125
127
  const Column* AuthoredColumn(PrimId prim, std::string_view attribute) const;
126
128
  const AttributeDef* Declared(BucketId bucket, AttributeId attribute) const;
@@ -139,6 +139,24 @@ std::vector<const AttributeDef*> SchemaDef::AllAttributes() const {
139
139
  return all;
140
140
  }
141
141
 
142
+ std::vector<std::string_view> SchemaDef::AllBuiltinApis() const {
143
+ std::vector<std::string_view> all =
144
+ base != nullptr ? base->AllBuiltinApis() : std::vector<std::string_view>{};
145
+ all.insert(all.end(), builtinApis.begin(), builtinApis.end());
146
+ return all;
147
+ }
148
+
149
+ const Value* SchemaDef::FallbackOverride(std::string_view attribute) const {
150
+ const Value* found = nullptr;
151
+ FirstInLineage([&](const SchemaDef& type) {
152
+ const auto override = std::ranges::find(type.fallbackOverrides, attribute,
153
+ &std::pair<std::string_view, Value>::first);
154
+ found = override != type.fallbackOverrides.end() ? &override->second : nullptr;
155
+ return found != nullptr;
156
+ });
157
+ return found;
158
+ }
159
+
142
160
  ExtentRule SchemaDef::Extent() const {
143
161
  const SchemaDef* ruled = FirstInLineage(
144
162
  [](const SchemaDef& type) { return type.extent.kind != ExtentRule::Kind::Inherit; });
@@ -171,9 +171,14 @@ struct SchemaDef {
171
171
  SchemaKind kind = SchemaKind::Concrete;
172
172
  std::string_view doc;
173
173
  std::vector<AttributeDef> attributes;
174
+ ExtentRule extent;
174
175
  /// Namespaces (`xformOp:`) or `*` whose undeclared attributes the type takes.
175
176
  std::vector<std::string_view> openNamespaces;
176
- ExtentRule extent;
177
+ /// API schemas every prim of the type has, as UsdLux's lights have `CollectionAPI:lightLink`.
178
+ std::vector<std::string_view> builtinApis;
179
+ /// Fallbacks the type changes for attributes of its bases or built-in schemas, as
180
+ /// DistantLight's brighter intensity.
181
+ std::vector<std::pair<std::string_view, Value>> fallbackOverrides;
177
182
 
178
183
  bool IsA(const SchemaDef& other) const;
179
184
  bool IsOpen(std::string_view attribute) const;
@@ -181,6 +186,11 @@ struct SchemaDef {
181
186
  const AttributeDef* Find(std::string_view attribute) const;
182
187
  /// @return Every attribute, the bases' first.
183
188
  std::vector<const AttributeDef*> AllAttributes() const;
189
+ /// @return The built-in API schemas of the type and its bases.
190
+ std::vector<std::string_view> AllBuiltinApis() const;
191
+ /// @return The fallback the type or its nearest base gives an attribute in place of its
192
+ /// declaration's, or null.
193
+ const Value* FallbackOverride(std::string_view attribute) const;
184
194
  /// @return The rule, the nearest base's when inherited.
185
195
  ExtentRule Extent() const;
186
196
 
@@ -0,0 +1,20 @@
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, "Camera", &Xformable::Definition(), Concrete, kNoExtent,
9
+ "A view looking down -z, y up, with a lens and film.", ERNIE_CAMERA_ATTRIBUTES)
10
+ ERNIE_DEFINE_SCHEMA(ErnieLensAPI, "ErnieLensAPI", nullptr, SingleApply, kInheritExtent,
11
+ "A camera's lens beyond USD's: fisheyes, distortion, vignetting and colour.",
12
+ ERNIE_LENS_API_ATTRIBUTES)
13
+ ERNIE_DEFINE_SCHEMA(ErniePolarizerAPI, "ErniePolarizerAPI", nullptr, SingleApply, kInheritExtent,
14
+ "A polarizer in front of a camera's lens, or a polarization sensor's mosaic.",
15
+ ERNIE_POLARIZER_API_ATTRIBUTES)
16
+ ERNIE_DEFINE_SCHEMA(ErnieSensorAPI, "ErnieSensorAPI", nullptr, SingleApply, kInheritExtent,
17
+ "A camera's sensor: its spectral bands, noise, ADC and quantum efficiency.",
18
+ ERNIE_SENSOR_API_ATTRIBUTES)
19
+
20
+ } // namespace ernie
@@ -0,0 +1,184 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file camera.h
3
+ /// @brief UsdGeomCamera: a view's projection, lens and exposure.
4
+ ///
5
+ /// References:
6
+ /// - Pixar, UsdGeomCamera, https://openusd.org/release/api/class_usd_geom_camera.html
7
+ #pragma once
8
+
9
+ #include "ernie/scene/schemas/geom.h"
10
+
11
+ // clang-format off
12
+ // Lens lengths are metres, whatever a USD stage's scale: USD's tenths of a scene unit are
13
+ // converted on import and export.
14
+ #define ERNIE_LENS_LENGTH(X, Name, usdName, fallback, text) \
15
+ X(double, Name, usdName, fallback, text ", metres.", .group = "Lens", .lower = AtLeast(0.0), \
16
+ .finite = true)
17
+
18
+ #define ERNIE_CAMERA_ATTRIBUTES(X) \
19
+ X(std::string, Projection, "projection", "perspective", "How it projects the scene.", \
20
+ .group = "Lens", .options = {"perspective", "orthographic"}) \
21
+ ERNIE_LENS_LENGTH(X, HorizontalAperture, "horizontalAperture", 0.020955, "Film width") \
22
+ ERNIE_LENS_LENGTH(X, VerticalAperture, "verticalAperture", 0.0152908, "Film height") \
23
+ X(double, HorizontalApertureOffset, "horizontalApertureOffset", 0.0, \
24
+ "The film's offset from the lens axis along x, metres.", .group = "Lens", .finite = true) \
25
+ X(double, VerticalApertureOffset, "verticalApertureOffset", 0.0, \
26
+ "The film's offset from the lens axis along y, metres.", .group = "Lens", .finite = true) \
27
+ ERNIE_LENS_LENGTH(X, FocalLength, "focalLength", 0.05, "The lens's focal length") \
28
+ X(glm::dvec2, ClippingRange, "clippingRange", glm::dvec2(1.0, 1000000.0), \
29
+ "Near and far distances in metres.", .group = "Lens", .lower = Above(0.0)) \
30
+ X(Tensor, ClippingPlanes, "clippingPlanes", Tensor(), \
31
+ "(n, 4) planes (a, b, c, d) keeping points where a x + b y + c z + d >= 0.", \
32
+ .group = "Lens", .components = 4) \
33
+ X(double, FStop, "fStop", 0.0, "The lens's f-number; 0 for a pinhole, all in focus.", \
34
+ .group = "Lens", .lower = AtLeast(0.0)) \
35
+ X(double, FocusDistance, "focusDistance", 0.0, "Metres to the plane in focus.", \
36
+ .group = "Lens", .lower = AtLeast(0.0)) \
37
+ X(std::string, StereoRole, "stereoRole", "mono", "Which eye it is.", .group = "Lens", \
38
+ .options = {"mono", "left", "right"}) \
39
+ X(double, ShutterOpen, "shutter:open", 0.0, "Frames from the time code the shutter opens.", \
40
+ .group = "Shutter") \
41
+ X(double, ShutterClose, "shutter:close", 0.0, "Frames from the time code it closes.", \
42
+ .group = "Shutter") \
43
+ X(double, Exposure, "exposure", 0.0, "Stops of exposure added to the image.", \
44
+ .group = "Exposure", .finite = true) \
45
+ X(double, ExposureIso, "exposure:iso", 100.0, "The sensor's ISO speed.", .group = "Exposure", \
46
+ .lower = Above(0.0)) \
47
+ X(double, ExposureTime, "exposure:time", 1.0, "Seconds of exposure.", .group = "Exposure", \
48
+ .lower = AtLeast(0.0)) \
49
+ X(double, ExposureFStop, "exposure:fStop", 1.0, "The f-number exposure is computed with.", \
50
+ .group = "Exposure", .lower = Above(0.0)) \
51
+ X(double, ExposureResponsivity, "exposure:responsivity", 1.0, "The sensor's responsivity.", \
52
+ .group = "Exposure", .lower = AtLeast(0.0)) \
53
+ X(std::string, ExposureMode, "ernie:exposure:mode", "manual", \
54
+ "auto keys the image to middle grey from the metered scene, after the settings above.", \
55
+ .group = "Exposure", .options = {"manual", "auto"}) \
56
+ X(double, ExposureAdaptation, "ernie:exposure:adaptation", 0.0, \
57
+ "Frames auto exposure takes to cover 63% of a change; 0 at once.", .group = "Exposure", \
58
+ .lower = AtLeast(0.0)) \
59
+ X(int, ShutterSamples, "ernie:shutter:samples", 8, "Sub-frames rendered across the shutter.", \
60
+ .group = "Shutter", .lower = AtLeast(1.0)) \
61
+ X(double, ShutterRolling, "ernie:shutter:rolling", 0.0, \
62
+ "Frames between the top row's exposure and the bottom row's; 0 global.", .group = "Shutter", \
63
+ .lower = AtLeast(0.0)) \
64
+ X(std::string, Scan, "ernie:camera:scan", "frame", \
65
+ "pushbroom: a line scanner whose rows run from the last frame's pose to this one's.", \
66
+ .group = "Shutter", .options = {"frame", "pushbroom"}) \
67
+ X(double, PushbroomLineOffset, "ernie:pushbroom:lineOffset", 0.0, \
68
+ "Metres from the principal point to the pushbroom's detector line.", \
69
+ .group = "Shutter", .finite = true)
70
+
71
+ #define ERNIE_LENS_API_ATTRIBUTES(X) \
72
+ X(std::string, LensProjection, "ernie:lens:projection", "perspective", \
73
+ "Rectilinear, or a Kannala-Brandt fisheye.", .group = "Lens", \
74
+ .options = {"perspective", "fisheye"}) \
75
+ X(std::vector<float>, LensDistortion, "ernie:lens:distortion", std::vector<float>{}, \
76
+ "Brown-Conrady k1 k2 k3 p1 p2; missing ones are 0.", .group = "Lens") \
77
+ X(std::vector<float>, LensFisheye, "ernie:lens:fisheye", std::vector<float>{}, \
78
+ "Kannala-Brandt k1 k2 k3 k4 of a fisheye; none is equidistant.", .group = "Lens") \
79
+ X(bool, LensVignetting, "ernie:lens:vignetting", false, "Natural falloff off axis.", \
80
+ .group = "Lens") \
81
+ X(double, LensTransmission, "ernie:lens:transmission", 1.0, "The fraction of light passed.", \
82
+ .group = "Lens", .lower = AtLeast(0.0), .upper = AtMost(1.0)) \
83
+ X(std::vector<float>, LensChromaticScale, "ernie:lens:chromatic:scale", std::vector<float>{}, \
84
+ "(nm, scale) pairs: lateral colour, the image's scale per wavelength.", .group = "Lens") \
85
+ X(std::vector<float>, LensChromaticFocus, "ernie:lens:chromatic:focus", std::vector<float>{}, \
86
+ "(nm, metres) pairs: axial colour, the focal length's shift per wavelength.", \
87
+ .group = "Lens") \
88
+ X(Tensor, LensRays, "ernie:lens:rays", Tensor(), \
89
+ "float32 (rows, columns, 3) unit directions every rays step pixels, in place of the " \
90
+ "projection and distortion.", \
91
+ .group = "Lens", .rank = 3) \
92
+ X(int, LensRaysStep, "ernie:lens:raysStep", 8, "Pixels between the lens's rays.", \
93
+ .group = "Lens", .lower = AtLeast(1.0))
94
+
95
+ #define ERNIE_POLARIZER_API_ATTRIBUTES(X) \
96
+ X(std::string, PolarizerType, "ernie:polarizer:type", "linear", \
97
+ "linear in front of the lens, or a mosaic of 90, 45 / 135, 0 degree polarizers over 2 x 2 " \
98
+ "pixels, as a polarization sensor's.", \
99
+ .group = "Polarizer", .options = {"linear", "mosaic"}) \
100
+ X(double, PolarizerAngle, "ernie:polarizer:angle", 0.0, \
101
+ "Degrees from the image's +x towards +y to a linear polarizer's axis.", .group = "Polarizer", \
102
+ .finite = true) \
103
+ X(double, PolarizerExtinction, "ernie:polarizer:extinction", 1000.0, \
104
+ "Light passed along the axis over light passed across it.", .group = "Polarizer", \
105
+ .lower = AtLeast(1.0)) \
106
+ X(double, PolarizerTransmission, "ernie:polarizer:transmission", 0.85, \
107
+ "The fraction of light polarized along the axis passed.", .group = "Polarizer", \
108
+ .lower = AtLeast(0.0), .upper = AtMost(1.0))
109
+
110
+ #define ERNIE_SENSOR_QE(X, Name, usdName, channel) \
111
+ X(std::vector<float>, Name, usdName, std::vector<float>{}, \
112
+ "(nm, electrons per photon) pairs of the " channel "; unset keeps the generic curve.", \
113
+ .group = "Sensor")
114
+
115
+ #define ERNIE_SENSOR_API_ATTRIBUTES(X) \
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"}) \
123
+ X(std::string, SensorType, "ernie:sensor:type", "rgb", "A colour or a mono sensor.", \
124
+ .group = "Sensor", .options = {"rgb", "mono"}) \
125
+ X(bool, SensorNoise, "ernie:sensor:noise", true, "Whether it adds the noise below.", \
126
+ .group = "Sensor") \
127
+ X(double, SensorFullWell, "ernie:sensor:fullWell", 20000.0, "Electrons a pixel holds.", \
128
+ .group = "Sensor", .lower = Above(0.0)) \
129
+ X(double, SensorReadNoise, "ernie:sensor:readNoise", 3.0, "Electrons, standard deviation.", \
130
+ .group = "Sensor", .lower = AtLeast(0.0)) \
131
+ X(double, SensorDarkCurrent, "ernie:sensor:darkCurrent", 0.1, "Electrons per second.", \
132
+ .group = "Sensor", .lower = AtLeast(0.0)) \
133
+ X(double, SensorPrnu, "ernie:sensor:prnu", 0.005, \
134
+ "Standard deviation of each pixel's relative gain.", .group = "Sensor", \
135
+ .lower = AtLeast(0.0)) \
136
+ X(double, SensorDsnu, "ernie:sensor:dsnu", 0.5, \
137
+ "Electrons, standard deviation of each pixel's offset.", .group = "Sensor", \
138
+ .lower = AtLeast(0.0)) \
139
+ X(double, SensorElectronsPerDn, "ernie:sensor:electronsPerDn", 0.0, \
140
+ "At ISO 100; 0 for the full well over the ADC range.", .group = "Sensor", \
141
+ .lower = AtLeast(0.0)) \
142
+ X(int, SensorAdcBits, "ernie:sensor:adcBits", 12, "The ADC's bits.", .group = "Sensor", \
143
+ .lower = AtLeast(1.0), .upper = AtMost(32.0)) \
144
+ X(double, SensorBlackLevel, "ernie:sensor:blackLevel", 0.0, "DN added to every pixel.", \
145
+ .group = "Sensor", .lower = AtLeast(0.0)) \
146
+ X(double, SensorPixelPitch, "ernie:sensor:pixelPitch", 5.0, \
147
+ "Micrometres, of orthographic cameras.", .group = "Sensor", .lower = Above(0.0)) \
148
+ X(int, SensorSeed, "ernie:sensor:seed", 0, "The seed of the sensor's noise.", \
149
+ .group = "Sensor") \
150
+ ERNIE_SENSOR_QE(X, SensorQeR, "ernie:sensor:qe:r", "red channel") \
151
+ ERNIE_SENSOR_QE(X, SensorQeG, "ernie:sensor:qe:g", "green channel") \
152
+ ERNIE_SENSOR_QE(X, SensorQeB, "ernie:sensor:qe:b", "blue channel") \
153
+ ERNIE_SENSOR_QE(X, SensorQeMono, "ernie:sensor:qe:mono", "mono channel")
154
+ // clang-format on
155
+
156
+ namespace ernie {
157
+
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
+ };
183
+
184
+ } // namespace ernie
@@ -65,18 +65,20 @@ ERNIE_DEFINE_SCHEMA(Imageable, "Imageable", nullptr, Abstract, kInheritExtent,
65
65
  ERNIE_IMAGEABLE_ATTRIBUTES)
66
66
  ERNIE_DEFINE_SCHEMA(Xformable, "Xformable", &Imageable::Definition(), Abstract, kInheritExtent,
67
67
  "What has a transform, composed from its xformOps.", ERNIE_XFORMABLE_ATTRIBUTES,
68
- tokens::kXformOpPrefix)
68
+ .openNamespaces = {tokens::kXformOpPrefix})
69
69
  ERNIE_DEFINE_SCHEMA(Boundable, "Boundable", &Xformable::Definition(), Abstract, kInheritExtent,
70
70
  "What has an extent in its own space, computed from its attributes.",
71
71
  ERNIE_BOUNDABLE_ATTRIBUTES)
72
72
  ERNIE_DEFINE_SCHEMA(Gprim, "Gprim", &Boundable::Definition(), Abstract, kInheritExtent,
73
73
  "Geometry, drawn in a display colour or with a bound material.",
74
- ERNIE_GPRIM_ATTRIBUTES, tokens::kPrimvarsPrefix)
74
+ ERNIE_GPRIM_ATTRIBUTES, .openNamespaces = {tokens::kPrimvarsPrefix})
75
75
  // Grouping prims are where custom data lives, so they take attributes of any name.
76
76
  ERNIE_DEFINE_SCHEMA(Xform, tokens::kXform, &Xformable::Definition(), Concrete, kDescendantsExtent,
77
- "A transform grouping its children.", ERNIE_NO_ATTRIBUTES, "*")
77
+ "A transform grouping its children.", ERNIE_NO_ATTRIBUTES,
78
+ .openNamespaces = {"*"})
78
79
  ERNIE_DEFINE_SCHEMA(Scope, tokens::kScope, &Imageable::Definition(), Concrete, kDescendantsExtent,
79
- "A grouping without a transform of its own.", ERNIE_NO_ATTRIBUTES, "*")
80
+ "A grouping without a transform of its own.", ERNIE_NO_ATTRIBUTES,
81
+ .openNamespaces = {"*"})
80
82
  ERNIE_DEFINE_SCHEMA(Cube, tokens::kCube, &Gprim::Definition(), Concrete, ComputedExtent(CubeExtent),
81
83
  "A box centred on its origin, size along each axis.", ERNIE_CUBE_ATTRIBUTES)
82
84
  ERNIE_DEFINE_SCHEMA(Sphere, tokens::kSphere, &Gprim::Definition(), Concrete,
@@ -88,6 +88,6 @@ void InstancerExtent(const ExtentRows& rows, RowRange range, std::span<Box> out)
88
88
  ERNIE_DEFINE_SCHEMA(PointInstancer, tokens::kPointInstancer, &Boundable::Definition(), Concrete,
89
89
  ComputedFromOtherPrims(InstancerExtent),
90
90
  "Prototypes placed at instances, bounded by their bounds at each instance.",
91
- ERNIE_POINT_INSTANCER_ATTRIBUTES, tokens::kPrimvarsPrefix)
91
+ ERNIE_POINT_INSTANCER_ATTRIBUTES, .openNamespaces = {tokens::kPrimvarsPrefix})
92
92
 
93
93
  } // namespace ernie
@@ -0,0 +1,29 @@
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
+ void LaserExtent(const ExtentRows& rows, RowRange range, std::span<Box> out) {
12
+ const auto aperture = rows.Column<double>(LaserLight::kApertureRadius);
13
+ const auto waist = rows.Column<glm::dvec2>(LaserLight::kWaistRadius);
14
+ for (std::uint32_t row = range.begin; row < range.end; ++row) {
15
+ const double radius = std::max({aperture[row], waist[row].x, waist[row].y});
16
+ out[row - range.begin] = Box::Around(glm::dvec3(0.0), {radius, radius, 0.0});
17
+ }
18
+ }
19
+
20
+ } // namespace
21
+
22
+ ERNIE_DEFINE_SCHEMA(LaserLight, "LaserLight", &BoundableLightBase::Definition(), Concrete,
23
+ ComputedExtent(LaserExtent),
24
+ "A laser along -z: a Gaussian beam and its pattern.",
25
+ ERNIE_LASER_LIGHT_ATTRIBUTES,
26
+ .fallbackOverrides = {{"ernie:power", 0.001},
27
+ {"ernie:polarization:degree", 0.98}})
28
+
29
+ } // namespace ernie
@@ -0,0 +1,95 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ /// @file laser.h
3
+ /// @brief Ernie's LaserLight: a Gaussian beam from datasheet parameters, and its diffractive
4
+ /// patterns and sequences.
5
+ #pragma once
6
+
7
+ #include "ernie/scene/schemas/lux.h"
8
+
9
+ // clang-format off
10
+ #define ERNIE_LASER_COUNT(X, Name, usdName, fallback, text) \
11
+ X(int, Name, usdName, fallback, text, .group = "Pattern", .lower = AtLeast(1.0))
12
+
13
+ #define ERNIE_LASER_LIGHT_ATTRIBUTES(X) \
14
+ X(double, Wavelength, "ernie:laser:wavelength", 532.0, "Centre wavelength, nm.", \
15
+ .group = "Laser", .lower = Above(0.0), .finite = true) \
16
+ X(double, Linewidth, "ernie:laser:linewidth", 0.1, "Spectral width (FWHM), nm.", \
17
+ .group = "Laser", .lower = AtLeast(0.0), .finite = true) \
18
+ X(bool, Speckle, "ernie:laser:speckle", false, \
19
+ "Grain on rough surfaces, sized by the camera's aperture.", .group = "Laser") \
20
+ X(glm::dvec2, WaistRadius, "ernie:laser:waistRadius", glm::dvec2(0.0005), \
21
+ "1/e^2 radius at the waist along x and y, metres.", .group = "Beam", .lower = Above(0.0), \
22
+ .finite = true) \
23
+ X(double, WaistDistance, "ernie:laser:waistDistance", 0.0, \
24
+ "Metres from the aperture along the beam to its waist.", .group = "Beam", .finite = true) \
25
+ X(glm::dvec2, BeamQuality, "ernie:laser:beamQuality", glm::dvec2(1.0), \
26
+ "M^2 along x and y: 1 for an ideal beam.", .label = "M^2", .group = "Beam", \
27
+ .lower = AtLeast(1.0), .finite = true) \
28
+ X(double, ApertureRadius, "ernie:laser:apertureRadius", 0.0, \
29
+ "Metres at which the aperture clips the beam's tails; 0 none.", .group = "Beam", \
30
+ .lower = AtLeast(0.0), .finite = true) \
31
+ X(std::string, Pattern, "ernie:laser:pattern", "spot", \
32
+ "The beam itself, a line fanned along x, a grid of beamlets, a field of dots, an image, or " \
33
+ "a scanned Lissajous figure.", \
34
+ .group = "Pattern", .options = {"spot", "line", "grid", "dots", "image", "scan"}) \
35
+ X(double, FanAngle, "ernie:laser:fanAngle", 60.0, "A line's full angle along x, degrees.", \
36
+ .group = "Pattern", .lower = Above(0.0), .upper = Below(170.0)) \
37
+ X(std::string, LineProfile, "ernie:laser:lineProfile", "flat", \
38
+ "Along a line: flat (a Powell lens) or Gaussian, 1/e^2 at the fan's edges.", \
39
+ .group = "Pattern", .options = {"flat", "gaussian"}) \
40
+ ERNIE_LASER_COUNT(X, GridColumns, "ernie:laser:gridColumns", 5, "A grid's beamlets along x.") \
41
+ ERNIE_LASER_COUNT(X, GridRows, "ernie:laser:gridRows", 5, "A grid's beamlets along y.") \
42
+ X(glm::dvec2, GridPitch, "ernie:laser:gridPitch", glm::dvec2(2.0), \
43
+ "Degrees between a grid's beamlets along x and y.", .group = "Pattern", .lower = Above(0.0)) \
44
+ ERNIE_LASER_COUNT(X, DotColumns, "ernie:laser:dotColumns", 64, "Dots per tile along x.") \
45
+ ERNIE_LASER_COUNT(X, DotRows, "ernie:laser:dotRows", 48, "Dots per tile along y.") \
46
+ ERNIE_LASER_COUNT(X, DotTileColumns, "ernie:laser:dotTileColumns", 1, \
47
+ "Tiles of the same dots along x.") \
48
+ ERNIE_LASER_COUNT(X, DotTileRows, "ernie:laser:dotTileRows", 1, \
49
+ "Tiles of the same dots along y.") \
50
+ X(double, DotJitter, "ernie:laser:dotJitter", 0.9, \
51
+ "How far a dot strays from its cell's centre, in cells: 0 a regular grid, 1 anywhere.", \
52
+ .group = "Pattern", .lower = AtLeast(0.0), .upper = AtMost(1.0)) \
53
+ X(int, DotSeed, "ernie:laser:dotSeed", 1, "The seed the dots derive from.", \
54
+ .group = "Pattern", .lower = AtLeast(0.0)) \
55
+ X(glm::dvec2, ScanFrequencies, "ernie:laser:scanFrequencies", glm::dvec2(3.0, 2.0), \
56
+ "A scan's Lissajous turns along x and y each period, swept faster than cameras see.", \
57
+ .group = "Pattern", .lower = AtLeast(0.0)) \
58
+ X(double, ScanPhase, "ernie:laser:scanPhase", 90.0, "A scan's phase along x, degrees.", \
59
+ .group = "Pattern", .finite = true) \
60
+ X(double, Efficiency, "ernie:laser:efficiency", 1.0, \
61
+ "The fraction of the power that goes into the pattern.", .group = "Pattern", \
62
+ .lower = AtLeast(0.0), .upper = AtMost(1.0)) \
63
+ X(double, ZeroOrder, "ernie:laser:zeroOrder", 0.0, \
64
+ "The fraction of the power left in a beam along the axis.", .group = "Pattern", \
65
+ .lower = AtLeast(0.0), .upper = AtMost(1.0)) \
66
+ X(std::string, PatternImage, "ernie:laser:pattern:image", "", \
67
+ "The image pattern's relative power (linear), its top towards +y.", .group = "Pattern", \
68
+ .asset = true) \
69
+ X(Tensor, PatternImageArray, "ernie:laser:pattern:imageArray", Tensor(), \
70
+ "float32 (rows, columns) pattern image in place of the file, on the host or a device.", \
71
+ .group = "Pattern", .rank = 2) \
72
+ X(glm::dvec2, PatternFieldOfView, "ernie:laser:pattern:fieldOfView", glm::dvec2(40.0, 30.0), \
73
+ "Full angles an image, dots or a scan span along x and y, degrees.", .group = "Pattern", \
74
+ .lower = AtLeast(0.0), .upper = Below(170.0)) \
75
+ X(int, SequenceCount, "ernie:laser:sequence:count", 1, \
76
+ "Patterns shown in turn; 1 for one pattern.", .group = "Time", .lower = AtLeast(1.0)) \
77
+ X(double, SequencePeriod, "ernie:laser:sequence:period", 1.0 / 30.0, \
78
+ "Seconds each pattern of a sequence shows.", .group = "Time", .lower = Above(0.0), \
79
+ .finite = true) \
80
+ X(double, SequenceDelay, "ernie:laser:sequence:delay", 0.0, \
81
+ "Seconds on the sensor clock the first pattern shows.", .group = "Time", .finite = true)
82
+ // clang-format on
83
+
84
+ namespace ernie {
85
+
86
+ ERNIE_SCHEMA_ACCESSORS(LaserLight, BoundableLightBase, ERNIE_LASER_LIGHT_ATTRIBUTES);
87
+
88
+ /// A laser along -z: a Gaussian beam and its pattern. Its power is `ernie:power`, its pulses
89
+ /// LightAPI's, and its extent the emitter, so framing it frames the device.
90
+ class LaserLight : public LaserLightAccessors<LaserLight, BoundableLightBase> {
91
+ ERNIE_SCHEMA_BODY(LaserLight, BoundableLightBase)
92
+ ERNIE_SCHEMA_DEFINE(LaserLight)
93
+ };
94
+
95
+ } // namespace ernie
@@ -36,14 +36,26 @@ glm::dvec3 CylinderHalf(const ExtentRows& rows, std::uint32_t row) {
36
36
 
37
37
  } // namespace
38
38
 
39
+ // Every light has LightAPI and its light-linking collections built in: which prims it lights and
40
+ // which cast its shadows, everything unless they say otherwise.
41
+ #define ERNIE_LIGHT_BUILTINS \
42
+ .builtinApis = {"LightAPI", "CollectionAPI:lightLink", "CollectionAPI:shadowLink"}, \
43
+ .fallbackOverrides = {{"collection:lightLink:includeRoot", true}, \
44
+ {"collection:shadowLink:includeRoot", true}}
45
+
46
+ ERNIE_DEFINE_SCHEMA(LightAPI, "LightAPI", nullptr, SingleApply, kInheritExtent,
47
+ "What every light has: brightness, colour, spectrum, polarization and pulses.",
48
+ ERNIE_LIGHT_API_ATTRIBUTES)
39
49
  ERNIE_DEFINE_SCHEMA(BoundableLightBase, "BoundableLightBase", &Boundable::Definition(), Abstract,
40
- kInheritExtent, "A light with a shape, bounded by it.", ERNIE_NO_ATTRIBUTES)
50
+ kInheritExtent, "A light with a shape, bounded by it.",
51
+ ERNIE_BOUNDABLE_LIGHT_BASE_ATTRIBUTES, ERNIE_LIGHT_BUILTINS)
41
52
  ERNIE_DEFINE_SCHEMA(NonboundableLightBase, "NonboundableLightBase", &Xformable::Definition(),
42
53
  Abstract, kUnbounded, "A light at infinity or around everything.",
43
- ERNIE_NO_ATTRIBUTES)
54
+ ERNIE_NO_ATTRIBUTES, ERNIE_LIGHT_BUILTINS)
44
55
  ERNIE_DEFINE_SCHEMA(DistantLight, "DistantLight", &NonboundableLightBase::Definition(), Concrete,
45
56
  kInheritExtent, "A light from infinitely far along +z, such as the Sun's.",
46
- ERNIE_DISTANT_LIGHT_ATTRIBUTES)
57
+ ERNIE_DISTANT_LIGHT_ATTRIBUTES,
58
+ .fallbackOverrides = {{"inputs:intensity", 50000.0}})
47
59
  ERNIE_DEFINE_SCHEMA(DiskLight, "DiskLight", &BoundableLightBase::Definition(), Concrete,
48
60
  ComputedExtent(CentredExtent<DiskHalf>), "A disk emitting towards -z.",
49
61
  ERNIE_DISK_LIGHT_ATTRIBUTES)
@@ -68,5 +80,17 @@ ERNIE_DEFINE_SCHEMA(ShapingAPI, "ShapingAPI", nullptr, SingleApply, kInheritExte
68
80
  ERNIE_SHAPING_API_ATTRIBUTES)
69
81
  ERNIE_DEFINE_SCHEMA(ShadowAPI, "ShadowAPI", nullptr, SingleApply, kInheritExtent,
70
82
  "Controls a light's shadows.", ERNIE_SHADOW_API_ATTRIBUTES)
83
+ ERNIE_DEFINE_SCHEMA(PhotometricAreaLightAPI, "PhotometricAreaLightAPI", nullptr, SingleApply,
84
+ kInheritExtent, "Photometric units for shaped lights: lumens, or lux.",
85
+ ERNIE_PHOTOMETRIC_AREA_LIGHT_API_ATTRIBUTES)
86
+ ERNIE_DEFINE_SCHEMA(PhotometricDistantLightAPI, "PhotometricDistantLightAPI", nullptr, SingleApply,
87
+ kInheritExtent, "Photometric units for distant lights: lux.",
88
+ ERNIE_PHOTOMETRIC_DISTANT_LIGHT_API_ATTRIBUTES)
89
+ ERNIE_DEFINE_SCHEMA(PhotometricDomeLightAPI, "PhotometricDomeLightAPI", nullptr, SingleApply,
90
+ kInheritExtent, "Photometric units for dome lights: lux.",
91
+ ERNIE_PHOTOMETRIC_DOME_LIGHT_API_ATTRIBUTES)
92
+ ERNIE_DEFINE_SCHEMA(PhysicalLightIlluminantAPI, "PhysicalLightIlluminantAPI", nullptr, SingleApply,
93
+ kInheritExtent, "The shape of a light's spectrum.",
94
+ ERNIE_PHYSICAL_LIGHT_ILLUMINANT_API_ATTRIBUTES)
71
95
 
72
96
  } // namespace ernie