ernie-renderer 0.1.0.dev189__tar.gz → 0.1.0.dev196__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.
Files changed (513) hide show
  1. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/PKG-INFO +1 -1
  3. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/slang.cmake +4 -0
  4. ernie_renderer-0.1.0.dev196/demos/batched/batch_camera.cpp +399 -0
  5. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/batched/batch_camera.py +14 -5
  6. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/lighting/illuminants.cpp +3 -1
  7. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/lighting/illuminants.py +3 -1
  8. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/cli.cpp +5 -7
  9. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/shading.slang +89 -27
  10. ernie_renderer-0.1.0.dev196/ernie/kernel/raster/terrain_horizon.slang +91 -0
  11. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/CMakeLists.txt +5 -0
  12. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/delegate.cpp +7 -4
  13. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/ground_drawable.cpp +5 -4
  14. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/mesh_drawable.cpp +16 -9
  15. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/mesh_drawable.h +1 -0
  16. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/renderer.cpp +32 -5
  17. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/renderer.h +9 -0
  18. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/terrain_drawable.cpp +23 -1
  19. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/terrain_drawable.h +2 -0
  20. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/resolve.cpp +34 -12
  21. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_demos.py +1 -1
  22. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_lights_gpu_test.cpp +44 -0
  23. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/session_lights_test.cpp +27 -0
  24. ernie_renderer-0.1.0.dev196/ernie/test/util_ies_test.cpp +176 -0
  25. ernie_renderer-0.1.0.dev196/ernie/util/ies.cpp +305 -0
  26. ernie_renderer-0.1.0.dev196/ernie/util/ies.h +88 -0
  27. ernie_renderer-0.1.0.dev189/ernie/kernel/raster/terrain_horizon.slang +0 -80
  28. ernie_renderer-0.1.0.dev189/ernie/test/util_ies_test.cpp +0 -75
  29. ernie_renderer-0.1.0.dev189/ernie/util/ies.cpp +0 -189
  30. ernie_renderer-0.1.0.dev189/ernie/util/ies.h +0 -46
  31. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.clang-format +0 -0
  32. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.clang-tidy +0 -0
  33. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.cmake-format.yaml +0 -0
  34. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.gitattributes +0 -0
  35. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  36. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  37. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/dependabot.yml +0 -0
  38. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/pull_request_template.md +0 -0
  39. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/scripts/ci_metrics.py +0 -0
  40. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/workflows/ci-metrics.yml +0 -0
  41. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.github/workflows/ci.yml +0 -0
  42. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.gitignore +0 -0
  43. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/.pre-commit-config.yaml +0 -0
  44. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/CITATION.cff +0 -0
  45. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/CMakePresets.json +0 -0
  46. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/CONTRIBUTING.md +0 -0
  47. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/LICENSE +0 -0
  48. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/README.md +0 -0
  49. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/EmbedShaders.cmake +0 -0
  50. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ErnieCPackOptions.cmake +0 -0
  51. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ErnieConfig.cmake.in +0 -0
  52. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ErnieInstall.cmake +0 -0
  53. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ErnieLicenses.cmake +0 -0
  54. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ErniePackaging.cmake +0 -0
  55. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ErnieTesting.cmake +0 -0
  56. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/cppcheck/ernie.cfg +0 -0
  57. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/ernie_exports.map +0 -0
  58. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/dear_imgui/CMakeLists.txt +0 -0
  59. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/dear_imgui.cmake +0 -0
  60. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/dlpack.cmake +0 -0
  61. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/embed_file.cmake +0 -0
  62. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/glfw.cmake +0 -0
  63. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/glm.cmake +0 -0
  64. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/googletest.cmake +0 -0
  65. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/gui_fonts.cmake +0 -0
  66. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/imguizmo.cmake +0 -0
  67. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/implot.cmake +0 -0
  68. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/json.cmake +0 -0
  69. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/meshoptimizer.cmake +0 -0
  70. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/moltenvk.cmake +0 -0
  71. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/nanobind.cmake +0 -0
  72. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/openexr.cmake +0 -0
  73. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/stb.cmake +0 -0
  74. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/tracy.cmake +0 -0
  75. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/vma/vma.cpp +0 -0
  76. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/vma.cmake +0 -0
  77. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/volk.cmake +0 -0
  78. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/cmake/third_party/vulkan_headers.cmake +0 -0
  79. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/CMakeLists.txt +0 -0
  80. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/main.cpp +0 -0
  81. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/util.cpp +0 -0
  82. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/util.h +0 -0
  83. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/viewer/sun_panel.cpp +0 -0
  84. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/demos/viewer/sun_panel.py +0 -0
  85. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/Makefile +0 -0
  86. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/README.md +0 -0
  87. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/cpp.md +0 -0
  88. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/app.md +0 -0
  89. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/astronomy.md +0 -0
  90. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/batch.md +0 -0
  91. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/cameras.md +0 -0
  92. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/demo.md +0 -0
  93. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/rendering.md +0 -0
  94. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/scene.md +0 -0
  95. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/schemas.md +0 -0
  96. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/api/python/tokens.md +0 -0
  97. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/cameras.md +0 -0
  98. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/lighting.md +0 -0
  99. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/materials.md +0 -0
  100. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/scene.md +0 -0
  101. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/sensor-filters.md +0 -0
  102. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/shadows.md +0 -0
  103. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/spectral.md +0 -0
  104. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/star-fields.md +0 -0
  105. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/terrain.md +0 -0
  106. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/concepts/transforms.md +0 -0
  107. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/css/extra.css +0 -0
  108. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-aovs.md +0 -0
  109. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-brdfs.md +0 -0
  110. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-lenses.md +0 -0
  111. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-panels.md +0 -0
  112. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-render-delegates.md +0 -0
  113. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-sensor-filters.md +0 -0
  114. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-spectra.md +0 -0
  115. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/custom-star-catalogs.md +0 -0
  116. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/debug-draw.md +0 -0
  117. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/frame-callbacks.md +0 -0
  118. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/extending/index.md +0 -0
  119. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/getting-started/demos.md +0 -0
  120. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/getting-started/installation.md +0 -0
  121. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/getting-started/quickstart.md +0 -0
  122. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/getting-started/viewer.md +0 -0
  123. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/guides/batched-rendering.md +0 -0
  124. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/guides/gpu-interop.md +0 -0
  125. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/guides/scenes.md +0 -0
  126. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/index.md +0 -0
  127. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/docs/requirements.txt +0 -0
  128. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/CMakeLists.txt +0 -0
  129. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/CMakeLists.txt +0 -0
  130. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/app.h +0 -0
  131. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/builtin_panels.h +0 -0
  132. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/camera_panel.cpp +0 -0
  133. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/cli.h +0 -0
  134. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/create.cpp +0 -0
  135. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/create.h +0 -0
  136. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/demo.cpp +0 -0
  137. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/demo.h +0 -0
  138. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/file_dialog.cpp +0 -0
  139. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/file_dialog.h +0 -0
  140. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/icons.h +0 -0
  141. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/log_panel.cpp +0 -0
  142. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/main.cpp +0 -0
  143. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/panel.cpp +0 -0
  144. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/panel.h +0 -0
  145. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/prim_icons.cpp +0 -0
  146. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/prim_icons.h +0 -0
  147. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/prim_schemas.cpp +0 -0
  148. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/prim_schemas.h +0 -0
  149. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/profiler_panel.cpp +0 -0
  150. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/properties_panel.cpp +0 -0
  151. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/property_fields.cpp +0 -0
  152. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/property_fields.h +0 -0
  153. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/session.cpp +0 -0
  154. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/session.h +0 -0
  155. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/settings_panel.cpp +0 -0
  156. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/stage_panel.cpp +0 -0
  157. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/theme.cpp +0 -0
  158. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/theme.h +0 -0
  159. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/viewer.cpp +0 -0
  160. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/app/viewer.h +0 -0
  161. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/CMakeLists.txt +0 -0
  162. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/buffer.cpp +0 -0
  163. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/buffer.h +0 -0
  164. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/compute_interop.cpp +0 -0
  165. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/compute_interop.h +0 -0
  166. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/cuda_interop.cpp +0 -0
  167. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/cuda_interop.h +0 -0
  168. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/frame_uploads.cpp +0 -0
  169. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/frame_uploads.h +0 -0
  170. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/gpu_profile.h +0 -0
  171. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/gpu_timer.cpp +0 -0
  172. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/gpu_timer.h +0 -0
  173. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/image.cpp +0 -0
  174. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/image.h +0 -0
  175. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/offscreen_target.cpp +0 -0
  176. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/offscreen_target.h +0 -0
  177. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/pipeline.cpp +0 -0
  178. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/pipeline.h +0 -0
  179. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/shader_compiler.cpp +0 -0
  180. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/shader_compiler.h +0 -0
  181. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/swapchain.cpp +0 -0
  182. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/swapchain.h +0 -0
  183. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/vulkan_context.cpp +0 -0
  184. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/device/vulkan_context.h +0 -0
  185. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/CMakeLists.txt +0 -0
  186. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/cube_sphere_lod.cpp +0 -0
  187. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/cube_sphere_lod.h +0 -0
  188. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/frustum.cpp +0 -0
  189. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/frustum.h +0 -0
  190. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/lod_quadtree.cpp +0 -0
  191. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/lod_quadtree.h +0 -0
  192. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/mesh_data.cpp +0 -0
  193. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/mesh_data.h +0 -0
  194. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/primitives.cpp +0 -0
  195. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/geometry/primitives.h +0 -0
  196. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/CMakeLists.txt +0 -0
  197. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/brdf.slang +0 -0
  198. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/hapke.slang +0 -0
  199. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/lambert.slang +0 -0
  200. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/lommel_seeliger.slang +0 -0
  201. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/lunar_lambert.slang +0 -0
  202. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/oren_nayar.slang +0 -0
  203. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/closure/preview_surface.slang +0 -0
  204. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/embedded_shaders.h +0 -0
  205. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/cube_faces.slang +0 -0
  206. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_bayer.slang +0 -0
  207. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_blooming.slang +0 -0
  208. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_color_matrix.slang +0 -0
  209. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_compand.slang +0 -0
  210. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_compand_table.slang +0 -0
  211. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_dark_current.slang +0 -0
  212. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_defect_pixels.slang +0 -0
  213. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_defocus.slang +0 -0
  214. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_demosaic.slang +0 -0
  215. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_detector_pattern.slang +0 -0
  216. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_glare.slang +0 -0
  217. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_jpeg.slang +0 -0
  218. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_lag.slang +0 -0
  219. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_measured_qe.slang +0 -0
  220. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_psf.slang +0 -0
  221. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_readout_taps.slang +0 -0
  222. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_smear.slang +0 -0
  223. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_spectral_transmission.slang +0 -0
  224. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_tdi.slang +0 -0
  225. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_temporal_average.slang +0 -0
  226. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_tone_curve.slang +0 -0
  227. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/filter_white_balance.slang +0 -0
  228. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/lens.slang +0 -0
  229. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/pyramid.slang +0 -0
  230. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/film/sensor.slang +0 -0
  231. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/cull.slang +0 -0
  232. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/depth_range.slang +0 -0
  233. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/frame.slang +0 -0
  234. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/ground.slang +0 -0
  235. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/hzb.slang +0 -0
  236. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/instance_anchors.slang +0 -0
  237. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/instance_compose.slang +0 -0
  238. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/light_views.slang +0 -0
  239. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/mesh.slang +0 -0
  240. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/mesh_normals.slang +0 -0
  241. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/meter.slang +0 -0
  242. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/minimal_resolve.slang +0 -0
  243. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/motion.slang +0 -0
  244. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/motion_vectors.slang +0 -0
  245. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/overlay.slang +0 -0
  246. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/planet.slang +0 -0
  247. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/planet_color.slang +0 -0
  248. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/planet_shadow.slang +0 -0
  249. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/points.slang +0 -0
  250. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/present.slang +0 -0
  251. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/projection_pinhole.slang +0 -0
  252. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/projection_pushbroom.slang +0 -0
  253. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/surface.slang +0 -0
  254. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/terrain.slang +0 -0
  255. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/terrain_color.slang +0 -0
  256. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/terrain_shadow.slang +0 -0
  257. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/terrain_update.slang +0 -0
  258. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/kernel/raster/views.slang +0 -0
  259. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/app.cpp +0 -0
  260. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/bindings.h +0 -0
  261. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/demo.cpp +0 -0
  262. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/__init__.py +0 -0
  263. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/__main__.py +0 -0
  264. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/app.py +0 -0
  265. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/batch.py +0 -0
  266. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/cli.py +0 -0
  267. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/demo.py +0 -0
  268. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/demos/__init__.py +0 -0
  269. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/demos/__main__.py +0 -0
  270. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/ernie/schema.py +0 -0
  271. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/module.cpp +0 -0
  272. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/render.cpp +0 -0
  273. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/scene.cpp +0 -0
  274. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/scene_json.cpp +0 -0
  275. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/schema.cpp +0 -0
  276. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/stub_schema.py +0 -0
  277. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/python/tensor.cpp +0 -0
  278. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/CMakeLists.txt +0 -0
  279. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/delegate.h +0 -0
  280. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/drawable.h +0 -0
  281. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/ground_drawable.h +0 -0
  282. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/material.cpp +0 -0
  283. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/material.h +0 -0
  284. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/minimal_targets.cpp +0 -0
  285. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/minimal_targets.h +0 -0
  286. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/overlay_pass.cpp +0 -0
  287. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/overlay_pass.h +0 -0
  288. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/planet_drawable.cpp +0 -0
  289. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/planet_drawable.h +0 -0
  290. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/points_drawable.cpp +0 -0
  291. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/points_drawable.h +0 -0
  292. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/poisson_disk.cpp +0 -0
  293. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/poisson_disk.h +0 -0
  294. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/render_targets.cpp +0 -0
  295. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/render_targets.h +0 -0
  296. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/sensor_plan.cpp +0 -0
  297. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/sensor_plan.h +0 -0
  298. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/shadow_cascades.cpp +0 -0
  299. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/raster/shadow_cascades.h +0 -0
  300. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/CMakeLists.txt +0 -0
  301. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/base_schemas.cpp +0 -0
  302. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/base_schemas.h +0 -0
  303. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/brdf.cpp +0 -0
  304. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/brdf.h +0 -0
  305. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/cahvore.cpp +0 -0
  306. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/cahvore.h +0 -0
  307. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/camera.cpp +0 -0
  308. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/camera.h +0 -0
  309. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/camera_schemas.cpp +0 -0
  310. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/camera_schemas.h +0 -0
  311. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/edit_history.cpp +0 -0
  312. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/edit_history.h +0 -0
  313. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/geometry_schemas.cpp +0 -0
  314. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/geometry_schemas.h +0 -0
  315. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/instruments.cpp +0 -0
  316. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/instruments.h +0 -0
  317. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/isd.cpp +0 -0
  318. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/isd.h +0 -0
  319. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/light_schemas.cpp +0 -0
  320. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/light_schemas.h +0 -0
  321. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/material.h +0 -0
  322. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/material_schemas.cpp +0 -0
  323. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/material_schemas.h +0 -0
  324. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/orbit_controller.cpp +0 -0
  325. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/orbit_controller.h +0 -0
  326. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/overlay.cpp +0 -0
  327. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/overlay.h +0 -0
  328. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/path.cpp +0 -0
  329. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/path.h +0 -0
  330. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/prim_type.cpp +0 -0
  331. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/prim_type.h +0 -0
  332. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/render_schemas.cpp +0 -0
  333. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/render_schemas.h +0 -0
  334. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/scene.cpp +0 -0
  335. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/scene.h +0 -0
  336. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/scene_json.cpp +0 -0
  337. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/scene_json.h +0 -0
  338. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/schema.cpp +0 -0
  339. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/schema.h +0 -0
  340. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/sensor_filters.cpp +0 -0
  341. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/sensor_filters.h +0 -0
  342. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/terrain_schemas.cpp +0 -0
  343. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/terrain_schemas.h +0 -0
  344. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/tokens.h +0 -0
  345. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/value.h +0 -0
  346. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/wide_view.cpp +0 -0
  347. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/wide_view.h +0 -0
  348. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/xform.cpp +0 -0
  349. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/scene/xform.h +0 -0
  350. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/CMakeLists.txt +0 -0
  351. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/backends.cpp +0 -0
  352. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/delegate.cpp +0 -0
  353. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/delegate.h +0 -0
  354. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/frame_params.cpp +0 -0
  355. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/frame_params.h +0 -0
  356. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/outputs.cpp +0 -0
  357. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/outputs.h +0 -0
  358. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/product_frame.h +0 -0
  359. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/renderer.cpp +0 -0
  360. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/renderer.h +0 -0
  361. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/resolve.h +0 -0
  362. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/session/sampling.h +0 -0
  363. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/CMakeLists.txt +0 -0
  364. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_demo_gpu_test.cpp +0 -0
  365. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_demo_test.cpp +0 -0
  366. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_file_dialog_test.cpp +0 -0
  367. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_panel_test.cpp +0 -0
  368. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_prim_schemas_test.cpp +0 -0
  369. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_session_test.cpp +0 -0
  370. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_theme_test.cpp +0 -0
  371. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/app_viewer_gpu_test.cpp +0 -0
  372. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/device_cuda_interop_test.cpp +0 -0
  373. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/device_frame_uploads_test.cpp +0 -0
  374. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/device_pipeline_test.cpp +0 -0
  375. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/device_shader_compiler_test.cpp +0 -0
  376. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/device_vulkan_context_test.cpp +0 -0
  377. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/cahvore/README.md +0 -0
  378. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/cahvore/m2020_camera_models.json +0 -0
  379. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/images/grey16.png +0 -0
  380. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/README.md +0 -0
  381. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/constVelocityLineScan.json +0 -0
  382. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/ctxLineScan.json +0 -0
  383. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/dawnfc_radtan.json +0 -0
  384. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/lroWacPushFrame.json +0 -0
  385. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/orbitalFramer.json +0 -0
  386. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/orbitalLineScan.json +0 -0
  387. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/orbitalPushFrame.json +0 -0
  388. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/simpleFramerISD.json +0 -0
  389. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/isd/toughLroNacLineScan.json +0 -0
  390. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/fixtures/scene_basic.json +0 -0
  391. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/geometry_cube_sphere_lod_test.cpp +0 -0
  392. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/geometry_frustum_test.cpp +0 -0
  393. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/geometry_lod_quadtree_test.cpp +0 -0
  394. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/geometry_mesh_data_test.cpp +0 -0
  395. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/geometry_primitives_test.cpp +0 -0
  396. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/install/CMakeLists.txt +0 -0
  397. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/install/consumer.cpp +0 -0
  398. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/install/run_install_test.cmake +0 -0
  399. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/conftest.py +0 -0
  400. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_app.py +0 -0
  401. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_batch.py +0 -0
  402. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_cahvore.py +0 -0
  403. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_cuda.py +0 -0
  404. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_filters.py +0 -0
  405. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_instruments.py +0 -0
  406. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_isd.py +0 -0
  407. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_map.py +0 -0
  408. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_materials.py +0 -0
  409. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_minimal.py +0 -0
  410. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_overlays.py +0 -0
  411. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_readme.py +0 -0
  412. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_render.py +0 -0
  413. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_scene.py +0 -0
  414. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_schema.py +0 -0
  415. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_schema_camera.py +0 -0
  416. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_schema_geometry.py +0 -0
  417. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_schema_material.py +0 -0
  418. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_schema_render.py +0 -0
  419. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_schema_terrain.py +0 -0
  420. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_stars.py +0 -0
  421. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_step.py +0 -0
  422. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform.py +0 -0
  423. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform_gpu.py +0 -0
  424. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform_gpu_cameras.py +0 -0
  425. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform_gpu_compose.py +0 -0
  426. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform_gpu_lights.py +0 -0
  427. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform_gpu_map.py +0 -0
  428. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/python/test_xform_gpu_points.py +0 -0
  429. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_batch_gpu_test.cpp +0 -0
  430. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_culling_gpu_test.cpp +0 -0
  431. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_delegate_gpu_test.cpp +0 -0
  432. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_delegate_test.cpp +0 -0
  433. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_gpu_meshes_gpu_test.cpp +0 -0
  434. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_gpu_terrain_gpu_test.cpp +0 -0
  435. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_hex_tiling_gpu_test.cpp +0 -0
  436. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_lens_rays_gpu_test.cpp +0 -0
  437. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_mesh_drawable_test.cpp +0 -0
  438. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_motion_gpu_test.cpp +0 -0
  439. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_overlays_gpu_test.cpp +0 -0
  440. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_planet_gpu_test.cpp +0 -0
  441. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_points_gpu_test.cpp +0 -0
  442. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_poisson_disk_test.cpp +0 -0
  443. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_products_gpu_test.cpp +0 -0
  444. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_sensor_filters_gpu_test.cpp +0 -0
  445. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_sensor_plan_test.cpp +0 -0
  446. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_shadow_cascades_test.cpp +0 -0
  447. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_standard_filters_gpu_test.cpp +0 -0
  448. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_terrain_drawable_test.cpp +0 -0
  449. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_textures_gpu_test.cpp +0 -0
  450. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/raster_zero_copy_gpu_test.cpp +0 -0
  451. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_brdf_test.cpp +0 -0
  452. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_brdf_vulkan_test.cpp +0 -0
  453. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_cahvore_test.cpp +0 -0
  454. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_camera_schemas_test.cpp +0 -0
  455. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_camera_test.cpp +0 -0
  456. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_edit_history_test.cpp +0 -0
  457. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_geometry_schemas_test.cpp +0 -0
  458. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_isd_test.cpp +0 -0
  459. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_json_test.cpp +0 -0
  460. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_material_schemas_test.cpp +0 -0
  461. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_orbit_controller_test.cpp +0 -0
  462. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_overlay_test.cpp +0 -0
  463. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_path_test.cpp +0 -0
  464. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_prim_type_test.cpp +0 -0
  465. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_render_schemas_test.cpp +0 -0
  466. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_scene_test.cpp +0 -0
  467. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_schema_test.cpp +0 -0
  468. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_sensor_filters_test.cpp +0 -0
  469. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_terrain_schemas_test.cpp +0 -0
  470. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_wide_view_test.cpp +0 -0
  471. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/scene_xform_test.cpp +0 -0
  472. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/session_delegate_test.cpp +0 -0
  473. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/session_frame_params_test.cpp +0 -0
  474. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/session_gpu_xform_test.cpp +0 -0
  475. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/session_resolve_test.cpp +0 -0
  476. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/session_sampling_test.cpp +0 -0
  477. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/support/brdf_reference.h +0 -0
  478. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/support/delegate_scenes.cpp +0 -0
  479. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/support/delegate_scenes.h +0 -0
  480. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/support/terrain_harness.h +0 -0
  481. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/support/test_raster.h +0 -0
  482. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/support/vulkan_fixture.h +0 -0
  483. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/util_astronomy_test.cpp +0 -0
  484. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/util_image_test.cpp +0 -0
  485. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/util_spectrum_test.cpp +0 -0
  486. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/test/util_tensor_test.cpp +0 -0
  487. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/CMakeLists.txt +0 -0
  488. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/astronomy.cpp +0 -0
  489. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/astronomy.h +0 -0
  490. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/image.cpp +0 -0
  491. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/image.h +0 -0
  492. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/least_squares.h +0 -0
  493. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/profile.h +0 -0
  494. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/profiler.cpp +0 -0
  495. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/profiler.h +0 -0
  496. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/raster_checks.h +0 -0
  497. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/raster_view.h +0 -0
  498. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/shader_source.h +0 -0
  499. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/spectrum.cpp +0 -0
  500. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/spectrum.h +0 -0
  501. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/tensor.cpp +0 -0
  502. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/ernie/util/tensor.h +0 -0
  503. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/mkdocs.yml +0 -0
  504. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/pyproject.toml +0 -0
  505. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/README.md +0 -0
  506. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/cameramodelutilsjs/LICENSE +0 -0
  507. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/dlpack/LICENSE +0 -0
  508. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/dlpack/include/dlpack/dlpack.h +0 -0
  509. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/stb/LICENSE +0 -0
  510. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/stb/stb.cpp +0 -0
  511. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/stb/stb_easy_font.h +0 -0
  512. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/stb/stb_image.h +0 -0
  513. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev196}/third_party/stb/stb_image_write.h +0 -0
@@ -17,7 +17,7 @@ project(
17
17
  # reads it here too (pyproject.toml), and the packages turn it into "~dev12".
18
18
  # One line, as CI rewrites it and the wheel's version regex reads it.
19
19
  # cmake-format: off
20
- set(ERNIE_VERSION_SUFFIX ".dev189" CACHE STRING "Pre-release suffix of Ernie's version, such as .dev12")
20
+ set(ERNIE_VERSION_SUFFIX ".dev196" CACHE STRING "Pre-release suffix of Ernie's version, such as .dev12")
21
21
  # cmake-format: on
22
22
  set(ERNIE_VERSION "${PROJECT_VERSION}${ERNIE_VERSION_SUFFIX}")
23
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ernie-renderer
3
- Version: 0.1.0.dev189
3
+ Version: 0.1.0.dev196
4
4
  Summary: Efficient Renderer for Natural and Interplanetary Environments: a spectral Vulkan renderer with a USD-style scene and batched cameras
5
5
  Keywords: rendering,spectral,vulkan,planetary,space,sensor-simulation,reinforcement-learning,robotics
6
6
  Author: Alex Maietta
@@ -67,3 +67,7 @@ file(
67
67
  "${slang_library_dir}/slang-compiler.dll"
68
68
  "${slang_library_dir}/slang-glslang.dll")
69
69
  set(ERNIE_SLANG_RUNTIME_DIR "${slang_library_dir}")
70
+ # Windows has no rpath: a program finds its DLLs beside it, so the build's programs get Slang's.
71
+ if(WIN32 AND CMAKE_RUNTIME_OUTPUT_DIRECTORY)
72
+ file(COPY ${ERNIE_SLANG_RUNTIME} DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
73
+ endif()
@@ -0,0 +1,399 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Benchmarks batched cameras for reinforcement learning: one environment ("world") per view, each
3
+ // a clone of the first, with camera poses that change every step on the GPU, and reports the time
4
+ // per step and views rendered per second. The C++ twin of batch_camera.py.
5
+ //
6
+ // ernie --demo batched/batch_camera [--views 1024] [--bands 3] [--minimal texturedDiffuse]
7
+ // [--viewer null] [--sweep] [--output views.png]
8
+ //
9
+ // Each environment holds a few boxes and spheres over a shared ground under a sun with shadows.
10
+ // The views orbit their environment, a step's poses arrive as a CUDA array, and the observations
11
+ // stay on the GPU (a step mapped with MapDevice::Gpu), the way a training loop consumes them.
12
+ // Spectral bands (ernie:spectralBands) set most of the shading and sensor cost; RGB observations
13
+ // need few. --minimal draws with minimal shading (ernie:minimal:mode) instead: one forward pass
14
+ // straight into the observations, with no spectral shading or sensor filters; "none" renders
15
+ // black colour and distances alone.
16
+ //
17
+ // Each frame is one batch step, timed after a few steps' warm-up; --sweep first times 256, 1024
18
+ // and 4096 views at 3 and 16 bands, each in a scene of its own. The environments are clones at
19
+ // the origin, so the viewer shows them as one. --output writes 16 views of the last step, spread
20
+ // round the orbit, as a contact sheet.
21
+
22
+ #include "ernie/app/demo.h"
23
+ #include "ernie/device/compute_interop.h"
24
+ #include "ernie/scene/base_schemas.h"
25
+ #include "ernie/scene/camera_schemas.h"
26
+ #include "ernie/scene/geometry_schemas.h"
27
+ #include "ernie/scene/light_schemas.h"
28
+ #include "ernie/scene/render_schemas.h"
29
+ #include "ernie/scene/xform.h"
30
+ #include "util.h"
31
+
32
+ #include <glm/gtc/constants.hpp>
33
+
34
+ #include <algorithm>
35
+ #include <array>
36
+ #include <chrono>
37
+ #include <cmath>
38
+ #include <cstdint>
39
+ #include <cstdio>
40
+ #include <cstring>
41
+ #include <map>
42
+ #include <optional>
43
+ #include <stdexcept>
44
+ #include <string>
45
+ #include <vector>
46
+
47
+ namespace {
48
+
49
+ using namespace ernie;
50
+ using demos::Check;
51
+ using Clock = std::chrono::steady_clock;
52
+
53
+ constexpr int kSize = 64;
54
+ constexpr int kSteps = 60; // distinct poses, cycled
55
+ constexpr int kWarmup = 5; // steps before timing: uploads, pipelines, allocations
56
+
57
+ // An environment's things, cubes and spheres in turn: their colours and where they stand, the
58
+ // same in batch_camera.py.
59
+ struct Thing {
60
+ glm::dvec3 colour;
61
+ double x;
62
+ double y;
63
+ };
64
+ constexpr std::array<Thing, 6> kThings = {{
65
+ {{0.700, 0.918, 0.821}, -1.649, -1.199},
66
+ {{0.899, 0.204, 0.857}, 1.782, -0.192},
67
+ {{0.442, 0.423, 0.404}, -0.330, 0.027},
68
+ {{0.643, 0.996, 0.834}, 0.733, 2.934},
69
+ {{0.372, 0.328, 0.690}, -2.736, -2.786},
70
+ {{0.612, 0.573, 0.934}, 0.775, 0.085},
71
+ }};
72
+
73
+ constexpr std::array<const char*, 4> kMinimalModes = {"off", "none", "constantDiffuse",
74
+ "texturedDiffuse"};
75
+
76
+ const Path kCamera("/World/Camera");
77
+ const Path kProduct("/Render/BatchCamera");
78
+
79
+ void BuildScene(Scene& scene, int worlds, int bands) {
80
+ GroundPlane::Define(scene, "/World/Ground");
81
+ DistantLight::Define(scene, "/World/Sun").SetTransform(DistantLightTransform({0.4, -0.6, 0.7}));
82
+ Xform::Define(scene, "/Envs/Env0");
83
+ for (std::size_t i = 0; i < kThings.size(); ++i) {
84
+ const Path thing("/Envs/Env0/Thing" + std::to_string(i));
85
+ if (i % 2 == 0) {
86
+ Cube::Define(scene, thing).SetDisplayColor(kThings[i].colour);
87
+ } else {
88
+ Sphere::Define(scene, thing).SetDisplayColor(kThings[i].colour);
89
+ }
90
+ SetXform(scene, thing, {.translate = glm::dvec3(kThings[i].x, kThings[i].y, 0.5)});
91
+ }
92
+ for (int world = 0; world < worlds; ++world) {
93
+ const Path env("/Envs/Env" + std::to_string(world));
94
+ if (world > 0) {
95
+ scene.Clone("/Envs/Env0", env);
96
+ }
97
+ Xform(scene, env).SetWorld(world);
98
+ }
99
+ Camera::Define(scene, kCamera).SetFocalLength(18.0).SetSpectralBands(bands);
100
+ }
101
+
102
+ /// One pose per view, circling its environment from its own heading: float32 (views, 4, 4) in
103
+ /// the math convention, rows of four.
104
+ Tensor Orbit(int views, double angle) {
105
+ std::vector<float> poses;
106
+ poses.reserve(static_cast<std::size_t>(views) * 16);
107
+ for (int v = 0; v < views; ++v) {
108
+ const double heading = angle + 2.0 * glm::pi<double>() * v / views;
109
+ const glm::dmat4 pose =
110
+ LookAtTransform({8.0 * std::cos(heading), 8.0 * std::sin(heading), 5.0},
111
+ {0.0, 0.0, 0.5}, {0.0, 0.0, 1.0});
112
+ for (int row = 0; row < 4; ++row) {
113
+ for (int col = 0; col < 4; ++col) {
114
+ poses.push_back(static_cast<float>(pose[col][row]));
115
+ }
116
+ }
117
+ }
118
+ return Tensor::Copy<float>(poses, {views, 4, 4});
119
+ }
120
+
121
+ /// The render vars a batch renders: distances besides the black colour of minimal "none".
122
+ std::vector<std::string> RenderVars(const std::string& minimal) {
123
+ if (minimal == "none") {
124
+ return {"LdrColor", "DistanceToCamera"};
125
+ }
126
+ return {"LdrColor"};
127
+ }
128
+
129
+ /// A product rendering `views` views through the camera, one world each, as Python's
130
+ /// ernie.batch.BatchCamera defines it: minimal shading unless `minimal` is "off".
131
+ void DefineBatch(Scene& scene, int views, const std::string& minimal) {
132
+ std::vector<Path> vars;
133
+ for (const std::string& name : RenderVars(minimal)) {
134
+ const Path var = kProduct.Child("Vars").Child(name);
135
+ RenderVar::Define(scene, var).SetSourceName(name);
136
+ vars.push_back(var);
137
+ }
138
+ RenderProduct product = RenderProduct::Define(scene, kProduct)
139
+ .SetCamera(kCamera)
140
+ .SetResolution({kSize, kSize})
141
+ .SetOrderedVars(vars);
142
+ if (minimal != "off") {
143
+ product.SetMinimalMode(minimal);
144
+ }
145
+ std::vector<std::int32_t> worlds(static_cast<std::size_t>(views));
146
+ for (int v = 0; v < views; ++v) {
147
+ worlds[static_cast<std::size_t>(v)] = v;
148
+ }
149
+ Camera(scene, kCamera)
150
+ .SetPoses(Orbit(views, 0.0))
151
+ .SetWorlds(Tensor::Copy<std::int32_t>(worlds, {views}));
152
+ }
153
+
154
+ /// Every step's poses, in CUDA memory, as a simulator would hand them over.
155
+ std::vector<Tensor> UploadPoses(ComputeInterop& compute, int views) {
156
+ std::vector<Tensor> poses;
157
+ for (int s = 0; s < kSteps; ++s) {
158
+ poses.push_back(compute.Upload(Orbit(views, 0.03 * s)));
159
+ }
160
+ return poses;
161
+ }
162
+
163
+ /// Renders a step with `poses` and returns each render var's observations on the GPU, without
164
+ /// waiting for the render.
165
+ std::map<std::string, Tensor> StepBatch(Renderer& renderer, Scene& scene, const Tensor& poses) {
166
+ Camera(scene, kCamera).SetPoses(poses);
167
+ const Path products[] = {kProduct};
168
+ StepOperation operation = renderer.StepAsync(scene, products);
169
+ RenderProductSetOutputs outputs = operation.Outputs();
170
+ std::map<std::string, Tensor> observations;
171
+ for (auto& [name, var] : outputs.at(kProduct).vars) {
172
+ observations.emplace(name, var.Map(MapDevice::Gpu).tensor);
173
+ }
174
+ return observations;
175
+ }
176
+
177
+ ComputeInterop& RequireCuda(Renderer& renderer) {
178
+ ComputeInterop* compute = renderer.Delegate().Compute();
179
+ if (compute == nullptr) {
180
+ throw std::runtime_error("This demo needs CUDA interop");
181
+ }
182
+ return *compute;
183
+ }
184
+
185
+ /// Seconds per step of `views` views at `bands` bands, in a scene of their own.
186
+ double Benchmark(Renderer& renderer, int views, int bands, const std::string& minimal) {
187
+ Scene scene;
188
+ BuildScene(scene, views, bands);
189
+ DefineBatch(scene, views, minimal);
190
+ ComputeInterop& compute = RequireCuda(renderer);
191
+ const std::vector<Tensor> poses = UploadPoses(compute, views);
192
+ for (int s = 0; s < kWarmup; ++s) {
193
+ StepBatch(renderer, scene, poses[static_cast<std::size_t>(s)]);
194
+ }
195
+ const Clock::time_point start = Clock::now();
196
+ std::map<std::string, Tensor> observations;
197
+ for (const Tensor& pose : poses) {
198
+ observations = StepBatch(renderer, scene, pose);
199
+ }
200
+ compute.Download(observations.at("LdrColor")); // the last step has finished
201
+ return std::chrono::duration<double>(Clock::now() - start).count() / kSteps;
202
+ }
203
+
204
+ void PrintRate(int views, int bands, double perStep, const std::string& note = {}) {
205
+ std::printf("%6d views, %2d bands: %7.2f ms per step, %10.0f views per second%s\n", views,
206
+ bands, perStep * 1e3, views / perStep, note.c_str());
207
+ }
208
+
209
+ class BatchCameraDemo : public app::Demo {
210
+ public:
211
+ BatchCameraDemo(app::Viewer* viewer, const app::DemoOptions& options) : Demo(viewer, options) {
212
+ numFrames = kWarmup + kSteps;
213
+ bool sweep = false;
214
+ ParseOptions(options.extra, sweep);
215
+ Renderer& renderer = GetRenderer();
216
+ ComputeInterop& compute = RequireCuda(renderer);
217
+ std::printf("%s, %d x %d LdrColor observations\n", renderer.DeviceName().c_str(), kSize,
218
+ kSize);
219
+ if (sweep) {
220
+ for (const int bands : {3, 16}) {
221
+ for (const int views : {256, 1024, 4096}) {
222
+ PrintRate(views, bands, Benchmark(renderer, views, bands, "off"));
223
+ }
224
+ }
225
+ // Minimal shading has no spectral bands to speak of: one row per mode.
226
+ for (std::size_t m = 1; m < kMinimalModes.size(); ++m) {
227
+ for (const int views : {256, 1024, 4096}) {
228
+ PrintRate(views, 3, Benchmark(renderer, views, 3, kMinimalModes[m]),
229
+ std::string(", minimal ") + kMinimalModes[m]);
230
+ }
231
+ }
232
+ }
233
+ BuildScene(GetScene(), views_, bands_);
234
+ DefineBatch(GetScene(), views_, minimal_);
235
+ poses_ = UploadPoses(compute, views_);
236
+ }
237
+
238
+ void Step() override {
239
+ if (frame == kWarmup) {
240
+ Images(); // the warm-up has finished
241
+ timerStart_ = Clock::now();
242
+ timedSteps_ = 0;
243
+ }
244
+ observations_ =
245
+ StepBatch(GetRenderer(), GetScene(), poses_[static_cast<std::size_t>(frame % kSteps)]);
246
+ if (timerStart_) {
247
+ ++timedSteps_;
248
+ }
249
+ }
250
+
251
+ // Without a viewer the batch step is the render.
252
+ void Render() override {
253
+ if (GetViewer() != nullptr) {
254
+ GetViewer()->Step();
255
+ }
256
+ }
257
+
258
+ void SaveOutput(const std::filesystem::path& path) override {
259
+ Report();
260
+ // 16 views spread round the orbit; neighbouring views differ by only a few degrees.
261
+ const Tensor images = Images();
262
+ const auto* texels = static_cast<const std::uint8_t*>(images.Data());
263
+ const int stride = std::max(views_ / 16, 1);
264
+ Tensor sheet = Tensor::Zeros(DType::UInt8, {4 * kSize, 4 * kSize, 4});
265
+ auto* to = static_cast<std::uint8_t*>(sheet.Data());
266
+ for (int i = 0; i < 16 && i * stride < views_; ++i) {
267
+ const int r = i / 4;
268
+ const int c = i % 4;
269
+ for (int y = 0; y < kSize; ++y) {
270
+ std::memcpy(to + ((r * kSize + y) * 4 * kSize + c * kSize) * 4,
271
+ texels +
272
+ ((static_cast<std::size_t>(i * stride) * kSize + y) * kSize) * 4,
273
+ kSize * 4);
274
+ }
275
+ }
276
+ app::WritePng(path, sheet);
277
+ }
278
+
279
+ void Close() override {
280
+ Report();
281
+ }
282
+
283
+ void TestFinal() override {
284
+ Report();
285
+ const Tensor images = Images();
286
+ Check(images.Shape() == std::vector<std::int64_t>{views_, kSize, kSize, 4},
287
+ "the observations should hold a view per environment");
288
+ const std::size_t pixels = static_cast<std::size_t>(views_) * kSize * kSize;
289
+ // The values the checks look at: colours, or for minimal "none" (black by design) the
290
+ // distances in tenths of a metre, as the colours' scale.
291
+ std::vector<double> values(pixels * 3);
292
+ const auto* texels = static_cast<const std::uint8_t*>(images.Data());
293
+ if (minimal_ == "none") {
294
+ for (std::size_t i = 0; i < pixels; ++i) {
295
+ Check(texels[i * 4] == 0 && texels[i * 4 + 1] == 0 && texels[i * 4 + 2] == 0,
296
+ "minimal none renders no colour");
297
+ }
298
+ const Tensor distances =
299
+ RequireCuda(GetRenderer()).Download(observations_.at("DistanceToCamera"));
300
+ const auto* metres = static_cast<const float*>(distances.Data());
301
+ for (std::size_t i = 0; i < pixels; ++i) {
302
+ const double tenths =
303
+ std::isfinite(metres[i]) ? std::min(10.0 * metres[i], 255.0) : 0.0;
304
+ values[i * 3] = values[i * 3 + 1] = values[i * 3 + 2] = tenths;
305
+ }
306
+ } else {
307
+ for (std::size_t i = 0; i < pixels; ++i) {
308
+ for (int c = 0; c < 3; ++c) {
309
+ values[i * 3 + c] = texels[i * 4 + c];
310
+ }
311
+ }
312
+ }
313
+ double sum = 0.0;
314
+ double squares = 0.0;
315
+ for (const double value : values) {
316
+ sum += value;
317
+ squares += value * value;
318
+ }
319
+ const double mean = sum / static_cast<double>(values.size());
320
+ Check(std::sqrt(squares / static_cast<double>(values.size()) - mean * mean) > 1.0,
321
+ "the views should not render flat");
322
+ // Views from opposite headings see their environment from opposite sides.
323
+ if (views_ > 1) {
324
+ const std::size_t view = static_cast<std::size_t>(kSize) * kSize * 3;
325
+ const std::size_t opposite = static_cast<std::size_t>(views_ / 2) * view;
326
+ double largest = 0.0;
327
+ for (std::size_t i = 0; i < view; ++i) {
328
+ largest = std::max(largest, std::abs(values[i] - values[opposite + i]));
329
+ }
330
+ Check(largest > 16.0, "views from opposite headings should differ");
331
+ }
332
+ }
333
+
334
+ private:
335
+ /// --views, --bands, --minimal and --sweep among the demo's own arguments.
336
+ void ParseOptions(const std::vector<std::string>& extra, bool& sweep) {
337
+ for (std::size_t i = 0; i < extra.size(); ++i) {
338
+ const auto value = [&]() -> const std::string& {
339
+ if (i + 1 >= extra.size()) {
340
+ throw std::invalid_argument(extra[i] + " needs a value");
341
+ }
342
+ return extra[++i];
343
+ };
344
+ if (extra[i] == "--views") {
345
+ views_ = std::stoi(value());
346
+ } else if (extra[i] == "--bands") {
347
+ bands_ = std::stoi(value());
348
+ } else if (extra[i] == "--minimal") {
349
+ minimal_ = value();
350
+ if (std::find(kMinimalModes.begin(), kMinimalModes.end(), minimal_) ==
351
+ kMinimalModes.end()) {
352
+ throw std::invalid_argument("--minimal is off, none, constantDiffuse or "
353
+ "texturedDiffuse, not " +
354
+ minimal_);
355
+ }
356
+ } else if (extra[i] == "--sweep") {
357
+ sweep = true;
358
+ } else {
359
+ throw std::invalid_argument("Unknown option " + extra[i]);
360
+ }
361
+ }
362
+ if (views_ < 1) {
363
+ throw std::invalid_argument("--views needs at least one view");
364
+ }
365
+ }
366
+
367
+ /// The last step's views, uint8 (views, kSize, kSize, 4) on the host, waiting for the render.
368
+ Tensor Images() {
369
+ return RequireCuda(GetRenderer()).Download(observations_.at("LdrColor"));
370
+ }
371
+
372
+ /// Prints the time per step since the warm-up, once the last step has finished; before the
373
+ /// output and the test, so that their downloads are not counted.
374
+ void Report() {
375
+ if (observations_.empty() || timedSteps_ == 0) {
376
+ return;
377
+ }
378
+ Images(); // the last step has finished
379
+ const double perStep =
380
+ std::chrono::duration<double>(Clock::now() - *timerStart_).count() / timedSteps_;
381
+ std::string note = minimal_ == "off" ? std::string() : ", minimal " + minimal_;
382
+ note += GetViewer() == nullptr ? "" : " (with the viewer drawing)";
383
+ PrintRate(views_, bands_, perStep, note);
384
+ timedSteps_ = 0;
385
+ }
386
+
387
+ int views_ = 1024;
388
+ int bands_ = 3;
389
+ std::string minimal_ = "off";
390
+ std::vector<Tensor> poses_;
391
+ std::map<std::string, Tensor> observations_;
392
+ std::optional<Clock::time_point> timerStart_;
393
+ int timedSteps_ = 0;
394
+ };
395
+
396
+ } // namespace
397
+
398
+ ERNIE_REGISTER_DEMO(BatchCameraDemo, "batched", "batch camera",
399
+ "A view per environment rendered in batches, timed per step.");
@@ -17,7 +17,7 @@ one forward pass straight into the observations, with no spectral shading or sen
17
17
  Each frame is one batch step, timed after a few steps' warm-up; `--sweep` first times 256, 1024
18
18
  and 4096 views at 3 and 16 bands, each in a scene of its own. The environments are clones at the
19
19
  origin, so the viewer shows them as one. `--output` writes 16 views of the last step, spread round
20
- the orbit, as a contact sheet.
20
+ the orbit, as a contact sheet. The Python twin of batch_camera.cpp.
21
21
  """
22
22
 
23
23
  import time
@@ -33,6 +33,17 @@ SIZE = 64
33
33
  STEPS = 60 # distinct poses, cycled
34
34
  WARMUP = 5 # steps before timing: uploads, pipelines, allocations
35
35
 
36
+ # An environment's things, cubes and spheres in turn: their colours and where they stand, the
37
+ # same in batch_camera.cpp.
38
+ THINGS = [
39
+ ((0.700, 0.918, 0.821), (-1.649, -1.199)),
40
+ ((0.899, 0.204, 0.857), (1.782, -0.192)),
41
+ ((0.442, 0.423, 0.404), (-0.330, 0.027)),
42
+ ((0.643, 0.996, 0.834), (0.733, 2.934)),
43
+ ((0.372, 0.328, 0.690), (-2.736, -2.786)),
44
+ ((0.612, 0.573, 0.934), (0.775, 0.085)),
45
+ ]
46
+
36
47
 
37
48
  def build_scene(scene, worlds, bands):
38
49
  scene.define("/World/Ground", ernie.GroundPlane)
@@ -40,11 +51,9 @@ def build_scene(scene, worlds, bands):
40
51
  tokens.TRANSFORM, ernie.distant_light_transform((0.4, -0.6, 0.7))
41
52
  )
42
53
  env0 = scene.define("/Envs/Env0", ernie.Xform)
43
- rng = np.random.default_rng(7)
44
- for i in range(6):
54
+ for i, (colour, (x, y)) in enumerate(THINGS):
45
55
  shape = ernie.Cube if i % 2 == 0 else ernie.Sphere
46
- env0.define(f"Thing{i}", shape, display_color=tuple(rng.uniform(0.2, 1.0, 3)),
47
- translate=(*rng.uniform(-3.0, 3.0, 2), 0.5))
56
+ env0.define(f"Thing{i}", shape, display_color=colour, translate=(x, y, 0.5))
48
57
  for world in range(worlds):
49
58
  env = env0 if world == 0 else ernie.Xform(scene.clone("/Envs/Env0", f"/Envs/Env{world}"))
50
59
  env.world = world
@@ -131,10 +131,12 @@ class IlluminantsDemo : public app::Demo {
131
131
  .SetPhotometricPower(1600.0)
132
132
  .SetPhysicalCustomIlluminant(Fluorescent())
133
133
  .SetTransform(LookAtTransform({-1.2, 0.6, 2.9}, {-0.25, 1.0, 1.0}, {0.0, 1.0, 0.0}));
134
+ // ISO 400, f/2, 1/125 s: the spot's lumens fill only its 40 degree cone, so the wall in it
135
+ // is bright; the cone's centre just clips.
134
136
  Camera::Define(scene, "/World/Camera")
135
137
  .SetFocalLength(18.0)
136
138
  .SetSensorNoise(false)
137
- .SetExposureTime(1.0 / 15.0)
139
+ .SetExposureTime(1.0 / 125.0)
138
140
  .SetExposureIso(400.0)
139
141
  .SetExposureFStop(2.0)
140
142
  .SetTransform(LookAtTransform({0.0, -2.6, 1.3}, {0.0, 1.0, 1.2}, {0.0, 0.0, 1.0}));
@@ -92,8 +92,10 @@ class Demo(ernie.demo.Demo):
92
92
  physical_custom_illuminant=fluorescent()).set(
93
93
  tokens.TRANSFORM,
94
94
  ernie.look_at_transform((-1.2, 0.6, 2.9), (-0.25, 1.0, 1.0), (0.0, 1.0, 0.0)))
95
+ # ISO 400, f/2, 1/125 s: the spot's lumens fill only its 40 degree cone, so the wall in
96
+ # it is bright; the cone's centre just clips.
95
97
  camera = world.define("Camera", ernie.Camera, focal_length=18.0, sensor_noise=False,
96
- exposure_time=1.0 / 15.0, exposure_iso=400.0,
98
+ exposure_time=1.0 / 125.0, exposure_iso=400.0,
97
99
  exposure_f_stop=2.0).set(
98
100
  tokens.TRANSFORM, ernie.look_at_transform((0.0, -2.6, 1.3), (0.0, 1.0, 1.2)))
99
101
  self.scene.define("/Render/Settings", ernie.RenderSettings, camera=camera,
@@ -92,14 +92,12 @@ int ErnieMain(std::span<const std::string> args, std::string_view version) {
92
92
  std::string(kUsage).c_str(), std::string(DemoOptionsHelp()).c_str());
93
93
  return 0;
94
94
  }
95
- // The first argument that is no option is a scene file.
95
+ // Without --demo, a first argument that is no option is a scene file; the other arguments are
96
+ // the demo's own (such as --views 64).
96
97
  std::filesystem::path file;
97
- for (auto it = options.extra.begin(); it != options.extra.end(); ++it) {
98
- if (!it->starts_with("-")) {
99
- file = *it;
100
- options.extra.erase(it);
101
- break;
102
- }
98
+ if (options.demo.empty() && !options.extra.empty() && !options.extra.front().starts_with("-")) {
99
+ file = options.extra.front();
100
+ options.extra.erase(options.extra.begin());
103
101
  }
104
102
  std::vector<DemoInfo> demos = RegisteredDemos();
105
103
  if (options.list) {
@@ -147,6 +147,13 @@ struct ShadingConstants {
147
147
  // width, height, the terrain's prim id and 1 when there is one.
148
148
  float4 horizonGrid;
149
149
  uint4 horizonInfo;
150
+ // The terrain's heights (`terrainHeights`): their cell size, the frame origin's height
151
+ // (subtracted from the terrain's), the no-data value and 1 when there is one; their width
152
+ // and height.
153
+ float4 heightsGrid;
154
+ uint4 heightsSize;
155
+ // The heights above the ground the horizon map's levels see from, in height units.
156
+ float4 horizonLevels;
150
157
  }
151
158
 
152
159
  [[vk::binding(0, 0)]] StructuredBuffer<ShadingUniforms> shadingViews;
@@ -549,35 +556,85 @@ float4 occlusionSlice(float3 n, float3 tangent, float3 v, float2 horizons) {
549
556
  return float4(projectedLength * (t0 * tangent + t1 * v), projectedLength * arc);
550
557
  }
551
558
 
552
- // The terrain's horizon map (terrain_horizon.slang): per texel, the tangents of the horizon's
553
- // elevation towards azimuths 0 to 135 degrees (layer 0) and 180 to 315 (layer 1), before
554
- // vertical exaggeration.
559
+ // The terrain's horizon map (terrain_horizon.slang): per texel and level (a height above the
560
+ // ground, `ShadingConstants::horizonLevels`), the tangents of the horizon's elevation towards
561
+ // azimuths 0 to 135 degrees (layer 2 level) and 180 to 315 (layer 2 level + 1), before vertical
562
+ // exaggeration.
555
563
  [[vk::binding(19, 0)]] Texture2DArray<float4> horizonMap;
564
+ // The terrain's heights, before exaggeration, rows from its north edge.
565
+ [[vk::binding(21, 0)]] Texture2D<float> terrainHeights;
556
566
 
557
- // The horizon tangents around texel `texel` (clamped to the map), as eight values.
558
- void horizonTexel(int2 texel, out float4 first, out float4 second) {
559
- let at = clamp(texel, int2(0), int2(pass.horizonInfo.xy) - 1);
560
- first = horizonMap.Load(int4(at, 0, 0));
561
- second = horizonMap.Load(int4(at, 1, 0));
567
+ static const uint kHorizonLevels = 4;
568
+
569
+ // The horizon tangents of level `level` around texel `texel` (clamped to the map), as eight
570
+ // values, bilinear at fraction `f` towards the next texels.
571
+ void horizonAround(int2 texel, float2 f, uint level, out float4 first, out float4 second) {
572
+ let last = int2(pass.horizonInfo.xy) - 1;
573
+ float4 a[2], b[2], c[2], d[2];
574
+ for (uint side = 0; side < 2; ++side) {
575
+ let layer = 2 * level + side;
576
+ a[side] = horizonMap.Load(int4(clamp(texel, int2(0), last), layer, 0));
577
+ b[side] = horizonMap.Load(int4(clamp(texel + int2(1, 0), int2(0), last), layer, 0));
578
+ c[side] = horizonMap.Load(int4(clamp(texel + int2(0, 1), int2(0), last), layer, 0));
579
+ d[side] = horizonMap.Load(int4(clamp(texel + int2(1, 1), int2(0), last), layer, 0));
580
+ }
581
+ first = lerp(lerp(a[0], b[0], f.x), lerp(c[0], d[0], f.x), f.y);
582
+ second = lerp(lerp(a[1], b[1], f.x), lerp(c[1], d[1], f.x), f.y);
562
583
  }
563
584
 
564
- // The dome's visibility and bent normal over terrain at world point `world` (relative to the
565
- // frame's origin) with unit normal `n`, from the terrain's horizon map: the horizons around the
566
- // point (bilinear in its texels), in four vertical slices whose horizons to either side are the
567
- // map's opposite azimuths, integrated as `occlusionSlice` does about the vertical. They see the
568
- // whole terrain, on screen or not, at the map's resolution.
569
- float4 terrainOcclusion(float3 world, float3 n) {
585
+ // How far world point `world` (relative to the frame's origin) stands above the terrain under
586
+ // it, in height units (before exaggeration): bilinear in the heights. False off the terrain or
587
+ // over no-data.
588
+ bool aboveTerrain(float3 world, out float above) {
589
+ above = 0.0;
590
+ let grid = pass.horizonGrid;
591
+ let size = int2(pass.heightsSize.xy);
592
+ let cell = float2(world.x - grid.x, grid.y - world.y) / pass.heightsGrid.x - 0.5;
593
+ if (any(cell < -0.5) || any(cell > float2(size) - 0.5)) {
594
+ return false;
595
+ }
596
+ let base = int2(floor(cell));
597
+ let f = saturate(cell - float2(base));
598
+ float h[4];
599
+ for (uint k = 0; k < 4; ++k) {
600
+ let at = clamp(base + int2(k & 1, k >> 1), int2(0), size - 1);
601
+ h[k] = terrainHeights.Load(int3(at, 0));
602
+ if ((pass.heightsGrid.w > 0.5 && h[k] == pass.heightsGrid.z) || isnan(h[k])) {
603
+ return false;
604
+ }
605
+ }
606
+ let ground = lerp(lerp(h[0], h[1], f.x), lerp(h[2], h[3], f.x), f.y);
607
+ above = (world.z + pass.heightsGrid.y) / grid.w - ground;
608
+ return true;
609
+ }
610
+
611
+ // The dome's visibility and bent normal at world point `world` (relative to the frame's origin)
612
+ // with unit normal `n`, `above` height units over the terrain (0 on it), from the terrain's
613
+ // horizon map: the horizons around the point (bilinear in its texels, linear between the levels
614
+ // bracketing `above`, extrapolated past the highest), in four vertical slices whose horizons to
615
+ // either side are the map's opposite azimuths, integrated as `occlusionSlice` does about the
616
+ // vertical. They see the whole terrain, on screen or not, at the map's resolution.
617
+ float4 terrainOcclusion(float3 world, float3 n, float above) {
570
618
  let grid = pass.horizonGrid;
571
619
  let cell = float2(world.x - grid.x, grid.y - world.y) / grid.z - 0.5;
572
620
  let base = int2(floor(cell));
573
621
  let f = cell - float2(base);
574
- float4 a0, a1, b0, b1, c0, c1, d0, d1;
575
- horizonTexel(base, a0, a1);
576
- horizonTexel(base + int2(1, 0), b0, b1);
577
- horizonTexel(base + int2(0, 1), c0, c1);
578
- horizonTexel(base + int2(1, 1), d0, d1);
579
- let first = lerp(lerp(a0, b0, f.x), lerp(c0, d0, f.x), f.y) * grid.w;
580
- let second = lerp(lerp(a1, b1, f.x), lerp(c1, d1, f.x), f.y) * grid.w;
622
+ uint lower = 0;
623
+ while (lower + 2 < kHorizonLevels && above > pass.horizonLevels[lower + 1]) {
624
+ lower += 1;
625
+ }
626
+ float4 first, second;
627
+ horizonAround(base, f, lower, first, second);
628
+ if (above > 0.0) {
629
+ float4 upperFirst, upperSecond;
630
+ horizonAround(base, f, lower + 1, upperFirst, upperSecond);
631
+ let span = pass.horizonLevels[lower + 1] - pass.horizonLevels[lower];
632
+ let t = span > 0.0 ? (above - pass.horizonLevels[lower]) / span : 0.0;
633
+ first = max(lerp(first, upperFirst, t), float4(-100.0));
634
+ second = max(lerp(second, upperSecond, t), float4(-100.0));
635
+ }
636
+ first *= grid.w;
637
+ second *= grid.w;
581
638
  // Elevation tangents as cosines of the angle from the vertical: sin(atan(t)).
582
639
  let up = float3(0.0, 0.0, 1.0);
583
640
  let towards = first * rsqrt(1.0 + first * first);
@@ -627,12 +684,17 @@ void occlusionMain(uint3 id : SV_DispatchThreadID) {
627
684
  let v = viewVector(ndc.xy, world);
628
685
  let n = facingNormal(normalize(gNormal.Load(pixel).xyz), v);
629
686
  var occlusion = domeOcclusion(int2(id.xy), id.z, world, ndc.z, n, v);
630
- // Over terrain, the horizon map's occlusion too, which sees the whole terrain: the less
631
- // visible of the two (as Unreal combines distance field and screen-space occlusion).
632
- if (pass.horizonInfo.w != 0 && gIds.Load(pixel).y == pass.horizonInfo.z) {
633
- let terrain = terrainOcclusion(world, n);
634
- if (terrain.w < occlusion.w) {
635
- occlusion = terrain;
687
+ // Over terrain, and on what stands over it, the horizon map's occlusion too, which sees the
688
+ // whole terrain: the less visible of the two (as Unreal combines distance field and
689
+ // screen-space occlusion).
690
+ if (pass.horizonInfo.w != 0) {
691
+ float above = 0.0;
692
+ let onTerrain = gIds.Load(pixel).y == pass.horizonInfo.z;
693
+ if (onTerrain || aboveTerrain(world, above)) {
694
+ let terrain = terrainOcclusion(world, n, onTerrain ? 0.0 : max(above, 0.0));
695
+ if (terrain.w < occlusion.w) {
696
+ occlusion = terrain;
697
+ }
636
698
  }
637
699
  }
638
700
  occlusionRaw[id] = occlusion;