less3d 3.0.5__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 less3d might be problematic. Click here for more details.

Files changed (1475) hide show
  1. less3d-3.0.5/.agents/skills/less-skill/README.md +86 -0
  2. less3d-3.0.5/.agents/skills/less-skill/SKILL.md +334 -0
  3. less3d-3.0.5/.agents/skills/less-skill/api-reference.md +965 -0
  4. less3d-3.0.5/.agents/skills/less-skill/examples.md +992 -0
  5. less3d-3.0.5/.agents/skills/less-skill/faq.md +203 -0
  6. less3d-3.0.5/.agents/skills/less-skill/helpers.py +109 -0
  7. less3d-3.0.5/.dockerignore +17 -0
  8. less3d-3.0.5/.gitignore +71 -0
  9. less3d-3.0.5/AGENTS.md +310 -0
  10. less3d-3.0.5/CLAUDE.md +157 -0
  11. less3d-3.0.5/CMakeLists.txt +2800 -0
  12. less3d-3.0.5/LICENSE +637 -0
  13. less3d-3.0.5/PKG-INFO +244 -0
  14. less3d-3.0.5/README.md +203 -0
  15. less3d-3.0.5/THIRD_PARTY_NOTICES.md +32 -0
  16. less3d-3.0.5/benchmarks/README-turbid.md +34 -0
  17. less3d-3.0.5/benchmarks/__init__.py +1 -0
  18. less3d-3.0.5/benchmarks/_provenance.py +131 -0
  19. less3d-3.0.5/benchmarks/baselines/less3d_3_0_1_runtime_attestation.json +41 -0
  20. less3d-3.0.5/benchmarks/baselines/local-native-optical.json +2844 -0
  21. less3d-3.0.5/benchmarks/baselines/local-native-scene-operations.json +841 -0
  22. less3d-3.0.5/benchmarks/baselines/task5_performance_release_status.json +35 -0
  23. less3d-3.0.5/benchmarks/baselines/task5_runtime_attestation.json +42 -0
  24. less3d-3.0.5/benchmarks/baselines/turbid_workflows_rtx4080.json +8770 -0
  25. less3d-3.0.5/benchmarks/baselines/water_surface_rtx4080.json +254 -0
  26. less3d-3.0.5/benchmarks/benchmark_lidar_scaling.py +173 -0
  27. less3d-3.0.5/benchmarks/constant_field_paired.py +487 -0
  28. less3d-3.0.5/benchmarks/field_programs.py +599 -0
  29. less3d-3.0.5/benchmarks/optical_transport.py +2169 -0
  30. less3d-3.0.5/benchmarks/optix_dynamic_spectrum.py +420 -0
  31. less3d-3.0.5/benchmarks/scene_operations.py +881 -0
  32. less3d-3.0.5/benchmarks/turbid_paired.py +70 -0
  33. less3d-3.0.5/benchmarks/turbid_release_gate.py +407 -0
  34. less3d-3.0.5/benchmarks/turbid_workflows.py +2301 -0
  35. less3d-3.0.5/benchmarks/water_surface.py +435 -0
  36. less3d-3.0.5/build_wheels.py +859 -0
  37. less3d-3.0.5/cmake/CompilerFlags.cmake +32 -0
  38. less3d-3.0.5/cmake/FindOptiX.cmake +48 -0
  39. less3d-3.0.5/cmake/LESSHomogeneousWaterLidar.cmake +57 -0
  40. less3d-3.0.5/cmake/LESSModels.cmake +981 -0
  41. less3d-3.0.5/cmake/LESSRuntime.cmake +247 -0
  42. less3d-3.0.5/cmake/test_turbid_layout_dependencies.py +132 -0
  43. less3d-3.0.5/cmake/verify_joint_thermo_physiology_artifact.py +83 -0
  44. less3d-3.0.5/cmake/verify_native_dependency_isolation.py +132 -0
  45. less3d-3.0.5/cmake/verify_turbid_resident_artifacts.py +135 -0
  46. less3d-3.0.5/cmake/verify_turbid_sampling_artifacts.py +107 -0
  47. less3d-3.0.5/dev_build.py +226 -0
  48. less3d-3.0.5/docker/Dockerfile.manylinux +98 -0
  49. less3d-3.0.5/docs/CHANGELOG.md +567 -0
  50. less3d-3.0.5/docs/ROADMAP.md +17 -0
  51. less3d-3.0.5/docs/_archive/book-draft/README.md +49 -0
  52. less3d-3.0.5/docs/_archive/book-draft/chapters/appendix.tex +470 -0
  53. less3d-3.0.5/docs/_archive/book-draft/chapters/ch01_introduction.tex +164 -0
  54. less3d-3.0.5/docs/_archive/book-draft/chapters/ch02_theory.tex +213 -0
  55. less3d-3.0.5/docs/_archive/book-draft/chapters/ch03_architecture.tex +250 -0
  56. less3d-3.0.5/docs/_archive/book-draft/chapters/ch04_geometry.tex +608 -0
  57. less3d-3.0.5/docs/_archive/book-draft/chapters/ch05_materials.tex +653 -0
  58. less3d-3.0.5/docs/_archive/book-draft/chapters/ch06_illumination.tex +489 -0
  59. less3d-3.0.5/docs/_archive/book-draft/chapters/ch07_pathtracer.tex +1015 -0
  60. less3d-3.0.5/docs/_archive/book-draft/chapters/ch08_sensors.tex +634 -0
  61. less3d-3.0.5/docs/_archive/book-draft/chapters/ch09_spectral.tex +712 -0
  62. less3d-3.0.5/docs/_archive/book-draft/chapters/ch10_python_api.tex +800 -0
  63. less3d-3.0.5/docs/_archive/book-draft/chapters/ch11_validation.tex +452 -0
  64. less3d-3.0.5/docs/_archive/book-draft/chapters/ch12_microwave.tex +960 -0
  65. less3d-3.0.5/docs/_archive/book-draft/main.tex +69 -0
  66. less3d-3.0.5/docs/_archive/book-draft/preamble.tex +176 -0
  67. less3d-3.0.5/docs/_archive/book-draft/test_ch12.tex +7 -0
  68. less3d-3.0.5/docs/architecture.md +248 -0
  69. less3d-3.0.5/docs/component-authoring.md +245 -0
  70. less3d-3.0.5/docs/concepts/backends.md +191 -0
  71. less3d-3.0.5/docs/concepts/class_overview.svg +205 -0
  72. less3d-3.0.5/docs/concepts/coordinate-system.md +134 -0
  73. less3d-3.0.5/docs/concepts/digital-twin.md +130 -0
  74. less3d-3.0.5/docs/concepts/ortho_multiangle.svg +70 -0
  75. less3d-3.0.5/docs/concepts/ortho_parallelepiped.svg +68 -0
  76. less3d-3.0.5/docs/decisions/001-modular-native-component-architecture.md +213 -0
  77. less3d-3.0.5/docs/decisions/002-native-plugin-api-boundary.md +79 -0
  78. less3d-3.0.5/docs/design/active_microwave_t1_biomass.md +480 -0
  79. less3d-3.0.5/docs/design/active_mw_bistatic.md +319 -0
  80. less3d-3.0.5/docs/design/backend-parity.md +130 -0
  81. less3d-3.0.5/docs/design/energy_balance.md +1118 -0
  82. less3d-3.0.5/docs/design/extensible-architecture-refactor.md +606 -0
  83. less3d-3.0.5/docs/design/optical_turbid_canopy.md +1043 -0
  84. less3d-3.0.5/docs/design/optical_water_volume.md +906 -0
  85. less3d-3.0.5/docs/design/passive_microwave.md +1331 -0
  86. less3d-3.0.5/docs/design/passive_microwave_review.md +180 -0
  87. less3d-3.0.5/docs/design/physiology_architecture.md +2295 -0
  88. less3d-3.0.5/docs/design/sif.md +1425 -0
  89. less3d-3.0.5/docs/design/source-layout-simplification.md +173 -0
  90. less3d-3.0.5/docs/design/source-layout-v2-validation-and-migration-plan.md +650 -0
  91. less3d-3.0.5/docs/design/v2_scattering_progress.md +132 -0
  92. less3d-3.0.5/docs/design/vulkan-backend.md +180 -0
  93. less3d-3.0.5/docs/known-issues.md +234 -0
  94. less3d-3.0.5/docs/less-project-format.md +95 -0
  95. less3d-3.0.5/docs/migration/0.5.1-unified-turbid.md +22 -0
  96. less3d-3.0.5/docs/migration/3.0.2-plugin-api.md +13 -0
  97. less3d-3.0.5/docs/migration/from-old-less.md +289 -0
  98. less3d-3.0.5/docs/migration/universal-spatial-textures.md +83 -0
  99. less3d-3.0.5/docs/plugin-authoring.md +47 -0
  100. less3d-3.0.5/docs/plugin-compatibility.md +18 -0
  101. less3d-3.0.5/docs/plugin-security.md +29 -0
  102. less3d-3.0.5/docs/superpowers/plans/2026-08-05-unified-passive-optical-transport.md +787 -0
  103. less3d-3.0.5/docs/superpowers/plans/2026-08-06-unified-multiphysics-phase1.md +607 -0
  104. less3d-3.0.5/docs/superpowers/plans/2026-08-08-scene-capabilities-release.md +825 -0
  105. less3d-3.0.5/docs/superpowers/plans/2026-08-09-release-readiness-and-test-tiers.md +793 -0
  106. less3d-3.0.5/docs/superpowers/plans/2026-08-09-unified-turbid-implementation.md +901 -0
  107. less3d-3.0.5/docs/superpowers/plans/2026-08-10-turbid-batch-a.md +55 -0
  108. less3d-3.0.5/docs/superpowers/plans/2026-08-10-turbid-batch-b.md +237 -0
  109. less3d-3.0.5/docs/superpowers/plans/2026-08-10-turbid-task5-fix1.md +164 -0
  110. less3d-3.0.5/docs/superpowers/plans/2026-08-11-turbid-batch-c.md +52 -0
  111. less3d-3.0.5/docs/superpowers/plans/2026-08-12-mixed-thermo-physiology-coupling.md +728 -0
  112. less3d-3.0.5/docs/superpowers/plans/2026-08-12-optical-backend-throughput.md +104 -0
  113. less3d-3.0.5/docs/superpowers/plans/2026-08-12-unified-sunlit-shaded-thermo-physiology.md +214 -0
  114. less3d-3.0.5/docs/superpowers/plans/2026-08-13-independent-native-backends.md +821 -0
  115. less3d-3.0.5/docs/superpowers/plans/2026-08-13-joint-thermo-sif-completeness.md +404 -0
  116. less3d-3.0.5/docs/superpowers/plans/2026-08-14-tutorial-navigation-visual-refresh.md +185 -0
  117. less3d-3.0.5/docs/superpowers/plans/2026-08-15-scope-fvcb-formulations.md +349 -0
  118. less3d-3.0.5/docs/superpowers/plans/2026-08-15-spectral-absorption-partitions.md +381 -0
  119. less3d-3.0.5/docs/superpowers/plans/2026-08-23-universal-spatial-field-texture-system.md +877 -0
  120. less3d-3.0.5/docs/superpowers/plans/2026-08-26-modular-native-architecture.md +883 -0
  121. less3d-3.0.5/docs/superpowers/specs/2026-08-05-less-architecture-governance-design.md +230 -0
  122. less3d-3.0.5/docs/superpowers/specs/2026-08-06-unified-multiphysics-gating-design.md +244 -0
  123. less3d-3.0.5/docs/superpowers/specs/2026-08-08-scene-capabilities-release-design.md +291 -0
  124. less3d-3.0.5/docs/superpowers/specs/2026-08-09-release-readiness-and-test-tiers-design.md +158 -0
  125. less3d-3.0.5/docs/superpowers/specs/2026-08-09-unified-turbid-architecture-design.md +536 -0
  126. less3d-3.0.5/docs/superpowers/specs/2026-08-12-mixed-thermo-physiology-coupling-design.md +240 -0
  127. less3d-3.0.5/docs/superpowers/specs/2026-08-12-optical-backend-throughput-design.md +47 -0
  128. less3d-3.0.5/docs/superpowers/specs/2026-08-12-unified-sunlit-shaded-thermo-physiology-design.md +81 -0
  129. less3d-3.0.5/docs/superpowers/specs/2026-08-13-independent-native-backends-design.md +263 -0
  130. less3d-3.0.5/docs/superpowers/specs/2026-08-13-joint-thermo-sif-completeness-design.md +112 -0
  131. less3d-3.0.5/docs/superpowers/specs/2026-08-14-tutorial-navigation-visual-refresh-design.md +57 -0
  132. less3d-3.0.5/docs/superpowers/specs/2026-08-15-spectral-absorption-scope-fvcb-design.md +272 -0
  133. less3d-3.0.5/docs/superpowers/specs/2026-08-24-field-program-specialization-design.md +346 -0
  134. less3d-3.0.5/docs/testing.md +91 -0
  135. less3d-3.0.5/docs/tutorials/build.cmd +1 -0
  136. less3d-3.0.5/docs/tutorials/build_bilingual.py +99 -0
  137. less3d-3.0.5/docs/tutorials/en/01-introduction.md +108 -0
  138. less3d-3.0.5/docs/tutorials/en/02-installation.md +209 -0
  139. less3d-3.0.5/docs/tutorials/en/03-coordinate-system.md +134 -0
  140. less3d-3.0.5/docs/tutorials/en/04-concepts.md +879 -0
  141. less3d-3.0.5/docs/tutorials/en/05-first-simulation.md +167 -0
  142. less3d-3.0.5/docs/tutorials/en/06-terrain-and-properties.md +297 -0
  143. less3d-3.0.5/docs/tutorials/en/07-forest-scene.md +203 -0
  144. less3d-3.0.5/docs/tutorials/en/08-crop-field.md +210 -0
  145. less3d-3.0.5/docs/tutorials/en/08b-turbid-medium.md +248 -0
  146. less3d-3.0.5/docs/tutorials/en/09-multispectral.md +285 -0
  147. less3d-3.0.5/docs/tutorials/en/09b-atmosphere.md +238 -0
  148. less3d-3.0.5/docs/tutorials/en/09c-satellite-pushbroom.md +153 -0
  149. less3d-3.0.5/docs/tutorials/en/10-brdf.md +193 -0
  150. less3d-3.0.5/docs/tutorials/en/11-lidar.md +290 -0
  151. less3d-3.0.5/docs/tutorials/en/11b-irradiance-map.md +259 -0
  152. less3d-3.0.5/docs/tutorials/en/12-thermal.md +275 -0
  153. less3d-3.0.5/docs/tutorials/en/13-energy-balance.md +166 -0
  154. less3d-3.0.5/docs/tutorials/en/14-photosynthesis-sif.md +316 -0
  155. less3d-3.0.5/docs/tutorials/en/15-visualization.md +140 -0
  156. less3d-3.0.5/docs/tutorials/en/16-serialization.md +662 -0
  157. less3d-3.0.5/docs/tutorials/en/17-lidar-reconstruction.md +330 -0
  158. less3d-3.0.5/docs/tutorials/en/18-spatial-textures.md +329 -0
  159. less3d-3.0.5/docs/tutorials/en/api-reference.md +254 -0
  160. less3d-3.0.5/docs/tutorials/en/index.md +71 -0
  161. less3d-3.0.5/docs/tutorials/mkdocs.en.yml +125 -0
  162. less3d-3.0.5/docs/tutorials/mkdocs.yml +125 -0
  163. less3d-3.0.5/docs/tutorials/preview.cmd +1 -0
  164. less3d-3.0.5/docs/tutorials/shared/javascripts/language-switch.js +42 -0
  165. less3d-3.0.5/docs/tutorials/shared/stylesheets/less-theme.css +49 -0
  166. less3d-3.0.5/docs/tutorials/zh/01-introduction.md +108 -0
  167. less3d-3.0.5/docs/tutorials/zh/02-installation.md +209 -0
  168. less3d-3.0.5/docs/tutorials/zh/03-coordinate-system.md +134 -0
  169. less3d-3.0.5/docs/tutorials/zh/04-concepts.md +879 -0
  170. less3d-3.0.5/docs/tutorials/zh/05-first-simulation.md +167 -0
  171. less3d-3.0.5/docs/tutorials/zh/06-terrain-and-properties.md +297 -0
  172. less3d-3.0.5/docs/tutorials/zh/07-forest-scene.md +203 -0
  173. less3d-3.0.5/docs/tutorials/zh/08-crop-field.md +210 -0
  174. less3d-3.0.5/docs/tutorials/zh/08b-turbid-medium.md +248 -0
  175. less3d-3.0.5/docs/tutorials/zh/09-multispectral.md +285 -0
  176. less3d-3.0.5/docs/tutorials/zh/09b-atmosphere.md +238 -0
  177. less3d-3.0.5/docs/tutorials/zh/09c-satellite-pushbroom.md +152 -0
  178. less3d-3.0.5/docs/tutorials/zh/10-brdf.md +193 -0
  179. less3d-3.0.5/docs/tutorials/zh/11-lidar.md +290 -0
  180. less3d-3.0.5/docs/tutorials/zh/11b-irradiance-map.md +259 -0
  181. less3d-3.0.5/docs/tutorials/zh/12-thermal.md +275 -0
  182. less3d-3.0.5/docs/tutorials/zh/13-energy-balance.md +151 -0
  183. less3d-3.0.5/docs/tutorials/zh/14-photosynthesis-sif.md +288 -0
  184. less3d-3.0.5/docs/tutorials/zh/15-visualization.md +140 -0
  185. less3d-3.0.5/docs/tutorials/zh/16-serialization.md +662 -0
  186. less3d-3.0.5/docs/tutorials/zh/17-lidar-reconstruction.md +330 -0
  187. less3d-3.0.5/docs/tutorials/zh/18-spatial-textures.md +276 -0
  188. less3d-3.0.5/docs/tutorials/zh/api-reference.md +247 -0
  189. less3d-3.0.5/docs/tutorials/zh/data/als_plot.las +0 -0
  190. less3d-3.0.5/docs/tutorials/zh/diagrams/concepts-overview.svg +180 -0
  191. less3d-3.0.5/docs/tutorials/zh/diagrams/coordinate-system.svg +123 -0
  192. less3d-3.0.5/docs/tutorials/zh/diagrams/energy-balance.svg +76 -0
  193. less3d-3.0.5/docs/tutorials/zh/diagrams/irradiance-map.svg +173 -0
  194. less3d-3.0.5/docs/tutorials/zh/diagrams/lidar-pipeline.svg +140 -0
  195. less3d-3.0.5/docs/tutorials/zh/diagrams/orthographic-projection.svg +106 -0
  196. less3d-3.0.5/docs/tutorials/zh/diagrams/scene-lifecycle.svg +70 -0
  197. less3d-3.0.5/docs/tutorials/zh/diagrams/scene-repetition.svg +110 -0
  198. less3d-3.0.5/docs/tutorials/zh/diagrams/sif-coupling.svg +70 -0
  199. less3d-3.0.5/docs/tutorials/zh/index.md +71 -0
  200. less3d-3.0.5/docs/tutorials/zh/javascripts/mathjax-config.js +19 -0
  201. less3d-3.0.5/docs/tutorials/zh/scripts/05_first_simulation.py +43 -0
  202. less3d-3.0.5/docs/tutorials/zh/scripts/06_terrain_properties.py +50 -0
  203. less3d-3.0.5/docs/tutorials/zh/scripts/07_forest_scene.py +68 -0
  204. less3d-3.0.5/docs/tutorials/zh/scripts/08_crop_field.py +72 -0
  205. less3d-3.0.5/docs/tutorials/zh/scripts/08b_turbid_medium.py +116 -0
  206. less3d-3.0.5/docs/tutorials/zh/scripts/09_multispectral.py +63 -0
  207. less3d-3.0.5/docs/tutorials/zh/scripts/10_brdf.py +75 -0
  208. less3d-3.0.5/docs/tutorials/zh/scripts/11_lidar.py +68 -0
  209. less3d-3.0.5/docs/tutorials/zh/scripts/11b_irradiance_map.py +69 -0
  210. less3d-3.0.5/docs/tutorials/zh/scripts/12_thermal.py +52 -0
  211. less3d-3.0.5/docs/tutorials/zh/scripts/13_energy_balance.py +84 -0
  212. less3d-3.0.5/docs/tutorials/zh/scripts/14_photosynthesis_sif.py +99 -0
  213. less3d-3.0.5/docs/usage_issues.md +149 -0
  214. less3d-3.0.5/docs/validation/data/val17_runs_high.csv +21 -0
  215. less3d-3.0.5/docs/validation/data/val17_runs_standard.csv +76 -0
  216. less3d-3.0.5/docs/validation/data/val17_summary_high.csv +6 -0
  217. less3d-3.0.5/docs/validation/data/val17_summary_standard.csv +16 -0
  218. less3d-3.0.5/docs/validation/extensible-architecture-refactor-report.md +117 -0
  219. less3d-3.0.5/docs/validation/figures/val12_data.npz +0 -0
  220. less3d-3.0.5/docs/validation/figures/val12_tier1_bare_soil_vza.png +0 -0
  221. less3d-3.0.5/docs/validation/figures/val12_tier2_bare_soil_moisture.png +0 -0
  222. less3d-3.0.5/docs/validation/figures/val12_tier3_canopy_total_vza.png +0 -0
  223. less3d-3.0.5/docs/validation/figures/val12_tier4_data.npz +0 -0
  224. less3d-3.0.5/docs/validation/figures/val12_tier4_trunk_only.png +0 -0
  225. less3d-3.0.5/docs/validation/figures/val17_turbid_mesh_photosynthesis.png +0 -0
  226. less3d-3.0.5/docs/validation/figures/water_surface_glint.png +0 -0
  227. less3d-3.0.5/docs/validation/less_vs_mimics_report.md +559 -0
  228. less3d-3.0.5/docs/validation/mixed_thermo_physiology.md +29 -0
  229. less3d-3.0.5/docs/validation/turbid-absorption-investigation.md +175 -0
  230. less3d-3.0.5/docs/validation/turbid_mesh_photosynthesis.md +428 -0
  231. less3d-3.0.5/docs/validation/turbid_sif_convergence.md +80 -0
  232. less3d-3.0.5/docs/validation/unified_turbid_release_report.md +138 -0
  233. less3d-3.0.5/docs/validation/unified_turbid_validation.md +40 -0
  234. less3d-3.0.5/docs/validation/water-surface-phase1.md +93 -0
  235. less3d-3.0.5/examples/plugins/less3d_example_plugin/less3d_example_plugin/__init__.py +88 -0
  236. less3d-3.0.5/examples/plugins/less3d_example_plugin/pyproject.toml +12 -0
  237. less3d-3.0.5/examples/python/active_mw_biomass.py +125 -0
  238. less3d-3.0.5/examples/python/autumn_forest.py +186 -0
  239. less3d-3.0.5/examples/python/dem_downwelling.py +122 -0
  240. less3d-3.0.5/examples/python/maize_eb_thermal.py +415 -0
  241. less3d-3.0.5/examples/python/maize_field.py +191 -0
  242. less3d-3.0.5/examples/python/mixed_canopy_photosynthesis.py +92 -0
  243. less3d-3.0.5/examples/python/mw_forest_dem.py +334 -0
  244. less3d-3.0.5/examples/python/satellite_pushbroom.py +94 -0
  245. less3d-3.0.5/examples/python/spatial_texture_fields.py +100 -0
  246. less3d-3.0.5/examples/python/thermal_pushbroom.py +107 -0
  247. less3d-3.0.5/examples/python/water_surface_glint.py +97 -0
  248. less3d-3.0.5/include/less/core/aabb.h +55 -0
  249. less3d-3.0.5/include/less/core/frame.h +59 -0
  250. less3d-3.0.5/include/less/core/grid_mapping.h +152 -0
  251. less3d-3.0.5/include/less/core/offset_ray.h +86 -0
  252. less3d-3.0.5/include/less/core/rng.h +47 -0
  253. less3d-3.0.5/include/less/core/silhouette_emit.h +184 -0
  254. less3d-3.0.5/include/less/core/spectrum.h +107 -0
  255. less3d-3.0.5/include/less/core/transform.h +100 -0
  256. less3d-3.0.5/include/less/core/types.h +52 -0
  257. less3d-3.0.5/include/less/core/vec_math.h +150 -0
  258. less3d-3.0.5/include/less/core/warp.h +115 -0
  259. less3d-3.0.5/include/less/fields/compile.h +213 -0
  260. less3d-3.0.5/include/less/fields/data.h +78 -0
  261. less3d-3.0.5/include/less/fields/evaluate.h +137 -0
  262. less3d-3.0.5/include/less/fields/field.h +1203 -0
  263. less3d-3.0.5/include/less/fields/program.h +321 -0
  264. less3d-3.0.5/include/less/fields/provenance.h +693 -0
  265. less3d-3.0.5/include/less/fields/resources.h +556 -0
  266. less3d-3.0.5/include/less/fields/state_adapter.h +96 -0
  267. less3d-3.0.5/include/less/fields/state_registry.h +123 -0
  268. less3d-3.0.5/include/less/fields/texture_footprint.h +180 -0
  269. less3d-3.0.5/include/less/physics/complex_bessel.h +289 -0
  270. less3d-3.0.5/include/less/physics/dielectric.h +423 -0
  271. less3d-3.0.5/include/less/physics/planck.h +67 -0
  272. less3d-3.0.5/include/less/physics/roughness.h +178 -0
  273. less3d-3.0.5/include/less/physics/scattering/rayleigh_cylinder_scatter.h +162 -0
  274. less3d-3.0.5/include/less/physics/scattering/rayleigh_disc_scatter.h +181 -0
  275. less3d-3.0.5/include/less/physics/scattering/scatter_to_mueller.h +146 -0
  276. less3d-3.0.5/include/less/physics/stokes.h +265 -0
  277. less3d-3.0.5/include/less/physics/wait_mie_cylinder.h +325 -0
  278. less3d-3.0.5/include/less/physics/wood_dielectric.h +89 -0
  279. less3d-3.0.5/include/less/runtime/execution.h +47 -0
  280. less3d-3.0.5/include/less/runtime/execution_identity.h +147 -0
  281. less3d-3.0.5/include/less/runtime/result.h +72 -0
  282. less3d-3.0.5/include/less/runtime/scene.h +136 -0
  283. less3d-3.0.5/include/less/runtime/scene_data.h +279 -0
  284. less3d-3.0.5/include/less/transport/optical_path.h +49 -0
  285. less3d-3.0.5/install_dev.sh +71 -0
  286. less3d-3.0.5/pyproject.toml +109 -0
  287. less3d-3.0.5/python/less/__init__.py +283 -0
  288. less3d-3.0.5/python/less/_compile/__init__.py +1 -0
  289. less3d-3.0.5/python/less/_compile/acquisition.py +60 -0
  290. less3d-3.0.5/python/less/_compile/domains.py +131 -0
  291. less3d-3.0.5/python/less/_compile/field_capabilities.py +297 -0
  292. less3d-3.0.5/python/less/_compile/model/__init__.py +1 -0
  293. less3d-3.0.5/python/less/_compile/model/environment.py +238 -0
  294. less3d-3.0.5/python/less/_compile/model/field.py +711 -0
  295. less3d-3.0.5/python/less/_compile/model/native.py +59 -0
  296. less3d-3.0.5/python/less/_compile/model/scene.py +361 -0
  297. less3d-3.0.5/python/less/_compile/model/spectral.py +103 -0
  298. less3d-3.0.5/python/less/_compile/model/texture.py +340 -0
  299. less3d-3.0.5/python/less/_compile/optical.py +441 -0
  300. less3d-3.0.5/python/less/_compile/physiology.py +260 -0
  301. less3d-3.0.5/python/less/_compile/process_graph.py +584 -0
  302. less3d-3.0.5/python/less/_compile/processes.py +792 -0
  303. less3d-3.0.5/python/less/_compile/products.py +117 -0
  304. less3d-3.0.5/python/less/_compile/property_registry.py +70 -0
  305. less3d-3.0.5/python/less/_compile/recipe.py +604 -0
  306. less3d-3.0.5/python/less/_compile/scene.py +308 -0
  307. less3d-3.0.5/python/less/_compile/scene_energy_balance.py +182 -0
  308. less3d-3.0.5/python/less/_compile/scene_optical.py +1498 -0
  309. less3d-3.0.5/python/less/_compile/schema.py +72 -0
  310. less3d-3.0.5/python/less/_compile/sensors.py +156 -0
  311. less3d-3.0.5/python/less/_compile/thermal.py +134 -0
  312. less3d-3.0.5/python/less/_compile/workflows/__init__.py +1 -0
  313. less3d-3.0.5/python/less/_compile/workflows/active_microwave.py +341 -0
  314. less3d-3.0.5/python/less/_compile/workflows/brf.py +281 -0
  315. less3d-3.0.5/python/less/_compile/workflows/codec_support.py +62 -0
  316. less3d-3.0.5/python/less/_compile/workflows/energy_balance.py +180 -0
  317. less3d-3.0.5/python/less/_compile/workflows/irradiance_map.py +272 -0
  318. less3d-3.0.5/python/less/_compile/workflows/lidar.py +668 -0
  319. less3d-3.0.5/python/less/_compile/workflows/microwave_support.py +42 -0
  320. less3d-3.0.5/python/less/_compile/workflows/optical_imaging.py +398 -0
  321. less3d-3.0.5/python/less/_compile/workflows/passive_microwave.py +400 -0
  322. less3d-3.0.5/python/less/_compile/workflows/photosynthesis.py +324 -0
  323. less3d-3.0.5/python/less/_compile/workflows/pipeline.py +416 -0
  324. less3d-3.0.5/python/less/_compile/workflows/process_support.py +75 -0
  325. less3d-3.0.5/python/less/_compile/workflows/radiation_field.py +251 -0
  326. less3d-3.0.5/python/less/_compile/workflows/radiation_field_process.py +472 -0
  327. less3d-3.0.5/python/less/_compile/workflows/registry.py +452 -0
  328. less3d-3.0.5/python/less/_compile/workflows/requirements.py +66 -0
  329. less3d-3.0.5/python/less/_compile/workflows/sif_imaging.py +523 -0
  330. less3d-3.0.5/python/less/_compile/workflows/sif_process.py +192 -0
  331. less3d-3.0.5/python/less/_compile/workflows/thermal_imaging.py +412 -0
  332. less3d-3.0.5/python/less/_runtime/__init__.py +1 -0
  333. less3d-3.0.5/python/less/_runtime/artifacts/__init__.py +1 -0
  334. less3d-3.0.5/python/less/_runtime/artifacts/process/__init__.py +1 -0
  335. less3d-3.0.5/python/less/_runtime/artifacts/process/thermo_physiology.py +61 -0
  336. less3d-3.0.5/python/less/_runtime/artifacts/process/thermo_physiology_manifest.json +309 -0
  337. less3d-3.0.5/python/less/_runtime/artifacts/turbid/__init__.py +1 -0
  338. less3d-3.0.5/python/less/_runtime/artifacts/turbid/resident.py +225 -0
  339. less3d-3.0.5/python/less/_runtime/artifacts/turbid/resident_manifest.json +703 -0
  340. less3d-3.0.5/python/less/_runtime/artifacts/turbid/sampling.py +361 -0
  341. less3d-3.0.5/python/less/_runtime/artifacts/turbid/sampling_manifest.json +218 -0
  342. less3d-3.0.5/python/less/_runtime/backends/__init__.py +1 -0
  343. less3d-3.0.5/python/less/_runtime/backends/active.py +65 -0
  344. less3d-3.0.5/python/less/_runtime/backends/capabilities.py +673 -0
  345. less3d-3.0.5/python/less/_runtime/backends/embree.py +235 -0
  346. less3d-3.0.5/python/less/_runtime/backends/execution.py +227 -0
  347. less3d-3.0.5/python/less/_runtime/backends/factory.py +295 -0
  348. less3d-3.0.5/python/less/_runtime/backends/interfaces.py +157 -0
  349. less3d-3.0.5/python/less/_runtime/backends/loading.py +139 -0
  350. less3d-3.0.5/python/less/_runtime/backends/optix.py +337 -0
  351. less3d-3.0.5/python/less/_runtime/backends/runtime.py +86 -0
  352. less3d-3.0.5/python/less/_runtime/backends/turbid.py +686 -0
  353. less3d-3.0.5/python/less/_runtime/backends/vulkan.py +412 -0
  354. less3d-3.0.5/python/less/_runtime/backends/workflows.py +233 -0
  355. less3d-3.0.5/python/less/_runtime/execution_identity.py +86 -0
  356. less3d-3.0.5/python/less/_runtime/geometry.py +49 -0
  357. less3d-3.0.5/python/less/_runtime/geospatial.py +47 -0
  358. less3d-3.0.5/python/less/_runtime/lstex.py +399 -0
  359. less3d-3.0.5/python/less/_runtime/matplotlib.py +18 -0
  360. less3d-3.0.5/python/less/_runtime/native.py +39 -0
  361. less3d-3.0.5/python/less/_runtime/registry.py +258 -0
  362. less3d-3.0.5/python/less/_runtime/session.py +318 -0
  363. less3d-3.0.5/python/less/_runtime/textures.py +185 -0
  364. less3d-3.0.5/python/less/_serialization/__init__.py +1 -0
  365. less3d-3.0.5/python/less/_serialization/codecs.py +228 -0
  366. less3d-3.0.5/python/less/absorption.py +321 -0
  367. less3d-3.0.5/python/less/assets/FREX.obj.gz +0 -0
  368. less3d-3.0.5/python/less/assets/__init__.py +31 -0
  369. less3d-3.0.5/python/less/assets/favicon.ico +0 -0
  370. less3d-3.0.5/python/less/assets/maize.obj.gz +0 -0
  371. less3d-3.0.5/python/less/assets/mixed_canopy.obj.gz +0 -0
  372. less3d-3.0.5/python/less/atmosphere/__init__.py +26 -0
  373. less3d-3.0.5/python/less/atmosphere/database.py +354 -0
  374. less3d-3.0.5/python/less/atmosphere/libradtran.py +296 -0
  375. less3d-3.0.5/python/less/atmosphere/model.py +1380 -0
  376. less3d-3.0.5/python/less/atmosphere/profile.py +167 -0
  377. less3d-3.0.5/python/less/atmosphere/py6s.py +117 -0
  378. less3d-3.0.5/python/less/atmosphere/result.py +455 -0
  379. less3d-3.0.5/python/less/atmosphere/solver.py +640 -0
  380. less3d-3.0.5/python/less/backend.py +73 -0
  381. less3d-3.0.5/python/less/convert_less.py +422 -0
  382. less3d-3.0.5/python/less/data/AtmosphereDB.db +0 -0
  383. less3d-3.0.5/python/less/data/LambertianDB.db +0 -0
  384. less3d-3.0.5/python/less/data/SolarDB.db +0 -0
  385. less3d-3.0.5/python/less/data/srgb.coeff +0 -0
  386. less3d-3.0.5/python/less/data/srgb.coeff.provenance.json +9 -0
  387. less3d-3.0.5/python/less/energy_balance/__init__.py +73 -0
  388. less3d-3.0.5/python/less/energy_balance/aerodynamic.py +136 -0
  389. less3d-3.0.5/python/less/energy_balance/microclimate.py +187 -0
  390. less3d-3.0.5/python/less/energy_balance/result.py +192 -0
  391. less3d-3.0.5/python/less/energy_balance/solver.py +261 -0
  392. less3d-3.0.5/python/less/extensions/__init__.py +22 -0
  393. less3d-3.0.5/python/less/extensions/api.py +107 -0
  394. less3d-3.0.5/python/less/extensions/approvals.py +116 -0
  395. less3d-3.0.5/python/less/extensions/identity.py +181 -0
  396. less3d-3.0.5/python/less/extensions/manager.py +414 -0
  397. less3d-3.0.5/python/less/generators/__init__.py +16 -0
  398. less3d-3.0.5/python/less/generators/_utils.py +156 -0
  399. less3d-3.0.5/python/less/generators/forest/__init__.py +18 -0
  400. less3d-3.0.5/python/less/generators/forest/builder.py +331 -0
  401. less3d-3.0.5/python/less/generators/forest/crown.py +444 -0
  402. less3d-3.0.5/python/less/generators/urban/__init__.py +18 -0
  403. less3d-3.0.5/python/less/generators/urban/builder.py +488 -0
  404. less3d-3.0.5/python/less/geometry.py +88 -0
  405. less3d-3.0.5/python/less/hosek_wilkie.py +361 -0
  406. less3d-3.0.5/python/less/illumination/__init__.py +442 -0
  407. less3d-3.0.5/python/less/illumination/_compile.py +118 -0
  408. less3d-3.0.5/python/less/inspector.py +1419 -0
  409. less3d-3.0.5/python/less/instrument.py +531 -0
  410. less3d-3.0.5/python/less/io.py +948 -0
  411. less3d-3.0.5/python/less/less_gpu.py +5 -0
  412. less3d-3.0.5/python/less/lidar/__init__.py +62 -0
  413. less3d-3.0.5/python/less/lidar/_crown.py +415 -0
  414. less3d-3.0.5/python/less/lidar/_ground.py +217 -0
  415. less3d-3.0.5/python/less/lidar/_io_las.py +118 -0
  416. less3d-3.0.5/python/less/lidar/_leaves.py +904 -0
  417. less3d-3.0.5/python/less/lidar/_pipeline.py +294 -0
  418. less3d-3.0.5/python/less/lidar/_raster.py +229 -0
  419. less3d-3.0.5/python/less/lidar/_result.py +72 -0
  420. less3d-3.0.5/python/less/lidar/_segment.py +162 -0
  421. less3d-3.0.5/python/less/lidar/_types.py +221 -0
  422. less3d-3.0.5/python/less/local_service.py +372 -0
  423. less3d-3.0.5/python/less/local_worker.py +186 -0
  424. less3d-3.0.5/python/less/measures.py +468 -0
  425. less3d-3.0.5/python/less/media/__init__.py +5 -0
  426. less3d-3.0.5/python/less/media/turbid/__init__.py +124 -0
  427. less3d-3.0.5/python/less/media/turbid/compile.py +389 -0
  428. less3d-3.0.5/python/less/media/turbid/geometry.py +824 -0
  429. less3d-3.0.5/python/less/media/turbid/workflows.py +1902 -0
  430. less3d-3.0.5/python/less/mesh.py +219 -0
  431. less3d-3.0.5/python/less/object.py +781 -0
  432. less3d-3.0.5/python/less/physics/__init__.py +1 -0
  433. less3d-3.0.5/python/less/physics/fluspect/__init__.py +2 -0
  434. less3d-3.0.5/python/less/physics/fluspect/fluspect.py +342 -0
  435. less3d-3.0.5/python/less/physics/fluspect/optipar_fluspect.txt +2101 -0
  436. less3d-3.0.5/python/less/physics/fluspect/optipar_prospect_pro_2021.txt +2001 -0
  437. less3d-3.0.5/python/less/physics/microwave/__init__.py +23 -0
  438. less3d-3.0.5/python/less/physics/microwave/lad.py +217 -0
  439. less3d-3.0.5/python/less/physics/microwave/mie_cylinder.py +242 -0
  440. less3d-3.0.5/python/less/physics/microwave/mueller_integrator.py +274 -0
  441. less3d-3.0.5/python/less/physics/microwave/precompute.py +1091 -0
  442. less3d-3.0.5/python/less/physics/microwave/trunk_geometry.py +157 -0
  443. less3d-3.0.5/python/less/physics/optical/__init__.py +5 -0
  444. less3d-3.0.5/python/less/physics/optical/lad.py +79 -0
  445. less3d-3.0.5/python/less/physics/physiology/__init__.py +2 -0
  446. less3d-3.0.5/python/less/physics/physiology/fvcb.py +175 -0
  447. less3d-3.0.5/python/less/physics/prospect/__init__.py +1 -0
  448. less3d-3.0.5/python/less/physics/prospect/prospect_d.py +235 -0
  449. less3d-3.0.5/python/less/physics/prospect/prospect_d_spectra.txt +2121 -0
  450. less3d-3.0.5/python/less/place.py +333 -0
  451. less3d-3.0.5/python/less/preview.py +544 -0
  452. less3d-3.0.5/python/less/processes/__init__.py +4 -0
  453. less3d-3.0.5/python/less/processes/base.py +49 -0
  454. less3d-3.0.5/python/less/processes/energy_balance.py +120 -0
  455. less3d-3.0.5/python/less/processes/photosynthesis.py +121 -0
  456. less3d-3.0.5/python/less/processes/photosynthesis_metadata.py +53 -0
  457. less3d-3.0.5/python/less/processes/radiation_field.py +53 -0
  458. less3d-3.0.5/python/less/processes/sif.py +97 -0
  459. less3d-3.0.5/python/less/processes/thermo_physiology.py +1185 -0
  460. less3d-3.0.5/python/less/product.py +39 -0
  461. less3d-3.0.5/python/less/products/__init__.py +4 -0
  462. less3d-3.0.5/python/less/products/_scene_mesh.py +136 -0
  463. less3d-3.0.5/python/less/products/base.py +325 -0
  464. less3d-3.0.5/python/less/products/brf.py +112 -0
  465. less3d-3.0.5/python/less/products/energy_balance.py +346 -0
  466. less3d-3.0.5/python/less/products/image.py +758 -0
  467. less3d-3.0.5/python/less/products/irradiance.py +337 -0
  468. less3d-3.0.5/python/less/products/lidar.py +124 -0
  469. less3d-3.0.5/python/less/products/measurement.py +124 -0
  470. less3d-3.0.5/python/less/products/photosynthesis.py +1147 -0
  471. less3d-3.0.5/python/less/products/radiation_field.py +1064 -0
  472. less3d-3.0.5/python/less/products/radiation_process.py +236 -0
  473. less3d-3.0.5/python/less/products/sif.py +134 -0
  474. less3d-3.0.5/python/less/products/solve.py +59 -0
  475. less3d-3.0.5/python/less/project.py +709 -0
  476. less3d-3.0.5/python/less/project_resources.py +283 -0
  477. less3d-3.0.5/python/less/properties/__init__.py +2 -0
  478. less3d-3.0.5/python/less/properties/base.py +72 -0
  479. less3d-3.0.5/python/less/properties/physiology.py +285 -0
  480. less3d-3.0.5/python/less/properties/thermal.py +203 -0
  481. less3d-3.0.5/python/less/properties/vegetation.py +618 -0
  482. less3d-3.0.5/python/less/property.py +62 -0
  483. less3d-3.0.5/python/less/recipe_inspection.py +51 -0
  484. less3d-3.0.5/python/less/scene.py +2241 -0
  485. less3d-3.0.5/python/less/sensor.py +35 -0
  486. less3d-3.0.5/python/less/sensors/__init__.py +4 -0
  487. less3d-3.0.5/python/less/sensors/field.py +164 -0
  488. less3d-3.0.5/python/less/sensors/lidar.py +311 -0
  489. less3d-3.0.5/python/less/sensors/microwave.py +121 -0
  490. less3d-3.0.5/python/less/sensors/optical.py +127 -0
  491. less3d-3.0.5/python/less/sensors/projections.py +576 -0
  492. less3d-3.0.5/python/less/sensors/sif.py +82 -0
  493. less3d-3.0.5/python/less/sensors/thermal.py +130 -0
  494. less3d-3.0.5/python/less/serialize.py +837 -0
  495. less3d-3.0.5/python/less/show.py +2695 -0
  496. less3d-3.0.5/python/less/spectral.py +315 -0
  497. less3d-3.0.5/python/less/spectral_db.py +202 -0
  498. less3d-3.0.5/python/less/spectral_profile.py +213 -0
  499. less3d-3.0.5/python/less/sun_position.py +203 -0
  500. less3d-3.0.5/python/less/surfaces/__init__.py +18 -0
  501. less3d-3.0.5/python/less/surfaces/base.py +19 -0
  502. less3d-3.0.5/python/less/surfaces/lambertian.py +233 -0
  503. less3d-3.0.5/python/less/surfaces/microwave.py +158 -0
  504. less3d-3.0.5/python/less/surfaces/rpv.py +45 -0
  505. less3d-3.0.5/python/less/surfaces/water.py +213 -0
  506. less3d-3.0.5/python/less/texture.py +1148 -0
  507. less3d-3.0.5/src/backends/README.md +31 -0
  508. less3d-3.0.5/src/backends/embree/embree_backend.cpp +6183 -0
  509. less3d-3.0.5/src/backends/embree/embree_backend.h +869 -0
  510. less3d-3.0.5/src/backends/homogeneous_water_lidar_executor.h +13 -0
  511. less3d-3.0.5/src/backends/optix/device/microwave/kernels/closesthit_mw.cu +92 -0
  512. less3d-3.0.5/src/backends/optix/device/microwave/kernels/miss_mw.cu +31 -0
  513. less3d-3.0.5/src/backends/optix/device/microwave/kernels/periodic_xy.cuh +111 -0
  514. less3d-3.0.5/src/backends/optix/device/microwave/launch_params_mw.h +255 -0
  515. less3d-3.0.5/src/backends/optix/device/optical/kernels/closesthit.cu +132 -0
  516. less3d-3.0.5/src/backends/optix/device/optical/kernels/miss.cu +38 -0
  517. less3d-3.0.5/src/backends/optix/device/optical/launch_params.h +237 -0
  518. less3d-3.0.5/src/backends/optix/host/optix_context.cpp +183 -0
  519. less3d-3.0.5/src/backends/optix/host/optix_context.h +50 -0
  520. less3d-3.0.5/src/backends/optix/host/sbt_record.h +42 -0
  521. less3d-3.0.5/src/backends/vulkan/precompiled/active_microwave.spv +0 -0
  522. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical.spv +0 -0
  523. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_constant.spv +0 -0
  524. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_sampled.spv +0 -0
  525. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_state.spv +0 -0
  526. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_thermal.spv +0 -0
  527. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_thermal_constant.spv +0 -0
  528. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_thermal_sampled.spv +0 -0
  529. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_turbid.spv +0 -0
  530. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_turbid_reflected.spv +0 -0
  531. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_turbid_reflected_sampled.spv +0 -0
  532. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_wavefront_diffuse_trace.spv +0 -0
  533. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_wavefront_resolve.spv +0 -0
  534. less3d-3.0.5/src/backends/vulkan/precompiled/backward_optical_wavefront_trace.spv +0 -0
  535. less3d-3.0.5/src/backends/vulkan/precompiled/energy_balance_partition.spv +0 -0
  536. less3d-3.0.5/src/backends/vulkan/precompiled/energy_balance_process.spv +0 -0
  537. less3d-3.0.5/src/backends/vulkan/precompiled/energy_balance_radiation.spv +0 -0
  538. less3d-3.0.5/src/backends/vulkan/precompiled/energy_balance_radiation_constant.spv +0 -0
  539. less3d-3.0.5/src/backends/vulkan/precompiled/forward_flux.spv +0 -0
  540. less3d-3.0.5/src/backends/vulkan/precompiled/forward_flux_constant.spv +0 -0
  541. less3d-3.0.5/src/backends/vulkan/precompiled/homogeneous_water_lidar.spv +0 -0
  542. less3d-3.0.5/src/backends/vulkan/precompiled/joint_thermo_physiology.spv +0 -0
  543. less3d-3.0.5/src/backends/vulkan/precompiled/mesh_sif_source_assembly.spv +0 -0
  544. less3d-3.0.5/src/backends/vulkan/precompiled/photosynthesis_process.spv +0 -0
  545. less3d-3.0.5/src/backends/vulkan/precompiled/physiology.spv +0 -0
  546. less3d-3.0.5/src/backends/vulkan/precompiled/ray_query_trace.spv +0 -0
  547. less3d-3.0.5/src/backends/vulkan/precompiled/sif_process.spv +0 -0
  548. less3d-3.0.5/src/backends/vulkan/precompiled/sif_source_assembly.spv +0 -0
  549. less3d-3.0.5/src/backends/vulkan/precompiled/time_resolved_active.spv +0 -0
  550. less3d-3.0.5/src/backends/vulkan/precompiled/time_resolved_active_constant.spv +0 -0
  551. less3d-3.0.5/src/backends/vulkan/precompiled/time_resolved_active_direct_constant.spv +0 -0
  552. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_energy_balance_assemble.spv +0 -0
  553. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_field_assemble.spv +0 -0
  554. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_field_lookup.spv +0 -0
  555. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_leaf_rrt.spv +0 -0
  556. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_observation_source.spv +0 -0
  557. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_physiology_assemble.spv +0 -0
  558. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_radiation_assemble.spv +0 -0
  559. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_sampling.spv +0 -0
  560. less3d-3.0.5/src/backends/vulkan/precompiled/turbid_state.spv +0 -0
  561. less3d-3.0.5/src/backends/vulkan/shaders/field.slang +1487 -0
  562. less3d-3.0.5/src/backends/vulkan/shaders/microwave_wavefront.slang +839 -0
  563. less3d-3.0.5/src/backends/vulkan/shaders/trace_closest.slang +62 -0
  564. less3d-3.0.5/src/backends/vulkan/shaders/transport_common.slang +99 -0
  565. less3d-3.0.5/src/backends/vulkan/vulkan_buffer.cpp +158 -0
  566. less3d-3.0.5/src/backends/vulkan/vulkan_buffer.h +43 -0
  567. less3d-3.0.5/src/backends/vulkan/vulkan_context.cpp +524 -0
  568. less3d-3.0.5/src/backends/vulkan/vulkan_context.h +103 -0
  569. less3d-3.0.5/src/backends/vulkan/vulkan_scene.cpp +11131 -0
  570. less3d-3.0.5/src/backends/vulkan/vulkan_scene.h +1019 -0
  571. less3d-3.0.5/src/backends/vulkan/vulkan_scene_support.h +42 -0
  572. less3d-3.0.5/src/bindings/backend/backend_modules.h +11 -0
  573. less3d-3.0.5/src/bindings/backend/embree/active_bindings.cpp +66 -0
  574. less3d-3.0.5/src/bindings/backend/embree/diagnostics_bindings.cpp +33 -0
  575. less3d-3.0.5/src/bindings/backend/embree/optical_bindings.cpp +311 -0
  576. less3d-3.0.5/src/bindings/backend/embree/process_bindings.cpp +371 -0
  577. less3d-3.0.5/src/bindings/backend/embree/workflow_bindings.h +12 -0
  578. less3d-3.0.5/src/bindings/backend/embree_module.cpp +663 -0
  579. less3d-3.0.5/src/bindings/backend/optix/active_bindings.cpp +442 -0
  580. less3d-3.0.5/src/bindings/backend/optix/diagnostics_bindings.cpp +56 -0
  581. less3d-3.0.5/src/bindings/backend/optix/optical_bindings.cpp +185 -0
  582. less3d-3.0.5/src/bindings/backend/optix/process_bindings.cpp +467 -0
  583. less3d-3.0.5/src/bindings/backend/optix/workflow_bindings.h +16 -0
  584. less3d-3.0.5/src/bindings/backend/optix_module.cpp +565 -0
  585. less3d-3.0.5/src/bindings/backend/vulkan/active_bindings.cpp +166 -0
  586. less3d-3.0.5/src/bindings/backend/vulkan/diagnostics_bindings.cpp +151 -0
  587. less3d-3.0.5/src/bindings/backend/vulkan/optical_bindings.cpp +239 -0
  588. less3d-3.0.5/src/bindings/backend/vulkan/process_bindings.cpp +571 -0
  589. less3d-3.0.5/src/bindings/backend/vulkan/scene_bindings.cpp +368 -0
  590. less3d-3.0.5/src/bindings/backend/vulkan/workflow_bindings.h +18 -0
  591. less3d-3.0.5/src/bindings/backend/vulkan_module.cpp +39 -0
  592. less3d-3.0.5/src/bindings/core/backend_helpers.h +372 -0
  593. less3d-3.0.5/src/bindings/core/model_registry.cpp +50 -0
  594. less3d-3.0.5/src/bindings/core/model_registry.h +17 -0
  595. less3d-3.0.5/src/bindings/core/native_result.h +99 -0
  596. less3d-3.0.5/src/bindings/py_less.cpp +45 -0
  597. less3d-3.0.5/src/core/field/tests/test_native.cpp +1118 -0
  598. less3d-3.0.5/src/core/mesh/mesh_loader.cpp +53 -0
  599. less3d-3.0.5/src/core/mesh/mesh_loader.h +17 -0
  600. less3d-3.0.5/src/core/native_request_validation/tests/test_component.py +41 -0
  601. less3d-3.0.5/src/core/native_request_validation/tests/test_native.cpp +49 -0
  602. less3d-3.0.5/src/core/native_request_validation/validation.h +53 -0
  603. less3d-3.0.5/src/core/scene/scene_manager.cpp +3160 -0
  604. less3d-3.0.5/src/core/scene/scene_manager.h +940 -0
  605. less3d-3.0.5/src/core/simulation/simulator.cpp +4575 -0
  606. less3d-3.0.5/src/core/simulation/simulator.h +721 -0
  607. less3d-3.0.5/src/core/state_field_registry/state_field_adapter.cpp +277 -0
  608. less3d-3.0.5/src/core/state_field_registry/tests/test_native.cpp +367 -0
  609. less3d-3.0.5/src/illumination/CMakeLists.txt +2 -0
  610. less3d-3.0.5/src/illumination/lidar_pulse/embree/lidar_pulse.cpp +13 -0
  611. less3d-3.0.5/src/illumination/lidar_pulse/embree/lidar_pulse.h +11 -0
  612. less3d-3.0.5/src/illumination/lidar_pulse/lidar_pulse.h +58 -0
  613. less3d-3.0.5/src/illumination/lidar_pulse/optix/lidar_pulse.cpp +13 -0
  614. less3d-3.0.5/src/illumination/lidar_pulse/optix/lidar_pulse.h +11 -0
  615. less3d-3.0.5/src/illumination/lidar_pulse/vulkan/lidar_pulse.cpp +13 -0
  616. less3d-3.0.5/src/illumination/lidar_pulse/vulkan/lidar_pulse.h +11 -0
  617. less3d-3.0.5/src/illumination/sun_sky/embree.h +133 -0
  618. less3d-3.0.5/src/illumination/sun_sky/optix.h +164 -0
  619. less3d-3.0.5/src/illumination/sun_sky/sun_sky.h +5 -0
  620. less3d-3.0.5/src/illumination/sun_sky/vulkan.slang +142 -0
  621. less3d-3.0.5/src/integrators/CMakeLists.txt +9 -0
  622. less3d-3.0.5/src/integrators/active_microwave/active_microwave.h +3 -0
  623. less3d-3.0.5/src/integrators/active_microwave/embree.h +2 -0
  624. less3d-3.0.5/src/integrators/active_microwave/optix/active_microwave.h +2 -0
  625. less3d-3.0.5/src/integrators/active_microwave/optix/raygen_active.cu +706 -0
  626. less3d-3.0.5/src/integrators/active_microwave/vulkan.slang +1 -0
  627. less3d-3.0.5/src/integrators/backward_optical/backward_optical.h +76 -0
  628. less3d-3.0.5/src/integrators/backward_optical/embree.h +2 -0
  629. less3d-3.0.5/src/integrators/backward_optical/optix/backward_optical.h +2 -0
  630. less3d-3.0.5/src/integrators/backward_optical/optix/raygen_backward.cu +2051 -0
  631. less3d-3.0.5/src/integrators/backward_optical/vulkan/backward_optical.slang +2 -0
  632. less3d-3.0.5/src/integrators/backward_optical/vulkan/kernel.slang +2841 -0
  633. less3d-3.0.5/src/integrators/backward_optical/vulkan/layout.slang +49 -0
  634. less3d-3.0.5/src/integrators/energy_balance_radiation/embree.h +2 -0
  635. less3d-3.0.5/src/integrators/energy_balance_radiation/energy_balance_radiation.h +3 -0
  636. less3d-3.0.5/src/integrators/energy_balance_radiation/optix/energy_balance_radiation.h +2 -0
  637. less3d-3.0.5/src/integrators/energy_balance_radiation/optix/raygen_eb_rrt.cu +1906 -0
  638. less3d-3.0.5/src/integrators/energy_balance_radiation/vulkan/energy_balance_radiation.slang +1 -0
  639. less3d-3.0.5/src/integrators/energy_balance_radiation/vulkan/kernel.slang +924 -0
  640. less3d-3.0.5/src/integrators/energy_balance_radiation/vulkan/leaf_rrt.slang +821 -0
  641. less3d-3.0.5/src/integrators/forward_optical/embree.h +2 -0
  642. less3d-3.0.5/src/integrators/forward_optical/forward_optical.h +65 -0
  643. less3d-3.0.5/src/integrators/forward_optical/optix/forward_optical.h +2 -0
  644. less3d-3.0.5/src/integrators/forward_optical/optix/raygen_flux.cu +700 -0
  645. less3d-3.0.5/src/integrators/forward_optical/optix/raygen_forward.cu +1288 -0
  646. less3d-3.0.5/src/integrators/forward_optical/optix/spectrum_workspace.cuh +21 -0
  647. less3d-3.0.5/src/integrators/forward_optical/vulkan/forward_optical.slang +2 -0
  648. less3d-3.0.5/src/integrators/forward_optical/vulkan/kernel.slang +991 -0
  649. less3d-3.0.5/src/integrators/forward_optical/vulkan/layout.slang +48 -0
  650. less3d-3.0.5/src/integrators/homogeneous_water_lidar/bindings.cpp +151 -0
  651. less3d-3.0.5/src/integrators/homogeneous_water_lidar/embree/homogeneous_water_lidar.cpp +23 -0
  652. less3d-3.0.5/src/integrators/homogeneous_water_lidar/embree/homogeneous_water_lidar.h +7 -0
  653. less3d-3.0.5/src/integrators/homogeneous_water_lidar/homogeneous_water_lidar.h +189 -0
  654. less3d-3.0.5/src/integrators/homogeneous_water_lidar/layout.h +137 -0
  655. less3d-3.0.5/src/integrators/homogeneous_water_lidar/optix/homogeneous_water_lidar.cpp +89 -0
  656. less3d-3.0.5/src/integrators/homogeneous_water_lidar/optix/homogeneous_water_lidar.cu +13 -0
  657. less3d-3.0.5/src/integrators/homogeneous_water_lidar/optix/homogeneous_water_lidar.h +12 -0
  658. less3d-3.0.5/src/integrators/homogeneous_water_lidar/tests.cpp +123 -0
  659. less3d-3.0.5/src/integrators/homogeneous_water_lidar/vulkan/homogeneous_water_lidar.cpp +178 -0
  660. less3d-3.0.5/src/integrators/homogeneous_water_lidar/vulkan/homogeneous_water_lidar.h +13 -0
  661. less3d-3.0.5/src/integrators/homogeneous_water_lidar/vulkan/homogeneous_water_lidar.slang +2 -0
  662. less3d-3.0.5/src/integrators/homogeneous_water_lidar/vulkan/kernel.slang +120 -0
  663. less3d-3.0.5/src/integrators/homogeneous_water_lidar/vulkan/layout.slang +157 -0
  664. less3d-3.0.5/src/integrators/medium_event/embree.h +2 -0
  665. less3d-3.0.5/src/integrators/medium_event/medium_event.h +70 -0
  666. less3d-3.0.5/src/integrators/medium_event/optix.h +2 -0
  667. less3d-3.0.5/src/integrators/medium_event/tests.cpp +76 -0
  668. less3d-3.0.5/src/integrators/medium_event/vulkan.slang +57 -0
  669. less3d-3.0.5/src/integrators/passive_microwave/embree.h +2 -0
  670. less3d-3.0.5/src/integrators/passive_microwave/optix/passive_microwave.h +2 -0
  671. less3d-3.0.5/src/integrators/passive_microwave/optix/raygen_passive.cu +764 -0
  672. less3d-3.0.5/src/integrators/passive_microwave/passive_microwave.h +3 -0
  673. less3d-3.0.5/src/integrators/passive_microwave/vulkan.slang +1 -0
  674. less3d-3.0.5/src/integrators/steady_optical/embree.h +2 -0
  675. less3d-3.0.5/src/integrators/steady_optical/optix.h +2 -0
  676. less3d-3.0.5/src/integrators/steady_optical/steady_optical.h +3 -0
  677. less3d-3.0.5/src/integrators/steady_optical/vulkan.slang +1 -0
  678. less3d-3.0.5/src/integrators/time_resolved_active/bindings.cpp +111 -0
  679. less3d-3.0.5/src/integrators/time_resolved_active/embree/time_resolved_active.cpp +577 -0
  680. less3d-3.0.5/src/integrators/time_resolved_active/embree/time_resolved_active.h +2 -0
  681. less3d-3.0.5/src/integrators/time_resolved_active/event.h +119 -0
  682. less3d-3.0.5/src/integrators/time_resolved_active/integrator.h +50 -0
  683. less3d-3.0.5/src/integrators/time_resolved_active/optix/raygen_lidar.cu +494 -0
  684. less3d-3.0.5/src/integrators/time_resolved_active/optix/time_resolved_active.h +2 -0
  685. less3d-3.0.5/src/integrators/time_resolved_active/path_state.h +29 -0
  686. less3d-3.0.5/src/integrators/time_resolved_active/result.h +18 -0
  687. less3d-3.0.5/src/integrators/time_resolved_active/time_resolved_active.h +7 -0
  688. less3d-3.0.5/src/integrators/time_resolved_active/timeline.h +148 -0
  689. less3d-3.0.5/src/integrators/time_resolved_active/vulkan/event.slang +81 -0
  690. less3d-3.0.5/src/integrators/time_resolved_active/vulkan/integrator.slang +41 -0
  691. less3d-3.0.5/src/integrators/time_resolved_active/vulkan/kernel.slang +612 -0
  692. less3d-3.0.5/src/integrators/time_resolved_active/vulkan/layout.slang +17 -0
  693. less3d-3.0.5/src/integrators/time_resolved_active/vulkan/time_resolved_active.slang +2 -0
  694. less3d-3.0.5/src/media/CMakeLists.txt +14 -0
  695. less3d-3.0.5/src/media/continuous_participating/continuous_participating_medium.h +105 -0
  696. less3d-3.0.5/src/media/continuous_participating/embree.h +5 -0
  697. less3d-3.0.5/src/media/continuous_participating/optix.cuh +5 -0
  698. less3d-3.0.5/src/media/continuous_participating/tests/test_native.cpp +64 -0
  699. less3d-3.0.5/src/media/continuous_participating/vulkan.slang +103 -0
  700. less3d-3.0.5/src/media/region_stack/bindings.cpp +38 -0
  701. less3d-3.0.5/src/media/region_stack/embree.h +5 -0
  702. less3d-3.0.5/src/media/region_stack/optix.cuh +5 -0
  703. less3d-3.0.5/src/media/region_stack/region_stack.h +119 -0
  704. less3d-3.0.5/src/media/region_stack/vulkan.slang +77 -0
  705. less3d-3.0.5/src/media/turbid/aggregation.h +232 -0
  706. less3d-3.0.5/src/media/turbid/bindings/domain.cpp +574 -0
  707. less3d-3.0.5/src/media/turbid/bindings/fields.cpp +616 -0
  708. less3d-3.0.5/src/media/turbid/bindings/sampling_debug.h +401 -0
  709. less3d-3.0.5/src/media/turbid/bindings/state.cpp +437 -0
  710. less3d-3.0.5/src/media/turbid/domain.h +418 -0
  711. less3d-3.0.5/src/media/turbid/embree/domain.cpp +66 -0
  712. less3d-3.0.5/src/media/turbid/embree/leaf_scattering.h +5 -0
  713. less3d-3.0.5/src/media/turbid/embree/leaf_scattering_operations.h +5 -0
  714. less3d-3.0.5/src/media/turbid/embree/path_state.h +118 -0
  715. less3d-3.0.5/src/media/turbid/embree/sampling.cpp +82 -0
  716. less3d-3.0.5/src/media/turbid/embree/turbid_leaf_collision.h +5 -0
  717. less3d-3.0.5/src/media/turbid/field_device.h +82 -0
  718. less3d-3.0.5/src/media/turbid/fields.h +219 -0
  719. less3d-3.0.5/src/media/turbid/host/domain.h +1272 -0
  720. less3d-3.0.5/src/media/turbid/host/fields.h +1284 -0
  721. less3d-3.0.5/src/media/turbid/host/sampling.h +1554 -0
  722. less3d-3.0.5/src/media/turbid/host/state.h +1198 -0
  723. less3d-3.0.5/src/media/turbid/host/state_fields.cpp +279 -0
  724. less3d-3.0.5/src/media/turbid/leaf_scattering.h +96 -0
  725. less3d-3.0.5/src/media/turbid/leaf_scattering_operations.h +72 -0
  726. less3d-3.0.5/src/media/turbid/optix/fields.cu +554 -0
  727. less3d-3.0.5/src/media/turbid/optix/fields.h +40 -0
  728. less3d-3.0.5/src/media/turbid/optix/leaf_scattering.cuh +5 -0
  729. less3d-3.0.5/src/media/turbid/optix/leaf_scattering_operations.cuh +5 -0
  730. less3d-3.0.5/src/media/turbid/optix/sampling.cu +81 -0
  731. less3d-3.0.5/src/media/turbid/optix/sampling.h +18 -0
  732. less3d-3.0.5/src/media/turbid/optix/sampling_host.cpp +202 -0
  733. less3d-3.0.5/src/media/turbid/optix/state.cu +535 -0
  734. less3d-3.0.5/src/media/turbid/optix/state.h +108 -0
  735. less3d-3.0.5/src/media/turbid/optix/turbid_leaf_collision.cuh +5 -0
  736. less3d-3.0.5/src/media/turbid/recipe.h +25 -0
  737. less3d-3.0.5/src/media/turbid/sampling.h +276 -0
  738. less3d-3.0.5/src/media/turbid/sampling_layout.def +18 -0
  739. less3d-3.0.5/src/media/turbid/sampling_layout.h +45 -0
  740. less3d-3.0.5/src/media/turbid/sobol.h +697 -0
  741. less3d-3.0.5/src/media/turbid/state.h +289 -0
  742. less3d-3.0.5/src/media/turbid/state_fields.h +74 -0
  743. less3d-3.0.5/src/media/turbid/tests/aggregation_native.cpp +304 -0
  744. less3d-3.0.5/src/media/turbid/tests/boundary_broadphase.cpp +61 -0
  745. less3d-3.0.5/src/media/turbid/tests/boundary_validation.cpp +245 -0
  746. less3d-3.0.5/src/media/turbid/tests/domain_fixtures.h +125 -0
  747. less3d-3.0.5/src/media/turbid/tests/domain_native.cpp +131 -0
  748. less3d-3.0.5/src/media/turbid/tests/fields_native.cpp +283 -0
  749. less3d-3.0.5/src/media/turbid/tests/leaf_scattering_native.cpp +130 -0
  750. less3d-3.0.5/src/media/turbid/tests/sampling_layout.cpp +29 -0
  751. less3d-3.0.5/src/media/turbid/tests/sampling_native.cpp +261 -0
  752. less3d-3.0.5/src/media/turbid/tests/sobol.cpp +16 -0
  753. less3d-3.0.5/src/media/turbid/tests/state_fields_native.cpp +105 -0
  754. less3d-3.0.5/src/media/turbid/tests/state_native.cpp +263 -0
  755. less3d-3.0.5/src/media/turbid/turbid_leaf_collision.h +302 -0
  756. less3d-3.0.5/src/media/turbid/turbid_medium.h +8 -0
  757. less3d-3.0.5/src/media/turbid/vulkan/field.cpp +601 -0
  758. less3d-3.0.5/src/media/turbid/vulkan/field.h +66 -0
  759. less3d-3.0.5/src/media/turbid/vulkan/field_assemble.slang +423 -0
  760. less3d-3.0.5/src/media/turbid/vulkan/field_lookup.slang +117 -0
  761. less3d-3.0.5/src/media/turbid/vulkan/leaf_scattering.slang +71 -0
  762. less3d-3.0.5/src/media/turbid/vulkan/leaf_scattering_operations.slang +87 -0
  763. less3d-3.0.5/src/media/turbid/vulkan/observation_source.slang +215 -0
  764. less3d-3.0.5/src/media/turbid/vulkan/resident_artifact.h +135 -0
  765. less3d-3.0.5/src/media/turbid/vulkan/sampling.cpp +355 -0
  766. less3d-3.0.5/src/media/turbid/vulkan/sampling.h +18 -0
  767. less3d-3.0.5/src/media/turbid/vulkan/sampling.slang +68 -0
  768. less3d-3.0.5/src/media/turbid/vulkan/state.cpp +244 -0
  769. less3d-3.0.5/src/media/turbid/vulkan/state.h +31 -0
  770. less3d-3.0.5/src/media/turbid/vulkan/state.slang +92 -0
  771. less3d-3.0.5/src/media/turbid/vulkan/turbid_leaf_collision.slang +142 -0
  772. less3d-3.0.5/src/media/water/embree/phase.h +3 -0
  773. less3d-3.0.5/src/media/water/embree/water_column_medium.h +3 -0
  774. less3d-3.0.5/src/media/water/optix/phase.cuh +3 -0
  775. less3d-3.0.5/src/media/water/optix/water_column_medium.cuh +3 -0
  776. less3d-3.0.5/src/media/water/phase.h +39 -0
  777. less3d-3.0.5/src/media/water/vulkan/phase.slang +28 -0
  778. less3d-3.0.5/src/media/water/vulkan/water_column_medium.slang +38 -0
  779. less3d-3.0.5/src/media/water/water_column_medium.h +55 -0
  780. less3d-3.0.5/src/processes/CMakeLists.txt +37 -0
  781. less3d-3.0.5/src/processes/energy_balance/bindings.cpp +347 -0
  782. less3d-3.0.5/src/processes/energy_balance/energy_balance_process.h +97 -0
  783. less3d-3.0.5/src/processes/energy_balance/fixed_energy_balance.h +104 -0
  784. less3d-3.0.5/src/processes/energy_balance/joint_storage.h +279 -0
  785. less3d-3.0.5/src/processes/energy_balance/optix.cu +417 -0
  786. less3d-3.0.5/src/processes/energy_balance/process.h +149 -0
  787. less3d-3.0.5/src/processes/energy_balance/tests/test_native.cpp +73 -0
  788. less3d-3.0.5/src/processes/energy_balance/tests/turbid_native.cpp +145 -0
  789. less3d-3.0.5/src/processes/energy_balance/turbid.h +124 -0
  790. less3d-3.0.5/src/processes/energy_balance/turbid_storage.h +470 -0
  791. less3d-3.0.5/src/processes/energy_balance/vulkan/process.slang +87 -0
  792. less3d-3.0.5/src/processes/energy_balance/vulkan/turbid_assemble.slang +263 -0
  793. less3d-3.0.5/src/processes/photosynthesis/bindings.cpp +397 -0
  794. less3d-3.0.5/src/processes/photosynthesis/dynamic_photosynthesis_process.h +216 -0
  795. less3d-3.0.5/src/processes/photosynthesis/metadata.h +47 -0
  796. less3d-3.0.5/src/processes/photosynthesis/optix.cu +248 -0
  797. less3d-3.0.5/src/processes/photosynthesis/photosynthesis.h +166 -0
  798. less3d-3.0.5/src/processes/photosynthesis/process.h +634 -0
  799. less3d-3.0.5/src/processes/photosynthesis/tests/test_native.cpp +277 -0
  800. less3d-3.0.5/src/processes/photosynthesis/tests/turbid_native.cpp +173 -0
  801. less3d-3.0.5/src/processes/photosynthesis/turbid.h +177 -0
  802. less3d-3.0.5/src/processes/photosynthesis/turbid_storage.h +236 -0
  803. less3d-3.0.5/src/processes/photosynthesis/vulkan/process.slang +408 -0
  804. less3d-3.0.5/src/processes/photosynthesis/vulkan/turbid_assemble.slang +102 -0
  805. less3d-3.0.5/src/processes/physiology/farquhar/farquhar.h +624 -0
  806. less3d-3.0.5/src/processes/physiology/farquhar/tests/data/generate_scope_fvcb_reference.m +170 -0
  807. less3d-3.0.5/src/processes/physiology/farquhar/tests/data/scope_fvcb_scalar_reference.csv +109 -0
  808. less3d-3.0.5/src/processes/physiology/farquhar/tests/data/scope_fvcb_scalar_reference.meta.json +36 -0
  809. less3d-3.0.5/src/processes/physiology/farquhar/tests/test_farquhar_formulations.py +98 -0
  810. less3d-3.0.5/src/processes/physiology/farquhar/tests/test_native.cpp +359 -0
  811. less3d-3.0.5/src/processes/physiology/farquhar/tests/test_scope_fvcb_reference.py +85 -0
  812. less3d-3.0.5/src/processes/physiology/farquhar/vulkan/farquhar_leaf_solver.slang +219 -0
  813. less3d-3.0.5/src/processes/physiology/farquhar/vulkan/formulation.slang +2 -0
  814. less3d-3.0.5/src/processes/physiology/process.h +203 -0
  815. less3d-3.0.5/src/processes/physiology/tests/test_native.cpp +111 -0
  816. less3d-3.0.5/src/processes/physiology/vulkan.slang +279 -0
  817. less3d-3.0.5/src/processes/radiation_field/bindings.cpp +374 -0
  818. less3d-3.0.5/src/processes/radiation_field/radiation_field.h +137 -0
  819. less3d-3.0.5/src/processes/radiation_field/storage.h +485 -0
  820. less3d-3.0.5/src/processes/radiation_field/tests/test_native.cpp +130 -0
  821. less3d-3.0.5/src/processes/radiation_field/vulkan.slang +286 -0
  822. less3d-3.0.5/src/processes/sif/bindings.cpp +396 -0
  823. less3d-3.0.5/src/processes/sif/embree/sif_process.cpp +72 -0
  824. less3d-3.0.5/src/processes/sif/embree/sif_source_assembly.cpp +209 -0
  825. less3d-3.0.5/src/processes/sif/optix/sif_process.cu +165 -0
  826. less3d-3.0.5/src/processes/sif/optix/sif_source_assembly.cu +373 -0
  827. less3d-3.0.5/src/processes/sif/process.h +481 -0
  828. less3d-3.0.5/src/processes/sif/source_assembly.h +60 -0
  829. less3d-3.0.5/src/processes/sif/tests/test_native.cpp +221 -0
  830. less3d-3.0.5/src/processes/sif/vulkan/mesh_sif_source_assembly.slang +54 -0
  831. less3d-3.0.5/src/processes/sif/vulkan/sif_process.slang +52 -0
  832. less3d-3.0.5/src/processes/sif/vulkan/sif_process_host.cpp +664 -0
  833. less3d-3.0.5/src/processes/sif/vulkan/sif_source_assembly.slang +215 -0
  834. less3d-3.0.5/src/processes/thermo_physiology/bindings/joint_thermo_physiology_bindings.cpp +1162 -0
  835. less3d-3.0.5/src/processes/thermo_physiology/bindings/processes.cpp +747 -0
  836. less3d-3.0.5/src/processes/thermo_physiology/embree/joint_thermo_physiology.cpp +648 -0
  837. less3d-3.0.5/src/processes/thermo_physiology/embree/joint_thermo_physiology.h +24 -0
  838. less3d-3.0.5/src/processes/thermo_physiology/embree/processes.cpp +380 -0
  839. less3d-3.0.5/src/processes/thermo_physiology/embree/turbid_processes.cpp +209 -0
  840. less3d-3.0.5/src/processes/thermo_physiology/embree/turbid_processes.h +28 -0
  841. less3d-3.0.5/src/processes/thermo_physiology/joint_thermo_physiology.h +164 -0
  842. less3d-3.0.5/src/processes/thermo_physiology/optix/joint_thermo_physiology.cpp +647 -0
  843. less3d-3.0.5/src/processes/thermo_physiology/optix/joint_thermo_physiology.cu +393 -0
  844. less3d-3.0.5/src/processes/thermo_physiology/optix/joint_thermo_physiology.h +169 -0
  845. less3d-3.0.5/src/processes/thermo_physiology/optix/processes.cu +799 -0
  846. less3d-3.0.5/src/processes/thermo_physiology/optix/turbid_processes.cpp +693 -0
  847. less3d-3.0.5/src/processes/thermo_physiology/optix/turbid_processes.h +107 -0
  848. less3d-3.0.5/src/processes/thermo_physiology/radiative_coupling_controller.h +197 -0
  849. less3d-3.0.5/src/processes/thermo_physiology/radiative_temperature_coupling.h +144 -0
  850. less3d-3.0.5/src/processes/thermo_physiology/tests/test_controller.cpp +234 -0
  851. less3d-3.0.5/src/processes/thermo_physiology/tests/test_joint.cpp +92 -0
  852. less3d-3.0.5/src/processes/thermo_physiology/tests/test_temperature_coupling.cpp +148 -0
  853. less3d-3.0.5/src/processes/thermo_physiology/vulkan/joint_thermo_physiology.slang +426 -0
  854. less3d-3.0.5/src/processes/thermo_physiology/vulkan/processes_host.cpp +924 -0
  855. less3d-3.0.5/src/processes/thermo_physiology/vulkan/turbid_processes.cpp +148 -0
  856. less3d-3.0.5/src/processes/thermo_physiology/vulkan/turbid_processes.h +22 -0
  857. less3d-3.0.5/src/products/CMakeLists.txt +6 -0
  858. less3d-3.0.5/src/products/brf/brf.h +54 -0
  859. less3d-3.0.5/src/products/brf/embree.h +44 -0
  860. less3d-3.0.5/src/products/brf/optix.cuh +30 -0
  861. less3d-3.0.5/src/products/brf/vulkan.h +28 -0
  862. less3d-3.0.5/src/products/image/embree/image.cpp +69 -0
  863. less3d-3.0.5/src/products/image/embree/image.h +110 -0
  864. less3d-3.0.5/src/products/image/optix/image.cpp +38 -0
  865. less3d-3.0.5/src/products/image/optix/image.cuh +64 -0
  866. less3d-3.0.5/src/products/image/optix/image.h +20 -0
  867. less3d-3.0.5/src/products/image/vulkan/image.cpp +25 -0
  868. less3d-3.0.5/src/products/image/vulkan/image.h +14 -0
  869. less3d-3.0.5/src/products/image/vulkan/image.slang +67 -0
  870. less3d-3.0.5/src/products/irradiance_map/embree.h +78 -0
  871. less3d-3.0.5/src/products/irradiance_map/irradiance_map.h +85 -0
  872. less3d-3.0.5/src/products/irradiance_map/optix.cuh +119 -0
  873. less3d-3.0.5/src/products/irradiance_map/vulkan.slang +66 -0
  874. less3d-3.0.5/src/products/lidar_waveform/embree.h +22 -0
  875. less3d-3.0.5/src/products/lidar_waveform/lidar_waveform.h +45 -0
  876. less3d-3.0.5/src/products/lidar_waveform/optix.cuh +20 -0
  877. less3d-3.0.5/src/products/lidar_waveform/vulkan/layout.slang +20 -0
  878. less3d-3.0.5/src/products/lidar_waveform/vulkan/lidar_waveform.slang +15 -0
  879. less3d-3.0.5/src/products/point_cloud/embree/point_cloud.cpp +39 -0
  880. less3d-3.0.5/src/products/point_cloud/embree/point_cloud.h +29 -0
  881. less3d-3.0.5/src/products/point_cloud/host.h +158 -0
  882. less3d-3.0.5/src/products/point_cloud/optix/point_cloud.cu +126 -0
  883. less3d-3.0.5/src/products/point_cloud/optix/point_cloud.h +31 -0
  884. less3d-3.0.5/src/products/point_cloud/point_cloud.h +40 -0
  885. less3d-3.0.5/src/products/point_cloud/vulkan/point_cloud.cpp +35 -0
  886. less3d-3.0.5/src/products/point_cloud/vulkan/point_cloud.h +25 -0
  887. less3d-3.0.5/src/products/radiation_field/embree.h +143 -0
  888. less3d-3.0.5/src/products/radiation_field/optix.cuh +105 -0
  889. less3d-3.0.5/src/products/radiation_field/radiation_field.h +79 -0
  890. less3d-3.0.5/src/products/radiation_field/vulkan.slang +62 -0
  891. less3d-3.0.5/src/sensors/CMakeLists.txt +2 -0
  892. less3d-3.0.5/src/sensors/lidar/CMakeLists.txt +6 -0
  893. less3d-3.0.5/src/sensors/lidar/pulse_table/embree.h +2 -0
  894. less3d-3.0.5/src/sensors/lidar/pulse_table/optix.h +2 -0
  895. less3d-3.0.5/src/sensors/lidar/pulse_table/pulse_table.h +32 -0
  896. less3d-3.0.5/src/sensors/lidar/pulse_table/vulkan.slang +32 -0
  897. less3d-3.0.5/src/sensors/lidar/receiver_response/embree/receiver_response.cpp +25 -0
  898. less3d-3.0.5/src/sensors/lidar/receiver_response/embree/receiver_response.h +20 -0
  899. less3d-3.0.5/src/sensors/lidar/receiver_response/optix/receiver_response.cu +100 -0
  900. less3d-3.0.5/src/sensors/lidar/receiver_response/optix/receiver_response.h +28 -0
  901. less3d-3.0.5/src/sensors/lidar/receiver_response/receiver_response.h +48 -0
  902. less3d-3.0.5/src/sensors/lidar/receiver_response/receiver_response_host.h +46 -0
  903. less3d-3.0.5/src/sensors/lidar/receiver_response/vulkan/receiver_response.cpp +25 -0
  904. less3d-3.0.5/src/sensors/lidar/receiver_response/vulkan/receiver_response.h +20 -0
  905. less3d-3.0.5/src/sensors/lidar/survey/bindings.cpp +145 -0
  906. less3d-3.0.5/src/sensors/lidar/survey/embree.h +2 -0
  907. less3d-3.0.5/src/sensors/lidar/survey/optix.h +2 -0
  908. less3d-3.0.5/src/sensors/lidar/survey/survey.h +286 -0
  909. less3d-3.0.5/src/sensors/lidar/survey/vulkan.h +2 -0
  910. less3d-3.0.5/src/sensors/optical/CMakeLists.txt +6 -0
  911. less3d-3.0.5/src/sensors/optical/fisheye/embree.h +2 -0
  912. less3d-3.0.5/src/sensors/optical/fisheye/fisheye.h +60 -0
  913. less3d-3.0.5/src/sensors/optical/fisheye/optix.h +2 -0
  914. less3d-3.0.5/src/sensors/optical/fisheye/tests/test_native.cpp +45 -0
  915. less3d-3.0.5/src/sensors/optical/fisheye/vulkan.slang +48 -0
  916. less3d-3.0.5/src/sensors/optical/orthographic/embree.h +2 -0
  917. less3d-3.0.5/src/sensors/optical/orthographic/optix.h +2 -0
  918. less3d-3.0.5/src/sensors/optical/orthographic/orthographic.h +44 -0
  919. less3d-3.0.5/src/sensors/optical/orthographic/tests/test_native.cpp +49 -0
  920. less3d-3.0.5/src/sensors/optical/orthographic/vulkan.slang +25 -0
  921. less3d-3.0.5/src/sensors/optical/perspective/embree.h +2 -0
  922. less3d-3.0.5/src/sensors/optical/perspective/optix.h +2 -0
  923. less3d-3.0.5/src/sensors/optical/perspective/perspective.h +35 -0
  924. less3d-3.0.5/src/sensors/optical/perspective/tests/test_native.cpp +40 -0
  925. less3d-3.0.5/src/sensors/optical/perspective/vulkan.slang +24 -0
  926. less3d-3.0.5/src/sensors/optical/pushbroom/embree.h +2 -0
  927. less3d-3.0.5/src/sensors/optical/pushbroom/optix.h +2 -0
  928. less3d-3.0.5/src/sensors/optical/pushbroom/pushbroom.h +32 -0
  929. less3d-3.0.5/src/sensors/optical/pushbroom/tests/test_native.cpp +41 -0
  930. less3d-3.0.5/src/sensors/optical/pushbroom/vulkan.slang +23 -0
  931. less3d-3.0.5/src/sensors/optical/spectral_response/bindings.cpp +90 -0
  932. less3d-3.0.5/src/sensors/optical/spectral_response/embree.h +2 -0
  933. less3d-3.0.5/src/sensors/optical/spectral_response/optix.h +2 -0
  934. less3d-3.0.5/src/sensors/optical/spectral_response/spectral_response.h +192 -0
  935. less3d-3.0.5/src/sensors/optical/spectral_response/vulkan.h +2 -0
  936. less3d-3.0.5/src/surfaces/CMakeLists.txt +11 -0
  937. less3d-3.0.5/src/surfaces/dielectric_water_boundary/dielectric_water_boundary.h +99 -0
  938. less3d-3.0.5/src/surfaces/dielectric_water_boundary/embree.h +3 -0
  939. less3d-3.0.5/src/surfaces/dielectric_water_boundary/optix.cuh +3 -0
  940. less3d-3.0.5/src/surfaces/dielectric_water_boundary/vulkan.slang +79 -0
  941. less3d-3.0.5/src/surfaces/diffuse_transmitter/compile.h +41 -0
  942. less3d-3.0.5/src/surfaces/diffuse_transmitter/diffuse_transmitter.h +125 -0
  943. less3d-3.0.5/src/surfaces/diffuse_transmitter/embree.h +13 -0
  944. less3d-3.0.5/src/surfaces/diffuse_transmitter/optix.cuh +65 -0
  945. less3d-3.0.5/src/surfaces/diffuse_transmitter/tests/test_api.py +18 -0
  946. less3d-3.0.5/src/surfaces/diffuse_transmitter/tests/test_lidar_parity.py +73 -0
  947. less3d-3.0.5/src/surfaces/diffuse_transmitter/tests/test_native.cpp +59 -0
  948. less3d-3.0.5/src/surfaces/diffuse_transmitter/tests/test_texture_science.py +197 -0
  949. less3d-3.0.5/src/surfaces/diffuse_transmitter/vulkan.slang +294 -0
  950. less3d-3.0.5/src/surfaces/lambertian/compile.h +43 -0
  951. less3d-3.0.5/src/surfaces/lambertian/embree.h +13 -0
  952. less3d-3.0.5/src/surfaces/lambertian/lambertian.h +62 -0
  953. less3d-3.0.5/src/surfaces/lambertian/optix.cuh +63 -0
  954. less3d-3.0.5/src/surfaces/lambertian/tests/test_api.py +17 -0
  955. less3d-3.0.5/src/surfaces/lambertian/tests/test_science.py +53 -0
  956. less3d-3.0.5/src/surfaces/lambertian/vulkan.slang +139 -0
  957. less3d-3.0.5/src/surfaces/microwave/bindings.cpp +200 -0
  958. less3d-3.0.5/src/surfaces/microwave/microwave.h +7 -0
  959. less3d-3.0.5/src/surfaces/microwave/mie_cylinder.h +87 -0
  960. less3d-3.0.5/src/surfaces/microwave/soil.h +121 -0
  961. less3d-3.0.5/src/surfaces/microwave/trunk_ground.h +87 -0
  962. less3d-3.0.5/src/surfaces/rpv/compile.h +43 -0
  963. less3d-3.0.5/src/surfaces/rpv/embree.h +13 -0
  964. less3d-3.0.5/src/surfaces/rpv/optix.cuh +66 -0
  965. less3d-3.0.5/src/surfaces/rpv/rpv.h +95 -0
  966. less3d-3.0.5/src/surfaces/rpv/tests/test_api.py +17 -0
  967. less3d-3.0.5/src/surfaces/rpv/tests/test_native.cpp +54 -0
  968. less3d-3.0.5/src/surfaces/rpv/tests/test_parity.py +81 -0
  969. less3d-3.0.5/src/surfaces/rpv/vulkan.slang +227 -0
  970. less3d-3.0.5/src/surfaces/surface_fluorescence/embree.h +15 -0
  971. less3d-3.0.5/src/surfaces/surface_fluorescence/optix.cuh +14 -0
  972. less3d-3.0.5/src/surfaces/surface_fluorescence/surface_fluorescence.h +20 -0
  973. less3d-3.0.5/src/surfaces/surface_fluorescence/vulkan.slang +5 -0
  974. less3d-3.0.5/src/surfaces/thermal_surface/embree.h +24 -0
  975. less3d-3.0.5/src/surfaces/thermal_surface/optix.cuh +24 -0
  976. less3d-3.0.5/src/surfaces/thermal_surface/thermal_surface.h +27 -0
  977. less3d-3.0.5/src/surfaces/thermal_surface/vulkan.slang +63 -0
  978. less3d-3.0.5/src/surfaces/water/compile.h +54 -0
  979. less3d-3.0.5/src/surfaces/water/embree.h +68 -0
  980. less3d-3.0.5/src/surfaces/water/optix.cuh +69 -0
  981. less3d-3.0.5/src/surfaces/water/tests/test_api.py +170 -0
  982. less3d-3.0.5/src/surfaces/water/tests/test_benchmark.py +75 -0
  983. less3d-3.0.5/src/surfaces/water/tests/test_native.cpp +133 -0
  984. less3d-3.0.5/src/surfaces/water/tests/test_native.py +197 -0
  985. less3d-3.0.5/src/surfaces/water/tests/test_surface.py +101 -0
  986. less3d-3.0.5/src/surfaces/water/vulkan.slang +381 -0
  987. less3d-3.0.5/src/surfaces/water/water.h +355 -0
  988. less3d-3.0.5/src/transport/domain_partition/domain_partition.h +141 -0
  989. less3d-3.0.5/src/transport/domain_partition/tests/test_native.cpp +60 -0
  990. less3d-3.0.5/src/transport/domain_partition/vulkan.slang +123 -0
  991. less3d-3.0.5/src/transport/emitter_data.h +53 -0
  992. less3d-3.0.5/src/transport/illumination.h +46 -0
  993. less3d-3.0.5/src/transport/illumination.slang +10 -0
  994. less3d-3.0.5/src/transport/integrator.h +9 -0
  995. less3d-3.0.5/src/transport/integrator.slang +6 -0
  996. less3d-3.0.5/src/transport/lidar_data.h +69 -0
  997. less3d-3.0.5/src/transport/medium.h +56 -0
  998. less3d-3.0.5/src/transport/medium.slang +43 -0
  999. less3d-3.0.5/src/transport/phase.h +47 -0
  1000. less3d-3.0.5/src/transport/phase.slang +13 -0
  1001. less3d-3.0.5/src/transport/product.h +37 -0
  1002. less3d-3.0.5/src/transport/product.slang +6 -0
  1003. less3d-3.0.5/src/transport/ray_differential.h +38 -0
  1004. less3d-3.0.5/src/transport/scientific_process.h +22 -0
  1005. less3d-3.0.5/src/transport/scientific_process.slang +9 -0
  1006. less3d-3.0.5/src/transport/sensor.h +55 -0
  1007. less3d-3.0.5/src/transport/sensor.slang +20 -0
  1008. less3d-3.0.5/src/transport/sensor_data.h +58 -0
  1009. less3d-3.0.5/src/transport/source_composition/bindings.cpp +86 -0
  1010. less3d-3.0.5/src/transport/source_composition/source_composition.h +98 -0
  1011. less3d-3.0.5/src/transport/source_composition/tests/test_native.cpp +34 -0
  1012. less3d-3.0.5/src/transport/source_composition/vulkan.slang +33 -0
  1013. less3d-3.0.5/src/transport/surface.h +80 -0
  1014. less3d-3.0.5/src/transport/surface.slang +58 -0
  1015. less3d-3.0.5/src/transport/surface_closure/surface_closure.h +30 -0
  1016. less3d-3.0.5/src/transport/surface_closure/vulkan.slang +23 -0
  1017. less3d-3.0.5/src/transport/surface_emission/surface_emission.h +30 -0
  1018. less3d-3.0.5/src/transport/surface_emission/vulkan.slang +8 -0
  1019. less3d-3.0.5/src/transport/volume_event/embree.h +5 -0
  1020. less3d-3.0.5/src/transport/volume_event/optix.cuh +5 -0
  1021. less3d-3.0.5/src/transport/volume_event/tests/test_native.cpp +43 -0
  1022. less3d-3.0.5/src/transport/volume_event/volume_event.h +86 -0
  1023. less3d-3.0.5/src/transport/volume_event/vulkan.slang +79 -0
  1024. less3d-3.0.5/tests/README.md +120 -0
  1025. less3d-3.0.5/tests/_native_test_support.py +7 -0
  1026. less3d-3.0.5/tests/_test_manifest.py +932 -0
  1027. less3d-3.0.5/tests/_test_support.py +166 -0
  1028. less3d-3.0.5/tests/api/test_texture_api_contract.py +153 -0
  1029. less3d-3.0.5/tests/architecture/portable_debt.toml +3 -0
  1030. less3d-3.0.5/tests/architecture/test_acquisition_geometry_orthographic.py +29 -0
  1031. less3d-3.0.5/tests/architecture/test_acquisition_geometry_passive_remaining.py +32 -0
  1032. less3d-3.0.5/tests/architecture/test_acquisition_lidar_pulse_table.py +35 -0
  1033. less3d-3.0.5/tests/architecture/test_acquisition_lidar_survey.py +37 -0
  1034. less3d-3.0.5/tests/architecture/test_acquisition_recipe_dispatch.py +51 -0
  1035. less3d-3.0.5/tests/architecture/test_active_emitter_lidar_pulse.py +54 -0
  1036. less3d-3.0.5/tests/architecture/test_backend_descriptors.py +49 -0
  1037. less3d-3.0.5/tests/architecture/test_backend_kernel_resource_layout.py +56 -0
  1038. less3d-3.0.5/tests/architecture/test_backward_direct_solar_closure_dispatch.py +74 -0
  1039. less3d-3.0.5/tests/architecture/test_backward_integrator_progression.py +78 -0
  1040. less3d-3.0.5/tests/architecture/test_backward_recipe_composition.py +89 -0
  1041. less3d-3.0.5/tests/architecture/test_boundary_illumination_sun_sky.py +78 -0
  1042. less3d-3.0.5/tests/architecture/test_brf_recipe_estimator_contract.py +89 -0
  1043. less3d-3.0.5/tests/architecture/test_compiler_ir.py +319 -0
  1044. less3d-3.0.5/tests/architecture/test_continuous_participating_medium.py +35 -0
  1045. less3d-3.0.5/tests/architecture/test_embree_radiation_field_memory_policy.py +24 -0
  1046. less3d-3.0.5/tests/architecture/test_embree_state_field_fluorescence_closure.py +65 -0
  1047. less3d-3.0.5/tests/architecture/test_embree_state_field_temperature_closure.py +37 -0
  1048. less3d-3.0.5/tests/architecture/test_energy_balance_surface_category_dispatch.py +32 -0
  1049. less3d-3.0.5/tests/architecture/test_extensible_refactor_baseline.py +232 -0
  1050. less3d-3.0.5/tests/architecture/test_extension_ownership.py +55 -0
  1051. less3d-3.0.5/tests/architecture/test_field_combination_capabilities.py +137 -0
  1052. less3d-3.0.5/tests/architecture/test_field_ir.py +223 -0
  1053. less3d-3.0.5/tests/architecture/test_field_program_execution_identity.py +88 -0
  1054. less3d-3.0.5/tests/architecture/test_field_program_requirements_ir.py +125 -0
  1055. less3d-3.0.5/tests/architecture/test_field_workflow_closure_gate.py +104 -0
  1056. less3d-3.0.5/tests/architecture/test_forward_integrator_event_contract.py +73 -0
  1057. less3d-3.0.5/tests/architecture/test_homogeneous_water_lidar_contract.py +49 -0
  1058. less3d-3.0.5/tests/architecture/test_illumination_category_source_layout.py +73 -0
  1059. less3d-3.0.5/tests/architecture/test_integrator_category_source_layout.py +56 -0
  1060. less3d-3.0.5/tests/architecture/test_invalid_closure_energy_fail_closed.py +27 -0
  1061. less3d-3.0.5/tests/architecture/test_legacy_turbid_dynamic_removed.py +131 -0
  1062. less3d-3.0.5/tests/architecture/test_medium_category_source_layout.py +86 -0
  1063. less3d-3.0.5/tests/architecture/test_medium_closure_turbid_leaf.py +43 -0
  1064. less3d-3.0.5/tests/architecture/test_medium_event_composition.py +30 -0
  1065. less3d-3.0.5/tests/architecture/test_medium_region_stack.py +29 -0
  1066. less3d-3.0.5/tests/architecture/test_microwave_acquisition_recipe_dispatch.py +27 -0
  1067. less3d-3.0.5/tests/architecture/test_native_artifact_identity.py +69 -0
  1068. less3d-3.0.5/tests/architecture/test_native_module_isolation.py +292 -0
  1069. less3d-3.0.5/tests/architecture/test_no_legacy_native_dispatch.py +74 -0
  1070. less3d-3.0.5/tests/architecture/test_optix_dynamic_spectrum_policy.py +56 -0
  1071. less3d-3.0.5/tests/architecture/test_optix_forward_dynamic_spectrum_policy.py +36 -0
  1072. less3d-3.0.5/tests/architecture/test_optix_pipeline_specialization.py +217 -0
  1073. less3d-3.0.5/tests/architecture/test_optix_state_field_fluorescence_closure.py +80 -0
  1074. less3d-3.0.5/tests/architecture/test_optix_state_field_temperature_closure.py +68 -0
  1075. less3d-3.0.5/tests/architecture/test_phase_category_source_layout.py +87 -0
  1076. less3d-3.0.5/tests/architecture/test_phase_function_turbid_leaf.py +77 -0
  1077. less3d-3.0.5/tests/architecture/test_phase_function_turbid_lidar_moment.py +47 -0
  1078. less3d-3.0.5/tests/architecture/test_phase_function_turbid_operations.py +66 -0
  1079. less3d-3.0.5/tests/architecture/test_physiology_farquhar_component.py +54 -0
  1080. less3d-3.0.5/tests/architecture/test_plugin_manager.py +451 -0
  1081. less3d-3.0.5/tests/architecture/test_plugin_workflows.py +181 -0
  1082. less3d-3.0.5/tests/architecture/test_process_category_source_layout.py +68 -0
  1083. less3d-3.0.5/tests/architecture/test_process_contract_leaf_includes.py +53 -0
  1084. less3d-3.0.5/tests/architecture/test_process_graph_contract.py +210 -0
  1085. less3d-3.0.5/tests/architecture/test_product_category_source_layout.py +58 -0
  1086. less3d-3.0.5/tests/architecture/test_product_image.py +107 -0
  1087. less3d-3.0.5/tests/architecture/test_product_irradiance_map.py +61 -0
  1088. less3d-3.0.5/tests/architecture/test_product_lidar_waveform.py +34 -0
  1089. less3d-3.0.5/tests/architecture/test_product_point_cloud.py +38 -0
  1090. less3d-3.0.5/tests/architecture/test_product_radiation_field.py +57 -0
  1091. less3d-3.0.5/tests/architecture/test_production_boundaries.py +794 -0
  1092. less3d-3.0.5/tests/architecture/test_program_recipe_ir.py +208 -0
  1093. less3d-3.0.5/tests/architecture/test_program_variant_inventory.py +71 -0
  1094. less3d-3.0.5/tests/architecture/test_public_native_logging.py +16 -0
  1095. less3d-3.0.5/tests/architecture/test_radiation_field_float_accumulation_policy.py +40 -0
  1096. less3d-3.0.5/tests/architecture/test_radiative_coupling_component.py +53 -0
  1097. less3d-3.0.5/tests/architecture/test_recipe_inspection.py +62 -0
  1098. less3d-3.0.5/tests/architecture/test_registered_brf_workflow.py +137 -0
  1099. less3d-3.0.5/tests/architecture/test_registered_emission_imaging_workflows.py +112 -0
  1100. less3d-3.0.5/tests/architecture/test_registered_forward_workflows.py +117 -0
  1101. less3d-3.0.5/tests/architecture/test_registered_lidar_workflow.py +98 -0
  1102. less3d-3.0.5/tests/architecture/test_registered_microwave_workflows.py +122 -0
  1103. less3d-3.0.5/tests/architecture/test_registered_optical_workflow.py +111 -0
  1104. less3d-3.0.5/tests/architecture/test_registered_process_workflows.py +202 -0
  1105. less3d-3.0.5/tests/architecture/test_registry_foundation.py +131 -0
  1106. less3d-3.0.5/tests/architecture/test_response_lidar_receiver.py +38 -0
  1107. less3d-3.0.5/tests/architecture/test_response_spectral_bands.py +33 -0
  1108. less3d-3.0.5/tests/architecture/test_runtime_session.py +131 -0
  1109. less3d-3.0.5/tests/architecture/test_scene_domain_partition_compile.py +79 -0
  1110. less3d-3.0.5/tests/architecture/test_scene_solve_process_graph.py +107 -0
  1111. less3d-3.0.5/tests/architecture/test_sensor_category_source_layout.py +117 -0
  1112. less3d-3.0.5/tests/architecture/test_serialization_codec_registry.py +124 -0
  1113. less3d-3.0.5/tests/architecture/test_source_composition_passive.py +127 -0
  1114. less3d-3.0.5/tests/architecture/test_source_layout_contract.py +174 -0
  1115. less3d-3.0.5/tests/architecture/test_source_layout_simplification_complete.py +132 -0
  1116. less3d-3.0.5/tests/architecture/test_state_field_registry_provenance.py +70 -0
  1117. less3d-3.0.5/tests/architecture/test_surface_category_source_layout.py +126 -0
  1118. less3d-3.0.5/tests/architecture/test_surface_emission_fluorescence.py +72 -0
  1119. less3d-3.0.5/tests/architecture/test_surface_emission_thermal.py +88 -0
  1120. less3d-3.0.5/tests/architecture/test_texture_no_representative_fallback.py +23 -0
  1121. less3d-3.0.5/tests/architecture/test_time_resolved_active_integrator.py +182 -0
  1122. less3d-3.0.5/tests/architecture/test_time_resolved_active_timeline.py +85 -0
  1123. less3d-3.0.5/tests/architecture/test_transport_domain_partition.py +66 -0
  1124. less3d-3.0.5/tests/architecture/test_turbid_aggregation_component.py +35 -0
  1125. less3d-3.0.5/tests/architecture/test_turbid_domain_component.py +38 -0
  1126. less3d-3.0.5/tests/architecture/test_turbid_energy_balance_process_component.py +50 -0
  1127. less3d-3.0.5/tests/architecture/test_turbid_field_component.py +34 -0
  1128. less3d-3.0.5/tests/architecture/test_turbid_radiation_process_component.py +44 -0
  1129. less3d-3.0.5/tests/architecture/test_turbid_sampling_foundation_component.py +26 -0
  1130. less3d-3.0.5/tests/architecture/test_turbid_state_component.py +41 -0
  1131. less3d-3.0.5/tests/architecture/test_turbid_state_field_publication.py +59 -0
  1132. less3d-3.0.5/tests/architecture/test_turbid_static_physiology_process_component.py +45 -0
  1133. less3d-3.0.5/tests/architecture/test_volume_event_contract.py +75 -0
  1134. less3d-3.0.5/tests/architecture/test_vulkan_field_profile_specialization.py +234 -0
  1135. less3d-3.0.5/tests/architecture/test_vulkan_readback_memory_policy.py +25 -0
  1136. less3d-3.0.5/tests/architecture/test_vulkan_shader_include_dependencies.py +34 -0
  1137. less3d-3.0.5/tests/architecture/test_vulkan_state_field_fluorescence_closure.py +69 -0
  1138. less3d-3.0.5/tests/architecture/test_vulkan_state_field_temperature_closure.py +76 -0
  1139. less3d-3.0.5/tests/architecture/test_vulkan_turbid_pipeline_policy.py +52 -0
  1140. less3d-3.0.5/tests/architecture/test_vulkan_wavefront_allocation_policy.py +24 -0
  1141. less3d-3.0.5/tests/architecture/test_vulkan_wavefront_diffuse_profile_policy.py +29 -0
  1142. less3d-3.0.5/tests/architecture/test_vulkan_wavefront_fused_path_policy.py +38 -0
  1143. less3d-3.0.5/tests/architecture/test_water_surface_source_layout.py +124 -0
  1144. less3d-3.0.5/tests/architecture/test_workflow_pipeline_ownership.py +119 -0
  1145. less3d-3.0.5/tests/architecture/test_workflow_registry_authority.py +438 -0
  1146. less3d-3.0.5/tests/assets/flux_internal_boundary.obj +8 -0
  1147. less3d-3.0.5/tests/assets/flux_tiny_outside_boundary.obj +8 -0
  1148. less3d-3.0.5/tests/assets/vulkan_mw_slab.obj +22 -0
  1149. less3d-3.0.5/tests/assets/vulkan_mw_trunk.obj +34 -0
  1150. less3d-3.0.5/tests/assets/vulkan_triangle.obj +7 -0
  1151. less3d-3.0.5/tests/atmosphere/test_atmospheric_sensor_paths.py +564 -0
  1152. less3d-3.0.5/tests/atmosphere/test_illumination_composition.py +163 -0
  1153. less3d-3.0.5/tests/atmosphere/test_native_atmosphere.py +971 -0
  1154. less3d-3.0.5/tests/data/extensible_architecture_3_0_1.json +25 -0
  1155. less3d-3.0.5/tests/data/modular_native_architecture_v3_0_4.json +143 -0
  1156. less3d-3.0.5/tests/docs/test_bilingual_tutorials.py +169 -0
  1157. less3d-3.0.5/tests/docs/test_public_release_docs.py +197 -0
  1158. less3d-3.0.5/tests/docs/test_turbid_tutorials.py +111 -0
  1159. less3d-3.0.5/tests/energy_balance/README.md +19 -0
  1160. less3d-3.0.5/tests/energy_balance/run_checkpoint.py +257 -0
  1161. less3d-3.0.5/tests/energy_balance/test_ground_heat_fraction_native.py +51 -0
  1162. less3d-3.0.5/tests/energy_balance/test_joint_embree.py +296 -0
  1163. less3d-3.0.5/tests/energy_balance/test_joint_farquhar_formulations.py +201 -0
  1164. less3d-3.0.5/tests/energy_balance/test_joint_optix.py +43 -0
  1165. less3d-3.0.5/tests/energy_balance/test_joint_performance.py +45 -0
  1166. less3d-3.0.5/tests/energy_balance/test_joint_process_contract.py +108 -0
  1167. less3d-3.0.5/tests/energy_balance/test_joint_public_products.py +83 -0
  1168. less3d-3.0.5/tests/energy_balance/test_joint_scene_compilation.py +266 -0
  1169. less3d-3.0.5/tests/energy_balance/test_joint_scientific_release.py +79 -0
  1170. less3d-3.0.5/tests/energy_balance/test_joint_sunlit_shaded_mesh.py +65 -0
  1171. less3d-3.0.5/tests/energy_balance/test_joint_transaction.py +207 -0
  1172. less3d-3.0.5/tests/energy_balance/test_joint_vulkan.py +52 -0
  1173. less3d-3.0.5/tests/energy_balance/test_joint_without_turbid.py +688 -0
  1174. less3d-3.0.5/tests/energy_balance/test_phase1_0_scaffolding.py +268 -0
  1175. less3d-3.0.5/tests/energy_balance/test_phase1_1_solver.py +314 -0
  1176. less3d-3.0.5/tests/energy_balance/test_phase1_2_primitive_buffers.py +193 -0
  1177. less3d-3.0.5/tests/energy_balance/test_phase1_3_temperature_buffer.py +249 -0
  1178. less3d-3.0.5/tests/energy_balance/test_phase1_4_kernel.py +156 -0
  1179. less3d-3.0.5/tests/energy_balance/test_phase1_mesh_refine.py +132 -0
  1180. less3d-3.0.5/tests/energy_balance/test_phase1_thermal_product.py +175 -0
  1181. less3d-3.0.5/tests/energy_balance/test_phase3_0_infrastructure.py +470 -0
  1182. less3d-3.0.5/tests/energy_balance/test_radiation_sunlit_face_orientation.py +101 -0
  1183. less3d-3.0.5/tests/energy_balance/test_representation_specific_routes.py +86 -0
  1184. less3d-3.0.5/tests/energy_balance/test_scope_aerodynamic_resistance.py +73 -0
  1185. less3d-3.0.5/tests/energy_balance/test_task5_static_mixed_product_live.py +99 -0
  1186. less3d-3.0.5/tests/energy_balance/test_terrain_two_sided.py +331 -0
  1187. less3d-3.0.5/tests/energy_balance/test_turbid_component_energy_balance.py +655 -0
  1188. less3d-3.0.5/tests/energy_balance/test_vulkan_radiation_roulette_parity.py +65 -0
  1189. less3d-3.0.5/tests/fixtures/component_extension/CMakeLists.txt +1 -0
  1190. less3d-3.0.5/tests/fixtures/component_extension/components/contracts/surface_closure/shared/surface_closure_contract.h +3 -0
  1191. less3d-3.0.5/tests/fixtures/component_extension/components/contracts/surface_closure/tests/surface_closure_contract.fixture +1 -0
  1192. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/with_reference/embree/consumer.cpp +1 -0
  1193. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/with_reference/optix/consumer.cu +1 -0
  1194. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/with_reference/tests/with_reference.fixture +1 -0
  1195. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/with_reference/vulkan/consumer.cpp +1 -0
  1196. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/without_reference/embree/consumer.cpp +1 -0
  1197. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/without_reference/optix/consumer.cu +1 -0
  1198. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/without_reference/tests/without_reference.fixture +1 -0
  1199. less3d-3.0.5/tests/fixtures/component_extension/components/integrator/without_reference/vulkan/consumer.cpp +1 -0
  1200. less3d-3.0.5/tests/fixtures/component_extension/components/surface/reference_leaf/embree/reference_leaf.h +7 -0
  1201. less3d-3.0.5/tests/fixtures/component_extension/components/surface/reference_leaf/optix/reference_leaf.cuh +7 -0
  1202. less3d-3.0.5/tests/fixtures/component_extension/components/surface/reference_leaf/shared/reference_leaf.h +5 -0
  1203. less3d-3.0.5/tests/fixtures/component_extension/components/surface/reference_leaf/tests/reference_leaf_backends.fixture +1 -0
  1204. less3d-3.0.5/tests/fixtures/component_extension/components/surface/reference_leaf/tests/reference_leaf_contract.fixture +1 -0
  1205. less3d-3.0.5/tests/fixtures/component_extension/components/surface/reference_leaf/vulkan/reference_leaf.slang +5 -0
  1206. less3d-3.0.5/tests/fixtures/component_extension/tests/_test_manifest.py +2 -0
  1207. less3d-3.0.5/tests/io/test_obj_mtl_texture_warning.py +66 -0
  1208. less3d-3.0.5/tests/io/test_obj_uv.py +133 -0
  1209. less3d-3.0.5/tests/native/test_homogeneous_water_lidar_native.py +142 -0
  1210. less3d-3.0.5/tests/native/test_lidar_beam_backend_parity.py +52 -0
  1211. less3d-3.0.5/tests/native/test_lidar_field_closure.py +82 -0
  1212. less3d-3.0.5/tests/native/test_lidar_large_launch_batching.py +54 -0
  1213. less3d-3.0.5/tests/native/test_lidar_return_timeline.py +81 -0
  1214. less3d-3.0.5/tests/native/test_lidar_survey_compiler.py +157 -0
  1215. less3d-3.0.5/tests/native/test_lidar_tls_backend_parity.py +66 -0
  1216. less3d-3.0.5/tests/native/test_medium_region_stack.py +37 -0
  1217. less3d-3.0.5/tests/native/test_optix_dynamic_bands.py +74 -0
  1218. less3d-3.0.5/tests/native/test_vulkan_dynamic_bands.py +57 -0
  1219. less3d-3.0.5/tests/native/test_vulkan_lidar_waveform_throughput.py +46 -0
  1220. less3d-3.0.5/tests/native/test_vulkan_wavefront_optical.py +55 -0
  1221. less3d-3.0.5/tests/optical/test_backend_spectral_batch_limits.py +15 -0
  1222. less3d-3.0.5/tests/optical/test_brf_difftrans.py +34 -0
  1223. less3d-3.0.5/tests/optical/test_brf_forward_backward.py +30 -0
  1224. less3d-3.0.5/tests/optical/test_brf_measurement_plane.py +46 -0
  1225. less3d-3.0.5/tests/optical/test_brf_product_plot_order.py +43 -0
  1226. less3d-3.0.5/tests/optical/test_brf_repetitive.py +35 -0
  1227. less3d-3.0.5/tests/optical/test_brf_sky_photons.py +30 -0
  1228. less3d-3.0.5/tests/optical/test_common.py +162 -0
  1229. less3d-3.0.5/tests/optical/test_default_scattering_order.py +62 -0
  1230. less3d-3.0.5/tests/optical/test_dynamic_multiband_backend_parity.py +55 -0
  1231. less3d-3.0.5/tests/optical/test_embree_optical_throughput.py +86 -0
  1232. less3d-3.0.5/tests/optical/test_embree_unchanged_reuse.py +56 -0
  1233. less3d-3.0.5/tests/optical/test_native_srf_integration.py +92 -0
  1234. less3d-3.0.5/tests/optical/test_native_turbid_contract.py +352 -0
  1235. less3d-3.0.5/tests/optical/test_optical_lad.py +54 -0
  1236. less3d-3.0.5/tests/optical/test_optical_product_contract.py +827 -0
  1237. less3d-3.0.5/tests/optical/test_optix_dynamic_spectral_batching.py +84 -0
  1238. less3d-3.0.5/tests/optical/test_optix_dynamic_spectral_workflows.py +127 -0
  1239. less3d-3.0.5/tests/optical/test_optix_dynamic_spectrum_benchmark_contract.py +18 -0
  1240. less3d-3.0.5/tests/optical/test_optix_sample_batching.py +44 -0
  1241. less3d-3.0.5/tests/optical/test_projection_transport_parity.py +135 -0
  1242. less3d-3.0.5/tests/optical/test_radiance_to_brf.py +39 -0
  1243. less3d-3.0.5/tests/optical/test_scene_modifiers_release.py +335 -0
  1244. less3d-3.0.5/tests/optical/test_sundisk.py +24 -0
  1245. less3d-3.0.5/tests/optical/test_turbid_asymmetric_optics.py +280 -0
  1246. less3d-3.0.5/tests/optical/test_turbid_backend_parity.py +252 -0
  1247. less3d-3.0.5/tests/optical/test_turbid_beer_lambert.py +326 -0
  1248. less3d-3.0.5/tests/optical/test_turbid_brf_imaging.py +219 -0
  1249. less3d-3.0.5/tests/optical/test_turbid_forward_backend_parity.py +545 -0
  1250. less3d-3.0.5/tests/optical/test_turbid_imaging_backend_parity.py +1287 -0
  1251. less3d-3.0.5/tests/optical/test_turbid_overlap_boundary.py +216 -0
  1252. less3d-3.0.5/tests/optical/test_turbid_periodic_process_scale_invariance.py +56 -0
  1253. less3d-3.0.5/tests/optical/test_turbid_periodic_scale_invariance.py +131 -0
  1254. less3d-3.0.5/tests/optical/test_turbid_photosynthesis.py +216 -0
  1255. less3d-3.0.5/tests/optical/test_turbid_voxel_product.py +73 -0
  1256. less3d-3.0.5/tests/optical/test_vulkan_unchanged_reuse.py +56 -0
  1257. less3d-3.0.5/tests/physics/test_fluspect_band_windows.py +19 -0
  1258. less3d-3.0.5/tests/physics/test_fluspect_basic.py +54 -0
  1259. less3d-3.0.5/tests/physics/test_physiology_basic.py +72 -0
  1260. less3d-3.0.5/tests/physiology/test_absorption_driver_compilation.py +104 -0
  1261. less3d-3.0.5/tests/physiology/test_absorption_partitions.py +168 -0
  1262. less3d-3.0.5/tests/physiology/test_absorption_product_semantics.py +459 -0
  1263. less3d-3.0.5/tests/physiology/test_farquhar_product_metadata.py +660 -0
  1264. less3d-3.0.5/tests/physiology/test_joint_phi_f_contract.py +853 -0
  1265. less3d-3.0.5/tests/physiology/test_mesh_absorption_driver.py +286 -0
  1266. less3d-3.0.5/tests/physiology/test_mesh_farquhar_formulations.py +335 -0
  1267. less3d-3.0.5/tests/physiology/test_turbid_absorption_driver.py +439 -0
  1268. less3d-3.0.5/tests/physiology/test_turbid_farquhar_formulations.py +377 -0
  1269. less3d-3.0.5/tests/reference/__init__.py +1 -0
  1270. less3d-3.0.5/tests/reference/portable_energy_balance.py +398 -0
  1271. less3d-3.0.5/tests/reference/portable_microwave.py +1524 -0
  1272. less3d-3.0.5/tests/reference/portable_ray_query.py +194 -0
  1273. less3d-3.0.5/tests/reference/portable_turbid_rrt.py +974 -0
  1274. less3d-3.0.5/tests/reference/portable_turbid_transport.py +1270 -0
  1275. less3d-3.0.5/tests/release/test_cross_device_math_portability.py +25 -0
  1276. less3d-3.0.5/tests/release/test_linux_stash_safety.py +133 -0
  1277. less3d-3.0.5/tests/release/test_native_dependency_audit.py +170 -0
  1278. less3d-3.0.5/tests/release/test_optix_ir_packaging.py +55 -0
  1279. less3d-3.0.5/tests/release/test_public_release_metadata.py +51 -0
  1280. less3d-3.0.5/tests/release/test_sdist_payload_policy.py +31 -0
  1281. less3d-3.0.5/tests/release/test_vulkan_artifact_install_contract.py +25 -0
  1282. less3d-3.0.5/tests/release/test_windows_wheel_payload_identity.py +104 -0
  1283. less3d-3.0.5/tests/release/verify_installed_package.py +129 -0
  1284. less3d-3.0.5/tests/run_all_tests.py +11 -0
  1285. less3d-3.0.5/tests/run_tests.py +350 -0
  1286. less3d-3.0.5/tests/serialization/test_texture_roundtrip.py +116 -0
  1287. less3d-3.0.5/tests/sif/README.md +14 -0
  1288. less3d-3.0.5/tests/sif/test_fluspect_band_response.py +105 -0
  1289. less3d-3.0.5/tests/sif/test_mesh_sif_state_field_backends.py +70 -0
  1290. less3d-3.0.5/tests/sif/test_sif_imager.py +247 -0
  1291. less3d-3.0.5/tests/sif/test_sif_process_dynamic.py +244 -0
  1292. less3d-3.0.5/tests/sif/test_sif_process_static.py +207 -0
  1293. less3d-3.0.5/tests/sif/test_turbid_sif_observation_throughput.py +96 -0
  1294. less3d-3.0.5/tests/sif/test_turbid_sif_process.py +471 -0
  1295. less3d-3.0.5/tests/test_backend_capabilities.py +983 -0
  1296. less3d-3.0.5/tests/test_backend_embree_parity.py +192 -0
  1297. less3d-3.0.5/tests/test_backend_process_parity.py +765 -0
  1298. less3d-3.0.5/tests/test_backend_runtime.py +526 -0
  1299. less3d-3.0.5/tests/test_backend_vulkan_context.py +951 -0
  1300. less3d-3.0.5/tests/test_backend_vulkan_microwave.py +570 -0
  1301. less3d-3.0.5/tests/test_dynamic_instances_release.py +169 -0
  1302. less3d-3.0.5/tests/test_end_to_end_satellite.py +446 -0
  1303. less3d-3.0.5/tests/test_local_service.py +80 -0
  1304. less3d-3.0.5/tests/test_matplotlib_compat.py +26 -0
  1305. less3d-3.0.5/tests/test_measures.py +279 -0
  1306. less3d-3.0.5/tests/test_mueller_integrator.py +188 -0
  1307. less3d-3.0.5/tests/test_mw_bare_soil.py +319 -0
  1308. less3d-3.0.5/tests/test_mw_hg_phase.py +370 -0
  1309. less3d-3.0.5/tests/test_native_dynamic_photosynthesis_process.py +171 -0
  1310. less3d-3.0.5/tests/test_native_energy_balance_process.py +260 -0
  1311. less3d-3.0.5/tests/test_native_execution_identity.py +256 -0
  1312. less3d-3.0.5/tests/test_native_mesh_sif_source_assembly.py +111 -0
  1313. less3d-3.0.5/tests/test_native_photosynthesis_process.py +121 -0
  1314. less3d-3.0.5/tests/test_native_physiology_solver.py +167 -0
  1315. less3d-3.0.5/tests/test_native_process_execution.py +81 -0
  1316. less3d-3.0.5/tests/test_native_sif_process.py +97 -0
  1317. less3d-3.0.5/tests/test_native_sif_source_assembly.py +100 -0
  1318. less3d-3.0.5/tests/test_optix_pipeline_lifecycle.py +176 -0
  1319. less3d-3.0.5/tests/test_photosynthesis_temperature_input.py +296 -0
  1320. less3d-3.0.5/tests/test_precompute_mueller.py +121 -0
  1321. less3d-3.0.5/tests/test_project_management.py +87 -0
  1322. less3d-3.0.5/tests/test_public_feature_evidence.py +112 -0
  1323. less3d-3.0.5/tests/test_rayleigh_cylinder.py +274 -0
  1324. less3d-3.0.5/tests/test_rayleigh_disc.py +243 -0
  1325. less3d-3.0.5/tests/test_release_stability.py +108 -0
  1326. less3d-3.0.5/tests/test_serialize_absorption.py +190 -0
  1327. less3d-3.0.5/tests/test_sif_photosynthesis_release.py +126 -0
  1328. less3d-3.0.5/tests/test_test_runner.py +125 -0
  1329. less3d-3.0.5/tests/test_thermal_release.py +127 -0
  1330. less3d-3.0.5/tests/test_trunk_geometry.py +150 -0
  1331. less3d-3.0.5/tests/test_trunk_mueller_lut.py +142 -0
  1332. less3d-3.0.5/tests/test_turbid_boundary_api.py +158 -0
  1333. less3d-3.0.5/tests/test_turbid_boundary_validation.py +258 -0
  1334. less3d-3.0.5/tests/test_turbid_irradiance_lai.py +380 -0
  1335. less3d-3.0.5/tests/test_turbid_lidar.py +342 -0
  1336. less3d-3.0.5/tests/test_viewer_terrain.py +30 -0
  1337. less3d-3.0.5/tests/texture/test_absorption_partition_field.py +109 -0
  1338. less3d-3.0.5/tests/texture/test_absorption_partition_radiation_field.py +108 -0
  1339. less3d-3.0.5/tests/texture/test_brf_scene_reuse.py +49 -0
  1340. less3d-3.0.5/tests/texture/test_categorical_texture_lookup.py +169 -0
  1341. less3d-3.0.5/tests/texture/test_field_program_performance_contract.py +106 -0
  1342. less3d-3.0.5/tests/texture/test_forward_flux_uv_texture.py +97 -0
  1343. less3d-3.0.5/tests/texture/test_geotiff_texture_loading.py +120 -0
  1344. less3d-3.0.5/tests/texture/test_geotiff_tiled_residency.py +238 -0
  1345. less3d-3.0.5/tests/texture/test_irradiance_map_scene_reuse.py +50 -0
  1346. less3d-3.0.5/tests/texture/test_level0_uv_texture.py +79 -0
  1347. less3d-3.0.5/tests/texture/test_lidar_request_cache.py +72 -0
  1348. less3d-3.0.5/tests/texture/test_lidar_uv_texture.py +116 -0
  1349. less3d-3.0.5/tests/texture/test_lstex_format.py +126 -0
  1350. less3d-3.0.5/tests/texture/test_lstex_runtime_cache.py +68 -0
  1351. less3d-3.0.5/tests/texture/test_mip_builder.py +60 -0
  1352. less3d-3.0.5/tests/texture/test_optix_texture_codegen_budget.py +75 -0
  1353. less3d-3.0.5/tests/texture/test_photosynthesis_absorption_partition_field.py +132 -0
  1354. less3d-3.0.5/tests/texture/test_photosynthesis_uv_texture_inheritance.py +118 -0
  1355. less3d-3.0.5/tests/texture/test_radiation_process_absorbed_contract.py +99 -0
  1356. less3d-3.0.5/tests/texture/test_radiation_process_input_cache.py +80 -0
  1357. less3d-3.0.5/tests/texture/test_radiation_process_many_bands.py +90 -0
  1358. less3d-3.0.5/tests/texture/test_radiation_process_rgb_texture.py +83 -0
  1359. less3d-3.0.5/tests/texture/test_radiation_process_uv_texture.py +87 -0
  1360. less3d-3.0.5/tests/texture/test_radiation_uv_texture.py +83 -0
  1361. less3d-3.0.5/tests/texture/test_rgb_lidar_texture.py +117 -0
  1362. less3d-3.0.5/tests/texture/test_rgb_uv_texture.py +105 -0
  1363. less3d-3.0.5/tests/texture/test_sampled_spectral_domain.py +85 -0
  1364. less3d-3.0.5/tests/texture/test_sif_absorption_partition_field.py +98 -0
  1365. less3d-3.0.5/tests/texture/test_sif_process_texture_inheritance.py +89 -0
  1366. less3d-3.0.5/tests/texture/test_terrain_rejects_uv_texture.py +35 -0
  1367. less3d-3.0.5/tests/texture/test_texture_component_default.py +173 -0
  1368. less3d-3.0.5/tests/texture/test_texture_energy_policy.py +89 -0
  1369. less3d-3.0.5/tests/texture/test_texture_mip_semantics.py +43 -0
  1370. less3d-3.0.5/tests/texture/test_texture_nodata_semantics.py +51 -0
  1371. less3d-3.0.5/tests/texture/test_texture_update_reuse.py +92 -0
  1372. less3d-3.0.5/tests/texture/test_thermal_field_science.py +142 -0
  1373. less3d-3.0.5/tests/texture/test_thermal_uv_texture.py +115 -0
  1374. less3d-3.0.5/tests/texture/test_trilinear_footprint_antialias.py +151 -0
  1375. less3d-3.0.5/tests/texture/test_turbid_process_field_identity.py +81 -0
  1376. less3d-3.0.5/tests/texture/test_turbid_rejects_uv_texture.py +54 -0
  1377. less3d-3.0.5/tests/texture/test_turbid_world_xy_texture.py +156 -0
  1378. less3d-3.0.5/tests/texture/test_uv_seam_image.py +94 -0
  1379. less3d-3.0.5/tests/texture/test_vulkan_texture_codegen_budget.py +153 -0
  1380. less3d-3.0.5/tests/texture/test_world_xy_mapping_contract.py +144 -0
  1381. less3d-3.0.5/tests/texture/test_world_xy_texture.py +150 -0
  1382. less3d-3.0.5/tests/turbid/fixtures/corrupt_output_turbid_sampling.slang +31 -0
  1383. less3d-3.0.5/tests/turbid/fixtures/wrong_abi_turbid_sampling.slang +11 -0
  1384. less3d-3.0.5/tests/turbid/fixtures/wrong_order_turbid_sampling.slang +33 -0
  1385. less3d-3.0.5/tests/turbid/test_batch_a_lifecycle.py +143 -0
  1386. less3d-3.0.5/tests/turbid/test_batch_a_review_closure.py +872 -0
  1387. less3d-3.0.5/tests/turbid/test_benchmark_contract.py +1192 -0
  1388. less3d-3.0.5/tests/turbid/test_capability_graph.py +159 -0
  1389. less3d-3.0.5/tests/turbid/test_compiled_scene_cache.py +27 -0
  1390. less3d-3.0.5/tests/turbid/test_deterministic_sampling.py +314 -0
  1391. less3d-3.0.5/tests/turbid/test_domain_lifecycle.py +458 -0
  1392. less3d-3.0.5/tests/turbid/test_domain_lifecycle_fix1.py +544 -0
  1393. less3d-3.0.5/tests/turbid/test_field_assembly_lookup.py +300 -0
  1394. less3d-3.0.5/tests/turbid/test_field_convergence_slow.py +65 -0
  1395. less3d-3.0.5/tests/turbid/test_lad_sampling_statistics.py +114 -0
  1396. less3d-3.0.5/tests/turbid/test_lidar_shared_domain.py +72 -0
  1397. less3d-3.0.5/tests/turbid/test_mixed_product_contract.py +126 -0
  1398. less3d-3.0.5/tests/turbid/test_native_energy_balance.py +379 -0
  1399. less3d-3.0.5/tests/turbid/test_native_radiation_field.py +390 -0
  1400. less3d-3.0.5/tests/turbid/test_native_static_physiology.py +309 -0
  1401. less3d-3.0.5/tests/turbid/test_passive_source_contract.py +153 -0
  1402. less3d-3.0.5/tests/turbid/test_sampling_artifact_contract.py +332 -0
  1403. less3d-3.0.5/tests/turbid/test_sampling_failure_identity.py +101 -0
  1404. less3d-3.0.5/tests/turbid/test_sampling_private_api.py +50 -0
  1405. less3d-3.0.5/tests/turbid/test_sampling_validation.py +350 -0
  1406. less3d-3.0.5/tests/turbid/test_state_provenance_aggregation.py +338 -0
  1407. less3d-3.0.5/tests/turbid/test_thermal_source_imaging.py +168 -0
  1408. less3d-3.0.5/tests/turbid/turbid_sampling_test_utils.py +159 -0
  1409. less3d-3.0.5/tests/validation/Val01_lambertian.py +108 -0
  1410. less3d-3.0.5/tests/validation/Val02_box_canopy.py +169 -0
  1411. less3d-3.0.5/tests/validation/Val03_depth_scan.py +186 -0
  1412. less3d-3.0.5/tests/validation/Val03_forest.py +295 -0
  1413. less3d-3.0.5/tests/validation/Val04_sky_diffuse.py +130 -0
  1414. less3d-3.0.5/tests/validation/Val05_prospect.py +207 -0
  1415. less3d-3.0.5/tests/validation/Val06_fpar.py +595 -0
  1416. less3d-3.0.5/tests/validation/Val07_thermal_ir.py +651 -0
  1417. less3d-3.0.5/tests/validation/Val08_mw_vegetation.py +1259 -0
  1418. less3d-3.0.5/tests/validation/Val09_mueller_vegetation.py +339 -0
  1419. less3d-3.0.5/tests/validation/Val10_active_mw_bare_soil.py +159 -0
  1420. less3d-3.0.5/tests/validation/Val10b_active_mw_spm.py +210 -0
  1421. less3d-3.0.5/tests/validation/Val11_active_mw_forest_agb.py +171 -0
  1422. less3d-3.0.5/tests/validation/Val12_less_vs_mimics_systematic.py +372 -0
  1423. less3d-3.0.5/tests/validation/Val12_tier4_trunk_only.py +146 -0
  1424. less3d-3.0.5/tests/validation/Val17_turbid_mesh_photosynthesis.py +706 -0
  1425. less3d-3.0.5/tests/validation/Val18_facet_size_convergence.py +347 -0
  1426. less3d-3.0.5/tests/validation/Val19_facet_tessellation_invariance.py +140 -0
  1427. less3d-3.0.5/tests/validation/Val20_mesh_sunlit_sampling_convergence.py +169 -0
  1428. less3d-3.0.5/tests/validation/Val21_turbid_photosynthesis_release_gate.py +199 -0
  1429. less3d-3.0.5/tests/validation/Val22_turbid_sif_convergence.py +498 -0
  1430. less3d-3.0.5/tests/validation/Val23_dynamic_physiology_closure.py +723 -0
  1431. less3d-3.0.5/tests/validation/Val24_native_atmosphere.py +346 -0
  1432. less3d-3.0.5/tests/validation/Val24_turbid_explicit_leaf_convergence.py +189 -0
  1433. less3d-3.0.5/tests/validation/Val25_satellite_end_to_end.py +205 -0
  1434. less3d-3.0.5/tests/validation/Val26_turbid_thermal_sif_fields.py +172 -0
  1435. less3d-3.0.5/tests/validation/Val27_real_geospatial_field_products.py +297 -0
  1436. less3d-3.0.5/tests/validation/_mimics_harness.py +168 -0
  1437. less3d-3.0.5/tests/validation/build_val22_sif_report.py +301 -0
  1438. less3d-3.0.5/tests/validation/build_val23_dynamic_report.py +277 -0
  1439. less3d-3.0.5/tests/validation/config.py +129 -0
  1440. less3d-3.0.5/tests/validation/framework.py +1032 -0
  1441. less3d-3.0.5/tests/validation/microwave/README.md +23 -0
  1442. less3d-3.0.5/tests/validation/microwave/investigate_mie_cylinder.py +140 -0
  1443. less3d-3.0.5/tests/validation/microwave/investigate_mw_stokes_rotation.py +220 -0
  1444. less3d-3.0.5/tests/validation/microwave/investigate_mw_trunk.py +370 -0
  1445. less3d-3.0.5/tests/validation/microwave/investigate_mw_vegetation.py +290 -0
  1446. less3d-3.0.5/tests/validation/run_all.py +187 -0
  1447. less3d-3.0.5/tests/validation/run_new_turbid_mesh_report.py +1234 -0
  1448. less3d-3.0.5/tests/validation/run_val.py +207 -0
  1449. less3d-3.0.5/tests/validation/run_val_fast.py +170 -0
  1450. less3d-3.0.5/tests/validation/test_lidar_survey_trajectory_reference.py +159 -0
  1451. less3d-3.0.5/tests/validation/val10_mimics_comparison.py +609 -0
  1452. less3d-3.0.5/tests/validation/val11_build_report.py +101 -0
  1453. less3d-3.0.5/tests/validation/val11_mimics_trunk.py +409 -0
  1454. less3d-3.0.5/tests/validation/val12_less2_flat_compare.py +98 -0
  1455. less3d-3.0.5/tests/validation/val12_less2_flat_sim.py +85 -0
  1456. less3d-3.0.5/tests/validation/val12b_equal_irradiance.py +197 -0
  1457. less3d-3.0.5/tests/validation/val12b_less2_sim_sub.py +50 -0
  1458. less3d-3.0.5/tests/validation/val13_less2_sub.py +68 -0
  1459. less3d-3.0.5/tests/validation/val13_multibounce.py +292 -0
  1460. less3d-3.0.5/tests/validation/val14_gaussian_terrain.py +268 -0
  1461. less3d-3.0.5/tests/validation/val14_less2_sub.py +57 -0
  1462. less3d-3.0.5/tests/validation/val15_flux_gpu_vs_cpu.py +176 -0
  1463. less3d-3.0.5/tests/validation/val16_terrain_albedo.py +166 -0
  1464. less3d-3.0.5/tests/validation/val17_generate_forest_scenes.py +255 -0
  1465. less3d-3.0.5/tests/validation/val_common.py +472 -0
  1466. less3d-3.0.5/tools/architecture_inventory.py +268 -0
  1467. less3d-3.0.5/tools/build_atmosphere_database.py +744 -0
  1468. less3d-3.0.5/tools/generate_category_dispatch.py +345 -0
  1469. less3d-3.0.5/tools/generate_illumination_registry.py +122 -0
  1470. less3d-3.0.5/tools/generate_integrator_registry.py +42 -0
  1471. less3d-3.0.5/tools/generate_medium_registry.py +58 -0
  1472. less3d-3.0.5/tools/generate_phase_registry.py +58 -0
  1473. less3d-3.0.5/tools/generate_process_registry.py +42 -0
  1474. less3d-3.0.5/tools/generate_product_registry.py +42 -0
  1475. less3d-3.0.5/tools/generate_sensor_registry.py +152 -0
@@ -0,0 +1,86 @@
1
+ # less-skill
2
+
3
+ AI coding assistant skill/rule for the [LESS](http://lessrt.org/) 3D radiative transfer model. It enables AI assistants (Claude Code, Cursor, Windsurf, etc.) to generate correct pyLessSDK simulation code with domain knowledge built in.
4
+
5
+ ## What's included
6
+
7
+ | File | Description |
8
+ |------|-------------|
9
+ | `SKILL.md` | Core guide: architecture, workflow, key concepts, rules & restrictions |
10
+ | `api-reference.md` | Complete API reference for all pyLessSDK classes |
11
+ | `examples.md` | 16 working examples covering all simulation types |
12
+ | `faq.md` | 16 common domain Q&A (leaf optics, BRF, turbid vs mesh, etc.) |
13
+ | `helpers.py` | Validation utilities (band consistency, spp check, etc.) |
14
+
15
+ ## Installation
16
+
17
+ ### Claude Code
18
+
19
+ ```bash
20
+ # Clone into your project's .claude/skills directory
21
+ git clone https://github.com/jianboqi/less-skill .claude/skills/less-sdk
22
+
23
+ # Or clone into global skills (available to all projects)
24
+ git clone https://github.com/jianboqi/less-skill ~/.claude/skills/less-sdk
25
+ ```
26
+
27
+ Also add the LESS installation path to your project's `CLAUDE.md`:
28
+
29
+ ```
30
+ LESS installation directory: D:\LESS
31
+ ```
32
+
33
+ Then use the skill via:
34
+
35
+ ```
36
+ /less-sdk create a broadleaf forest scene with LAI=3
37
+ ```
38
+
39
+ ### Cursor
40
+
41
+ Copy the content of `SKILL.md` into `.cursor/rules/less-sdk.md` in your project:
42
+
43
+ ```bash
44
+ mkdir -p .cursor/rules
45
+ cp less-skill/SKILL.md .cursor/rules/less-sdk.md
46
+ ```
47
+
48
+ ### Windsurf
49
+
50
+ Copy into `.windsurf/rules/`:
51
+
52
+ ```bash
53
+ mkdir -p .windsurf/rules
54
+ cp less-skill/SKILL.md .windsurf/rules/less-sdk.md
55
+ ```
56
+
57
+ ### Other AI Coding Tools
58
+
59
+ Most AI coding assistants support project-level instruction files. Copy `SKILL.md` (and optionally the other reference files) into the tool's designated rules/instructions directory.
60
+
61
+ ## What can it do?
62
+
63
+ Once installed, your AI assistant can:
64
+
65
+ - Generate complete LESS simulation scripts from natural language descriptions
66
+ - Configure sensors (orthographic, perspective, fisheye, LiDAR, photon tracing, TRAC)
67
+ - Set up optical properties using PROSPECT-D, GSV soil, Fluspect models
68
+ - Build forest scenes from statistical parameters (LAI, FCC) via ForestSceneBuilder
69
+ - Handle batch simulations with runtime modification
70
+ - Avoid common pitfalls (20+ built-in rules and 14 hard restrictions)
71
+ - Answer domain questions about radiative transfer, BRF, LAI, fluorescence, etc.
72
+
73
+ ## Requirements
74
+
75
+ - [LESS](http://lessrt.org/) installed on your system
76
+ - Python with NumPy (LESS ships with a bundled Python interpreter, no separate installation needed)
77
+
78
+ ## License
79
+
80
+ MIT
81
+
82
+ ## Citation
83
+
84
+ If LESS is used in your work, please cite:
85
+
86
+ > Qi, J., Xie, D., Yin, T., Yan, G., Gastellu-Etchegorry, J.-P., Li, L., Zhang, W., Mu, X., Norford, L.K., 2019. LESS: LargE-Scale remote sensing data and image simulation framework over heterogeneous 3D scenes. Remote Sensing of Environment 221, 695-706.
@@ -0,0 +1,334 @@
1
+ ---
2
+ name: less-sdk
3
+ description: "Guide for using the LESS radiative transfer model via pyLessSDK. Use when the user asks to create, configure, or run LESS simulations, set up scenes with vegetation/terrain, configure sensors (orthographic, perspective, fisheye, LiDAR, TRAC, photon tracing), define optical properties, or post-process simulation results."
4
+ argument-hint: "[task description]"
5
+ ---
6
+
7
+ # LESS Radiative Transfer Model — pyLessSDK Guide
8
+
9
+ You are helping a user write Python code to drive the LESS (LargE-Scale remote sensing data and image simulation framework) 3D radiative transfer model using **pyLessSDK**.
10
+
11
+ The user's task: **$ARGUMENTS**
12
+
13
+ ## LESS Installation Path Discovery
14
+
15
+ Before generating any code, you MUST determine where LESS is installed. Follow this priority order:
16
+
17
+ 1. **Check user's AGENTS.md** for a line like `LESS installation directory: <path>` or `LESS_ROOT: <path>`
18
+ 2. **Check environment variable** `LESS_ROOT`
19
+ 3. **Check common locations**: `D:\LESS`, `C:\LESS`, `~/LESS`, or a path containing `lessrt`
20
+ 4. **Ask the user** if none of the above yields a valid path
21
+
22
+ Once found, use the path consistently for both `SimulationHelper(less_dir)` and the `sys.path.insert` import.
23
+
24
+ Similarly, determine the **pyLessSDK path**:
25
+ - If LESS is an installed distribution: `<LESS_ROOT>/app/Python_script/pyLessSDK`
26
+ - If working from the source repo: `<repo_root>/Utility/Python_script/pyLessSDK`
27
+
28
+ ### Bundled Python Interpreter
29
+
30
+ LESS ships with a bundled Python interpreter — users do NOT need to install Python separately:
31
+ - **Windows**: `<LESS_ROOT>/app/bin/python/python.exe`
32
+ - **Linux**: `<LESS_ROOT>/app/bin/py312_linux/bin/python`
33
+
34
+ When running simulation scripts, prefer using this bundled interpreter as it includes all required dependencies (NumPy, etc.). For example:
35
+ ```bash
36
+ # Windows
37
+ D:\LESS\app\bin\python\python.exe my_simulation.py
38
+
39
+ # Linux
40
+ /opt/LESS/app/bin/py312_linux/bin/python my_simulation.py
41
+ ```
42
+
43
+ **Tip for users**: Add this line to your project's `AGENTS.md` to avoid being asked every time:
44
+ ```
45
+ LESS installation directory: D:\LESS
46
+ ```
47
+
48
+ ## Architecture Overview
49
+
50
+ LESS simulates spectral remote sensing images over heterogeneous 3D scenes. The Python SDK (`Utility/Python_script/pyLessSDK/`) orchestrates simulations by:
51
+
52
+ 1. Configuring a **Scene** (landscape + terrain + illumination + sensor + observation)
53
+ 2. Writing a JSON config (`Parameters/input.conf`) and Mitsuba XML scene files
54
+ 3. Invoking the C++ radiative transfer core (`lessrt.exe`) via Mitsuba bindings
55
+ 4. Post-processing outputs (radiance -> BRF, brightness temperature, LAS point clouds, etc.)
56
+
57
+ ```
58
+ SimulationHelper -> Simulation -> Scene
59
+ |-- Landscape (objects, instances, optical properties)
60
+ | +-- Terrain (DEM, BRDF)
61
+ |-- Sensor (orthographic, perspective, fisheye, photon tracing, LiDAR, TRAC)
62
+ |-- Observation (viewing geometry)
63
+ |-- Illumination (sun position, atmosphere)
64
+ +-- AdvancedParams (cores, iterations)
65
+ ```
66
+
67
+ ## Import Pattern
68
+
69
+ pyLessSDK is NOT installed as a package. Add its parent directory to `sys.path`:
70
+
71
+ ```python
72
+ import sys
73
+ sys.path.insert(0, r"<LESS_ROOT>/Utility/Python_script/pyLessSDK")
74
+ # For installed LESS distribution, use:
75
+ # sys.path.insert(0, r"<LESS_ROOT>/app/Python_script/pyLessSDK")
76
+
77
+ from SimulationHelper import SimulationHelper
78
+ from Simulation import Simulation
79
+ from SceneObjects import SceneObject
80
+ from OpticalProperty import OpticalItem, OpticalItemType
81
+ from Sensor import SensorOrthographic, SensorPerspective, SensorFisheye, SensorPhotonTracing, SensorLiDAR, SensorTRAC
82
+ from Observation import ObservationOrthographic, ObservationPerspective, ObservationFisheye, ObservationPhotonTracing
83
+ from Illumination import Illumination, Atmosphere6S, SunPositionCalculator
84
+ from Terrain import TERRAIN_TYPE, TERRAIN_BRDF_TYPE
85
+ from PostProcessing import PostProcessing
86
+ from LiDAR import ALSLiDAR, TLSLiDAR, LiDARSimMode
87
+ from SimpleCrownGenerator import LAD, CrownShape, LeafShape, CrownGenerator
88
+ from Prospect5AndD import prospectD
89
+ from GSVSoil import GSVSoil
90
+ from SDKCodeGenerator import SDKCodeGenerator
91
+ from SDKUtility import OBJHelper, SamplingUtils
92
+ ```
93
+
94
+ ## Minimal Complete Workflow
95
+
96
+ ```python
97
+ import sys, os, random
98
+ sys.path.insert(0, r"<LESS_ROOT>/Utility/Python_script/pyLessSDK")
99
+ from SimulationHelper import SimulationHelper
100
+ from Simulation import Simulation
101
+ from SceneObjects import SceneObject
102
+ from OpticalProperty import OpticalItem
103
+ from Sensor import SensorOrthographic
104
+ from Observation import ObservationOrthographic
105
+ from PostProcessing import PostProcessing
106
+
107
+ # 1. Setup
108
+ less_dir = r"D:\LESS" # LESS installation root
109
+ sim_dir = r"D:\Simulations\my_sim" # simulation workspace
110
+ sim_helper = SimulationHelper(less_dir)
111
+ sim_helper.create_new_sim(sim_dir) # creates directory + default config
112
+
113
+ # 2. Load project
114
+ sim = Simulation(sim_dir, sim_helper)
115
+ sim.read_sim_project()
116
+ scene = sim.get_scene()
117
+ landscape = scene.get_landscape()
118
+
119
+ # 3. Clear defaults and add custom optical properties
120
+ landscape.clear_landscape_elements()
121
+ landscape.clear_user_defined_optical_properties()
122
+ op_leaf = OpticalItem("leaf_green", "0.05,0.45;0.05,0.45;0.02,0.40")
123
+ # name front_ref;back_ref;transmittance (per band, comma-sep)
124
+ landscape.add_op_item(op_leaf)
125
+
126
+ # 4. Add 3D object and place instances
127
+ obj = SceneObject("Birch")
128
+ obj.add_component_from_file(r"path/to/birch_crown.obj", "leaf_green")
129
+ obj.add_component_from_file(r"path/to/birch_trunk.obj", "birch_branch") # built-in op
130
+ landscape.add_object(obj)
131
+ for _ in range(50):
132
+ landscape.place_object("Birch", x=random.uniform(5, 95), y=random.uniform(5, 95))
133
+
134
+ # 5. Terrain
135
+ terrain = landscape.get_terrain()
136
+ terrain.set_extent_width(100)
137
+ terrain.set_extent_height(100)
138
+ terrain.set_optical("dark_soil_mollisol") # built-in soil
139
+
140
+ # 6. Sensor + Observation
141
+ sensor = SensorOrthographic()
142
+ sensor.set_spectral_bands("680:2,550:2,450:2") # R, G, B bands (center:fwhm)
143
+ sensor.set_image_width(512)
144
+ sensor.set_image_height(512)
145
+ sensor.set_sample_per_pixel(128)
146
+ scene.set_sensor(sensor)
147
+ scene.set_observation(ObservationOrthographic())
148
+
149
+ # 7. Illumination
150
+ ill = scene.get_illumination()
151
+ ill.set_sun_zenith(30)
152
+ ill.set_sun_azimuth(180)
153
+
154
+ # 8. Run
155
+ sim.save_sim_project()
156
+ sim.start()
157
+
158
+ # 9. Post-process
159
+ PostProcessing.radiance2brf(sim.get_sim_dir())
160
+ ```
161
+
162
+ ## ForestSceneBuilder — Quick Forest Scene from Statistical Parameters
163
+
164
+ For users who want to generate forest scenes from high-level parameters (like PROSAIL) instead of manually specifying individual tree parameters:
165
+
166
+ ```python
167
+ from ForestSceneBuilder import ForestSceneBuilder, ForestType
168
+ from SimpleCrownGenerator import LAD
169
+
170
+ builder = ForestSceneBuilder(less_dir, output_dir, "my_sim", scene_x_size=40, scene_y_size=40)
171
+ builder.set_canopy_params(lai=3.0, fcc=0.6) # FCC = fractional crown cover
172
+ builder.set_forest_type(ForestType.BROADLEAF_NATURAL) # preset: crown shape, allometry, spacing
173
+ builder.build() # generates a complete LESS simulation project
174
+ builder.run() # runs the simulation
175
+ ```
176
+
177
+ **7 forest types**: `CONIFEROUS_NATURAL`, `CONIFEROUS_PLANTATION`, `BROADLEAF_NATURAL`, `BROADLEAF_PLANTATION`, `MIXED_NATURAL`, `SAVANNA`, `SHRUBLAND`
178
+
179
+ **Key features**:
180
+ - Automatic derivation of tree dimensions from allometric relationships (crown diameter -> height, trunk, DBH)
181
+ - Template tree approach: generates K template OBJs with different sizes, instances each multiple times
182
+ - Natural forests: crown size variance via Normal distribution + Poisson disc spacing
183
+ - Plantations: uniform trees + regular grid spacing with jitter
184
+ - Mixed forests: `builder.species_mix = {"broadleaf": 0.6, "coniferous": 0.4}`
185
+ - Understory grass layer: `builder.has_understory = True`
186
+ - PROSPECT-D leaf optics: `builder.set_optical_from_prospect(N=1.5, Cab=40, Car=8, Cw=0.01, Cm=0.009)`
187
+ - Triangle mesh or turbid: `builder.leaf_as_turbid = True/False`
188
+ - Access underlying Simulation: `sim = builder.get_simulation()` for further customization
189
+
190
+ For full ForestSceneBuilder API and examples, see `api-reference.md` and `examples.md`.
191
+
192
+ ## Key Concepts
193
+
194
+ ### Spectral Bands Format
195
+ Bands are comma-separated `wavelength:fwhm` pairs in nanometers:
196
+ - `"680:2,550:2,450:2"` — three bands centered at 680, 550, 450 nm, each 2 nm wide
197
+ - `"680,550,450"` — same centers, default width
198
+
199
+ ### Optical Property Value Format
200
+ Semicolon-separated groups for front reflectance, back reflectance, and transmittance. Each group has comma-separated values per band:
201
+ ```
202
+ "front_r1,front_r2;back_r1,back_r2;trans_r1,trans_r2"
203
+ ```
204
+
205
+ ### Coordinate System
206
+ - Scene is a rectangle: `(0,0)` to `(width, height)` in meters
207
+ - Z is up (vertical)
208
+ - `place_object(name, x, y, z=0, rotate=0)` — positions in scene coordinates
209
+
210
+ ### Built-in Optical Properties (always available)
211
+ - `"birch_leaf_green"` — green leaf
212
+ - `"birch_branch"` — bark/branch
213
+ - `"dark_soil_mollisol"` — dark soil
214
+
215
+ ### Leaf Angle Distribution (LAD) Enum
216
+ Used when setting turbid medium components or ForestSceneBuilder:
217
+ - `LAD.UNIFORM` — Uniform distribution
218
+ - `LAD.SPHERICAL` — Spherical distribution
219
+ - `LAD.ERECTOPHILE` — Erectophile (vertical leaves)
220
+ - `LAD.EXTREMOPHILE` — Extremophile
221
+ - `LAD.PLANOPHILE` — Planophile (horizontal leaves)
222
+ - `LAD.PLAGIOPHILE` — Plagiophile
223
+
224
+ ### Crown Shape Enum
225
+ - `CrownShape.CUBE`, `CrownShape.ELLIPSOID`, `CrownShape.CYLINDER`, `CrownShape.CONE`, `CrownShape.ASYMMETRIC_GAUSSIAN`
226
+
227
+ ### Leaf Shape Enum
228
+ - `LeafShape.SQUARE`, `LeafShape.DISK`
229
+
230
+ ## Optical Property Models
231
+
232
+ ### PROSPECT-D (Leaf Optics)
233
+ ```python
234
+ from Prospect5AndD import prospectD
235
+ reflectances, transmittances = prospectD(wl=[550, 680, 850], N=1.5, Cab=40, Car=8, Cw=0.01, Cm=0.009, Anth=0, BP=0)
236
+ ```
237
+
238
+ ### GSV Soil Model
239
+ ```python
240
+ from GSVSoil import GSVSoil
241
+ gsv = GSVSoil()
242
+ soil_ref = gsv.get_soil_spectra_gsv3(wavelength=[550, 680, 850], c1=0.5, c2=0.1, c3=0.05, csm=-0.2)
243
+ # csm: moisture coefficient, recommended [-0.6, 0], 0 = dry
244
+ ```
245
+
246
+ ### Fluspect (Leaf Fluorescence)
247
+ Used internally when `OpticalItemType.FLUSPECT` is set. The `fluspect()` function computes leaf reflectance/transmittance with fluorescence matrices.
248
+
249
+ ### FvCB Photosynthesis Model
250
+ ```python
251
+ from FvCB_from_SCOPE import PhotosynthesisModel
252
+ model = PhotosynthesisModel(plant_type="C3", P=101325, O2=209000, Q=1000,
253
+ Cs_ppm=400, es=1.0, leaf_tmp_k=298.15,
254
+ Vcmx25=60, RdPerVcmax25=0.015,
255
+ BallBerrySlope=8, BallBerry0=0.01)
256
+ Ci_ppm, gs, A, Ag, Vc, Vs, Ve, CO2_per_electron = model.run()
257
+ ```
258
+
259
+ ## SDKCodeGenerator — Reverse-Engineer GUI Projects
260
+
261
+ Generate Python SDK code from an existing LESS GUI simulation project:
262
+
263
+ ```python
264
+ from SDKCodeGenerator import SDKCodeGenerator
265
+ gen = SDKCodeGenerator(r"D:\Simulations\my_gui_project")
266
+ gen.generate(r"D:\output\generated_script.py")
267
+ ```
268
+
269
+ This is useful for converting GUI-created simulations into reproducible Python scripts.
270
+
271
+ ## OBJHelper — Split Multi-Group OBJ Files
272
+
273
+ When an OBJ file contains multiple groups (e.g., `leaves` and `stem_branch`), use `OBJHelper.seperate_obj()` to split it into separate files so each component can have a different optical property:
274
+
275
+ ```python
276
+ from SDKUtility import OBJHelper
277
+ group_paths, group_names = OBJHelper.seperate_obj(obj_path, return_group_names=True)
278
+ # Returns: (['path/tree_leaves.obj', 'path/tree_stem_branch.obj'], ['leaves', 'stem_branch'])
279
+
280
+ tree = SceneObject("MyTree")
281
+ for gpath, gname in zip(group_paths, group_names):
282
+ tree.add_component_from_file(gpath, "leaf_op" if "leaf" in gname else "bark_op")
283
+ ```
284
+
285
+ Also available: `OBJHelper.get_obj_bound(obj_path)` returns bounding box, `SamplingUtils.poisson_disc_samples(width, height, r)` generates natural tree placement positions.
286
+
287
+ For the full API reference with all classes, methods, parameters, and advanced examples, read the supporting files in this skill directory:
288
+ - `api-reference.md` — complete API for every class
289
+ - `examples.md` — working code for every simulation type (LiDAR, BRF, fisheye, batch, forest scenes, etc.)
290
+ - `helpers.py` — validation utilities (band consistency check, orthographic spp check, turbid boundary check, LAI computation). You can inline these functions into generated code when validation is needed.
291
+ - `faq.md` — common domain questions (leaf optics, BRF vs reflectance, turbid vs mesh, atmosphere, thermal, etc.). Consult when users ask physics or methodology questions.
292
+
293
+ ## PROHIBITED — Do NOT Use
294
+
295
+ These are hard restrictions. Violating them will produce incorrect simulation results.
296
+
297
+ 1. **NEVER use `cover_whole_scene = True`** on SensorTRAC or SensorOrthographic — this option is forbidden for these sensor types
298
+ 2. **NEVER use `set_repetitive_scene()`** when terrain is non-planar (RASTER or MESH) — repetitive scene must be 0 (disabled) for DEM/mesh terrain
299
+ 3. **NEVER use `enable_virtual_plane()`** on SensorOrthographic or SensorPhotonTracing — virtual plane is forbidden for these sensor types (PhotonTracing has a known bug)
300
+ 4. **NEVER use `compute_scene_lai()` when scene contains turbid medium objects** — `landscape.compute_scene_lai()` only works for triangle mesh scenes. For turbid medium scenes, manually compute LAI as: `LAI = crown_volume * leaf_area_density * num_trees / scene_area`
301
+
302
+ ## Important Defaults & Rules
303
+
304
+ 1. **Orthographic sensor view region must match scene extent** — when the user does not explicitly specify `sub_region_width` / `sub_region_height` for SensorOrthographic, always set them equal to the terrain extent (`terrain.get_extent_width()` / `terrain.get_extent_height()`). Do NOT leave them at arbitrary defaults or guess values.
305
+ 2. **Orthographic simulation must post-process radiance to BRF** — after `sim.start()` with SensorOrthographic, always call `PostProcessing.radiance2brf(sim.get_sim_dir())`. Use BRF results for all subsequent analysis unless the user explicitly asks for radiance.
306
+ 3. **Spectral band FWHM defaults to 1** — when setting `set_spectral_bands()`, use `"680:1,550:1,450:1"` format. Only use a different FWHM if the user explicitly specifies it.
307
+ - **RGB film type (`set_film_type("rgb")`)**: When using RGB film type to produce PNG images, set **30 uniform bands from 360 to 830 nm** (approximately 16.2 nm spacing). Generate the bands string as: `bands = ",".join(f"{int(wl)}:1" for wl in np.linspace(360, 830, 30))`. All optical properties (leaf, soil, trunk, understory, etc.) and `ill.set_ats_percentage()` must also have exactly 30 values to match. When using `ForestSceneBuilder`, set `builder.spectral_bands = [int(wl) for wl in np.linspace(360, 830, 30)]` BEFORE calling `build()`.
308
+ - **Broadband reflectance**: To simulate broadband sensor reflectance (e.g., Landsat, Sentinel-2 bands), do NOT set a large FWHM directly. Instead, simulate narrowband hyperspectral data (1 nm resolution across the band range), then post-process by applying the spectral response function (SRF) or numerical integration to compute broadband values. This applies to reflectance, BRF, and up/down radiation products. Only skip this if the user explicitly requests direct broadband simulation.
309
+ 4. **All band counts must be consistent** — sensor spectral bands, `ill.set_ats_percentage()` (sky-to-total ratio), and `OpticalItem` values (each semicolon-separated group) must all have the same number of bands. When band count changes, update all of them. Fill unknown values with `0` for sky-to-total ratio.
310
+ 5. **Sensor type must match observation type** — `SensorOrthographic` with `ObservationOrthographic`, `SensorPerspective` with `ObservationPerspective`, `SensorFisheye` with `ObservationFisheye`, `SensorPhotonTracing` with `ObservationPhotonTracing`. Mismatched pairs will cause errors.
311
+ 6. **Sun zenith angle range is 0~89.99** — never set to 90 or above, it will cause simulation errors.
312
+ 7. **Turbid medium objects must be entirely within scene boundary** — when placing turbid medium objects, ensure the entire OBJ bounding box (position + crown extent) stays within `(0, 0)` to `(extent_width, extent_height)`. Objects protruding outside the boundary will produce incorrect results.
313
+ 8. **Sample per pixel guidance** — preview/testing: 16~32; production: 64~256. For SensorOrthographic, also check spatial sampling density: `spp_needed = 64 * (sub_region_width * sub_region_height) / (image_width * image_height)`. Ensure at least 64 samples per square meter. Adjust `sample_per_pixel` or `image_width`/`image_height` accordingly.
314
+ 9. **PhotonTracing sun_ray_resolution and computation cost** — `set_sun_ray_resolution(res)` controls sun ray spacing in meters. Total photons ≈ `(scene_width/res) × (scene_height/res)`. Use 0.5 for quick preview, 0.02 for production BRF, 0.003 for fPAR/fluorescence. A 40×40m scene at 0.003 generates ~178M photons (~6.5 min); at 0.5 only ~6400 photons (<1 sec).
315
+ - **Multi-angle BRF**: use `set_virtual_directions("zen1:azi1;zen2:azi2;...")` for user-specified directions. Set `set_number_of_directions(1)` — the first BRF output line is scene albedo from hemisphere sampling, virtual directions follow after. Do NOT use `set_virtual_director_directions()` (not needed for typical simulations).
316
+ - **BRF output files**: `_BRF.txt` (total BRF), `_BRF_uc_sgl.txt` (uncollided single-scatter), `_BRF_co_sgl.txt` (collided single-scatter), `_BRF_mlt.txt` (multiple-scatter), `_LESS.txt` (scene info). Format: `zenith azimuth BRF_band1 BRF_band2 ...` per line.
317
+ - **fPAR layer extended format**: `set_fpar_layer("from:step:to/outputMode/objectNames")`. OutputMode: `0` = per-component (default), `1` = per-instance-component, `2` = per-triangle (every facet). Mode 2 outputs an additional `_temp_primitive_data.json` file containing per-triangle `Q` (absorbed photon flux density per unit leaf area), `T` (transmittance), `N` (photon count), `S` (triangle area). Example: `sensor.set_fpar_layer("0:0.2:3/2")` for per-facet fPAR in a 3m canopy. Add object names to filter: `"0:0.2:3/2/leaf,stem"`.
318
+ 10. **Multi-angle orthographic images must enable orthophoto map** — when simulating multiple viewing angles with SensorOrthographic for per-pixel BRDF extraction, always set `obs.is_orthophoto_map = True` on ObservationOrthographic. This reprojects each oblique view onto the ground plane so that all angles produce co-registered images (same pixel = same ground location and size). Without this, different angles cover different ground extents and pixel sizes, making per-pixel comparison impossible. Also use `set_repetitive_scene(100)` (flat terrain only) to avoid edge effects at oblique angles.
319
+ 11. **Batch simulations should use runtime modification by default** — when looping over spectral properties, sun angles, view angles, or optical properties, always enable `sim.enable_runtime_modification_of_properties(True)` to avoid reloading the full scene each iteration. This significantly speeds up batch runs. Inform the user that you are using this mode. If structural changes (geometry/instances) are needed between runs, call `sim.reload_runtime_structural_properties()`.
320
+ 11. **CPU cores default to total cores minus 2** — when setting `params.set_number_of_cores()`, use `os.cpu_count() - 2` (minimum 1) to leave headroom for the OS. Always `import os` and compute dynamically rather than hardcoding.
321
+ 12. **Always call `sim.read_sim_project()` before modifying the scene** — it loads defaults from input.conf.
322
+ 13. **Always call `sim.save_sim_project()` before `sim.start()`** — writes the JSON config.
323
+ 14. **`clear_landscape_elements()` removes ALL objects/instances** — call before re-adding.
324
+ 15. **`clear_user_defined_optical_properties()`** keeps built-in properties — use instead of `clear_all_optical_properties()`.
325
+ 16. **Turbid media components** require extra params: `is_turbid=True, leaf_density=X, lad="Spherical"`.
326
+ 17. **LiDAR sensor** needs a scanning device set via `sensor.set_scanning_device(ALSLiDAR())` or `TLSLiDAR()`.
327
+ 18. **SensorTRAC** is for TRAC-like gap fraction measurements along a transect line.
328
+ 19. **Call `landscape.prepare_for_ui()` before opening in GUI** — if a scene is created via SDK and the user wants to visualize it in the LESS GUI, call `landscape.prepare_for_ui()` after `sim.save_sim_project()`. This computes bounding boxes and other metadata needed by the GUI to display the scene correctly.
329
+ 20. **Disable OBJ cache when geometry changes between runs** — if an OBJ file is replaced with different geometry but keeps the same filename, LESS will use the cached version and produce identical results. Call `landscape.set_obj_cache(False)` to force reloading. Re-enable after the geometry stabilizes for better performance.
330
+ 21. **ForestSceneBuilder spectral bands must match sensor** — when customizing the sensor's spectral bands after `builder.build()`, the builder's default bands (550, 680, 800, 850 nm) may differ from the desired sensor bands. Always set `builder.spectral_bands = [680, 550, 450]` (or the desired wavelengths) BEFORE calling `builder.build()` and `builder.set_optical_from_prospect(...)`, so that all generated optical properties (leaf, soil, trunk, understory) have the correct number of bands matching the sensor. Mismatched band counts will cause a runtime error: `"Invalid spectrum value specified (length does not match the current spectral discretization)"`.
331
+ 22. **Flux measurement product** — to measure total radiant flux (W) entering/leaving each surface component, set `sensor.flux_measure_product = True` and `sensor.flux_measure_mode = 0` (per-component) / `1` (per-instance-component) / `2` (per-triangle). Output: `_FluxMeasure.txt`. These are attributes, not setter methods.
332
+ 23. **Crown representation defaults to facet mode** — when using `ForestSceneBuilder` or `SimpleCrownGenerator`, default to **facet mode** (`builder.leaf_as_turbid = False`) which produces triangle mesh leaves for more realistic results. Use turbid mode (`builder.leaf_as_turbid = True`) only when the user explicitly requests it or for very large scenes where performance is critical.
333
+ 24. **PROSPECT-D is only valid for 400–2500 nm** — do NOT use `prospectD()` for thermal infrared bands (e.g., 10000 nm). For thermal simulations, manually specify emissivity-based optical properties (e.g., vegetation reflectance ≈ 0.02, transmittance ≈ 0 at 10 μm).
334
+ 25. **Thermal simulation temperature mechanism** — LESS requires temperatures to be registered in the `temperature_properties` dict in `input.conf` before they can be referenced by components or terrain. ForestSceneBuilder does NOT support thermal scene construction. For thermal simulations, either: (a) build the scene manually without ForestSceneBuilder, setting `temperature` parameter in `add_component_from_file()` (e.g., `temperature="T298"`), or (b) use `SDKCodeGenerator` to convert a GUI-created thermal project into a script. Set `sensor.thermal_radiation = True` and `terrain.temperature = "T305"` (the temperature name must exist in `temperature_properties`).