ernie-renderer 0.2.0.dev22__tar.gz → 0.2.0.dev32__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ernie-renderer might be problematic. Click here for more details.
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/CMakeLists.txt +1 -1
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/PKG-INFO +1 -1
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/benchmarks/CMakeLists.txt +1 -1
- ernie_renderer-0.2.0.dev32/benchmarks/scene/extents.cpp +40 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/nanovdb.cpp +25 -9
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/nanovdb.h +8 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/CMakeLists.txt +7 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/extent_cache.cpp +89 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/extent_cache.h +43 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/scene.cpp +78 -19
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/scene.h +26 -3
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schema.cpp +62 -4
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schema.h +48 -2
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/camera.cpp +20 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/camera.h +184 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/geom.cpp +6 -4
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/geom.h +9 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/instancer.cpp +93 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/instancer.h +63 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/laser.cpp +29 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/laser.h +95 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/lux.cpp +96 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/lux.h +305 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/mesh.cpp +67 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/mesh.h +87 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/registry.cpp +67 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/shade.cpp +1 -1
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/vol.cpp +126 -0
- ernie_renderer-0.2.0.dev32/ernie/scene/schemas/vol.h +95 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/storage.cpp +11 -2
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/storage.h +3 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/tokens.h +9 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/view.h +34 -10
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/bytes.h +26 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/CMakeLists.txt +5 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/common.h +21 -1
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/io/nanovdb_test.cpp +9 -0
- ernie_renderer-0.2.0.dev32/tests/scene/extent_cache_test.cpp +81 -0
- ernie_renderer-0.2.0.dev32/tests/scene/instancer_test.cpp +69 -0
- ernie_renderer-0.2.0.dev32/tests/scene/lux_test.cpp +148 -0
- ernie_renderer-0.2.0.dev32/tests/scene/mesh_test.cpp +75 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/scene/scene_test.cpp +19 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/scene/schema_test.cpp +3 -4
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/scene/storage_test.cpp +20 -0
- ernie_renderer-0.2.0.dev32/tests/scene/vol_test.cpp +83 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/bytes_test.cpp +17 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/worker_pool_test.cpp +10 -1
- ernie_renderer-0.2.0.dev22/ernie/scene/schemas/registry.cpp +0 -23
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.clang-format +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.clang-tidy +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.dockerignore +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.gersemirc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.gitattributes +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.github/scripts/coverage_badge.py +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.github/scripts/install-lavapipe-windows.sh +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.github/workflows/ci.yml +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.gitignore +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/.pre-commit-config.yaml +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/CMakePresets.json +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/Dockerfile +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/benchmarks/bench.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/benchmarks/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/benchmarks/scene/storage.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/ErnieConfig.cmake.in +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/ErnieFetch.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/ErnieInstall.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/ErniePackaging.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/ErnieTesting.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/ernie.pc.in +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/bc7enc.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/dlpack.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/glm.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/googletest.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/json.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/nanobind.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/openexr.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/stb.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/tracy.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/volk.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/cmake/third_party/vulkan_headers.cmake +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/docs/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/docs/index.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/docs/requirements.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/app/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/app/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/device/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/device/vulkan_devices.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/device/vulkan_devices.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/geometry/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/geometry/bounds.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/graph/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/ies.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/ies.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/image.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/image.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/raster.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/raster.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/texture.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/io/texture.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/astronomy.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/astronomy.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/atmosphere.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/atmosphere.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/cloud.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/cloud.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/constants.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/reflectance_library.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/reflectance_library.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/reflectance_table.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/regolith.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/regolith.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/scattering.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/scattering.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/solar.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/solar.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/solar_table.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/spectrum.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/physics/spectrum.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/python/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/python/ernie/__init__.py +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/python/module.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/render/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/convert.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/path.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/path.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/collection.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/collection.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/schemas/shade.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/value.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/view.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/xform.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/scene/xform.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/algorithm.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/disk_cache.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/disk_cache.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/file.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/file.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/glm.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/hash_index.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/linear_algebra.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/log.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/log.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/math.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/noise.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/noise.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/numbers.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/parallel.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/profiler.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/profiler.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/random.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/tensor.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/tensor.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/text.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/version.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/version.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/ernie/util/worker_pool.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/mkdocs.yml +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/pyproject.toml +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/consumer/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/consumer/main.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/device/vulkan_devices_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/make_exr.py +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/rgb_float_zip.exr +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/rgba_half_window.exr +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/exr/y_half_zips.exr +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/downlight_quadrant.ies +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/floodlight_type_b.ies +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ies/lamp.tilt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/images/grey16.png +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/quadrants_etc1s.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/quadrants_uastc_zstd.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/tilted_normal_etc1s.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/ktx2/tilted_normal_uastc.ktx2 +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/float_deflate_predictor3.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/float_raw.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/int16_bigtiff_bigendian.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_lzw_predictor2.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_planar_lzw.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_planar_raw.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/tiff/rgb_tiled_deflate.tif +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/volumes/cube.nvdb +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/fixtures/volumes/make_nvdb.py +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/geometry/bounds_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/io/ies_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/io/image_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/io/raster_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/io/texture_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/astronomy_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/atmosphere_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/cloud_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/reflectance_library_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/regolith_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/scattering_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/solar_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/physics/spectrum_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/python/test_package.py +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/scene/api_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/scene/path_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/scene/xform_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/algorithm_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/disk_cache_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/file_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/hash_index_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/linear_algebra_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/log_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/math_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/noise_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/parallel_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/profiler_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/random_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/tensor_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/text_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/tests/util/version_test.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/CMakeLists.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSES/Apache-2.0.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSES/BSD-3-clause.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/LICENSES/MIT.txt +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/NOTICE +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/README.md +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_astc_cfgs.inl +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_astc_hdr_core.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_astc_helpers.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_containers.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_containers_impl.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_dds_transcoder.inl +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_etc1_mods.inl +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_file_headers.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_idct.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder.cpp +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_internal.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_astc.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_55.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_atc_56.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_transcoder_uastc.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_xbc7_decoder.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/transcoder/basisu_xbc7_decoder.inl +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/zstd/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/zstd/zstd.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/basisu/zstd/zstd_errors.h +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/nanovdb/LICENSE +0 -0
- {ernie_renderer-0.2.0.dev22 → ernie_renderer-0.2.0.dev32}/third_party/nanovdb/PNanoVDB.h +0 -0
|
@@ -15,7 +15,7 @@ project(
|
|
|
15
15
|
)
|
|
16
16
|
|
|
17
17
|
# Pre-release suffix such as .dev12, written by CI.
|
|
18
|
-
set(ERNIE_VERSION_SUFFIX ".
|
|
18
|
+
set(ERNIE_VERSION_SUFFIX ".dev32" CACHE STRING "Pre-release suffix of Ernie's version")
|
|
19
19
|
set(ERNIE_VERSION "${PROJECT_VERSION}${ERNIE_VERSION_SUFFIX}")
|
|
20
20
|
|
|
21
21
|
option(ERNIE_BUILD_TESTS "Build Ernie's tests" OFF)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ernie-renderer
|
|
3
|
-
Version: 0.2.0.
|
|
3
|
+
Version: 0.2.0.dev32
|
|
4
4
|
Summary: Efficient Renderer for Natural and Interplanetary Environments: a physically based, spectral Vulkan ray tracer
|
|
5
5
|
Author: Alex Maietta
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file extents.cpp
|
|
3
|
+
/// @brief Cached extents at 100,000 prims: the first update, and one edit's.
|
|
4
|
+
#include "benchmarks/bench.h"
|
|
5
|
+
#include "ernie/scene/schemas/geom.h"
|
|
6
|
+
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include <string>
|
|
9
|
+
#include <vector>
|
|
10
|
+
|
|
11
|
+
namespace ernie::bench {
|
|
12
|
+
namespace {
|
|
13
|
+
|
|
14
|
+
constexpr int kSpheres = 100'000;
|
|
15
|
+
|
|
16
|
+
std::unique_ptr<Scene> MakeSpheres() {
|
|
17
|
+
auto scene = std::make_unique<Scene>();
|
|
18
|
+
for (int i = 0; i < kSpheres; ++i) {
|
|
19
|
+
scene->Define("/World/Ball_" + std::to_string(i), "Sphere");
|
|
20
|
+
}
|
|
21
|
+
return scene;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const bool kFirstUpdate = Register("scene.extents.first_update_100k", [] {
|
|
25
|
+
std::unique_ptr<Scene> scene;
|
|
26
|
+
return Timing{Fastest([&] { scene = MakeSpheres(); }, [&] { scene->UpdateExtents(); }), 10.0};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const bool kOneEdit = Register("scene.extents.update_after_one_edit_of_100k", [] {
|
|
30
|
+
std::unique_ptr<Scene> scene = MakeSpheres();
|
|
31
|
+
scene->UpdateExtents();
|
|
32
|
+
const PrimId ball = *scene->Find("/World/Ball_54321");
|
|
33
|
+
double radius = 1.0;
|
|
34
|
+
const double ms = Fastest([&] { scene->Set(ball, Sphere::kRadius, radius += 1.0); },
|
|
35
|
+
[&] { scene->UpdateExtents(); });
|
|
36
|
+
return Timing{ms, 1.0};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
} // namespace
|
|
40
|
+
} // namespace ernie::bench
|
|
@@ -173,9 +173,8 @@ NanoVdbGrid ParseGrid(std::span<const std::uint8_t> bytes) {
|
|
|
173
173
|
return grid;
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
// The grids of a raw buffer: each GridData header gives its grid's
|
|
177
|
-
|
|
178
|
-
std::vector<NanoVdbGrid> RawGrids(std::span<const std::uint8_t> bytes) {
|
|
176
|
+
// The grids of a raw buffer, or only their headers: each GridData header gives its grid's size.
|
|
177
|
+
std::vector<NanoVdbGrid> RawGrids(std::span<const std::uint8_t> bytes, bool headsOnly = false) {
|
|
179
178
|
std::vector<NanoVdbGrid> grids;
|
|
180
179
|
std::size_t offset = 0;
|
|
181
180
|
while (offset + PNANOVDB_GRID_SIZE <= bytes.size()) {
|
|
@@ -189,7 +188,11 @@ std::vector<NanoVdbGrid> RawGrids(std::span<const std::uint8_t> bytes) {
|
|
|
189
188
|
if (size < PNANOVDB_GRID_SIZE || offset + size > bytes.size()) {
|
|
190
189
|
throw std::runtime_error("NanoVDB grid size runs past its data");
|
|
191
190
|
}
|
|
192
|
-
|
|
191
|
+
const std::span<const std::uint8_t> grid =
|
|
192
|
+
bytes.subspan(offset, static_cast<std::size_t>(size));
|
|
193
|
+
grids.push_back(headsOnly ? NanoVdbGridHead(grid.first(std::min(
|
|
194
|
+
static_cast<std::size_t>(size), kNanoVdbHeadBytes)))
|
|
195
|
+
: ParseGrid(grid));
|
|
193
196
|
offset += size;
|
|
194
197
|
}
|
|
195
198
|
if (grids.empty()) {
|
|
@@ -234,6 +237,10 @@ std::vector<NanoVdbGrid> ParseNanoVdbGrids(std::span<const std::uint8_t> bytes)
|
|
|
234
237
|
return RawGrids(bytes);
|
|
235
238
|
}
|
|
236
239
|
|
|
240
|
+
std::vector<NanoVdbGrid> ParseNanoVdbHeads(std::span<const std::uint8_t> bytes) {
|
|
241
|
+
return RawGrids(bytes, true);
|
|
242
|
+
}
|
|
243
|
+
|
|
237
244
|
NanoVdbGrid NanoVdbGridHead(std::span<const std::uint8_t> head) {
|
|
238
245
|
const auto magic = ReadLittleEndian<std::uint64_t>(head, 0);
|
|
239
246
|
if (magic != kMagicNumber && magic != kMagicGrid) {
|
|
@@ -247,8 +254,9 @@ NanoVdbGrid NanoVdbGridHead(std::span<const std::uint8_t> head) {
|
|
|
247
254
|
return grid;
|
|
248
255
|
}
|
|
249
256
|
|
|
250
|
-
std::vector<NanoVdbGrid>
|
|
251
|
-
// Grids are copied out of the mapping into buffers aligned for PNanoVDB
|
|
257
|
+
static std::vector<NanoVdbGrid> ReadGrids(const std::filesystem::path& path, bool headsOnly) {
|
|
258
|
+
// Grids are copied out of the mapping into buffers aligned for PNanoVDB; heads touch only the
|
|
259
|
+
// pages holding them.
|
|
252
260
|
const MappedFile file(path);
|
|
253
261
|
const std::span<const std::uint8_t> data(
|
|
254
262
|
reinterpret_cast<const std::uint8_t*>(file.Bytes().data()), file.Bytes().size());
|
|
@@ -256,7 +264,7 @@ std::vector<NanoVdbGrid> ReadNanoVdb(const std::filesystem::path& path) {
|
|
|
256
264
|
try {
|
|
257
265
|
const auto magic = ReadLittleEndian<std::uint64_t>(data, 0);
|
|
258
266
|
if (magic == kMagicGrid) {
|
|
259
|
-
return RawGrids(data);
|
|
267
|
+
return RawGrids(data, headsOnly);
|
|
260
268
|
}
|
|
261
269
|
if (magic != kMagicNumber && magic != kMagicFile) {
|
|
262
270
|
throw std::runtime_error("not a NanoVDB file");
|
|
@@ -267,7 +275,7 @@ std::vector<NanoVdbGrid> ReadNanoVdb(const std::filesystem::path& path) {
|
|
|
267
275
|
if (MajorVersion(ReadLittleEndian<std::uint32_t>(data, 8)) != kMajorVersion &&
|
|
268
276
|
MajorVersion(ReadLittleEndian<std::uint32_t>(data, PNANOVDB_GRID_OFF_VERSION)) ==
|
|
269
277
|
kMajorVersion) {
|
|
270
|
-
return RawGrids(data);
|
|
278
|
+
return RawGrids(data, headsOnly);
|
|
271
279
|
}
|
|
272
280
|
std::vector<NanoVdbGrid> grids;
|
|
273
281
|
std::size_t offset = 0;
|
|
@@ -296,7 +304,7 @@ std::vector<NanoVdbGrid> ReadNanoVdb(const std::filesystem::path& path) {
|
|
|
296
304
|
if (offset + size > data.size()) {
|
|
297
305
|
throw std::runtime_error("grid runs past the file's end");
|
|
298
306
|
}
|
|
299
|
-
std::vector<NanoVdbGrid> one = RawGrids(data.subspan(offset, size));
|
|
307
|
+
std::vector<NanoVdbGrid> one = RawGrids(data.subspan(offset, size), headsOnly);
|
|
300
308
|
grids.insert(grids.end(), std::make_move_iterator(one.begin()),
|
|
301
309
|
std::make_move_iterator(one.end()));
|
|
302
310
|
offset += size;
|
|
@@ -315,6 +323,14 @@ std::vector<NanoVdbGrid> ReadNanoVdb(const std::filesystem::path& path) {
|
|
|
315
323
|
}
|
|
316
324
|
}
|
|
317
325
|
|
|
326
|
+
std::vector<NanoVdbGrid> ReadNanoVdb(const std::filesystem::path& path) {
|
|
327
|
+
return ReadGrids(path, false);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
std::vector<NanoVdbGrid> ReadNanoVdbHeads(const std::filesystem::path& path) {
|
|
331
|
+
return ReadGrids(path, true);
|
|
332
|
+
}
|
|
333
|
+
|
|
318
334
|
const NanoVdbGrid* FindNanoVdbGrid(std::span<const NanoVdbGrid> grids, std::string_view name,
|
|
319
335
|
int index) {
|
|
320
336
|
// An index into the caller's grids, which cppcheck follows where
|
|
@@ -95,12 +95,20 @@ struct NanoVdbGrid {
|
|
|
95
95
|
/// `nanovdb_convert` without `-z`/`-b`).
|
|
96
96
|
std::vector<NanoVdbGrid> ReadNanoVdb(const std::filesystem::path& path);
|
|
97
97
|
|
|
98
|
+
/// @brief Reads the headers of a NanoVDB file's grids (names, types, bounds and transforms)
|
|
99
|
+
/// without their voxels, as `NanoVdbGridHead` does for each grid.
|
|
100
|
+
/// @throws std::runtime_error As `ReadNanoVdb`.
|
|
101
|
+
std::vector<NanoVdbGrid> ReadNanoVdbHeads(const std::filesystem::path& path);
|
|
102
|
+
|
|
98
103
|
/// @brief Splits a raw in-memory NanoVDB buffer into its grids.
|
|
99
104
|
/// @param bytes Grids back to back, as Warp's `Volume.array()`.
|
|
100
105
|
/// @return The grids.
|
|
101
106
|
/// @throws std::runtime_error If it does not start with a version 32
|
|
102
107
|
/// NanoVDB grid.
|
|
103
108
|
std::vector<NanoVdbGrid> ParseNanoVdbGrids(std::span<const std::uint8_t> bytes);
|
|
109
|
+
/// @brief Reads the headers of a raw buffer's grids, without copying their voxels.
|
|
110
|
+
/// @throws std::runtime_error As `ParseNanoVdbGrids`.
|
|
111
|
+
std::vector<NanoVdbGrid> ParseNanoVdbHeads(std::span<const std::uint8_t> bytes);
|
|
104
112
|
|
|
105
113
|
/// Bytes at a grid's start holding its header, tree and root, root
|
|
106
114
|
/// statistics included.
|
|
@@ -2,15 +2,22 @@
|
|
|
2
2
|
add_library(
|
|
3
3
|
ernie_scene
|
|
4
4
|
OBJECT
|
|
5
|
+
extent_cache.cpp
|
|
5
6
|
path.cpp
|
|
6
7
|
schema.cpp
|
|
7
8
|
scene.cpp
|
|
8
9
|
storage.cpp
|
|
9
10
|
view.cpp
|
|
10
11
|
xform.cpp
|
|
12
|
+
schemas/camera.cpp
|
|
11
13
|
schemas/collection.cpp
|
|
12
14
|
schemas/geom.cpp
|
|
15
|
+
schemas/instancer.cpp
|
|
16
|
+
schemas/laser.cpp
|
|
17
|
+
schemas/lux.cpp
|
|
18
|
+
schemas/mesh.cpp
|
|
13
19
|
schemas/registry.cpp
|
|
14
20
|
schemas/shade.cpp
|
|
21
|
+
schemas/vol.cpp
|
|
15
22
|
)
|
|
16
23
|
target_link_libraries(ernie_scene PUBLIC ernie_physics ernie_io PRIVATE ernie_build_options)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file extent_cache.cpp
|
|
3
|
+
/// @brief Replaying row changes into the extent boxes and recomputing stale runs.
|
|
4
|
+
#include "ernie/scene/extent_cache.h"
|
|
5
|
+
|
|
6
|
+
#include <algorithm>
|
|
7
|
+
|
|
8
|
+
namespace ernie {
|
|
9
|
+
|
|
10
|
+
void ExtentCache::Track(BucketId bucket, ExtentFunction compute) {
|
|
11
|
+
buckets_.resize(std::max<std::size_t>(buckets_.size(), bucket + 1));
|
|
12
|
+
buckets_[bucket].compute = compute;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void ExtentCache::Update(const PrimStore& store) {
|
|
16
|
+
const ChangeSet changes = store.ChangesSince(cursor_);
|
|
17
|
+
const auto tracked = [&](BucketId bucket) {
|
|
18
|
+
return bucket < buckets_.size() && buckets_[bucket].compute != nullptr;
|
|
19
|
+
};
|
|
20
|
+
for (const BucketId bucket : changes.resets) {
|
|
21
|
+
if (tracked(bucket)) {
|
|
22
|
+
Resize(buckets_[bucket], 0);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const ChangeSet::Rows& rows : changes.rows) {
|
|
26
|
+
if (tracked(rows.bucket)) {
|
|
27
|
+
Replay(buckets_[rows.bucket], rows.change);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (const ChangeSet::Values& values : changes.values) {
|
|
31
|
+
if (tracked(values.bucket)) {
|
|
32
|
+
for (const RowRange range : values.rows) {
|
|
33
|
+
buckets_[values.bucket].stale.SetRange(range.begin, range.end);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
for (BucketId bucket = 0; bucket < buckets_.size(); ++bucket) {
|
|
38
|
+
if (tracked(bucket) && store.GetBucket(bucket).version > cursor_) {
|
|
39
|
+
Refresh(buckets_[bucket], store, bucket);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
cursor_ = changes.version;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
std::optional<Box> ExtentCache::Find(const PrimStore& store, BucketId bucket,
|
|
46
|
+
std::uint32_t row) const {
|
|
47
|
+
if (bucket >= buckets_.size() || buckets_[bucket].compute == nullptr ||
|
|
48
|
+
store.GetBucket(bucket).version > cursor_ || row >= buckets_[bucket].boxes.size()) {
|
|
49
|
+
return std::nullopt;
|
|
50
|
+
}
|
|
51
|
+
return buckets_[bucket].boxes[row];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void ExtentCache::Replay(Entry& entry, const StructuralChange& change) {
|
|
55
|
+
using Kind = StructuralChange::Kind;
|
|
56
|
+
if (change.kind == Kind::Added) {
|
|
57
|
+
Resize(entry, change.row + change.count);
|
|
58
|
+
entry.stale.SetRange(change.row, change.row + change.count);
|
|
59
|
+
} else if (change.kind == Kind::Moved) {
|
|
60
|
+
// Recomputed, not copied: the moved row's own value edits are reported at its old place.
|
|
61
|
+
entry.stale.Set(change.row);
|
|
62
|
+
Resize(entry, change.from);
|
|
63
|
+
} else if (change.row + 1 == entry.boxes.size()) {
|
|
64
|
+
// Removing the last row moves nothing; otherwise the Moved that follows shrinks it.
|
|
65
|
+
Resize(entry, change.row);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void ExtentCache::Resize(Entry& entry, std::uint32_t rows) {
|
|
70
|
+
entry.boxes.resize(rows);
|
|
71
|
+
entry.stale.Resize(rows);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
void ExtentCache::Refresh(Entry& entry, const PrimStore& store, BucketId bucket) {
|
|
75
|
+
const std::uint32_t rows = store.GetBucket(bucket).Rows();
|
|
76
|
+
if (entry.boxes.size() != rows) {
|
|
77
|
+
// Too far behind to replay (a reset): recompute the bucket whole.
|
|
78
|
+
Resize(entry, rows);
|
|
79
|
+
entry.stale.SetRange(0, rows);
|
|
80
|
+
}
|
|
81
|
+
const ExtentRows columns{store, bucket};
|
|
82
|
+
entry.stale.ForEachRun([&](std::size_t begin, std::size_t end) {
|
|
83
|
+
entry.compute(columns, {static_cast<std::uint32_t>(begin), static_cast<std::uint32_t>(end)},
|
|
84
|
+
std::span(entry.boxes).subspan(begin, end - begin));
|
|
85
|
+
});
|
|
86
|
+
entry.stale.Clear();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
} // namespace ernie
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
/// @file extent_cache.h
|
|
3
|
+
/// @brief Prims' extents kept per bucket and refreshed for the rows that changed.
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
#include "ernie/geometry/bounds.h"
|
|
7
|
+
#include "ernie/scene/schema.h"
|
|
8
|
+
#include "ernie/scene/storage.h"
|
|
9
|
+
#include "ernie/util/bytes.h"
|
|
10
|
+
|
|
11
|
+
#include <cstdint>
|
|
12
|
+
#include <optional>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
namespace ernie {
|
|
16
|
+
|
|
17
|
+
/// @brief The extents of every bucket with an extent function, a box per row. `Update` replays
|
|
18
|
+
/// the buckets' row changes and recomputes only the rows whose values or places changed.
|
|
19
|
+
class ExtentCache {
|
|
20
|
+
public:
|
|
21
|
+
/// Tracks a bucket, computing its extents with `compute`; null for a bucket without them.
|
|
22
|
+
void Track(BucketId bucket, ExtentFunction compute);
|
|
23
|
+
/// Brings every tracked bucket up to the store's version.
|
|
24
|
+
void Update(const PrimStore& store);
|
|
25
|
+
/// @return A row's extent, or none when its bucket changed since `Update` or has none.
|
|
26
|
+
std::optional<Box> Find(const PrimStore& store, BucketId bucket, std::uint32_t row) const;
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
struct Entry {
|
|
30
|
+
ExtentFunction compute = nullptr;
|
|
31
|
+
std::vector<Box> boxes;
|
|
32
|
+
BitSet stale;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
static void Replay(Entry& entry, const StructuralChange& change);
|
|
36
|
+
static void Resize(Entry& entry, std::uint32_t rows);
|
|
37
|
+
static void Refresh(Entry& entry, const PrimStore& store, BucketId bucket);
|
|
38
|
+
|
|
39
|
+
std::vector<Entry> buckets_;
|
|
40
|
+
std::uint64_t cursor_ = 0;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
} // namespace ernie
|
|
@@ -16,14 +16,15 @@
|
|
|
16
16
|
namespace ernie {
|
|
17
17
|
namespace {
|
|
18
18
|
|
|
19
|
-
/// @return A column layout for the attribute `name` holding `
|
|
20
|
-
ColumnLayout MakeLayout(PathTable& paths, const AttributeDef& def, std::string_view name
|
|
19
|
+
/// @return A column layout for the attribute `name` holding `fallback` in unauthored rows.
|
|
20
|
+
ColumnLayout MakeLayout(PathTable& paths, const AttributeDef& def, std::string_view name,
|
|
21
|
+
const Value& fallback) {
|
|
21
22
|
const AttributeId attribute = paths.Names().Intern(name);
|
|
22
23
|
return WithColumnType(def.type, [&]<typename T>(std::type_identity<T>) {
|
|
23
24
|
if constexpr (std::is_same_v<T, Tensor>) {
|
|
24
25
|
return ColumnLayout::Of<T>(attribute);
|
|
25
26
|
} else {
|
|
26
|
-
return ColumnLayout::Of<T>(attribute, ToElement<T>(paths,
|
|
27
|
+
return ColumnLayout::Of<T>(attribute, ToElement<T>(paths, fallback).value_or(T{}));
|
|
27
28
|
}
|
|
28
29
|
});
|
|
29
30
|
}
|
|
@@ -136,7 +137,7 @@ std::vector<Path> Scene::Prims(std::string_view type) const {
|
|
|
136
137
|
|
|
137
138
|
void Scene::Set(PrimId prim, std::string_view attribute, const Value& value) {
|
|
138
139
|
const AttributeId token = store_.Tokens().Intern(attribute);
|
|
139
|
-
const AttributeDef* def = Declared(prim, token);
|
|
140
|
+
const AttributeDef* def = Declared(store_.PrimBucket(prim), token);
|
|
140
141
|
if (def != nullptr) {
|
|
141
142
|
Validate(*def, attribute, value, PrimPath(prim));
|
|
142
143
|
}
|
|
@@ -155,6 +156,27 @@ void Scene::Set(const Path& path, std::string_view attribute, const Value& value
|
|
|
155
156
|
Set(Require(path), attribute, value);
|
|
156
157
|
}
|
|
157
158
|
|
|
159
|
+
void Scene::Write(PrimId prim, std::string_view attribute, Tensor array) {
|
|
160
|
+
const AttributeId token = store_.Tokens().Intern(attribute);
|
|
161
|
+
const AttributeDef* def = Declared(store_.PrimBucket(prim), token);
|
|
162
|
+
if (def == nullptr && !TakesUndeclared(prim, attribute)) {
|
|
163
|
+
throw std::invalid_argument(Describe(*this, prim) + " has no attribute '" +
|
|
164
|
+
std::string(attribute) + "'");
|
|
165
|
+
}
|
|
166
|
+
if (def != nullptr) {
|
|
167
|
+
ValidateArray(*def, attribute, array, PrimPath(prim));
|
|
168
|
+
}
|
|
169
|
+
store_.Set(prim, token, std::move(array));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const Tensor* Scene::Read(PrimId prim, std::string_view attribute) const {
|
|
173
|
+
const Column* column = AuthoredColumn(prim, attribute);
|
|
174
|
+
if (column == nullptr || column->values->Type() != ColumnType::Tensor) {
|
|
175
|
+
return nullptr;
|
|
176
|
+
}
|
|
177
|
+
return &store_.Read<Tensor>(store_.PrimBucket(prim), column->attribute)[store_.PrimRow(prim)];
|
|
178
|
+
}
|
|
179
|
+
|
|
158
180
|
std::optional<Value> Scene::Get(PrimId prim, std::string_view attribute) const {
|
|
159
181
|
const Column* column = AuthoredColumn(prim, attribute);
|
|
160
182
|
if (column == nullptr) {
|
|
@@ -216,9 +238,13 @@ std::optional<Box> Scene::Extent(PrimId prim) const {
|
|
|
216
238
|
if (rule.kind != ExtentRule::Kind::Computed) {
|
|
217
239
|
return std::nullopt;
|
|
218
240
|
}
|
|
241
|
+
const BucketId bucket = store_.PrimBucket(prim);
|
|
219
242
|
const std::uint32_t row = store_.PrimRow(prim);
|
|
243
|
+
if (const std::optional<Box> cached = extents_.Find(store_, bucket, row)) {
|
|
244
|
+
return cached;
|
|
245
|
+
}
|
|
220
246
|
Box extent;
|
|
221
|
-
rule.compute({store_,
|
|
247
|
+
rule.compute({store_, bucket, this}, {row, row + 1}, std::span(&extent, 1));
|
|
222
248
|
return extent;
|
|
223
249
|
}
|
|
224
250
|
|
|
@@ -229,23 +255,31 @@ Box Scene::WorldBounds(const Path& path) const {
|
|
|
229
255
|
const glm::dmat4 above =
|
|
230
256
|
parent == kRootPath ? glm::dmat4(1.0) : WorldTransform(*store_.Find(parent));
|
|
231
257
|
Box bounds;
|
|
232
|
-
AddTo(bounds, id, above);
|
|
258
|
+
AddTo(bounds, id, above, true);
|
|
233
259
|
return bounds;
|
|
234
260
|
}
|
|
235
261
|
|
|
236
|
-
|
|
262
|
+
Box Scene::BoundsInParent(PrimId prim) const {
|
|
263
|
+
Box bounds;
|
|
264
|
+
AddTo(bounds, store_.PrimPath(prim), glm::dmat4(1.0), false);
|
|
265
|
+
return bounds;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
void Scene::AddTo(Box& bounds, PathId path, const glm::dmat4& parent, bool visibleOnly) const {
|
|
237
269
|
const PrimId prim = *store_.Find(path);
|
|
238
|
-
if (LeavesOutOfBounds(prim)) {
|
|
270
|
+
if (visibleOnly && LeavesOutOfBounds(prim)) {
|
|
239
271
|
return;
|
|
240
272
|
}
|
|
241
273
|
const glm::dmat4 local = LocalTransform(prim);
|
|
242
274
|
const glm::dmat4 world = ResetsXformStack(*this, prim) ? local : parent * local;
|
|
275
|
+
// A prim with an extent bounds what it is made of, so its children aren't added again.
|
|
243
276
|
if (const std::optional<Box> extent = Extent(prim)) {
|
|
244
277
|
bounds.Extend(extent->Transformed(world));
|
|
278
|
+
return;
|
|
245
279
|
}
|
|
246
280
|
store_.Paths().ForEachChild(path, [&](PathId child) {
|
|
247
281
|
if (store_.Find(child)) {
|
|
248
|
-
AddTo(bounds, child, world);
|
|
282
|
+
AddTo(bounds, child, world, visibleOnly);
|
|
249
283
|
}
|
|
250
284
|
});
|
|
251
285
|
}
|
|
@@ -269,20 +303,24 @@ BucketId Scene::FindOrAddBucket(const SchemaDef* schema, std::vector<Token> apis
|
|
|
269
303
|
std::vector<ColumnLayout> layout;
|
|
270
304
|
const auto add = [&](const SchemaDef& declaring, const ApiName& api) {
|
|
271
305
|
for (const AttributeDef* def : declaring.AllAttributes()) {
|
|
272
|
-
|
|
306
|
+
const std::string name = api.Attribute(def->name);
|
|
307
|
+
const Value* override = schema != nullptr ? schema->FallbackOverride(name) : nullptr;
|
|
308
|
+
layout.push_back(MakeLayout(paths, *def, name, override ? *override : def->fallback));
|
|
273
309
|
entry.declared.emplace(layout.back().attribute, def);
|
|
274
310
|
}
|
|
275
311
|
};
|
|
276
312
|
if (schema != nullptr) {
|
|
277
313
|
add(*schema, {});
|
|
278
314
|
}
|
|
279
|
-
for (const
|
|
280
|
-
const ApiName api = ApiName::Parse(paths.Names().Text(token));
|
|
315
|
+
for (const ApiName& api : AllApis(schema, key.apiSchemas)) {
|
|
281
316
|
add(*api.schema, api);
|
|
282
317
|
}
|
|
283
318
|
const BucketId bucket = store_.AddBucket(key, layout);
|
|
284
319
|
buckets_.resize(std::max<std::size_t>(buckets_.size(), bucket + 1));
|
|
285
320
|
buckets_[bucket] = std::move(entry);
|
|
321
|
+
const ExtentRule rule = schema != nullptr ? schema->Extent() : kNoExtent;
|
|
322
|
+
const bool cached = rule.kind == ExtentRule::Kind::Computed && !rule.readsOtherPrims;
|
|
323
|
+
extents_.Track(bucket, cached ? rule.compute : nullptr);
|
|
286
324
|
return bucket;
|
|
287
325
|
}
|
|
288
326
|
|
|
@@ -312,8 +350,20 @@ bool Scene::RemoveApi(PrimId prim, std::string_view api) {
|
|
|
312
350
|
}
|
|
313
351
|
|
|
314
352
|
bool Scene::HasApi(PrimId prim, std::string_view api) const {
|
|
315
|
-
|
|
316
|
-
|
|
353
|
+
return std::ranges::any_of(AllApis(Schema(prim), Apis(prim)),
|
|
354
|
+
[&](const ApiName& name) { return name.ToString() == api; });
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
std::vector<ApiName> Scene::AllApis(const SchemaDef* schema, std::span<const Token> applied) const {
|
|
358
|
+
std::vector<ApiName> apis;
|
|
359
|
+
for (const std::string_view builtin :
|
|
360
|
+
schema != nullptr ? schema->AllBuiltinApis() : std::vector<std::string_view>{}) {
|
|
361
|
+
apis.push_back(ApiName::Parse(builtin));
|
|
362
|
+
}
|
|
363
|
+
for (const Token token : applied) {
|
|
364
|
+
apis.push_back(ApiName::Parse(store_.Tokens().Text(token)));
|
|
365
|
+
}
|
|
366
|
+
return apis;
|
|
317
367
|
}
|
|
318
368
|
|
|
319
369
|
std::vector<std::string> Scene::AppliedApis(PrimId prim) const {
|
|
@@ -338,18 +388,27 @@ const Column* Scene::AuthoredColumn(PrimId prim, std::string_view attribute) con
|
|
|
338
388
|
return column != nullptr && column->authored.Test(store_.PrimRow(prim)) ? column : nullptr;
|
|
339
389
|
}
|
|
340
390
|
|
|
341
|
-
const AttributeDef* Scene::Declared(
|
|
342
|
-
const auto& declared = buckets_[
|
|
391
|
+
const AttributeDef* Scene::Declared(BucketId bucket, AttributeId attribute) const {
|
|
392
|
+
const auto& declared = buckets_[bucket].declared;
|
|
343
393
|
const auto found = declared.find(attribute);
|
|
344
394
|
return found != declared.end() ? found->second : nullptr;
|
|
345
395
|
}
|
|
346
396
|
|
|
397
|
+
Dirty Scene::Classify(const ChangeSet::Values& change) const {
|
|
398
|
+
if (const AttributeDef* def = Declared(change.bucket, change.attribute)) {
|
|
399
|
+
return def->meta.dirty;
|
|
400
|
+
}
|
|
401
|
+
const std::string_view name = store_.Tokens().Text(change.attribute);
|
|
402
|
+
return name.starts_with(tokens::kXformOpPrefix) ? Dirty::Transform
|
|
403
|
+
: name.starts_with(tokens::kPrimvarsPrefix) ? Dirty::Primvars
|
|
404
|
+
: Dirty::Params;
|
|
405
|
+
}
|
|
406
|
+
|
|
347
407
|
bool Scene::TakesUndeclared(PrimId prim, std::string_view attribute) const {
|
|
348
408
|
const SchemaDef* schema = Schema(prim);
|
|
349
409
|
return schema == nullptr || schema->IsOpen(attribute) ||
|
|
350
|
-
std::ranges::any_of(Apis(prim),
|
|
351
|
-
|
|
352
|
-
});
|
|
410
|
+
std::ranges::any_of(AllApis(schema, Apis(prim)),
|
|
411
|
+
[&](const ApiName& api) { return api.schema->IsOpen(attribute); });
|
|
353
412
|
}
|
|
354
413
|
|
|
355
414
|
ColumnType Scene::TypeForUndeclared(PrimId prim, std::string_view attribute,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
#pragma once
|
|
5
5
|
|
|
6
6
|
#include "ernie/geometry/bounds.h"
|
|
7
|
+
#include "ernie/scene/extent_cache.h"
|
|
7
8
|
#include "ernie/scene/schema.h"
|
|
8
9
|
#include "ernie/scene/storage.h"
|
|
9
10
|
#include "ernie/scene/value.h"
|
|
@@ -67,6 +68,12 @@ class Scene {
|
|
|
67
68
|
/// @return The authored value, or none.
|
|
68
69
|
std::optional<Value> Get(PrimId prim, std::string_view attribute) const;
|
|
69
70
|
std::optional<Value> Get(const Path& path, std::string_view attribute) const;
|
|
71
|
+
/// @brief Authors an array attribute with a tensor on the host or a device, shared, not copied.
|
|
72
|
+
/// @throws std::invalid_argument for a non-array attribute, or a tensor of the wrong type or
|
|
73
|
+
/// shape.
|
|
74
|
+
void Write(PrimId prim, std::string_view attribute, Tensor array);
|
|
75
|
+
/// @return The authored array, or null.
|
|
76
|
+
const Tensor* Read(PrimId prim, std::string_view attribute) const;
|
|
70
77
|
/// @return Whether the attribute was authored.
|
|
71
78
|
bool Clear(PrimId prim, std::string_view attribute);
|
|
72
79
|
bool IsAuthored(PrimId prim, std::string_view attribute) const;
|
|
@@ -77,9 +84,18 @@ class Scene {
|
|
|
77
84
|
glm::dmat4 LocalTransform(PrimId prim) const;
|
|
78
85
|
glm::dmat4 WorldTransform(PrimId prim) const;
|
|
79
86
|
/// @return The prim's extent in its own space; none when it isn't computed from attributes.
|
|
87
|
+
/// Cached since `UpdateExtents` when its bucket hasn't changed, computed otherwise.
|
|
80
88
|
std::optional<Box> Extent(PrimId prim) const;
|
|
89
|
+
/// @brief Recomputes the cached extents of the rows that changed since the last update.
|
|
90
|
+
void UpdateExtents() {
|
|
91
|
+
extents_.Update(store_);
|
|
92
|
+
}
|
|
81
93
|
/// @return The world box of the prim and its visible descendants of the default purpose.
|
|
94
|
+
/// Prims with extents bound their own subtrees, as UsdGeomBBoxCache prunes at Boundables.
|
|
82
95
|
Box WorldBounds(const Path& path) const;
|
|
96
|
+
/// @return The box of a prim's subtree in its parent's space, whatever its visibility: what a
|
|
97
|
+
/// point instancer places at each instance.
|
|
98
|
+
Box BoundsInParent(PrimId prim) const;
|
|
83
99
|
|
|
84
100
|
PrimStore& Store() {
|
|
85
101
|
return store_;
|
|
@@ -90,6 +106,9 @@ class Scene {
|
|
|
90
106
|
std::uint64_t Version() const {
|
|
91
107
|
return store_.Version();
|
|
92
108
|
}
|
|
109
|
+
/// @return What a column change means to renderers: the attribute's declared category, or for
|
|
110
|
+
/// undeclared ones Transform for xformOps, Primvars for primvars and Params for the rest.
|
|
111
|
+
Dirty Classify(const ChangeSet::Values& change) const;
|
|
93
112
|
|
|
94
113
|
private:
|
|
95
114
|
struct BucketSchema {
|
|
@@ -102,22 +121,26 @@ class Scene {
|
|
|
102
121
|
/// Moves a prim to the bucket of its type and `apis`.
|
|
103
122
|
void MoveTo(PrimId prim, const SchemaDef* schema, std::vector<Token> apis);
|
|
104
123
|
const std::vector<Token>& Apis(PrimId prim) const;
|
|
124
|
+
/// @return A type's built-in API schemas, then the applied ones.
|
|
125
|
+
std::vector<ApiName> AllApis(const SchemaDef* schema, std::span<const Token> applied) const;
|
|
105
126
|
/// @return The attribute's column when the prim authors it, or null.
|
|
106
127
|
const Column* AuthoredColumn(PrimId prim, std::string_view attribute) const;
|
|
107
|
-
const AttributeDef* Declared(
|
|
128
|
+
const AttributeDef* Declared(BucketId bucket, AttributeId attribute) const;
|
|
108
129
|
/// @return Whether the prim's type or an applied API schema leaves the attribute's namespace
|
|
109
130
|
/// open; any attribute for a prim without a type.
|
|
110
131
|
bool TakesUndeclared(PrimId prim, std::string_view attribute) const;
|
|
111
132
|
ColumnType TypeForUndeclared(PrimId prim, std::string_view attribute, const Value& value) const;
|
|
112
133
|
/// @return Whether the prim and its subtree are invisible or of a purpose bounds leave out.
|
|
113
134
|
bool LeavesOutOfBounds(PrimId prim) const;
|
|
114
|
-
/// Adds
|
|
115
|
-
|
|
135
|
+
/// Adds a subtree's extents under `parent`'s transform; with `visibleOnly`, only its visible
|
|
136
|
+
/// default-purpose prims'.
|
|
137
|
+
void AddTo(Box& bounds, PathId path, const glm::dmat4& parent, bool visibleOnly) const;
|
|
116
138
|
|
|
117
139
|
PrimStore store_;
|
|
118
140
|
Token invisible_ = 0;
|
|
119
141
|
Token defaultPurpose_ = 0;
|
|
120
142
|
std::vector<BucketSchema> buckets_;
|
|
143
|
+
ExtentCache extents_;
|
|
121
144
|
};
|
|
122
145
|
|
|
123
146
|
} // namespace ernie
|