ernie-renderer 0.2.0.dev35__tar.gz → 0.2.0.dev40__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.dev40}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/PKG-INFO +1 -1
  3. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/ErnieFetch.cmake +10 -0
  4. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/openexr.cmake +1 -0
  5. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/CMakeLists.txt +1 -0
  6. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/scene.cpp +79 -17
  7. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/scene.h +6 -1
  8. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schema.h +26 -0
  9. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/camera.cpp +13 -0
  10. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/camera.h +12 -31
  11. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/collection.cpp +1 -2
  12. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/collection.h +2 -6
  13. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/geom.cpp +78 -0
  14. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/geom.h +70 -81
  15. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/instancer.cpp +48 -32
  16. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/instancer.h +2 -7
  17. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/laser.cpp +26 -0
  18. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/laser.h +5 -8
  19. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/lux.cpp +83 -0
  20. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/lux.h +43 -112
  21. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/mesh.cpp +20 -18
  22. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/mesh.h +51 -24
  23. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/planet.cpp +16 -32
  24. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/planet.h +8 -28
  25. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/registry.cpp +14 -0
  26. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/render.cpp +18 -0
  27. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/render.h +113 -0
  28. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/shade.cpp +4 -12
  29. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/shade.h +14 -30
  30. ernie_renderer-0.2.0.dev40/ernie/scene/schemas/vol.cpp +114 -0
  31. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schemas/vol.h +12 -35
  32. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/tokens.h +2 -16
  33. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/view.h +52 -16
  34. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/CMakeLists.txt +1 -0
  35. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/api_test.cpp +7 -7
  36. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/lux_test.cpp +23 -1
  37. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/mesh_test.cpp +21 -0
  38. ernie_renderer-0.2.0.dev40/tests/scene/render_test.cpp +48 -0
  39. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/scene_test.cpp +18 -18
  40. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/schema_test.cpp +29 -1
  41. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/xform_test.cpp +5 -5
  42. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/CMakeLists.txt +1 -0
  43. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/camera.cpp +0 -20
  44. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/geom.cpp +0 -101
  45. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/laser.cpp +0 -29
  46. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/lux.cpp +0 -96
  47. ernie_renderer-0.2.0.dev35/ernie/scene/schemas/vol.cpp +0 -126
  48. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.clang-format +0 -0
  49. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.clang-tidy +0 -0
  50. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.dockerignore +0 -0
  51. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.gersemirc +0 -0
  52. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.gitattributes +0 -0
  53. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.github/scripts/coverage_badge.py +0 -0
  54. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.github/scripts/install-lavapipe-windows.sh +0 -0
  55. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.github/workflows/ci.yml +0 -0
  56. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.gitignore +0 -0
  57. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/.pre-commit-config.yaml +0 -0
  58. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/CMakePresets.json +0 -0
  59. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/Dockerfile +0 -0
  60. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/LICENSE +0 -0
  61. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/README.md +0 -0
  62. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/benchmarks/CMakeLists.txt +0 -0
  63. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/benchmarks/bench.h +0 -0
  64. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/benchmarks/main.cpp +0 -0
  65. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/benchmarks/scene/extents.cpp +0 -0
  66. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/benchmarks/scene/storage.cpp +0 -0
  67. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/ErnieConfig.cmake.in +0 -0
  68. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/ErnieInstall.cmake +0 -0
  69. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/ErniePackaging.cmake +0 -0
  70. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/ErnieTesting.cmake +0 -0
  71. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/ernie.pc.in +0 -0
  72. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/bc7enc.cmake +0 -0
  73. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/dlpack.cmake +0 -0
  74. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/glm.cmake +0 -0
  75. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/googletest.cmake +0 -0
  76. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/json.cmake +0 -0
  77. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/nanobind.cmake +0 -0
  78. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/stb.cmake +0 -0
  79. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/tracy.cmake +0 -0
  80. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/volk.cmake +0 -0
  81. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/cmake/third_party/vulkan_headers.cmake +0 -0
  82. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/docs/README.md +0 -0
  83. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/docs/index.md +0 -0
  84. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/docs/requirements.txt +0 -0
  85. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/CMakeLists.txt +0 -0
  86. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/app/CMakeLists.txt +0 -0
  87. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/app/main.cpp +0 -0
  88. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/device/CMakeLists.txt +0 -0
  89. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/device/vulkan_devices.cpp +0 -0
  90. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/device/vulkan_devices.h +0 -0
  91. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/geometry/CMakeLists.txt +0 -0
  92. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/geometry/bounds.h +0 -0
  93. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/graph/CMakeLists.txt +0 -0
  94. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/CMakeLists.txt +0 -0
  95. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/ies.cpp +0 -0
  96. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/ies.h +0 -0
  97. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/image.cpp +0 -0
  98. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/image.h +0 -0
  99. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/nanovdb.cpp +0 -0
  100. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/nanovdb.h +0 -0
  101. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/raster.cpp +0 -0
  102. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/raster.h +0 -0
  103. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/texture.cpp +0 -0
  104. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/io/texture.h +0 -0
  105. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/CMakeLists.txt +0 -0
  106. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/astronomy.cpp +0 -0
  107. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/astronomy.h +0 -0
  108. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/atmosphere.cpp +0 -0
  109. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/atmosphere.h +0 -0
  110. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/cloud.cpp +0 -0
  111. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/cloud.h +0 -0
  112. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/constants.h +0 -0
  113. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/reflectance_library.cpp +0 -0
  114. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/reflectance_library.h +0 -0
  115. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/reflectance_table.h +0 -0
  116. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/regolith.cpp +0 -0
  117. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/regolith.h +0 -0
  118. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/scattering.cpp +0 -0
  119. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/scattering.h +0 -0
  120. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/solar.cpp +0 -0
  121. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/solar.h +0 -0
  122. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/solar_table.h +0 -0
  123. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/spectrum.cpp +0 -0
  124. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/physics/spectrum.h +0 -0
  125. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/python/CMakeLists.txt +0 -0
  126. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/python/ernie/__init__.py +0 -0
  127. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/python/module.cpp +0 -0
  128. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/render/CMakeLists.txt +0 -0
  129. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/convert.h +0 -0
  130. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/extent_cache.cpp +0 -0
  131. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/extent_cache.h +0 -0
  132. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/path.cpp +0 -0
  133. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/path.h +0 -0
  134. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/schema.cpp +0 -0
  135. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/storage.cpp +0 -0
  136. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/storage.h +0 -0
  137. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/value.h +0 -0
  138. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/view.cpp +0 -0
  139. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/xform.cpp +0 -0
  140. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/scene/xform.h +0 -0
  141. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/CMakeLists.txt +0 -0
  142. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/algorithm.h +0 -0
  143. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/bytes.h +0 -0
  144. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/disk_cache.cpp +0 -0
  145. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/disk_cache.h +0 -0
  146. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/file.cpp +0 -0
  147. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/file.h +0 -0
  148. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/glm.h +0 -0
  149. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/hash_index.h +0 -0
  150. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/linear_algebra.h +0 -0
  151. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/log.cpp +0 -0
  152. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/log.h +0 -0
  153. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/math.h +0 -0
  154. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/noise.cpp +0 -0
  155. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/noise.h +0 -0
  156. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/numbers.h +0 -0
  157. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/parallel.h +0 -0
  158. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/profiler.cpp +0 -0
  159. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/profiler.h +0 -0
  160. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/random.h +0 -0
  161. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/tensor.cpp +0 -0
  162. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/tensor.h +0 -0
  163. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/text.h +0 -0
  164. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/version.cpp +0 -0
  165. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/version.h +0 -0
  166. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/ernie/util/worker_pool.h +0 -0
  167. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/mkdocs.yml +0 -0
  168. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/pyproject.toml +0 -0
  169. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/common.h +0 -0
  170. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/consumer/CMakeLists.txt +0 -0
  171. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/consumer/main.cpp +0 -0
  172. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/device/vulkan_devices_test.cpp +0 -0
  173. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/exr/README.md +0 -0
  174. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/exr/make_exr.py +0 -0
  175. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
  176. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/exr/rgba_half_window.exr +0 -0
  177. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/exr/y_half_zips.exr +0 -0
  178. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ies/README.md +0 -0
  179. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
  180. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
  181. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ies/lamp.tilt +0 -0
  182. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/images/grey16.png +0 -0
  183. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ktx2/README.md +0 -0
  184. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
  185. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
  186. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
  187. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
  188. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/README.md +0 -0
  189. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
  190. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/float_raw.tif +0 -0
  191. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
  192. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
  193. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
  194. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
  195. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
  196. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/volumes/cube.nvdb +0 -0
  197. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/fixtures/volumes/make_nvdb.py +0 -0
  198. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/geometry/bounds_test.cpp +0 -0
  199. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/io/ies_test.cpp +0 -0
  200. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/io/image_test.cpp +0 -0
  201. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/io/nanovdb_test.cpp +0 -0
  202. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/io/raster_test.cpp +0 -0
  203. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/io/texture_test.cpp +0 -0
  204. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/astronomy_test.cpp +0 -0
  205. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/atmosphere_test.cpp +0 -0
  206. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/cloud_test.cpp +0 -0
  207. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/reflectance_library_test.cpp +0 -0
  208. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/regolith_test.cpp +0 -0
  209. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/scattering_test.cpp +0 -0
  210. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/solar_test.cpp +0 -0
  211. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/physics/spectrum_test.cpp +0 -0
  212. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/python/test_package.py +0 -0
  213. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/extent_cache_test.cpp +0 -0
  214. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/instancer_test.cpp +0 -0
  215. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/path_test.cpp +0 -0
  216. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/planet_test.cpp +0 -0
  217. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/shade_test.cpp +0 -0
  218. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/storage_test.cpp +0 -0
  219. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/scene/vol_test.cpp +0 -0
  220. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/algorithm_test.cpp +0 -0
  221. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/bytes_test.cpp +0 -0
  222. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/disk_cache_test.cpp +0 -0
  223. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/file_test.cpp +0 -0
  224. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/hash_index_test.cpp +0 -0
  225. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/linear_algebra_test.cpp +0 -0
  226. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/log_test.cpp +0 -0
  227. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/math_test.cpp +0 -0
  228. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/noise_test.cpp +0 -0
  229. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/parallel_test.cpp +0 -0
  230. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/profiler_test.cpp +0 -0
  231. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/random_test.cpp +0 -0
  232. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/tensor_test.cpp +0 -0
  233. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/text_test.cpp +0 -0
  234. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/version_test.cpp +0 -0
  235. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/tests/util/worker_pool_test.cpp +0 -0
  236. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/LICENSE +0 -0
  237. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
  238. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
  239. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/LICENSES/MIT.txt +0 -0
  240. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/NOTICE +0 -0
  241. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/README.md +0 -0
  242. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu.h +0 -0
  243. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
  244. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
  245. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
  246. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_containers.h +0 -0
  247. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
  248. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
  249. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
  250. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
  251. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_idct.h +0 -0
  252. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
  253. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
  254. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
  255. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
  256. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/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.dev40}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
  258. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
  259. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/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.dev40}/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.dev40}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
  262. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
  263. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
  264. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/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.dev40}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
  266. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
  267. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
  268. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/zstd/LICENSE +0 -0
  269. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/zstd/zstd.h +0 -0
  270. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/basisu/zstd/zstd_errors.h +0 -0
  271. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/third_party/nanovdb/LICENSE +0 -0
  272. {ernie_renderer-0.2.0.dev35 → ernie_renderer-0.2.0.dev40}/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 ".dev40" 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.dev40
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
  )
@@ -169,12 +169,16 @@ void Scene::Write(PrimId prim, std::string_view attribute, Tensor array) {
169
169
  store_.Set(prim, token, std::move(array));
170
170
  }
171
171
 
172
- const Tensor* Scene::Read(PrimId prim, std::string_view attribute) const {
172
+ template <typename T> const T* Scene::Authored(PrimId prim, std::string_view attribute) const {
173
173
  const Column* column = AuthoredColumn(prim, attribute);
174
- if (column == nullptr || column->values->Type() != ColumnType::Tensor) {
174
+ if (column == nullptr || column->values->Type() != kColumnType<T>) {
175
175
  return nullptr;
176
176
  }
177
- return &store_.Read<Tensor>(store_.PrimBucket(prim), column->attribute)[store_.PrimRow(prim)];
177
+ return &store_.Read<T>(store_.PrimBucket(prim), column->attribute)[store_.PrimRow(prim)];
178
+ }
179
+
180
+ const Tensor* Scene::Read(PrimId prim, std::string_view attribute) const {
181
+ return Authored<Tensor>(prim, attribute);
178
182
  }
179
183
 
180
184
  std::optional<Value> Scene::Get(PrimId prim, std::string_view attribute) const {
@@ -277,11 +281,17 @@ void Scene::AddTo(Box& bounds, PathId path, const glm::dmat4& parent, bool visib
277
281
  bounds.Extend(extent->Transformed(world));
278
282
  return;
279
283
  }
284
+ bool loaded = false;
280
285
  store_.Paths().ForEachChild(path, [&](PathId child) {
281
286
  if (store_.Find(child)) {
287
+ loaded = true;
282
288
  AddTo(bounds, child, world, visibleOnly);
283
289
  }
284
290
  });
291
+ // A model whose subtree isn't loaded is bounded by its hint.
292
+ if (!loaded) {
293
+ bounds.Extend(ExtentsHint(prim, !visibleOnly).Transformed(world));
294
+ }
285
295
  }
286
296
 
287
297
  PrimId Scene::Require(const Path& path) const {
@@ -300,19 +310,27 @@ BucketId Scene::FindOrAddBucket(const SchemaDef* schema, std::vector<Token> apis
300
310
  return *found;
301
311
  }
302
312
  BucketSchema entry{schema, {}};
313
+ const std::vector<ApiName> allApis = AllApis(schema, key.apiSchemas);
314
+ // The type's fallback overrides win over its API schemas', as USD's do.
315
+ const auto fallback = [&](const AttributeDef& def, const std::string& name) -> const Value& {
316
+ const Value* override = schema != nullptr ? schema->FallbackOverride(name) : nullptr;
317
+ for (auto api = allApis.begin(); override == nullptr && api != allApis.end(); ++api) {
318
+ override = api->schema->FallbackOverride(name);
319
+ }
320
+ return override != nullptr ? *override : def.fallback;
321
+ };
303
322
  std::vector<ColumnLayout> layout;
304
323
  const auto add = [&](const SchemaDef& declaring, const ApiName& api) {
305
324
  for (const AttributeDef* def : declaring.AllAttributes()) {
306
325
  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));
326
+ layout.push_back(MakeLayout(paths, *def, name, fallback(*def, name)));
309
327
  entry.declared.emplace(layout.back().attribute, def);
310
328
  }
311
329
  };
312
330
  if (schema != nullptr) {
313
331
  add(*schema, {});
314
332
  }
315
- for (const ApiName& api : AllApis(schema, key.apiSchemas)) {
333
+ for (const ApiName& api : allApis) {
316
334
  add(*api.schema, api);
317
335
  }
318
336
  const BucketId bucket = store_.AddBucket(key, layout);
@@ -333,7 +351,16 @@ const std::vector<Token>& Scene::Apis(PrimId prim) const {
333
351
  }
334
352
 
335
353
  void Scene::ApplyApi(PrimId prim, std::string_view api) {
336
- ApiName::Parse(api);
354
+ const ApiName parsed = ApiName::Parse(api);
355
+ const std::vector<std::string_view>& allowed = parsed.schema->appliesTo;
356
+ const SchemaDef* type = Schema(prim);
357
+ if (!allowed.empty() && std::ranges::none_of(allowed, [&](std::string_view name) {
358
+ return type != nullptr && type->IsA(*FindSchema(name));
359
+ })) {
360
+ throw std::invalid_argument(std::string(api) + " applies only to " +
361
+ std::string(allowed.front()) + " prims, not " +
362
+ Describe(*this, prim));
363
+ }
337
364
  std::vector<Token> apis = Apis(prim);
338
365
  apis.push_back(store_.Tokens().Intern(api));
339
366
  MoveTo(prim, Schema(prim), std::move(apis));
@@ -356,12 +383,24 @@ bool Scene::HasApi(PrimId prim, std::string_view api) const {
356
383
 
357
384
  std::vector<ApiName> Scene::AllApis(const SchemaDef* schema, std::span<const Token> applied) const {
358
385
  std::vector<ApiName> apis;
386
+ // Each API schema once, followed by those built into it (MeshLightAPI's LightAPI, LightAPI's
387
+ // light-link collections).
388
+ const auto add = [&](const auto& self, std::string_view name) -> void {
389
+ const ApiName api = ApiName::Parse(name);
390
+ if (std::ranges::find(apis, api) != apis.end()) {
391
+ return;
392
+ }
393
+ apis.push_back(api);
394
+ for (const std::string_view builtin : api.schema->AllBuiltinApis()) {
395
+ self(self, builtin);
396
+ }
397
+ };
359
398
  for (const std::string_view builtin :
360
399
  schema != nullptr ? schema->AllBuiltinApis() : std::vector<std::string_view>{}) {
361
- apis.push_back(ApiName::Parse(builtin));
400
+ add(add, builtin);
362
401
  }
363
402
  for (const Token token : applied) {
364
- apis.push_back(ApiName::Parse(store_.Tokens().Text(token)));
403
+ add(add, store_.Tokens().Text(token));
365
404
  }
366
405
  return apis;
367
406
  }
@@ -371,15 +410,24 @@ std::vector<std::string> Scene::AppliedApis(PrimId prim) const {
371
410
  }
372
411
 
373
412
  bool Scene::LeavesOutOfBounds(PrimId prim) const {
374
- const auto token = [&](std::string_view attribute) -> std::optional<Token> {
375
- const Column* column = AuthoredColumn(prim, attribute);
376
- return column ? std::optional(store_.Read<Token>(store_.PrimBucket(prim),
377
- column->attribute)[store_.PrimRow(prim)])
378
- : std::nullopt;
379
- };
413
+ const Token* visibility = Authored<Token>(prim, Imageable::kVisibility);
380
414
  // Purpose is inherited, so a subtree under another purpose is left out whole.
381
- const std::optional<Token> purpose = token(Imageable::kPurpose);
382
- return token(Imageable::kVisibility) == invisible_ || (purpose && *purpose != defaultPurpose_);
415
+ const Token* purpose = Authored<Token>(prim, Imageable::kPurpose);
416
+ return (visibility && *visibility == invisible_) || (purpose && *purpose != defaultPurpose_);
417
+ }
418
+
419
+ Box Scene::ExtentsHint(PrimId prim, bool allPurposes) const {
420
+ const auto* hint = Authored<std::vector<float>>(prim, GeomModelAPI::kExtentsHint);
421
+ if (hint == nullptr) {
422
+ return {};
423
+ }
424
+ // Six floats per purpose, the default purpose first.
425
+ const std::size_t floats = allPurposes ? hint->size() : std::min<std::size_t>(6, hint->size());
426
+ Box box;
427
+ for (std::size_t i = 0; i + 6 <= floats; i += 6) {
428
+ box.Extend(AuthoredExtent(std::span(*hint).subspan(i, 6)));
429
+ }
430
+ return box;
383
431
  }
384
432
 
385
433
  const Column* Scene::AuthoredColumn(PrimId prim, std::string_view attribute) const {
@@ -429,4 +477,18 @@ ColumnType Scene::TypeForUndeclared(PrimId prim, std::string_view attribute,
429
477
  return *type;
430
478
  }
431
479
 
480
+ std::optional<PrimId> ExtentRows::Resolve(const Target& target) const {
481
+ return target.path != kNoPath ? store.Find(target.path) : std::nullopt;
482
+ }
483
+
484
+ std::optional<Box> ExtentRows::ExtentInRowSpace(PrimId other, std::uint32_t row) const {
485
+ const std::optional<Box> extent = scene->Extent(other);
486
+ if (!extent) {
487
+ return std::nullopt;
488
+ }
489
+ const PrimId own = store.GetBucket(bucket).prims[row];
490
+ return extent->Transformed(glm::inverse(scene->WorldTransform(own)) *
491
+ scene->WorldTransform(other));
492
+ }
493
+
432
494
  } // namespace ernie
@@ -121,10 +121,13 @@ 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;
129
+ /// @return The attribute's value when the prim authors it as a `T`, or null.
130
+ template <typename T> const T* Authored(PrimId prim, std::string_view attribute) const;
128
131
  const AttributeDef* Declared(BucketId bucket, AttributeId attribute) const;
129
132
  /// @return Whether the prim's type or an applied API schema leaves the attribute's namespace
130
133
  /// open; any attribute for a prim without a type.
@@ -132,6 +135,8 @@ class Scene {
132
135
  ColumnType TypeForUndeclared(PrimId prim, std::string_view attribute, const Value& value) const;
133
136
  /// @return Whether the prim and its subtree are invisible or of a purpose bounds leave out.
134
137
  bool LeavesOutOfBounds(PrimId prim) const;
138
+ /// @return GeomModelAPI's extentsHint: the default purpose's box, or with `allPurposes`, all.
139
+ Box ExtentsHint(PrimId prim, bool allPurposes) const;
135
140
  /// Adds a subtree's extents under `parent`'s transform; with `visibleOnly`, only its visible
136
141
  /// default-purpose prims'.
137
142
  void AddTo(Box& bounds, PathId path, const glm::dmat4& parent, bool visibleOnly) 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,78 @@
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(GeomModelAPI, SingleApply, kInheritExtent, ERNIE_MODEL_API_ATTRIBUTES)
64
+ ERNIE_DEFINE_SCHEMA(GeomSubset, Concrete, kNoExtent, ERNIE_SUBSET_ATTRIBUTES)
65
+ ERNIE_DEFINE_SCHEMA(Cube, Concrete, ComputedExtent(CentredExtent<CubeHalves>),
66
+ ERNIE_CUBE_ATTRIBUTES)
67
+ ERNIE_DEFINE_SCHEMA(Sphere, Concrete, ComputedExtent(CentredExtent<SphereHalves>),
68
+ ERNIE_SPHERE_ATTRIBUTES)
69
+ ERNIE_DEFINE_SCHEMA(Cylinder, Concrete, ComputedExtent(CentredExtent<RoundHalves<false>>),
70
+ ERNIE_CYLINDER_ATTRIBUTES)
71
+ ERNIE_DEFINE_SCHEMA(Cone, Concrete, ComputedExtent(CentredExtent<RoundHalves<false>>),
72
+ ERNIE_CYLINDER_ATTRIBUTES)
73
+ ERNIE_DEFINE_SCHEMA(Capsule, Concrete, ComputedExtent(CentredExtent<RoundHalves<true>>),
74
+ ERNIE_CAPSULE_ATTRIBUTES)
75
+ ERNIE_DEFINE_SCHEMA(Plane, Concrete, ComputedExtent(CentredExtent<PlaneHalves>),
76
+ ERNIE_PLANE_ATTRIBUTES)
77
+
78
+ } // namespace ernie
@@ -10,6 +10,7 @@
10
10
  #include "ernie/scene/view.h"
11
11
 
12
12
  #include <array>
13
+ #include <span>
13
14
  #include <string>
14
15
  #include <string_view>
15
16
  #include <vector>
@@ -51,6 +52,47 @@
51
52
  "The winding of its front faces.", .group = "Geometry", \
52
53
  .options = {"rightHanded", "leftHanded"}, .dirty = Dirty::Topology)
53
54
 
55
+ #define ERNIE_CARD_TEXTURE(X, Name, usdName) \
56
+ X(std::string, Name, usdName, "", "The image on the card facing this way.", .group = "Model", \
57
+ .asset = true, .dirty = Dirty::Params)
58
+
59
+ #define ERNIE_MODEL_API_ATTRIBUTES(X) \
60
+ X(std::string, DrawMode, "model:drawMode", "inherited", \
61
+ "Draws the subtree as itself, or as a stand-in: its origin axes, its bounds or cards.", \
62
+ .group = "Model", .options = {"origin", "bounds", "cards", "default", "inherited"}, \
63
+ .dirty = Dirty::Visibility) \
64
+ X(bool, ApplyDrawMode, "model:applyDrawMode", false, \
65
+ "Whether this prim's draw mode replaces its subtree.", .group = "Model", \
66
+ .dirty = Dirty::Visibility) \
67
+ X(glm::dvec3, DrawModeColor, "model:drawModeColor", glm::dvec3(0.18), \
68
+ "Linear RGB of the stand-in.", .group = "Model", .lower = AtLeast(0.0), .color = true, \
69
+ .dirty = Dirty::Params) \
70
+ X(std::string, CardGeometry, "model:cardGeometry", "cross", \
71
+ "Cards through the centre, on the bounds' faces, or as the textures place them.", \
72
+ .group = "Model", .options = {"cross", "box", "fromTexture"}, .dirty = Dirty::Params) \
73
+ X(std::string, CardVisibility, "model:cardVisibility", "inherited", \
74
+ "Every textured card, or only one per axis.", .group = "Model", \
75
+ .options = {"full", "simple", "inherited"}, .dirty = Dirty::Params) \
76
+ ERNIE_CARD_TEXTURE(X, CardTextureXPos, "model:cardTextureXPos") \
77
+ ERNIE_CARD_TEXTURE(X, CardTextureYPos, "model:cardTextureYPos") \
78
+ ERNIE_CARD_TEXTURE(X, CardTextureZPos, "model:cardTextureZPos") \
79
+ ERNIE_CARD_TEXTURE(X, CardTextureXNeg, "model:cardTextureXNeg") \
80
+ ERNIE_CARD_TEXTURE(X, CardTextureYNeg, "model:cardTextureYNeg") \
81
+ ERNIE_CARD_TEXTURE(X, CardTextureZNeg, "model:cardTextureZNeg") \
82
+ X(std::vector<float>, ExtentsHint, "extentsHint", std::vector<float>{}, \
83
+ "The subtree's local bounds per purpose (default, render, proxy, guide), six floats each, " \
84
+ "read while it isn't loaded.", .group = "Model")
85
+
86
+ #define ERNIE_SUBSET_ATTRIBUTES(X) \
87
+ X(std::string, ElementType, "elementType", "face", "What its indices count.", \
88
+ .group = "Subset", .options = {"face", "point", "edge", "segment", "tetrahedron"}, \
89
+ .dirty = Dirty::Topology) \
90
+ X(Tensor, Indices, "indices", Tensor(), "The elements in the subset.", .group = "Subset", \
91
+ .integer = true, .dirty = Dirty::Topology) \
92
+ X(std::string, FamilyName, "familyName", "", \
93
+ "The family of subsets it is one of, as materialBind for per-face materials.", \
94
+ .group = "Subset", .dirty = Dirty::Topology)
95
+
54
96
  #define ERNIE_SHAPE_LENGTH .group = "Shape", .lower = AtLeast(0.0), .finite = true
55
97
 
56
98
  #define ERNIE_AXIS_ATTRIBUTE(X) \
@@ -86,7 +128,7 @@ namespace ernie {
86
128
 
87
129
  /// @return A Boundable's authored `extent` (min x, y, z, max x, y, z), which extent functions
88
130
  /// read while the data they bound isn't on the host; empty when unset.
89
- inline Box AuthoredExtent(const std::vector<float>& extent) {
131
+ inline Box AuthoredExtent(std::span<const float> extent) {
90
132
  if (extent.size() != 6) {
91
133
  return {};
92
134
  }
@@ -99,85 +141,32 @@ template <> struct ChoiceTokens<Axis> {
99
141
  static constexpr std::array<std::string_view, 3> kTokens{"X", "Y", "Z"};
100
142
  };
101
143
 
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
- };
144
+ ERNIE_SCHEMA(Imageable, SchemaView, ERNIE_IMAGEABLE_ATTRIBUTES,
145
+ "What every prim has: visibility, purpose and the world it is in.");
146
+ ERNIE_SCHEMA(Xformable, Imageable, ERNIE_XFORMABLE_ATTRIBUTES,
147
+ "What has a transform, composed from its xformOps.");
148
+ ERNIE_SCHEMA(Boundable, Xformable, ERNIE_BOUNDABLE_ATTRIBUTES,
149
+ "What has an extent in its own space, computed from its attributes.");
150
+ ERNIE_SCHEMA(Gprim, Boundable, ERNIE_GPRIM_ATTRIBUTES,
151
+ "Geometry, drawn in a display colour or with a bound material.");
152
+ ERNIE_CONCRETE_SCHEMA(Xform, Xformable, ERNIE_NO_ATTRIBUTES, "A transform grouping its children.");
153
+ ERNIE_CONCRETE_SCHEMA(Scope, Imageable, ERNIE_NO_ATTRIBUTES,
154
+ "A grouping without a transform of its own.");
155
+ ERNIE_API_SCHEMA(GeomModelAPI, ERNIE_MODEL_API_ATTRIBUTES,
156
+ "A model's stand-ins and the bounds hint used while its subtree isn't loaded.");
157
+ ERNIE_CONCRETE_SCHEMA(GeomSubset, SchemaView, ERNIE_SUBSET_ATTRIBUTES,
158
+ "Some faces, points, edges, segments or tetrahedra of its parent, to bind a "
159
+ "material to or select.");
160
+ ERNIE_CONCRETE_SCHEMA(Cube, Gprim, ERNIE_CUBE_ATTRIBUTES,
161
+ "A box centred on its origin, size along each axis.");
162
+ ERNIE_CONCRETE_SCHEMA(Sphere, Gprim, ERNIE_SPHERE_ATTRIBUTES, "A sphere centred on its origin.");
163
+ ERNIE_CONCRETE_SCHEMA(Cylinder, Gprim, ERNIE_CYLINDER_ATTRIBUTES,
164
+ "A capped cylinder along its axis.");
165
+ ERNIE_CONCRETE_SCHEMA(Cone, Gprim, ERNIE_CYLINDER_ATTRIBUTES,
166
+ "A capped cone along its axis, its apex at +height / 2.");
167
+ ERNIE_CONCRETE_SCHEMA(Capsule, Gprim, ERNIE_CAPSULE_ATTRIBUTES,
168
+ "A cylinder with hemispherical caps along its axis.");
169
+ ERNIE_CONCRETE_SCHEMA(Plane, Gprim, ERNIE_PLANE_ATTRIBUTES,
170
+ "A one-sided rectangle facing along its axis.");
182
171
 
183
172
  } // namespace ernie