ernie-renderer 0.1.0.dev189__tar.gz → 0.1.0.dev202__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 (517) hide show
  1. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/CMakeLists.txt +1 -1
  2. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/PKG-INFO +2 -2
  3. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/README.md +1 -1
  4. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/slang.cmake +4 -0
  5. ernie_renderer-0.1.0.dev202/demos/batched/batch_camera.cpp +399 -0
  6. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/batched/batch_camera.py +14 -5
  7. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/lighting/illuminants.cpp +10 -15
  8. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/lighting/illuminants.py +6 -7
  9. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/viewer/sun_panel.cpp +12 -12
  10. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/viewer/sun_panel.py +7 -10
  11. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/getting-started/demos.md +7 -7
  12. ernie_renderer-0.1.0.dev202/docs/js/sidebar.js +29 -0
  13. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/cli.cpp +5 -7
  14. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/demo.cpp +96 -47
  15. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/demo.h +15 -0
  16. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/CMakeLists.txt +2 -0
  17. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/embedded_shaders.h +2 -0
  18. ernie_renderer-0.1.0.dev202/ernie/kernel/film/filter_flare.slang +118 -0
  19. ernie_renderer-0.1.0.dev202/ernie/kernel/film/filter_stray_light.slang +99 -0
  20. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/sensor.slang +21 -2
  21. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/shading.slang +89 -27
  22. ernie_renderer-0.1.0.dev202/ernie/kernel/raster/terrain_horizon.slang +91 -0
  23. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/CMakeLists.txt +5 -0
  24. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/demo.cpp +3 -0
  25. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/scene.cpp +9 -0
  26. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/delegate.cpp +7 -4
  27. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/ground_drawable.cpp +5 -4
  28. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/mesh_drawable.cpp +16 -9
  29. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/mesh_drawable.h +1 -0
  30. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/renderer.cpp +56 -7
  31. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/renderer.h +9 -0
  32. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/terrain_drawable.cpp +23 -1
  33. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/terrain_drawable.h +2 -0
  34. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/isd.cpp +64 -3
  35. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/isd.h +29 -6
  36. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/sensor_filters.cpp +73 -0
  37. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/sensor_filters.h +8 -0
  38. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/resolve.cpp +34 -12
  39. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/README.md +1 -0
  40. ernie_renderer-0.1.0.dev202/ernie/test/fixtures/isd/jitterFramer.json +97 -0
  41. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_demos.py +1 -1
  42. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_isd.py +14 -0
  43. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_lights_gpu_test.cpp +44 -0
  44. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_standard_filters_gpu_test.cpp +124 -0
  45. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_isd_test.cpp +66 -0
  46. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/session_lights_test.cpp +27 -0
  47. ernie_renderer-0.1.0.dev202/ernie/test/util_ies_test.cpp +176 -0
  48. ernie_renderer-0.1.0.dev202/ernie/util/ies.cpp +305 -0
  49. ernie_renderer-0.1.0.dev202/ernie/util/ies.h +88 -0
  50. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/mkdocs.yml +4 -0
  51. ernie_renderer-0.1.0.dev189/ernie/kernel/raster/terrain_horizon.slang +0 -80
  52. ernie_renderer-0.1.0.dev189/ernie/test/util_ies_test.cpp +0 -75
  53. ernie_renderer-0.1.0.dev189/ernie/util/ies.cpp +0 -189
  54. ernie_renderer-0.1.0.dev189/ernie/util/ies.h +0 -46
  55. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.clang-format +0 -0
  56. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.clang-tidy +0 -0
  57. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.cmake-format.yaml +0 -0
  58. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.gitattributes +0 -0
  59. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  60. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  61. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/dependabot.yml +0 -0
  62. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/pull_request_template.md +0 -0
  63. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/scripts/ci_metrics.py +0 -0
  64. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/workflows/ci-metrics.yml +0 -0
  65. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.github/workflows/ci.yml +0 -0
  66. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.gitignore +0 -0
  67. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/.pre-commit-config.yaml +0 -0
  68. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/CITATION.cff +0 -0
  69. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/CMakePresets.json +0 -0
  70. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/CONTRIBUTING.md +0 -0
  71. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/LICENSE +0 -0
  72. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/EmbedShaders.cmake +0 -0
  73. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ErnieCPackOptions.cmake +0 -0
  74. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ErnieConfig.cmake.in +0 -0
  75. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ErnieInstall.cmake +0 -0
  76. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ErnieLicenses.cmake +0 -0
  77. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ErniePackaging.cmake +0 -0
  78. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ErnieTesting.cmake +0 -0
  79. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/cppcheck/ernie.cfg +0 -0
  80. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/ernie_exports.map +0 -0
  81. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/dear_imgui/CMakeLists.txt +0 -0
  82. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/dear_imgui.cmake +0 -0
  83. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/dlpack.cmake +0 -0
  84. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/embed_file.cmake +0 -0
  85. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/glfw.cmake +0 -0
  86. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/glm.cmake +0 -0
  87. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/googletest.cmake +0 -0
  88. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/gui_fonts.cmake +0 -0
  89. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/imguizmo.cmake +0 -0
  90. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/implot.cmake +0 -0
  91. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/json.cmake +0 -0
  92. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/meshoptimizer.cmake +0 -0
  93. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/moltenvk.cmake +0 -0
  94. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/nanobind.cmake +0 -0
  95. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/openexr.cmake +0 -0
  96. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/stb.cmake +0 -0
  97. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/tracy.cmake +0 -0
  98. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/vma/vma.cpp +0 -0
  99. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/vma.cmake +0 -0
  100. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/volk.cmake +0 -0
  101. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/cmake/third_party/vulkan_headers.cmake +0 -0
  102. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/CMakeLists.txt +0 -0
  103. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/main.cpp +0 -0
  104. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/util.cpp +0 -0
  105. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/demos/util.h +0 -0
  106. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/Makefile +0 -0
  107. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/README.md +0 -0
  108. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/cpp.md +0 -0
  109. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/app.md +0 -0
  110. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/astronomy.md +0 -0
  111. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/batch.md +0 -0
  112. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/cameras.md +0 -0
  113. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/demo.md +0 -0
  114. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/rendering.md +0 -0
  115. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/scene.md +0 -0
  116. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/schemas.md +0 -0
  117. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/api/python/tokens.md +0 -0
  118. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/cameras.md +0 -0
  119. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/lighting.md +0 -0
  120. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/materials.md +0 -0
  121. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/scene.md +0 -0
  122. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/sensor-filters.md +0 -0
  123. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/shadows.md +0 -0
  124. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/spectral.md +0 -0
  125. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/star-fields.md +0 -0
  126. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/terrain.md +0 -0
  127. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/concepts/transforms.md +0 -0
  128. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/css/extra.css +0 -0
  129. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-aovs.md +0 -0
  130. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-brdfs.md +0 -0
  131. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-lenses.md +0 -0
  132. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-panels.md +0 -0
  133. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-render-delegates.md +0 -0
  134. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-sensor-filters.md +0 -0
  135. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-spectra.md +0 -0
  136. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/custom-star-catalogs.md +0 -0
  137. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/debug-draw.md +0 -0
  138. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/frame-callbacks.md +0 -0
  139. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/extending/index.md +0 -0
  140. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/getting-started/installation.md +0 -0
  141. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/getting-started/quickstart.md +0 -0
  142. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/getting-started/viewer.md +0 -0
  143. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/guides/batched-rendering.md +0 -0
  144. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/guides/gpu-interop.md +0 -0
  145. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/guides/scenes.md +0 -0
  146. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/index.md +0 -0
  147. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/docs/requirements.txt +0 -0
  148. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/CMakeLists.txt +0 -0
  149. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/CMakeLists.txt +0 -0
  150. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/app.h +0 -0
  151. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/builtin_panels.h +0 -0
  152. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/camera_panel.cpp +0 -0
  153. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/cli.h +0 -0
  154. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/create.cpp +0 -0
  155. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/create.h +0 -0
  156. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/file_dialog.cpp +0 -0
  157. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/file_dialog.h +0 -0
  158. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/icons.h +0 -0
  159. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/log_panel.cpp +0 -0
  160. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/main.cpp +0 -0
  161. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/panel.cpp +0 -0
  162. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/panel.h +0 -0
  163. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/prim_icons.cpp +0 -0
  164. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/prim_icons.h +0 -0
  165. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/prim_schemas.cpp +0 -0
  166. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/prim_schemas.h +0 -0
  167. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/profiler_panel.cpp +0 -0
  168. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/properties_panel.cpp +0 -0
  169. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/property_fields.cpp +0 -0
  170. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/property_fields.h +0 -0
  171. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/session.cpp +0 -0
  172. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/session.h +0 -0
  173. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/settings_panel.cpp +0 -0
  174. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/stage_panel.cpp +0 -0
  175. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/theme.cpp +0 -0
  176. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/theme.h +0 -0
  177. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/viewer.cpp +0 -0
  178. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/app/viewer.h +0 -0
  179. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/CMakeLists.txt +0 -0
  180. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/buffer.cpp +0 -0
  181. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/buffer.h +0 -0
  182. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/compute_interop.cpp +0 -0
  183. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/compute_interop.h +0 -0
  184. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/cuda_interop.cpp +0 -0
  185. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/cuda_interop.h +0 -0
  186. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/frame_uploads.cpp +0 -0
  187. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/frame_uploads.h +0 -0
  188. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/gpu_profile.h +0 -0
  189. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/gpu_timer.cpp +0 -0
  190. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/gpu_timer.h +0 -0
  191. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/image.cpp +0 -0
  192. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/image.h +0 -0
  193. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/offscreen_target.cpp +0 -0
  194. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/offscreen_target.h +0 -0
  195. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/pipeline.cpp +0 -0
  196. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/pipeline.h +0 -0
  197. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/shader_compiler.cpp +0 -0
  198. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/shader_compiler.h +0 -0
  199. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/swapchain.cpp +0 -0
  200. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/swapchain.h +0 -0
  201. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/vulkan_context.cpp +0 -0
  202. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/device/vulkan_context.h +0 -0
  203. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/CMakeLists.txt +0 -0
  204. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/cube_sphere_lod.cpp +0 -0
  205. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/cube_sphere_lod.h +0 -0
  206. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/frustum.cpp +0 -0
  207. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/frustum.h +0 -0
  208. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/lod_quadtree.cpp +0 -0
  209. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/lod_quadtree.h +0 -0
  210. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/mesh_data.cpp +0 -0
  211. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/mesh_data.h +0 -0
  212. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/primitives.cpp +0 -0
  213. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/geometry/primitives.h +0 -0
  214. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/brdf.slang +0 -0
  215. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/hapke.slang +0 -0
  216. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/lambert.slang +0 -0
  217. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/lommel_seeliger.slang +0 -0
  218. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/lunar_lambert.slang +0 -0
  219. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/oren_nayar.slang +0 -0
  220. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/closure/preview_surface.slang +0 -0
  221. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/cube_faces.slang +0 -0
  222. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_bayer.slang +0 -0
  223. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_blooming.slang +0 -0
  224. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_color_matrix.slang +0 -0
  225. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_compand.slang +0 -0
  226. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_compand_table.slang +0 -0
  227. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_dark_current.slang +0 -0
  228. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_defect_pixels.slang +0 -0
  229. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_defocus.slang +0 -0
  230. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_demosaic.slang +0 -0
  231. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_detector_pattern.slang +0 -0
  232. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_glare.slang +0 -0
  233. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_jpeg.slang +0 -0
  234. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_lag.slang +0 -0
  235. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_measured_qe.slang +0 -0
  236. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_psf.slang +0 -0
  237. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_readout_taps.slang +0 -0
  238. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_smear.slang +0 -0
  239. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_spectral_transmission.slang +0 -0
  240. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_tdi.slang +0 -0
  241. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_temporal_average.slang +0 -0
  242. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_tone_curve.slang +0 -0
  243. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/filter_white_balance.slang +0 -0
  244. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/lens.slang +0 -0
  245. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/film/pyramid.slang +0 -0
  246. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/cull.slang +0 -0
  247. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/depth_range.slang +0 -0
  248. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/frame.slang +0 -0
  249. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/ground.slang +0 -0
  250. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/hzb.slang +0 -0
  251. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/instance_anchors.slang +0 -0
  252. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/instance_compose.slang +0 -0
  253. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/light_views.slang +0 -0
  254. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/mesh.slang +0 -0
  255. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/mesh_normals.slang +0 -0
  256. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/meter.slang +0 -0
  257. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/minimal_resolve.slang +0 -0
  258. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/motion.slang +0 -0
  259. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/motion_vectors.slang +0 -0
  260. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/overlay.slang +0 -0
  261. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/planet.slang +0 -0
  262. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/planet_color.slang +0 -0
  263. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/planet_shadow.slang +0 -0
  264. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/points.slang +0 -0
  265. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/present.slang +0 -0
  266. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/projection_pinhole.slang +0 -0
  267. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/projection_pushbroom.slang +0 -0
  268. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/surface.slang +0 -0
  269. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/terrain.slang +0 -0
  270. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/terrain_color.slang +0 -0
  271. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/terrain_shadow.slang +0 -0
  272. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/terrain_update.slang +0 -0
  273. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/kernel/raster/views.slang +0 -0
  274. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/app.cpp +0 -0
  275. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/bindings.h +0 -0
  276. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/__init__.py +0 -0
  277. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/__main__.py +0 -0
  278. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/app.py +0 -0
  279. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/batch.py +0 -0
  280. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/cli.py +0 -0
  281. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/demo.py +0 -0
  282. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/demos/__init__.py +0 -0
  283. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/demos/__main__.py +0 -0
  284. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/ernie/schema.py +0 -0
  285. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/module.cpp +0 -0
  286. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/render.cpp +0 -0
  287. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/scene_json.cpp +0 -0
  288. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/schema.cpp +0 -0
  289. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/stub_schema.py +0 -0
  290. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/python/tensor.cpp +0 -0
  291. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/CMakeLists.txt +0 -0
  292. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/delegate.h +0 -0
  293. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/drawable.h +0 -0
  294. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/ground_drawable.h +0 -0
  295. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/material.cpp +0 -0
  296. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/material.h +0 -0
  297. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/minimal_targets.cpp +0 -0
  298. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/minimal_targets.h +0 -0
  299. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/overlay_pass.cpp +0 -0
  300. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/overlay_pass.h +0 -0
  301. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/planet_drawable.cpp +0 -0
  302. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/planet_drawable.h +0 -0
  303. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/points_drawable.cpp +0 -0
  304. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/points_drawable.h +0 -0
  305. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/poisson_disk.cpp +0 -0
  306. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/poisson_disk.h +0 -0
  307. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/render_targets.cpp +0 -0
  308. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/render_targets.h +0 -0
  309. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/sensor_plan.cpp +0 -0
  310. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/sensor_plan.h +0 -0
  311. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/shadow_cascades.cpp +0 -0
  312. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/raster/shadow_cascades.h +0 -0
  313. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/CMakeLists.txt +0 -0
  314. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/base_schemas.cpp +0 -0
  315. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/base_schemas.h +0 -0
  316. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/brdf.cpp +0 -0
  317. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/brdf.h +0 -0
  318. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/cahvore.cpp +0 -0
  319. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/cahvore.h +0 -0
  320. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/camera.cpp +0 -0
  321. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/camera.h +0 -0
  322. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/camera_schemas.cpp +0 -0
  323. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/camera_schemas.h +0 -0
  324. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/edit_history.cpp +0 -0
  325. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/edit_history.h +0 -0
  326. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/geometry_schemas.cpp +0 -0
  327. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/geometry_schemas.h +0 -0
  328. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/instruments.cpp +0 -0
  329. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/instruments.h +0 -0
  330. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/light_schemas.cpp +0 -0
  331. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/light_schemas.h +0 -0
  332. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/material.h +0 -0
  333. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/material_schemas.cpp +0 -0
  334. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/material_schemas.h +0 -0
  335. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/orbit_controller.cpp +0 -0
  336. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/orbit_controller.h +0 -0
  337. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/overlay.cpp +0 -0
  338. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/overlay.h +0 -0
  339. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/path.cpp +0 -0
  340. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/path.h +0 -0
  341. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/prim_type.cpp +0 -0
  342. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/prim_type.h +0 -0
  343. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/render_schemas.cpp +0 -0
  344. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/render_schemas.h +0 -0
  345. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/scene.cpp +0 -0
  346. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/scene.h +0 -0
  347. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/scene_json.cpp +0 -0
  348. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/scene_json.h +0 -0
  349. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/schema.cpp +0 -0
  350. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/schema.h +0 -0
  351. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/terrain_schemas.cpp +0 -0
  352. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/terrain_schemas.h +0 -0
  353. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/tokens.h +0 -0
  354. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/value.h +0 -0
  355. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/wide_view.cpp +0 -0
  356. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/wide_view.h +0 -0
  357. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/xform.cpp +0 -0
  358. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/scene/xform.h +0 -0
  359. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/CMakeLists.txt +0 -0
  360. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/backends.cpp +0 -0
  361. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/delegate.cpp +0 -0
  362. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/delegate.h +0 -0
  363. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/frame_params.cpp +0 -0
  364. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/frame_params.h +0 -0
  365. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/outputs.cpp +0 -0
  366. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/outputs.h +0 -0
  367. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/product_frame.h +0 -0
  368. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/renderer.cpp +0 -0
  369. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/renderer.h +0 -0
  370. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/resolve.h +0 -0
  371. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/session/sampling.h +0 -0
  372. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/CMakeLists.txt +0 -0
  373. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_demo_gpu_test.cpp +0 -0
  374. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_demo_test.cpp +0 -0
  375. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_file_dialog_test.cpp +0 -0
  376. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_panel_test.cpp +0 -0
  377. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_prim_schemas_test.cpp +0 -0
  378. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_session_test.cpp +0 -0
  379. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_theme_test.cpp +0 -0
  380. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/app_viewer_gpu_test.cpp +0 -0
  381. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/device_cuda_interop_test.cpp +0 -0
  382. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/device_frame_uploads_test.cpp +0 -0
  383. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/device_pipeline_test.cpp +0 -0
  384. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/device_shader_compiler_test.cpp +0 -0
  385. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/device_vulkan_context_test.cpp +0 -0
  386. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/cahvore/README.md +0 -0
  387. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/cahvore/m2020_camera_models.json +0 -0
  388. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/images/grey16.png +0 -0
  389. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/constVelocityLineScan.json +0 -0
  390. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/ctxLineScan.json +0 -0
  391. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/dawnfc_radtan.json +0 -0
  392. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/lroWacPushFrame.json +0 -0
  393. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/orbitalFramer.json +0 -0
  394. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/orbitalLineScan.json +0 -0
  395. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/orbitalPushFrame.json +0 -0
  396. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/simpleFramerISD.json +0 -0
  397. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/isd/toughLroNacLineScan.json +0 -0
  398. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/fixtures/scene_basic.json +0 -0
  399. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/geometry_cube_sphere_lod_test.cpp +0 -0
  400. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/geometry_frustum_test.cpp +0 -0
  401. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/geometry_lod_quadtree_test.cpp +0 -0
  402. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/geometry_mesh_data_test.cpp +0 -0
  403. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/geometry_primitives_test.cpp +0 -0
  404. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/install/CMakeLists.txt +0 -0
  405. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/install/consumer.cpp +0 -0
  406. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/install/run_install_test.cmake +0 -0
  407. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/conftest.py +0 -0
  408. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_app.py +0 -0
  409. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_batch.py +0 -0
  410. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_cahvore.py +0 -0
  411. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_cuda.py +0 -0
  412. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_filters.py +0 -0
  413. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_instruments.py +0 -0
  414. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_map.py +0 -0
  415. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_materials.py +0 -0
  416. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_minimal.py +0 -0
  417. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_overlays.py +0 -0
  418. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_readme.py +0 -0
  419. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_render.py +0 -0
  420. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_scene.py +0 -0
  421. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_schema.py +0 -0
  422. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_schema_camera.py +0 -0
  423. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_schema_geometry.py +0 -0
  424. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_schema_material.py +0 -0
  425. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_schema_render.py +0 -0
  426. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_schema_terrain.py +0 -0
  427. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_stars.py +0 -0
  428. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_step.py +0 -0
  429. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform.py +0 -0
  430. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform_gpu.py +0 -0
  431. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform_gpu_cameras.py +0 -0
  432. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform_gpu_compose.py +0 -0
  433. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform_gpu_lights.py +0 -0
  434. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform_gpu_map.py +0 -0
  435. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/python/test_xform_gpu_points.py +0 -0
  436. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_batch_gpu_test.cpp +0 -0
  437. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_culling_gpu_test.cpp +0 -0
  438. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_delegate_gpu_test.cpp +0 -0
  439. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_delegate_test.cpp +0 -0
  440. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_gpu_meshes_gpu_test.cpp +0 -0
  441. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_gpu_terrain_gpu_test.cpp +0 -0
  442. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_hex_tiling_gpu_test.cpp +0 -0
  443. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_lens_rays_gpu_test.cpp +0 -0
  444. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_mesh_drawable_test.cpp +0 -0
  445. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_motion_gpu_test.cpp +0 -0
  446. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_overlays_gpu_test.cpp +0 -0
  447. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_planet_gpu_test.cpp +0 -0
  448. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_points_gpu_test.cpp +0 -0
  449. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_poisson_disk_test.cpp +0 -0
  450. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_products_gpu_test.cpp +0 -0
  451. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_sensor_filters_gpu_test.cpp +0 -0
  452. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_sensor_plan_test.cpp +0 -0
  453. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_shadow_cascades_test.cpp +0 -0
  454. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_terrain_drawable_test.cpp +0 -0
  455. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_textures_gpu_test.cpp +0 -0
  456. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/raster_zero_copy_gpu_test.cpp +0 -0
  457. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_brdf_test.cpp +0 -0
  458. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_brdf_vulkan_test.cpp +0 -0
  459. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_cahvore_test.cpp +0 -0
  460. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_camera_schemas_test.cpp +0 -0
  461. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_camera_test.cpp +0 -0
  462. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_edit_history_test.cpp +0 -0
  463. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_geometry_schemas_test.cpp +0 -0
  464. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_json_test.cpp +0 -0
  465. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_material_schemas_test.cpp +0 -0
  466. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_orbit_controller_test.cpp +0 -0
  467. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_overlay_test.cpp +0 -0
  468. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_path_test.cpp +0 -0
  469. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_prim_type_test.cpp +0 -0
  470. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_render_schemas_test.cpp +0 -0
  471. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_scene_test.cpp +0 -0
  472. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_schema_test.cpp +0 -0
  473. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_sensor_filters_test.cpp +0 -0
  474. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_terrain_schemas_test.cpp +0 -0
  475. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_wide_view_test.cpp +0 -0
  476. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/scene_xform_test.cpp +0 -0
  477. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/session_delegate_test.cpp +0 -0
  478. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/session_frame_params_test.cpp +0 -0
  479. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/session_gpu_xform_test.cpp +0 -0
  480. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/session_resolve_test.cpp +0 -0
  481. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/session_sampling_test.cpp +0 -0
  482. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/support/brdf_reference.h +0 -0
  483. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/support/delegate_scenes.cpp +0 -0
  484. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/support/delegate_scenes.h +0 -0
  485. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/support/terrain_harness.h +0 -0
  486. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/support/test_raster.h +0 -0
  487. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/support/vulkan_fixture.h +0 -0
  488. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/util_astronomy_test.cpp +0 -0
  489. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/util_image_test.cpp +0 -0
  490. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/util_spectrum_test.cpp +0 -0
  491. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/test/util_tensor_test.cpp +0 -0
  492. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/CMakeLists.txt +0 -0
  493. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/astronomy.cpp +0 -0
  494. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/astronomy.h +0 -0
  495. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/image.cpp +0 -0
  496. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/image.h +0 -0
  497. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/least_squares.h +0 -0
  498. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/profile.h +0 -0
  499. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/profiler.cpp +0 -0
  500. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/profiler.h +0 -0
  501. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/raster_checks.h +0 -0
  502. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/raster_view.h +0 -0
  503. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/shader_source.h +0 -0
  504. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/spectrum.cpp +0 -0
  505. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/spectrum.h +0 -0
  506. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/tensor.cpp +0 -0
  507. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/ernie/util/tensor.h +0 -0
  508. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/pyproject.toml +0 -0
  509. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/README.md +0 -0
  510. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/cameramodelutilsjs/LICENSE +0 -0
  511. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/dlpack/LICENSE +0 -0
  512. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/dlpack/include/dlpack/dlpack.h +0 -0
  513. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/stb/LICENSE +0 -0
  514. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/stb/stb.cpp +0 -0
  515. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/stb/stb_easy_font.h +0 -0
  516. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/third_party/stb/stb_image.h +0 -0
  517. {ernie_renderer-0.1.0.dev189 → ernie_renderer-0.1.0.dev202}/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 ".dev202" 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.dev202
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
@@ -37,7 +37,7 @@ Description-Content-Type: text/markdown
37
37
 
38
38
  Ernie is a physically accurate, real-time, spectral renderer for interplanetary environments.
39
39
 
40
- We provide C++ and Python APIs and a Hydra-like scene API. It is a Vulkan 1.3 rasterizer that runs on Linux today, with Windows and macOS on the way. Ernie is designed around physical quantities rather than artistic parameters: lights, materials and cameras are described the way they are measured, so a render can be compared against a real instrument. For reinforcement learning, Ernie renders batches of cameras in one step, shares data zero copy with any DLPack tensor (PyTorch, JAX, Warp, NumPy), and has a fast mode with simpler shading.
40
+ We provide C++ and Python APIs and a Hydra-like scene API. It is a Vulkan 1.3 rasterizer that runs on Linux, and builds on Windows and macOS (experimental: not yet tested there). Ernie is designed around physical quantities rather than artistic parameters: lights, materials and cameras are described the way they are measured, so a render can be compared against a real instrument. For reinforcement learning, Ernie renders batches of cameras in one step, shares data zero copy with any DLPack tensor (PyTorch, JAX, Warp, NumPy), and has a fast mode with simpler shading.
41
41
 
42
42
  Ernie's key features related to planetary robotics and sensing:
43
43
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  Ernie is a physically accurate, real-time, spectral renderer for interplanetary environments.
8
8
 
9
- We provide C++ and Python APIs and a Hydra-like scene API. It is a Vulkan 1.3 rasterizer that runs on Linux today, with Windows and macOS on the way. Ernie is designed around physical quantities rather than artistic parameters: lights, materials and cameras are described the way they are measured, so a render can be compared against a real instrument. For reinforcement learning, Ernie renders batches of cameras in one step, shares data zero copy with any DLPack tensor (PyTorch, JAX, Warp, NumPy), and has a fast mode with simpler shading.
9
+ We provide C++ and Python APIs and a Hydra-like scene API. It is a Vulkan 1.3 rasterizer that runs on Linux, and builds on Windows and macOS (experimental: not yet tested there). Ernie is designed around physical quantities rather than artistic parameters: lights, materials and cameras are described the way they are measured, so a render can be compared against a real instrument. For reinforcement learning, Ernie renders batches of cameras in one step, shares data zero copy with any DLPack tensor (PyTorch, JAX, Warp, NumPy), and has a fast mode with simpler shading.
10
10
 
11
11
  Ernie's key features related to planetary robotics and sensing:
12
12
 
@@ -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
@@ -28,8 +28,6 @@
28
28
  #include "ernie/scene/xform.h"
29
29
  #include "util.h"
30
30
 
31
- #include <imgui.h>
32
-
33
31
  #include <algorithm>
34
32
  #include <array>
35
33
  #include <cmath>
@@ -131,10 +129,12 @@ class IlluminantsDemo : public app::Demo {
131
129
  .SetPhotometricPower(1600.0)
132
130
  .SetPhysicalCustomIlluminant(Fluorescent())
133
131
  .SetTransform(LookAtTransform({-1.2, 0.6, 2.9}, {-0.25, 1.0, 1.0}, {0.0, 1.0, 0.0}));
132
+ // ISO 400, f/2, 1/125 s: the spot's lumens fill only its 40 degree cone, so the wall in it
133
+ // is bright; the cone's centre just clips.
134
134
  Camera::Define(scene, "/World/Camera")
135
135
  .SetFocalLength(18.0)
136
136
  .SetSensorNoise(false)
137
- .SetExposureTime(1.0 / 15.0)
137
+ .SetExposureTime(1.0 / 125.0)
138
138
  .SetExposureIso(400.0)
139
139
  .SetExposureFStop(2.0)
140
140
  .SetTransform(LookAtTransform({0.0, -2.6, 1.3}, {0.0, 1.0, 1.2}, {0.0, 0.0, 1.0}));
@@ -144,20 +144,15 @@ class IlluminantsDemo : public app::Demo {
144
144
  .SetAmbient(0.0);
145
145
  LightWith(0);
146
146
 
147
+ // The demo's option, in the Demos panel: the illuminant.
148
+ std::vector<std::string> names;
149
+ for (const Illuminant& illuminant : kIlluminants) {
150
+ names.emplace_back(illuminant.name);
151
+ }
152
+ Widgets().Combo("Illuminant", std::move(names), 0,
153
+ [this](std::size_t index) { LightWith(static_cast<int>(index)); });
147
154
  if (viewer != nullptr) {
148
- // In the viewer, a panel switches the illuminant.
149
155
  viewer->SetActiveCamera("/World/Camera");
150
- viewer->AddPanel("Illuminant", app::Dock::Right, [this](app::Viewer&) {
151
- int index = illuminant_;
152
- for (int i = 0; i < static_cast<int>(kIlluminants.size()); ++i) {
153
- if (ImGui::RadioButton(kIlluminants[i].name, i == index)) {
154
- index = i;
155
- }
156
- }
157
- if (index != illuminant_) {
158
- LightWith(index);
159
- }
160
- });
161
156
  }
162
157
  }
163
158
 
@@ -92,22 +92,21 @@ 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,
100
102
  resolution=(448, 300), ambient=0.0)
101
103
  self.light_with(0)
102
104
 
105
+ # The demo's option, in the Demos panel: the illuminant.
106
+ self.widgets.combo("Illuminant", [name for name, _, _ in ILLUMINANTS], 0,
107
+ on_change=self.light_with)
103
108
  if viewer is not None:
104
- # In the viewer, a panel switches the illuminant.
105
- from ernie.app import Dock
106
-
107
109
  viewer.active_camera = camera.path
108
- panel = viewer.add_panel("Illuminant", Dock.RIGHT)
109
- panel.combo("Illuminant", [name for name, _, _ in ILLUMINANTS], 0,
110
- on_change=self.light_with)
111
110
 
112
111
  def light_with(self, index):
113
112
  _, illuminant, kelvin = ILLUMINANTS[index]
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: BSD-3-Clause
2
- // Opens the viewer on a scene built in code, with a panel of its own that moves the sun. The C++
3
- // twin of sun_panel.py.
2
+ // Opens the viewer on a scene built in code, with options in the Demos panel that move the sun.
3
+ // The C++ twin of sun_panel.py.
4
4
  //
5
5
  // ernie --demo viewer/sun_panel [--viewer null --output sun.png]
6
6
 
@@ -43,15 +43,15 @@ class SunPanelDemo : public app::Demo {
43
43
  .SetFocalLength(24.0)
44
44
  .SetTransform(LookAtTransform({0.0, -14.0, 6.0}, {0.0, 0.0, 0.5}, {0.0, 0.0, 1.0}));
45
45
  AimSun();
46
- if (viewer != nullptr) {
47
- // Panels draw with Dear ImGui and edit the scene, which the next frame renders.
48
- viewer->AddPanel("Sun", app::Dock::Left, [this](app::Viewer&) {
49
- bool changed = ImGui::SliderFloat("Elevation", &elevation_, 1.0f, 90.0f);
50
- changed |= ImGui::SliderFloat("Azimuth", &azimuth_, 0.0f, 360.0f);
51
- if (changed) {
52
- AimSun();
53
- }
54
- });
46
+ }
47
+
48
+ // The demo's options, in the Demos panel: sliders drawn with Dear ImGui that move the sun,
49
+ // which the next frame renders.
50
+ void Gui() override {
51
+ bool changed = ImGui::SliderFloat("Elevation", &elevation_, 1.0f, 90.0f);
52
+ changed |= ImGui::SliderFloat("Azimuth", &azimuth_, 0.0f, 360.0f);
53
+ if (changed) {
54
+ AimSun();
55
55
  }
56
56
  }
57
57
 
@@ -76,4 +76,4 @@ class SunPanelDemo : public app::Demo {
76
76
  } // namespace
77
77
 
78
78
  ERNIE_REGISTER_DEMO(SunPanelDemo, "viewer", "sun panel",
79
- "A scene built in code, with a panel of its own that moves the sun.");
79
+ "A scene built in code, with options that move the sun.");
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: BSD-3-Clause
2
- """Opens the viewer on a scene built in code, with a panel of its own that moves the sun. The
3
- Python twin of sun_panel.cpp.
2
+ """Opens the viewer on a scene built in code, with options in the Demos panel that move the sun.
3
+ The Python twin of sun_panel.cpp.
4
4
 
5
5
  python -m ernie.demos viewer/sun_panel [--viewer null --output sun.png]
6
6
  """
@@ -31,14 +31,11 @@ class Demo(ernie.demo.Demo):
31
31
  self.elevation = 45.0
32
32
  self.azimuth = 30.0
33
33
  self.aim_sun()
34
- if viewer is not None:
35
- from ernie.app import Dock
36
-
37
- panel = viewer.add_panel("Sun", Dock.LEFT)
38
- panel.slider("Elevation", 1.0, 90.0, self.elevation,
39
- on_change=lambda value: self.aim_sun(elevation=value))
40
- panel.slider("Azimuth", 0.0, 360.0, self.azimuth,
41
- on_change=lambda value: self.aim_sun(azimuth=value))
34
+ # The demo's options, in the Demos panel: sliders that move the sun.
35
+ self.widgets.slider("Elevation", 1.0, 90.0, self.elevation,
36
+ on_change=lambda value: self.aim_sun(elevation=value))
37
+ self.widgets.slider("Azimuth", 0.0, 360.0, self.azimuth,
38
+ on_change=lambda value: self.aim_sun(azimuth=value))
42
39
 
43
40
  def aim_sun(self, elevation=None, azimuth=None):
44
41
  self.elevation = self.elevation if elevation is None else elevation