ernie-renderer 0.2.0.dev32__tar.gz → 0.2.0.dev35__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ernie-renderer might be problematic. Click here for more details.
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/CMakeLists.txt +1 -1
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/PKG-INFO +1 -1
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/CMakeLists.txt +1 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schema.cpp +9 -4
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schema.h +2 -2
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/camera.h +1 -1
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/laser.h +1 -1
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/lux.h +8 -10
- ernie_renderer-0.2.0.dev35/ernie/scene/schemas/planet.cpp +92 -0
- ernie_renderer-0.2.0.dev35/ernie/scene/schemas/planet.h +152 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/registry.cpp +8 -0
- ernie_renderer-0.2.0.dev35/ernie/scene/schemas/shade.cpp +57 -0
- ernie_renderer-0.2.0.dev35/ernie/scene/schemas/shade.h +82 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/vol.h +1 -1
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/CMakeLists.txt +2 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/lux_test.cpp +5 -3
- ernie_renderer-0.2.0.dev35/tests/scene/planet_test.cpp +74 -0
- ernie_renderer-0.2.0.dev35/tests/scene/shade_test.cpp +65 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/shade.cpp +0 -12
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/shade.h +0 -27
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.clang-format +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.clang-tidy +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.dockerignore +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.gersemirc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.gitattributes +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.github/scripts/coverage_badge.py +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.github/scripts/install-lavapipe-windows.sh +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.github/workflows/ci.yml +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.gitignore +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/.pre-commit-config.yaml +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/CMakePresets.json +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/Dockerfile +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/benchmarks/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/benchmarks/bench.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/benchmarks/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/benchmarks/scene/extents.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/benchmarks/scene/storage.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/ErnieConfig.cmake.in +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/ErnieFetch.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/ErnieInstall.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/ErniePackaging.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/ErnieTesting.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/ernie.pc.in +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/bc7enc.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/dlpack.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/glm.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/googletest.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/json.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/nanobind.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/openexr.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/stb.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/tracy.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/volk.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/cmake/third_party/vulkan_headers.cmake +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/docs/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/docs/index.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/docs/requirements.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/app/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/app/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/device/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/device/vulkan_devices.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/device/vulkan_devices.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/geometry/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/geometry/bounds.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/graph/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/ies.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/ies.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/image.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/image.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/nanovdb.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/nanovdb.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/raster.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/raster.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/texture.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/io/texture.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/astronomy.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/astronomy.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/atmosphere.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/atmosphere.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/cloud.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/cloud.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/constants.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/reflectance_library.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/reflectance_library.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/reflectance_table.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/regolith.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/regolith.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/scattering.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/scattering.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/solar.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/solar.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/solar_table.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/spectrum.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/physics/spectrum.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/python/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/python/ernie/__init__.py +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/python/module.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/render/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/convert.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/extent_cache.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/extent_cache.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/path.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/path.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/scene.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/scene.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/camera.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/collection.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/collection.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/geom.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/geom.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/instancer.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/instancer.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/laser.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/lux.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/mesh.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/mesh.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/schemas/vol.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/storage.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/storage.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/tokens.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/value.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/view.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/view.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/xform.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/scene/xform.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/algorithm.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/bytes.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/disk_cache.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/disk_cache.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/file.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/file.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/glm.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/hash_index.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/linear_algebra.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/log.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/log.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/math.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/noise.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/noise.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/numbers.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/parallel.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/profiler.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/profiler.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/random.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/tensor.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/tensor.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/text.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/version.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/version.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/ernie/util/worker_pool.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/mkdocs.yml +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/pyproject.toml +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/common.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/consumer/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/consumer/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/device/vulkan_devices_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/exr/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/exr/make_exr.py +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/exr/rgba_half_window.exr +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/exr/y_half_zips.exr +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ies/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ies/lamp.tilt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/images/grey16.png +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ktx2/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/float_raw.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/volumes/cube.nvdb +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/fixtures/volumes/make_nvdb.py +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/geometry/bounds_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/io/ies_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/io/image_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/io/nanovdb_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/io/raster_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/io/texture_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/astronomy_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/atmosphere_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/cloud_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/reflectance_library_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/regolith_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/scattering_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/solar_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/physics/spectrum_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/python/test_package.py +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/api_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/extent_cache_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/instancer_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/mesh_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/path_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/scene_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/schema_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/storage_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/vol_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/scene/xform_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/algorithm_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/bytes_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/disk_cache_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/file_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/hash_index_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/linear_algebra_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/log_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/math_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/noise_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/parallel_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/profiler_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/random_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/tensor_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/text_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/version_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/tests/util/worker_pool_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/LICENSES/MIT.txt +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/NOTICE +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/README.md +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_containers.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_idct.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/zstd/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/zstd/zstd.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/basisu/zstd/zstd_errors.h +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/nanovdb/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev32 → ernie_renderer-0.2.0.dev35}/third_party/nanovdb/PNanoVDB.h +0 -0
|
@@ -15,7 +15,7 @@ project(
|
|
|
15
15
|
)
|
|
16
16
|
|
|
17
17
|
# Pre-release suffix such as .dev12, written by CI.
|
|
18
|
-
set(ERNIE_VERSION_SUFFIX ".
|
|
18
|
+
set(ERNIE_VERSION_SUFFIX ".dev35" CACHE STRING "Pre-release suffix of Ernie's version")
|
|
19
19
|
set(ERNIE_VERSION "${PROJECT_VERSION}${ERNIE_VERSION_SUFFIX}")
|
|
20
20
|
|
|
21
21
|
option(ERNIE_BUILD_TESTS "Build Ernie's tests" OFF)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ernie-renderer
|
|
3
|
-
Version: 0.2.0.
|
|
3
|
+
Version: 0.2.0.dev35
|
|
4
4
|
Summary: Efficient Renderer for Natural and Interplanetary Environments: a physically based, spectral Vulkan ray tracer
|
|
5
5
|
Author: Alex Maietta
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -82,10 +82,15 @@ std::string ArrayProblem(const AttributeDef& def, const Tensor& array) {
|
|
|
82
82
|
if (def.meta.integer ? !integer : !floating) {
|
|
83
83
|
return def.meta.integer ? "must hold integers" : "must hold float32 or float64 numbers";
|
|
84
84
|
}
|
|
85
|
-
if (def.meta.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
if (const std::vector<std::int64_t>& ranks = def.meta.ranks; !ranks.empty()) {
|
|
86
|
+
if (std::ranges::find(ranks, static_cast<std::int64_t>(array.Rank())) != ranks.end()) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
std::string list;
|
|
90
|
+
for (const std::int64_t rank : ranks) {
|
|
91
|
+
list += (list.empty() ? "" : " or ") + std::to_string(rank);
|
|
92
|
+
}
|
|
93
|
+
return "must have " + list + " dimensions";
|
|
89
94
|
}
|
|
90
95
|
const std::int64_t components = def.meta.components;
|
|
91
96
|
const bool rows =
|
|
@@ -84,8 +84,8 @@ struct AttributeMeta {
|
|
|
84
84
|
bool bytes = false;
|
|
85
85
|
/// A tensor's vector size: (n, components) or flat; 0 for a flat array.
|
|
86
86
|
std::uint8_t components = 0;
|
|
87
|
-
///
|
|
88
|
-
std::
|
|
87
|
+
/// The ranks a tensor may have, as a dense grid's 3; none for flat or vector arrays.
|
|
88
|
+
std::vector<std::int64_t> ranks{};
|
|
89
89
|
Dirty dirty = Dirty::Params;
|
|
90
90
|
/// Resolved from the nearest authoring ancestor.
|
|
91
91
|
bool inherited = false;
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
X(Tensor, LensRays, "ernie:lens:rays", Tensor(), \
|
|
89
89
|
"float32 (rows, columns, 3) unit directions every rays step pixels, in place of the " \
|
|
90
90
|
"projection and distortion.", \
|
|
91
|
-
.group = "Lens", .
|
|
91
|
+
.group = "Lens", .ranks = {3}) \
|
|
92
92
|
X(int, LensRaysStep, "ernie:lens:raysStep", 8, "Pixels between the lens's rays.", \
|
|
93
93
|
.group = "Lens", .lower = AtLeast(1.0))
|
|
94
94
|
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
.asset = true) \
|
|
69
69
|
X(Tensor, PatternImageArray, "ernie:laser:pattern:imageArray", Tensor(), \
|
|
70
70
|
"float32 (rows, columns) pattern image in place of the file, on the host or a device.", \
|
|
71
|
-
.group = "Pattern", .
|
|
71
|
+
.group = "Pattern", .ranks = {2}) \
|
|
72
72
|
X(glm::dvec2, PatternFieldOfView, "ernie:laser:pattern:fieldOfView", glm::dvec2(40.0, 30.0), \
|
|
73
73
|
"Full angles an image, dots or a scan span along x and y, degrees.", .group = "Pattern", \
|
|
74
74
|
.lower = AtLeast(0.0), .upper = Below(170.0)) \
|
|
@@ -29,10 +29,6 @@
|
|
|
29
29
|
"Tints it by its colour temperature too.", .group = "Light") \
|
|
30
30
|
X(double, ColorTemperature, "inputs:colorTemperature", 6500.0, "Kelvin, a black body's.", \
|
|
31
31
|
.group = "Light", .lower = Above(0.0), .finite = true) \
|
|
32
|
-
X(std::vector<float>, Spectrum, "ernie:spectrum", std::vector<float>{}, \
|
|
33
|
-
"(nm, value) pairs of a physical spectrum: W m^-2 nm^-1 for a distant light, W sr^-1 nm^-1 " \
|
|
34
|
-
"for a sphere, W m^-2 sr^-1 nm^-1 for a rect, disk or dome.", \
|
|
35
|
-
.group = "Spectrum") \
|
|
36
32
|
X(double, PolarizationDegree, "ernie:polarization:degree", 0.0, \
|
|
37
33
|
"The fraction of its light linearly polarized.", .label = "Polarized", \
|
|
38
34
|
.group = "Polarization", .lower = AtLeast(0.0), .upper = AtMost(1.0)) \
|
|
@@ -58,15 +54,16 @@
|
|
|
58
54
|
|
|
59
55
|
#define ERNIE_BOUNDABLE_LIGHT_BASE_ATTRIBUTES(X) \
|
|
60
56
|
X(double, Power, "ernie:power", 0.0, \
|
|
61
|
-
"Radiant flux in watts
|
|
57
|
+
"Radiant flux in watts, scaling the illuminant's spectral shape; authored, it sets the " \
|
|
58
|
+
"brightness unless photometric values are authored.", \
|
|
62
59
|
.group = "Light", .lower = AtLeast(0.0), .finite = true)
|
|
63
60
|
|
|
64
61
|
#define ERNIE_DISTANT_LIGHT_ATTRIBUTES(X) \
|
|
65
62
|
X(double, Angle, "inputs:angle", 0.53, "Angular diameter in degrees; the Sun's is 0.53.", \
|
|
66
63
|
.group = "Light", .lower = AtLeast(0.0), .upper = AtMost(360.0)) \
|
|
67
64
|
X(double, Irradiance, "ernie:irradiance", 1361.0, \
|
|
68
|
-
"W m^-2 at normal incidence
|
|
69
|
-
"
|
|
65
|
+
"W m^-2 at normal incidence (the Sun's at 1 au), scaling the illuminant's spectral shape; " \
|
|
66
|
+
"authored, it sets the brightness unless photometric values are authored.", \
|
|
70
67
|
.group = "Light", .lower = AtLeast(0.0), .finite = true)
|
|
71
68
|
|
|
72
69
|
#define ERNIE_DISK_LIGHT_ATTRIBUTES(X) \
|
|
@@ -99,7 +96,7 @@
|
|
|
99
96
|
X(Tensor, Texture, "ernie:texture", Tensor(), \
|
|
100
97
|
"float32 (rows, columns, 3 or 4) linear RGB in memory, latitude-longitude about +z, in " \
|
|
101
98
|
"place of the file.", \
|
|
102
|
-
.group = "Light", .
|
|
99
|
+
.group = "Light", .ranks = {3}) \
|
|
103
100
|
X(std::vector<Path>, Portals, "portals", std::vector<Path>{}, \
|
|
104
101
|
"Portal lights its light enters through.", .group = "Light") \
|
|
105
102
|
X(double, GuideRadius, "guideRadius", 1.0e5, "Metres to the sphere drawn as its guide.", \
|
|
@@ -125,8 +122,9 @@
|
|
|
125
122
|
X(bool, ShapingIesNormalize, "inputs:shaping:ies:normalize", false, \
|
|
126
123
|
"Keeps the profile from changing the light's power.", .group = "Shaping")
|
|
127
124
|
|
|
128
|
-
// Omniverse's photometric and illuminant schemas (omni.usd.schema.physical_lighting).
|
|
129
|
-
//
|
|
125
|
+
// Omniverse's photometric and illuminant schemas (omni.usd.schema.physical_lighting). A light's
|
|
126
|
+
// spectral shape comes from its illuminant alone; its brightness from authored photometric values,
|
|
127
|
+
// else authored ernie:irradiance or ernie:power, else USD's intensity and exposure.
|
|
130
128
|
#define ERNIE_PHOTOMETRIC_SWITCH " Authored, it alone sets the light's brightness."
|
|
131
129
|
|
|
132
130
|
#define ERNIE_PHOTOMETRIC_AREA_LIGHT_API_ATTRIBUTES(X) \
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file planet.cpp
|
|
3
|
+
/// @brief The planetary prims' registry entries and extents: terrains from their heights and
|
|
4
|
+
/// bodies, atmospheres from their bodies and tops.
|
|
5
|
+
#include "ernie/scene/schemas/planet.h"
|
|
6
|
+
|
|
7
|
+
#include <algorithm>
|
|
8
|
+
#include <optional>
|
|
9
|
+
#include <vector>
|
|
10
|
+
|
|
11
|
+
namespace ernie {
|
|
12
|
+
namespace {
|
|
13
|
+
|
|
14
|
+
/// @return The body a row's relationship names, its extent brought into the row's own space; none
|
|
15
|
+
/// when it names none.
|
|
16
|
+
std::optional<Box> BodyInOwnSpace(const ExtentRows& rows, std::string_view relationship,
|
|
17
|
+
std::uint32_t row) {
|
|
18
|
+
const Target target = rows.Column<Target>(relationship)[row];
|
|
19
|
+
const std::optional<PrimId> body =
|
|
20
|
+
target.path != kNoPath ? rows.store.Find(target.path) : std::nullopt;
|
|
21
|
+
const std::optional<Box> extent = body ? rows.scene->Extent(*body) : std::nullopt;
|
|
22
|
+
if (!extent) {
|
|
23
|
+
return std::nullopt;
|
|
24
|
+
}
|
|
25
|
+
const PrimId own = rows.store.GetBucket(rows.bucket).prims[row];
|
|
26
|
+
return extent->Transformed(glm::inverse(rows.scene->WorldTransform(own)) *
|
|
27
|
+
rows.scene->WorldTransform(*body));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// @return The lowest and highest of a host array's heights; none on a device or when empty.
|
|
31
|
+
std::optional<std::pair<double, double>> HeightRange(const Tensor& heights) {
|
|
32
|
+
if (heights.Empty() || IsGpu(heights.Location().kind)) {
|
|
33
|
+
return std::nullopt;
|
|
34
|
+
}
|
|
35
|
+
const std::vector<float> values = CopyFloats(heights, "heights");
|
|
36
|
+
const auto [low, high] = std::ranges::minmax_element(values);
|
|
37
|
+
return std::pair<double, double>(*low, *high);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// A plane's footprint: x east from the origin, y south from it, a cell between heights.
|
|
41
|
+
Box PlaneFootprint(const Tensor& heights, glm::dvec2 origin, double cell, double low, double high) {
|
|
42
|
+
const double rows = static_cast<double>(heights.Shape()[0]);
|
|
43
|
+
const double columns = static_cast<double>(heights.Shape()[1]);
|
|
44
|
+
return {{origin.x, origin.y - (rows - 1.0) * cell, low},
|
|
45
|
+
{origin.x + (columns - 1.0) * cell, origin.y, high}};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void TerrainExtent(const ExtentRows& rows, RowRange range, std::span<Box> out) {
|
|
49
|
+
const auto heights = rows.Column<Tensor>(Terrain::kHeights);
|
|
50
|
+
const auto origin = rows.Column<glm::dvec2>(Terrain::kOrigin);
|
|
51
|
+
const auto cell = rows.Column<double>(Terrain::kCellSize);
|
|
52
|
+
const auto exaggeration = rows.Column<double>(Terrain::kExaggeration);
|
|
53
|
+
const auto authored = rows.Column<std::vector<float>>(Boundable::kExtent);
|
|
54
|
+
for (std::uint32_t row = range.begin; row < range.end; ++row) {
|
|
55
|
+
const std::optional<std::pair<double, double>> span = HeightRange(heights[row]);
|
|
56
|
+
const double low = span ? span->first * exaggeration[row] : 0.0;
|
|
57
|
+
const double high = span ? span->second * exaggeration[row] : 0.0;
|
|
58
|
+
Box& box = out[row - range.begin];
|
|
59
|
+
if (const std::optional<Box> body = BodyInOwnSpace(rows, Terrain::kBody, row)) {
|
|
60
|
+
box = body->Grown(std::max(high, 0.0));
|
|
61
|
+
} else if (span && heights[row].Rank() == 2) {
|
|
62
|
+
box = PlaneFootprint(heights[row], origin[row], cell[row], low, high);
|
|
63
|
+
} else {
|
|
64
|
+
box = AuthoredExtent(authored[row]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void AtmosphereExtent(const ExtentRows& rows, RowRange range, std::span<Box> out) {
|
|
70
|
+
const auto top = rows.Column<double>(Atmosphere::kTop);
|
|
71
|
+
for (std::uint32_t row = range.begin; row < range.end; ++row) {
|
|
72
|
+
const std::optional<Box> body = BodyInOwnSpace(rows, Atmosphere::kBody, row);
|
|
73
|
+
out[row - range.begin] = body ? body->Grown(top[row]) : Box();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} // namespace
|
|
78
|
+
|
|
79
|
+
ERNIE_DEFINE_SCHEMA(Terrain, "Terrain", &Gprim::Definition(), Concrete,
|
|
80
|
+
ComputedFromOtherPrims(TerrainExtent),
|
|
81
|
+
"Heights displacing a body's surface, or a plane.", ERNIE_TERRAIN_ATTRIBUTES)
|
|
82
|
+
ERNIE_DEFINE_SCHEMA(Atmosphere, "Atmosphere", &Xformable::Definition(), Concrete,
|
|
83
|
+
ComputedFromOtherPrims(AtmosphereExtent),
|
|
84
|
+
"The air around a body: its constituents, haze and clouds.",
|
|
85
|
+
ERNIE_ATMOSPHERE_ATTRIBUTES)
|
|
86
|
+
ERNIE_DEFINE_SCHEMA(StarField, "StarField", &NonboundableLightBase::Definition(), Concrete,
|
|
87
|
+
kInheritExtent, "The stars, from a catalogue or arrays, at infinity.",
|
|
88
|
+
ERNIE_STAR_FIELD_ATTRIBUTES)
|
|
89
|
+
ERNIE_DEFINE_SCHEMA(GroundPlane, "GroundPlane", &Gprim::Definition(), Concrete, kUnbounded,
|
|
90
|
+
"An infinite plane in its xy plane, facing +z.", ERNIE_GROUND_PLANE_ATTRIBUTES)
|
|
91
|
+
|
|
92
|
+
} // namespace ernie
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file planet.h
|
|
3
|
+
/// @brief Ernie's planetary prims: terrains on bodies or planes, atmospheres around bodies, star
|
|
4
|
+
/// fields and ground planes. A body is any Sphere, an ellipsoid when scaled unevenly.
|
|
5
|
+
#pragma once
|
|
6
|
+
|
|
7
|
+
#include "ernie/physics/astronomy.h"
|
|
8
|
+
#include "ernie/scene/schemas/lux.h"
|
|
9
|
+
|
|
10
|
+
// clang-format off
|
|
11
|
+
#define ERNIE_TERRAIN_ATTRIBUTES(X) \
|
|
12
|
+
X(Path, Body, "ernie:terrain:body", Path(), \
|
|
13
|
+
"The Sphere whose surface the heights displace, along its geodetic normals; unset, a plane " \
|
|
14
|
+
"in the terrain's xy plane.", \
|
|
15
|
+
.group = "Terrain", .dirty = Dirty::Topology) \
|
|
16
|
+
X(Tensor, Heights, "ernie:terrain:heights", Tensor(), \
|
|
17
|
+
"float32 (rows, columns) heights in metres, the first row the northern; on a body, " \
|
|
18
|
+
"(6, n + 1, n + 1) cube faces.", \
|
|
19
|
+
.group = "Terrain", .ranks = {2, 3}, .dirty = Dirty::Points) \
|
|
20
|
+
X(std::string, HeightsFile, "ernie:terrain:heights:file", "", \
|
|
21
|
+
"Heights as a raster (TIFF, PDS3, PNG or JPEG) in place of the array, paged as views need " \
|
|
22
|
+
"them.", \
|
|
23
|
+
.group = "Terrain", .asset = true, .dirty = Dirty::Points) \
|
|
24
|
+
X(double, HeightsUnit, "ernie:terrain:heights:unit", 1.0, \
|
|
25
|
+
"Metres in a unit of the file's values: 1000 for kilometres.", .group = "Terrain", \
|
|
26
|
+
.lower = Above(0.0), .dirty = Dirty::Points) \
|
|
27
|
+
X(double, HeightsReference, "ernie:terrain:heights:reference", 0.0, \
|
|
28
|
+
"Metres subtracted from the file's values: the radius, for files of radii.", \
|
|
29
|
+
.group = "Terrain", .finite = true, .dirty = Dirty::Points) \
|
|
30
|
+
X(double, NoData, "ernie:terrain:noData", 0.0, \
|
|
31
|
+
"The height marking missing cells; unauthored, every cell is a height.", .group = "Terrain") \
|
|
32
|
+
X(glm::dvec2, Origin, "ernie:terrain:origin", glm::dvec2(0.0), \
|
|
33
|
+
"A plane's north-west corner in its x and y, metres.", .group = "Terrain", .finite = true) \
|
|
34
|
+
X(double, CellSize, "ernie:terrain:cellSize", 1.0, "Metres between a plane's heights.", \
|
|
35
|
+
.group = "Terrain", .lower = Above(0.0), .finite = true) \
|
|
36
|
+
X(double, Exaggeration, "ernie:terrain:exaggeration", 1.0, "Scales the heights as drawn.", \
|
|
37
|
+
.group = "Terrain", .lower = AtLeast(0.0), .finite = true) \
|
|
38
|
+
X(double, FinestCell, "ernie:terrain:finestCell", 1.0, \
|
|
39
|
+
"Metres: a body's LOD refines below its heights, bilinearly, to quads this size; 0 stops at " \
|
|
40
|
+
"the heights'.", \
|
|
41
|
+
.group = "Terrain", .lower = AtLeast(0.0)) \
|
|
42
|
+
X(std::string, ColorMode, "ernie:terrain:colorMode", "shaded", \
|
|
43
|
+
"shaded: its material, lit; colormap: a height ramp, unlit; shadedColormap: both; " \
|
|
44
|
+
"hillshade: a GIS hillshade, grey and unlit.", \
|
|
45
|
+
.group = "Display", .options = {"shaded", "colormap", "shadedColormap", "hillshade"}) \
|
|
46
|
+
X(double, HillshadeAzimuth, "ernie:terrain:hillshade:azimuth", 315.0, \
|
|
47
|
+
"Degrees clockwise from north of the hillshade's light; GIS's 315, from the north-west.", \
|
|
48
|
+
.group = "Display", .lower = AtLeast(0.0), .upper = AtMost(360.0)) \
|
|
49
|
+
X(double, HillshadeAltitude, "ernie:terrain:hillshade:altitude", 45.0, \
|
|
50
|
+
"Degrees above the horizon of the hillshade's light.", .group = "Display", \
|
|
51
|
+
.lower = AtLeast(0.0), .upper = AtMost(90.0))
|
|
52
|
+
|
|
53
|
+
#define ERNIE_ATMOSPHERE_COLUMN(X, Name, usdName, fallback, text) \
|
|
54
|
+
X(double, Name, usdName, fallback, text, .group = "Atmosphere", .lower = AtLeast(0.0), \
|
|
55
|
+
.finite = true)
|
|
56
|
+
|
|
57
|
+
#define ERNIE_ATMOSPHERE_ATTRIBUTES(X) \
|
|
58
|
+
X(Path, Body, "ernie:atmosphere:body", Path(), "The Sphere it surrounds.", \
|
|
59
|
+
.group = "Atmosphere", .dirty = Dirty::Topology) \
|
|
60
|
+
X(std::string, Preset, "ernie:atmosphere:preset", "earth", \
|
|
61
|
+
"Its physical model: Earth's air, ozone and haze, or Mars's carbon dioxide and dust.", \
|
|
62
|
+
.group = "Atmosphere", .options = {"earth", "mars"}) \
|
|
63
|
+
ERNIE_ATMOSPHERE_COLUMN(X, Top, "ernie:atmosphere:top", 100000.0, \
|
|
64
|
+
"Metres above the surface it reaches; Earth's 100 km.") \
|
|
65
|
+
X(double, GroundAlbedo, "ernie:atmosphere:groundAlbedo", 0.3, \
|
|
66
|
+
"The ground's reflectance for light scattered in the air.", .group = "Atmosphere", \
|
|
67
|
+
.lower = AtLeast(0.0), .upper = AtMost(1.0)) \
|
|
68
|
+
ERNIE_ATMOSPHERE_COLUMN(X, HazeOpticalDepth, "ernie:atmosphere:hazeOpticalDepth", 0.1, \
|
|
69
|
+
"Earth: the haze's vertical optical depth at 550 nm.") \
|
|
70
|
+
ERNIE_ATMOSPHERE_COLUMN(X, OzoneColumn, "ernie:atmosphere:ozoneColumn", 300.0, \
|
|
71
|
+
"Earth: total column ozone, Dobson units.") \
|
|
72
|
+
ERNIE_ATMOSPHERE_COLUMN(X, SodiumColumn, "ernie:atmosphere:sodiumColumn", 4e13, \
|
|
73
|
+
"Earth: mesospheric sodium atoms per square metre, lit 92 km up by a " \
|
|
74
|
+
"589 nm laser as a guide star.") \
|
|
75
|
+
ERNIE_ATMOSPHERE_COLUMN(X, DustOpticalDepth, "ernie:atmosphere:dustOpticalDepth", 0.5, \
|
|
76
|
+
"Mars: the dust's vertical optical depth at 880 nm.") \
|
|
77
|
+
ERNIE_ATMOSPHERE_COLUMN(X, CloudTop, "ernie:atmosphere:cloudTop", 0.0, \
|
|
78
|
+
"Metres below which clouds block light grazing the limb, darkening " \
|
|
79
|
+
"its shadow as in a lunar eclipse; 0 clear.") \
|
|
80
|
+
X(double, CloudCover, "ernie:atmosphere:cloudCover", 0.5, \
|
|
81
|
+
"The fraction of the limb the clouds cover.", .group = "Atmosphere", .lower = AtLeast(0.0), \
|
|
82
|
+
.upper = AtMost(1.0)) \
|
|
83
|
+
X(double, PolarizationDegree, "ernie:polarization:degree", 0.75, \
|
|
84
|
+
"The sky's greatest degree of linear polarization, 90 degrees from the sun.", \
|
|
85
|
+
.label = "Sky polarization", .group = "Atmosphere", .lower = AtLeast(0.0), \
|
|
86
|
+
.upper = AtMost(1.0))
|
|
87
|
+
|
|
88
|
+
#define ERNIE_STAR_FIELD_ATTRIBUTES(X) \
|
|
89
|
+
X(double, MagnitudeLimit, "ernie:stars:magnitudeLimit", 99.0, \
|
|
90
|
+
"Stars fainter than this are left out.", .group = "Stars", .finite = true) \
|
|
91
|
+
X(double, ZeroPoint, "ernie:stars:zeroPoint", kMagnitudeZeroLux, \
|
|
92
|
+
"Lux of a magnitude 0 star (Allen's Astrophysical Quantities).", .group = "Stars", \
|
|
93
|
+
.lower = Above(0.0)) \
|
|
94
|
+
X(Tensor, Magnitude, "ernie:stars:magnitude", Tensor(), \
|
|
95
|
+
"float32 (stars): apparent visual (Johnson V) magnitudes.", .group = "Stars") \
|
|
96
|
+
X(Tensor, RightAscension, "ernie:stars:rightAscension", Tensor(), \
|
|
97
|
+
"float32 (stars), degrees, in the catalogue's frame.", .group = "Stars") \
|
|
98
|
+
X(Tensor, Declination, "ernie:stars:declination", Tensor(), \
|
|
99
|
+
"float32 (stars), degrees, in the catalogue's frame.", .group = "Stars") \
|
|
100
|
+
X(Tensor, Direction, "ernie:stars:direction", Tensor(), \
|
|
101
|
+
"float32 (stars, 3) unit directions in its own space, in place of right ascension and " \
|
|
102
|
+
"declination.", \
|
|
103
|
+
.group = "Stars", .components = 3) \
|
|
104
|
+
X(Tensor, ColorIndex, "ernie:stars:colorIndex", Tensor(), \
|
|
105
|
+
"float32 (stars): B-V colour indices, giving each star's temperature.", .group = "Stars") \
|
|
106
|
+
X(Tensor, Temperature, "ernie:stars:temperature", Tensor(), \
|
|
107
|
+
"float32 (stars) kelvin, in place of the colour indices; without either, the Sun's 5772 K.", \
|
|
108
|
+
.group = "Stars")
|
|
109
|
+
|
|
110
|
+
#define ERNIE_GROUND_PLANE_ATTRIBUTES(X) \
|
|
111
|
+
X(bool, Checker, "ernie:checker", false, "Multiplies its material's albedo by checker squares.", \
|
|
112
|
+
.group = "Ground") \
|
|
113
|
+
X(double, CheckerSize, "ernie:checker:size", 1.0, "Metres along a square's edge.", \
|
|
114
|
+
.group = "Ground", .lower = Above(0.0), .finite = true) \
|
|
115
|
+
X(glm::dvec3, CheckerColor0, "ernie:checker:color0", glm::dvec3(1.0), "Linear RGB.", \
|
|
116
|
+
.group = "Ground", .lower = AtLeast(0.0), .color = true) \
|
|
117
|
+
X(glm::dvec3, CheckerColor1, "ernie:checker:color1", glm::dvec3(0.5), "Linear RGB.", \
|
|
118
|
+
.group = "Ground", .lower = AtLeast(0.0), .color = true)
|
|
119
|
+
// clang-format on
|
|
120
|
+
|
|
121
|
+
namespace ernie {
|
|
122
|
+
|
|
123
|
+
ERNIE_SCHEMA_ACCESSORS(Terrain, Gprim, ERNIE_TERRAIN_ATTRIBUTES);
|
|
124
|
+
ERNIE_SCHEMA_ACCESSORS(Atmosphere, Xformable, ERNIE_ATMOSPHERE_ATTRIBUTES);
|
|
125
|
+
ERNIE_SCHEMA_ACCESSORS(StarField, NonboundableLightBase, ERNIE_STAR_FIELD_ATTRIBUTES);
|
|
126
|
+
ERNIE_SCHEMA_ACCESSORS(GroundPlane, Gprim, ERNIE_GROUND_PLANE_ATTRIBUTES);
|
|
127
|
+
|
|
128
|
+
/// Heights displacing a body's surface, or a plane.
|
|
129
|
+
class Terrain : public TerrainAccessors<Terrain, Gprim> {
|
|
130
|
+
ERNIE_SCHEMA_BODY(Terrain, Gprim)
|
|
131
|
+
ERNIE_SCHEMA_DEFINE(Terrain)
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/// The air around a body: its constituents, haze and clouds.
|
|
135
|
+
class Atmosphere : public AtmosphereAccessors<Atmosphere, Xformable> {
|
|
136
|
+
ERNIE_SCHEMA_BODY(Atmosphere, Xformable)
|
|
137
|
+
ERNIE_SCHEMA_DEFINE(Atmosphere)
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/// The stars, from a catalogue or arrays, at infinity: a light, unbounded.
|
|
141
|
+
class StarField : public StarFieldAccessors<StarField, NonboundableLightBase> {
|
|
142
|
+
ERNIE_SCHEMA_BODY(StarField, NonboundableLightBase)
|
|
143
|
+
ERNIE_SCHEMA_DEFINE(StarField)
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/// An infinite plane in its xy plane, facing +z.
|
|
147
|
+
class GroundPlane : public GroundPlaneAccessors<GroundPlane, Gprim> {
|
|
148
|
+
ERNIE_SCHEMA_BODY(GroundPlane, Gprim)
|
|
149
|
+
ERNIE_SCHEMA_DEFINE(GroundPlane)
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
} // namespace ernie
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include "ernie/scene/schemas/laser.h"
|
|
9
9
|
#include "ernie/scene/schemas/lux.h"
|
|
10
10
|
#include "ernie/scene/schemas/mesh.h"
|
|
11
|
+
#include "ernie/scene/schemas/planet.h"
|
|
11
12
|
#include "ernie/scene/schemas/shade.h"
|
|
12
13
|
#include "ernie/scene/schemas/vol.h"
|
|
13
14
|
|
|
@@ -52,12 +53,19 @@ std::span<const SchemaDef* const> Schemas() {
|
|
|
52
53
|
&DomeLight::Definition(),
|
|
53
54
|
&PortalLight::Definition(),
|
|
54
55
|
&LaserLight::Definition(),
|
|
56
|
+
&Terrain::Definition(),
|
|
57
|
+
&Atmosphere::Definition(),
|
|
58
|
+
&StarField::Definition(),
|
|
59
|
+
&GroundPlane::Definition(),
|
|
55
60
|
&ShapingAPI::Definition(),
|
|
56
61
|
&ShadowAPI::Definition(),
|
|
57
62
|
&PhotometricAreaLightAPI::Definition(),
|
|
58
63
|
&PhotometricDistantLightAPI::Definition(),
|
|
59
64
|
&PhotometricDomeLightAPI::Definition(),
|
|
60
65
|
&PhysicalLightIlluminantAPI::Definition(),
|
|
66
|
+
&NodeGraph::Definition(),
|
|
67
|
+
&Material::Definition(),
|
|
68
|
+
&Shader::Definition(),
|
|
61
69
|
&CollectionAPI::Definition(),
|
|
62
70
|
&MaterialBindingAPI::Definition(),
|
|
63
71
|
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file shade.cpp
|
|
3
|
+
/// @brief UsdShade's registry entries and connections.
|
|
4
|
+
#include "ernie/scene/schemas/shade.h"
|
|
5
|
+
|
|
6
|
+
#include <stdexcept>
|
|
7
|
+
|
|
8
|
+
namespace ernie {
|
|
9
|
+
namespace {
|
|
10
|
+
|
|
11
|
+
constexpr std::string_view kConnect = ".connect";
|
|
12
|
+
|
|
13
|
+
/// Inputs and outputs are open on every connectable prim, as UsdShadeConnectableAPI makes them.
|
|
14
|
+
#define ERNIE_CONNECTABLE .openNamespaces = {"inputs:", "outputs:"}
|
|
15
|
+
|
|
16
|
+
std::string ConnectionAttribute(std::string_view input) {
|
|
17
|
+
return std::string(input) + std::string(kConnect);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
} // namespace
|
|
21
|
+
|
|
22
|
+
ERNIE_DEFINE_SCHEMA(MaterialBindingAPI, "MaterialBindingAPI", nullptr, SingleApply, kInheritExtent,
|
|
23
|
+
"Binds a material to a prim and its descendants.",
|
|
24
|
+
ERNIE_MATERIAL_BINDING_API_ATTRIBUTES, .openNamespaces = {"material:binding:"})
|
|
25
|
+
ERNIE_DEFINE_SCHEMA(NodeGraph, "NodeGraph", nullptr, Concrete, kNoExtent,
|
|
26
|
+
"A network of shaders with the inputs its users set.", ERNIE_NO_ATTRIBUTES,
|
|
27
|
+
ERNIE_CONNECTABLE)
|
|
28
|
+
ERNIE_DEFINE_SCHEMA(Material, "Material", &NodeGraph::Definition(), Concrete, kInheritExtent,
|
|
29
|
+
"What prims are drawn with: its terminals connect to the shaders computing "
|
|
30
|
+
"them.",
|
|
31
|
+
ERNIE_NO_ATTRIBUTES)
|
|
32
|
+
ERNIE_DEFINE_SCHEMA(Shader, "Shader", nullptr, Concrete, kNoExtent,
|
|
33
|
+
"One node of a network, a model or a texture, by its info:id.",
|
|
34
|
+
ERNIE_SHADER_ATTRIBUTES, ERNIE_CONNECTABLE)
|
|
35
|
+
|
|
36
|
+
void Connect(Scene& scene, const Path& path, std::string_view input, const Connection& source) {
|
|
37
|
+
scene.Set(path, ConnectionAttribute(input), source.prim.String() + "." + source.output);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
std::optional<Connection> FindConnection(const Scene& scene, const Path& path,
|
|
41
|
+
std::string_view input) {
|
|
42
|
+
const std::optional<Value> value = scene.Get(path, ConnectionAttribute(input));
|
|
43
|
+
if (!value) {
|
|
44
|
+
return std::nullopt;
|
|
45
|
+
}
|
|
46
|
+
const std::string& text = *value->Get<std::string>();
|
|
47
|
+
const std::size_t dot =
|
|
48
|
+
text.find('.', text.rfind('/') == std::string::npos ? 0 : text.rfind('/'));
|
|
49
|
+
if (dot == std::string::npos || dot + 1 == text.size()) {
|
|
50
|
+
throw std::invalid_argument("'" + path.String() + "': " + ConnectionAttribute(input) +
|
|
51
|
+
" must be a prim path, a dot and a property, not '" + text +
|
|
52
|
+
"'");
|
|
53
|
+
}
|
|
54
|
+
return Connection{Path(text.substr(0, dot)), text.substr(dot + 1)};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
} // namespace ernie
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file shade.h
|
|
3
|
+
/// @brief UsdShade's schemas.
|
|
4
|
+
///
|
|
5
|
+
/// References:
|
|
6
|
+
/// - Pixar, UsdShade, https://openusd.org/release/api/usd_shade_page_front.html
|
|
7
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
#include "ernie/scene/view.h"
|
|
10
|
+
|
|
11
|
+
#include <optional>
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <string_view>
|
|
14
|
+
|
|
15
|
+
// clang-format off
|
|
16
|
+
#define ERNIE_MATERIAL_BINDING_API_ATTRIBUTES(X) \
|
|
17
|
+
X(Path, MaterialBinding, "material:binding", Path(), \
|
|
18
|
+
"The Material the prim and its descendants are drawn with.", .label = "Material", \
|
|
19
|
+
.group = "Material", .dirty = Dirty::Material)
|
|
20
|
+
|
|
21
|
+
#define ERNIE_SHADER_ATTRIBUTES(X) \
|
|
22
|
+
X(std::string, Id, "info:id", "", \
|
|
23
|
+
"The node it is: UsdPreviewSurface, UsdUVTexture, a primvar reader or an Ernie model.", \
|
|
24
|
+
.group = "Shader", .dirty = Dirty::Material) \
|
|
25
|
+
X(std::string, ImplementationSource, "info:implementationSource", "id", \
|
|
26
|
+
"Where its definition comes from: its id, a source asset or source code.", \
|
|
27
|
+
.group = "Shader", .options = {"id", "sourceAsset", "sourceCode"}, .dirty = Dirty::Material) \
|
|
28
|
+
X(std::string, SourceAsset, "info:sourceAsset", "", "A file defining it, as a MaterialX one.", \
|
|
29
|
+
.group = "Shader", .asset = true, .dirty = Dirty::Material) \
|
|
30
|
+
X(std::string, SourceCode, "info:sourceCode", "", "Code defining it, as a Slang model's.", \
|
|
31
|
+
.group = "Shader", .dirty = Dirty::Material)
|
|
32
|
+
// clang-format on
|
|
33
|
+
|
|
34
|
+
namespace ernie {
|
|
35
|
+
|
|
36
|
+
ERNIE_SCHEMA_ACCESSORS(MaterialBindingAPI, SchemaView, ERNIE_MATERIAL_BINDING_API_ATTRIBUTES);
|
|
37
|
+
ERNIE_SCHEMA_ACCESSORS(NodeGraph, SchemaView, ERNIE_NO_ATTRIBUTES);
|
|
38
|
+
ERNIE_SCHEMA_ACCESSORS(Material, NodeGraph, ERNIE_NO_ATTRIBUTES);
|
|
39
|
+
ERNIE_SCHEMA_ACCESSORS(Shader, SchemaView, ERNIE_SHADER_ATTRIBUTES);
|
|
40
|
+
|
|
41
|
+
/// Binds a material to a prim; `material:binding:<purpose>` binds one for a purpose.
|
|
42
|
+
class MaterialBindingAPI : public MaterialBindingAPIAccessors<MaterialBindingAPI, SchemaView> {
|
|
43
|
+
ERNIE_API_SCHEMA_BODY(MaterialBindingAPI)
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/// A network of shaders with `inputs:` its users set and `outputs:` connected inside it.
|
|
47
|
+
class NodeGraph : public NodeGraphAccessors<NodeGraph, SchemaView> {
|
|
48
|
+
ERNIE_SCHEMA_BODY(NodeGraph, SchemaView)
|
|
49
|
+
ERNIE_SCHEMA_DEFINE(NodeGraph)
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/// What prims are drawn with: its terminals `outputs:surface`, `outputs:displacement` and
|
|
53
|
+
/// `outputs:volume`, and Ernie's `outputs:ernie:thermal`, `outputs:ernie:lidar` and
|
|
54
|
+
/// `outputs:ernie:radar`, connect to the shaders that compute them.
|
|
55
|
+
class Material : public MaterialAccessors<Material, NodeGraph> {
|
|
56
|
+
ERNIE_SCHEMA_BODY(Material, NodeGraph)
|
|
57
|
+
ERNIE_SCHEMA_DEFINE(Material)
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/// One node of a network: a model or a texture, by its `info:id`, with its `inputs:` and
|
|
61
|
+
/// `outputs:`.
|
|
62
|
+
class Shader : public ShaderAccessors<Shader, SchemaView> {
|
|
63
|
+
ERNIE_SCHEMA_BODY(Shader, SchemaView)
|
|
64
|
+
ERNIE_SCHEMA_DEFINE(Shader)
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/// @brief The source of a connection: a shader or graph and one of its outputs.
|
|
68
|
+
struct Connection {
|
|
69
|
+
Path prim;
|
|
70
|
+
std::string output;
|
|
71
|
+
bool operator==(const Connection&) const = default;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/// @brief Connects an input or output of a Material, NodeGraph or Shader to another's output, as
|
|
75
|
+
/// USD's `<input>.connect` holds it: `/Looks/Red/Surface.outputs:surface`.
|
|
76
|
+
void Connect(Scene& scene, const Path& path, std::string_view input, const Connection& source);
|
|
77
|
+
/// @return The input's connection, or none.
|
|
78
|
+
/// @throws std::invalid_argument if its text is not a prim path, a dot and a property name.
|
|
79
|
+
std::optional<Connection> FindConnection(const Scene& scene, const Path& path,
|
|
80
|
+
std::string_view input);
|
|
81
|
+
|
|
82
|
+
} // namespace ernie
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
#define ERNIE_DENSE_FIELD_ATTRIBUTES(X) \
|
|
41
41
|
X(Tensor, Values, "ernie:values", Tensor(), \
|
|
42
42
|
"float32 (x, y, z) values, z fastest, on the host or a device; 0 is empty.", \
|
|
43
|
-
.group = "Field", .
|
|
43
|
+
.group = "Field", .ranks = {3}, .dirty = Dirty::Points) \
|
|
44
44
|
X(double, VoxelSize, "ernie:voxelSize", 1.0, \
|
|
45
45
|
"Metres between values: value (i, j, k) lies at the voxel size times (i, j, k).", \
|
|
46
46
|
.group = "Field", .lower = Above(0.0), .finite = true, .dirty = Dirty::Points)
|
|
@@ -61,8 +61,10 @@ ernie_add_test_suite(
|
|
|
61
61
|
scene/lux_test.cpp
|
|
62
62
|
scene/mesh_test.cpp
|
|
63
63
|
scene/path_test.cpp
|
|
64
|
+
scene/planet_test.cpp
|
|
64
65
|
scene/scene_test.cpp
|
|
65
66
|
scene/schema_test.cpp
|
|
67
|
+
scene/shade_test.cpp
|
|
66
68
|
scene/storage_test.cpp
|
|
67
69
|
scene/vol_test.cpp
|
|
68
70
|
scene/xform_test.cpp
|
|
@@ -82,10 +82,12 @@ TEST(Lights, ErnieAttributesSitBesideUsdLuxs) {
|
|
|
82
82
|
Scene scene;
|
|
83
83
|
SphereLight strobe = SphereLight::Define(scene, "/Strobe");
|
|
84
84
|
strobe.SetPulseRate(30.0).SetPulseTrigger(PulseTrigger::Exposure).SetPower(100.0);
|
|
85
|
-
|
|
85
|
+
PhysicalLightIlluminantAPI::Apply(scene, "/Strobe")
|
|
86
|
+
.SetPhysicalIlluminant("custom")
|
|
87
|
+
.SetPhysicalCustomIlluminant({400.0f, 1.0f, 700.0f, 0.5f});
|
|
86
88
|
EXPECT_EQ(scene.Get(strobe.Id(), "ernie:pulse:trigger"), Value("exposure"));
|
|
87
|
-
EXPECT_EQ(scene.Get(strobe.Id(), "ernie:power"), Value(100.0));
|
|
88
|
-
|
|
89
|
+
EXPECT_EQ(scene.Get(strobe.Id(), "ernie:power"), Value(100.0)) << "the scale of that shape";
|
|
90
|
+
EXPECT_FALSE(scene.Get(strobe.Id(), "ernie:spectrum")) << "shape comes from the illuminant";
|
|
89
91
|
EXPECT_EQ(DistantLight::Define(scene, "/Sun").GetIrradiance(), 1361.0);
|
|
90
92
|
EXPECT_THROW(strobe.SetPolarizationDegree(2.0), std::invalid_argument);
|
|
91
93
|
}
|