hyperdrone 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. hyperdrone/__init__.py +28 -0
  2. hyperdrone/_native/cmake/hyperdrone_jit.cmake +43 -0
  3. hyperdrone/_native/common/bindings.h +39 -0
  4. hyperdrone/_native/common/cuda_staging.h +68 -0
  5. hyperdrone/_native/common/jit_host.h +69 -0
  6. hyperdrone/_native/dynamics/CMakeLists.txt +66 -0
  7. hyperdrone/_native/dynamics/host.cpp +191 -0
  8. hyperdrone/_native/dynamics/iface.h +81 -0
  9. hyperdrone/_native/dynamics/impl.cpp +659 -0
  10. hyperdrone/_native/render/CMakeLists.txt +96 -0
  11. hyperdrone/_native/render/host.cpp +276 -0
  12. hyperdrone/_native/render/iface.h +132 -0
  13. hyperdrone/_native/render/impl.cpp +620 -0
  14. hyperdrone/_native/render/scene_bindings.cpp +279 -0
  15. hyperdrone/_vendor/rl-tools/CMakeLists.txt +159 -0
  16. hyperdrone/_vendor/rl-tools/LICENSE +21 -0
  17. hyperdrone/_vendor/rl-tools/cmake/autodetect/all.cmake +14 -0
  18. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-diff.cmake +103 -0
  19. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-hash.cmake +13 -0
  20. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier1-blas.cmake +43 -0
  21. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier2-json-hdf5-zlib.cmake +84 -0
  22. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier3-tensorboard.cmake +29 -0
  23. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier4-cuda.cmake +33 -0
  24. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier5-cli11.cmake +26 -0
  25. hyperdrone/_vendor/rl-tools/cmake/optional/assimp_fixup.cmake +16 -0
  26. hyperdrone/_vendor/rl-tools/cmake/optional/googletest.cmake +17 -0
  27. hyperdrone/_vendor/rl-tools/cmake/optional/metal.cmake +27 -0
  28. hyperdrone/_vendor/rl-tools/cmake/optional/mujoco.cmake +32 -0
  29. hyperdrone/_vendor/rl-tools/cmake/optional/optix.cmake +17 -0
  30. hyperdrone/_vendor/rl-tools/cmake/optional/raytracing_generic.cmake +4 -0
  31. hyperdrone/_vendor/rl-tools/cmake/optional/vulkan.cmake +6 -0
  32. hyperdrone/_vendor/rl-tools/cmake/scripts/embed_text.cmake +7 -0
  33. hyperdrone/_vendor/rl-tools/cmake/scripts/generate-git-snapshot.cmake +138 -0
  34. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/matrix.h +143 -0
  35. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_arm.h +33 -0
  36. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu.h +314 -0
  37. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_accelerate.h +37 -0
  38. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_blas.h +67 -0
  39. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_mkl.h +38 -0
  40. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_openblas.h +34 -0
  41. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cuda.h +289 -0
  42. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_dummy.h +20 -0
  43. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_esp32.h +29 -0
  44. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_generic.h +946 -0
  45. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_wasm32.h +13 -0
  46. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/persist_code.h +136 -0
  47. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_arm.h +1 -0
  48. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu.h +94 -0
  49. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_accelerate.h +25 -0
  50. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_blas.h +115 -0
  51. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_mkl.h +25 -0
  52. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_openblas.h +25 -0
  53. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cuda.h +703 -0
  54. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_generic.h +1334 -0
  55. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/persist_code.h +130 -0
  56. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/tensor.h +490 -0
  57. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/arm.h +91 -0
  58. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu.h +205 -0
  59. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_accelerate.h +23 -0
  60. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_blas.h +21 -0
  61. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_mkl.h +45 -0
  62. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_openblas.h +56 -0
  63. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_tensorboard.h +34 -0
  64. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cuda.h +411 -0
  65. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/devices.h +92 -0
  66. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/dummy.h +55 -0
  67. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/esp32.h +85 -0
  68. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/generic.h +0 -0
  69. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/wasm32.h +59 -0
  70. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/model.h +218 -0
  71. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/operations_generic.h +771 -0
  72. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/persist.h +278 -0
  73. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter.h +100 -0
  74. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter_persist.h +52 -0
  75. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/tensor_operations_generic.h +55 -0
  76. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_backend.h +112 -0
  77. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_interface.h +36 -0
  78. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/l2f.h +98 -0
  79. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_dyn.h +18 -0
  80. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_generic.h +268 -0
  81. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_backend.h +31 -0
  82. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_interface.h +12 -0
  83. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_backend.h +98 -0
  84. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_interface.h +50 -0
  85. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/executor.h +133 -0
  86. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/helper.h +109 -0
  87. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/operations_generic.h +219 -0
  88. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arduino.h +117 -0
  89. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arm.h +56 -0
  90. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu.h +93 -0
  91. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu_tensorboard.h +151 -0
  92. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cuda.h +65 -0
  93. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_dummy.h +45 -0
  94. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_wasm32.h +56 -0
  95. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_arm.h +98 -0
  96. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cpu.h +139 -0
  97. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cuda.h +382 -0
  98. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_dummy.h +93 -0
  99. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_esp32.h +92 -0
  100. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_generic.h +297 -0
  101. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_wasm32.h +225 -0
  102. hyperdrone/_vendor/rl-tools/include/rl_tools/mode/mode.h +75 -0
  103. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/activation_functions.h +115 -0
  104. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/capability.h +63 -0
  105. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/persist_code.h +27 -0
  106. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/layer.h +122 -0
  107. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_cuda.h +64 -0
  108. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_generic.h +184 -0
  109. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/persist.h +33 -0
  110. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/layer.h +300 -0
  111. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cpu_mkl.h +590 -0
  112. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cuda.h +739 -0
  113. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_generic.h +1185 -0
  114. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist.h +99 -0
  115. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist_code.h +170 -0
  116. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/layer.h +145 -0
  117. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/dsp.h +63 -0
  118. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/opt.h +173 -0
  119. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu.h +13 -0
  120. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_accelerate.h +66 -0
  121. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_blas.h +282 -0
  122. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_mkl.h +66 -0
  123. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_openblas.h +65 -0
  124. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cuda.h +519 -0
  125. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_dummy.h +8 -0
  126. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/dsp.h +58 -0
  127. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/opt.h +167 -0
  128. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_generic.h +421 -0
  129. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist.h +62 -0
  130. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_code.h +178 -0
  131. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_common.h +55 -0
  132. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/layer.h +188 -0
  133. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_cuda.h +356 -0
  134. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_generic.h +534 -0
  135. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/persist.h +32 -0
  136. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/layer.h +119 -0
  137. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/operations_generic.h +217 -0
  138. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/persist.h +46 -0
  139. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/layer.h +121 -0
  140. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/operations_generic.h +152 -0
  141. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist.h +44 -0
  142. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist_code.h +106 -0
  143. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_cuda.h +375 -0
  144. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_generic.h +158 -0
  145. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/layer.h +218 -0
  146. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/operations_generic.h +947 -0
  147. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist.h +75 -0
  148. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist_code.h +199 -0
  149. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/layers.h +3 -0
  150. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/layer.h +143 -0
  151. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_cuda.h +80 -0
  152. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_generic.h +214 -0
  153. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/persist.h +39 -0
  154. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu.h +1 -0
  155. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_accelerate.h +1 -0
  156. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_blas.h +1 -0
  157. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_mkl.h +3 -0
  158. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_openblas.h +1 -0
  159. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cuda.h +9 -0
  160. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_dummy.h +1 -0
  161. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_generic.h +3 -0
  162. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/layer.h +223 -0
  163. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_cuda.h +138 -0
  164. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_generic.h +428 -0
  165. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/persist.h +70 -0
  166. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/layer.h +154 -0
  167. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_cuda.h +119 -0
  168. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_generic.h +494 -0
  169. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist.h +50 -0
  170. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist_code.h +173 -0
  171. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/layer.h +116 -0
  172. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_cuda.h +156 -0
  173. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_generic.h +291 -0
  174. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist.h +83 -0
  175. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist_code.h +163 -0
  176. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/layer.h +123 -0
  177. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/operations_generic.h +268 -0
  178. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist.h +17 -0
  179. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist_code.h +164 -0
  180. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/layer.h +122 -0
  181. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_cuda.h +55 -0
  182. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_generic.h +158 -0
  183. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist.h +47 -0
  184. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist_code.h +106 -0
  185. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/layer.h +132 -0
  186. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_cuda.h +141 -0
  187. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_generic.h +228 -0
  188. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/categorical_cross_entropy/operations_generic.h +102 -0
  189. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_cuda.h +97 -0
  190. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_generic.h +101 -0
  191. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/operations_generic.h +2 -0
  192. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/nn.h +16 -0
  193. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu.h +1 -0
  194. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_accelerate.h +1 -0
  195. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_blas.h +1 -0
  196. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mkl.h +1 -0
  197. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mux.h +16 -0
  198. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_openblas.h +1 -0
  199. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cuda.h +2 -0
  200. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_dummy.h +1 -0
  201. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_generic.h +17 -0
  202. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/adam.h +120 -0
  203. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_cuda.h +90 -0
  204. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_generic.h +144 -0
  205. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist.h +39 -0
  206. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist_code.h +79 -0
  207. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_cuda.h +72 -0
  208. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_generic.h +102 -0
  209. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/persist.h +25 -0
  210. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/instance/operations_generic.h +101 -0
  211. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/lamb.h +40 -0
  212. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/operations_generic.h +61 -0
  213. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/optimizers.h +3 -0
  214. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_cuda.h +77 -0
  215. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_generic.h +134 -0
  216. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist.h +37 -0
  217. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist_code.h +71 -0
  218. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_cuda.h +40 -0
  219. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_generic.h +43 -0
  220. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/sgd.h +91 -0
  221. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_cuda.h +0 -0
  222. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_generic.h +90 -0
  223. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/parameters.h +78 -0
  224. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist.h +34 -0
  225. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist_code.h +133 -0
  226. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist.h +2 -0
  227. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist_code.h +27 -0
  228. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/network.h +174 -0
  229. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_cuda.h +10 -0
  230. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_dummy.h +8 -0
  231. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_generic.h +381 -0
  232. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist.h +56 -0
  233. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist_code.h +137 -0
  234. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/network.h +45 -0
  235. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/operations_generic.h +76 -0
  236. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist.h +43 -0
  237. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist_code.h +135 -0
  238. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/models.h +3 -0
  239. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/model.h +148 -0
  240. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/operations_generic.h +280 -0
  241. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist.h +25 -0
  242. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist_code.h +71 -0
  243. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cpu.h +0 -0
  244. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cuda.h +1 -0
  245. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_dummy.h +1 -0
  246. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_generic.h +6 -0
  247. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/model.h +276 -0
  248. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_cuda.h +165 -0
  249. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_generic.h +571 -0
  250. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist.h +80 -0
  251. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist_code.h +196 -0
  252. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist.h +1 -0
  253. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist_code.h +1 -0
  254. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/model.h +43 -0
  255. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/operations_generic.h +73 -0
  256. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/resnet/resnet.h +97 -0
  257. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/model.h +256 -0
  258. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/operations_generic.h +564 -0
  259. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist.h +99 -0
  260. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist_code.h +107 -0
  261. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/bf16.h +28 -0
  262. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/categories.h +22 -0
  263. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/persist_code.h +54 -0
  264. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/policy.h +48 -0
  265. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_1.h +18 -0
  266. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_2.h +14 -0
  267. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_3.h +14 -0
  268. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm.h +19 -0
  269. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_1.h +16 -0
  270. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_2.h +12 -0
  271. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_3.h +15 -0
  272. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu.h +19 -0
  273. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_1.h +16 -0
  274. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_2.h +12 -0
  275. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_3.h +15 -0
  276. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate.h +19 -0
  277. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_1.h +17 -0
  278. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_2.h +12 -0
  279. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_3.h +15 -0
  280. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl.h +18 -0
  281. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mux.h +148 -0
  282. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_1.h +16 -0
  283. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_2.h +12 -0
  284. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_3.h +15 -0
  285. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas.h +18 -0
  286. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_1.h +16 -0
  287. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_2.h +12 -0
  288. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_3.h +15 -0
  289. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard.h +19 -0
  290. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_1.h +18 -0
  291. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_2.h +12 -0
  292. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_3.h +12 -0
  293. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda.h +19 -0
  294. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_1.h +15 -0
  295. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_2.h +12 -0
  296. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_3.h +12 -0
  297. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy.h +19 -0
  298. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_1.h +16 -0
  299. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_2.h +12 -0
  300. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_3.h +13 -0
  301. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32.h +19 -0
  302. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_1.h +15 -0
  303. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_2.h +12 -0
  304. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_3.h +12 -0
  305. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32.h +19 -0
  306. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/hdf5.h +54 -0
  307. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/operations_cpu.h +419 -0
  308. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/io.h +55 -0
  309. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_cpu.h +58 -0
  310. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_generic.h +620 -0
  311. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_posix.h +63 -0
  312. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/tar.h +74 -0
  313. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/code.h +38 -0
  314. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_arm.h +39 -0
  315. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cpu.h +61 -0
  316. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cuda.h +164 -0
  317. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_dummy.h +72 -0
  318. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_esp32.h +45 -0
  319. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic.h +133 -0
  320. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic_array.h +64 -0
  321. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_wasm32.h +57 -0
  322. hyperdrone/_vendor/rl-tools/include/rl_tools/random/persist.h +77 -0
  323. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/README.md +149 -0
  324. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_cpu.h +768 -0
  325. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_generic.h +1173 -0
  326. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/context.h +177 -0
  327. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/device_source.h +17 -0
  328. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/operations_cpu.h +1122 -0
  329. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device.h +212 -0
  330. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device_impl.h +934 -0
  331. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/operations_cuda.h +1678 -0
  332. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/overlay_accel.h +57 -0
  333. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/context.h +220 -0
  334. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/device_source.h +40 -0
  335. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/operations_cpu.h +1967 -0
  336. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_common.h +1986 -0
  337. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_mux.h +19 -0
  338. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/renderer.h +376 -0
  339. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/procthor/operations_cpu.h +226 -0
  340. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/procthor/scene.h +25 -0
  341. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/scene.h +31 -0
  342. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene.h +107 -0
  343. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/transforms_generic.h +159 -0
  344. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/types.h +39 -0
  345. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/algorithms.h +6 -0
  346. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu.h +1 -0
  347. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu_mkl.h +1 -0
  348. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_generic.h +1 -0
  349. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/config.h +240 -0
  350. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_cuda.h +62 -0
  351. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_generic.h +245 -0
  352. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/persist.h +102 -0
  353. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/state.h +52 -0
  354. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_cuda.h +193 -0
  355. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic.h +334 -0
  356. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic_extensions.h +244 -0
  357. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/persist.h +28 -0
  358. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/ppo.h +105 -0
  359. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_gru.h +84 -0
  360. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_mlp.h +61 -0
  361. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/config.h +106 -0
  362. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/operations_generic.h +193 -0
  363. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/state.h +52 -0
  364. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu.h +9 -0
  365. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_accelerate.h +2 -0
  366. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mkl.h +2 -0
  367. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mux.h +9 -0
  368. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cuda.h +131 -0
  369. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_generic.h +580 -0
  370. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/sac.h +151 -0
  371. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_gru.h +72 -0
  372. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_mlp.h +54 -0
  373. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/config.h +107 -0
  374. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/operations_generic.h +172 -0
  375. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/state.h +46 -0
  376. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu.h +9 -0
  377. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_accelerate.h +2 -0
  378. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mkl.h +2 -0
  379. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mux.h +9 -0
  380. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cuda.h +111 -0
  381. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_generic.h +359 -0
  382. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/td3.h +141 -0
  383. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/components.h +4 -0
  384. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/off_policy_runner.h +225 -0
  385. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu.h +95 -0
  386. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_accelerate.h +21 -0
  387. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_mkl.h +21 -0
  388. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cuda.h +237 -0
  389. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic.h +498 -0
  390. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic_per_env.h +112 -0
  391. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/on_policy_runner.h +106 -0
  392. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu.h +16 -0
  393. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_accelerate.h +28 -0
  394. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_mkl.h +15 -0
  395. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cuda.h +195 -0
  396. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic.h +197 -0
  397. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_extensions.h +98 -0
  398. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_per_env.h +91 -0
  399. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/persist.h +61 -0
  400. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu.h +2 -0
  401. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_accelerate.h +1 -0
  402. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_mkl.h +1 -0
  403. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_generic.h +2 -0
  404. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_cpu.h +9 -0
  405. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_generic.h +123 -0
  406. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/persist.h +57 -0
  407. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/replay_buffer.h +93 -0
  408. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/operations_generic.h +76 -0
  409. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/persist.h +31 -0
  410. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/running_normalizer.h +33 -0
  411. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/operations_generic.h +58 -0
  412. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/operations_generic.h +28 -0
  413. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/wrapper.h +26 -0
  414. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/wrappers.h +29 -0
  415. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/acrobot.h +88 -0
  416. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_cpu.h +152 -0
  417. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_generic.h +202 -0
  418. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/car.h +119 -0
  419. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_cpu.h +110 -0
  420. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_generic.h +206 -0
  421. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_json.h +59 -0
  422. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/track.h +23 -0
  423. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/ui.h +189 -0
  424. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/environments.h +28 -0
  425. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/environment.h +87 -0
  426. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_cpu.h +212 -0
  427. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_generic.h +215 -0
  428. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/metrics.h +266 -0
  429. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/multirotor.h +1083 -0
  430. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cpu.h +2119 -0
  431. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cuda.h +38 -0
  432. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/05_state_is_nan.h +126 -0
  433. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/10_sample_initial_parameters.h +228 -0
  434. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/20_initial_state.h +189 -0
  435. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/30_sample_initial_state.h +276 -0
  436. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/35_get_desired_state.h +63 -0
  437. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/40_observe.h +625 -0
  438. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/50_state_algebra.h +57 -0
  439. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/60_dynamics.h +134 -0
  440. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/70_post_integration.h +329 -0
  441. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/80_abs_diff.h +290 -0
  442. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic.h +369 -0
  443. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_helper_generic.h +45 -0
  444. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic.h +72 -0
  445. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic_forward.h +26 -0
  446. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/default.h +202 -0
  447. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/arpl.h +112 -0
  448. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie.h +127 -0
  449. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie_openmv.h +119 -0
  450. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/flightmare.h +111 -0
  451. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/fs.h +113 -0
  452. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/mrs.h +110 -0
  453. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft.h +117 -0
  454. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft_rigid.h +118 -0
  455. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_real.h +88 -0
  456. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_sim.h +114 -0
  457. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/init/default.h +56 -0
  458. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/registry.h +90 -0
  459. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/default.h +64 -0
  460. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/reward_functions.h +1 -0
  461. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/operations_generic.h +202 -0
  462. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/squared.h +52 -0
  463. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/termination/default.h +33 -0
  464. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/lissajous.h +72 -0
  465. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/trajectory.h +78 -0
  466. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/persist_code.h +53 -0
  467. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/quaternion_helper.h +94 -0
  468. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/ui.h +180 -0
  469. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/multirotor_visual.h +135 -0
  470. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_cpu.h +244 -0
  471. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_cuda.h +180 -0
  472. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_generic.h +149 -0
  473. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/environment.h +69 -0
  474. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_cpu.h +46 -0
  475. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_generic.h +78 -0
  476. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/README.MD +5 -0
  477. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ant.h +77 -0
  478. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/model.h +415 -0
  479. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/operations_cpu.h +160 -0
  480. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ui.h +141 -0
  481. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/mujoco.h +1 -0
  482. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/bottleneck.h +113 -0
  483. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_cpu.h +289 -0
  484. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_generic.h +495 -0
  485. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/environments.h +16 -0
  486. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/observation.h +37 -0
  487. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_cpu.h +2 -0
  488. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_generic.h +33 -0
  489. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_cpu.h +146 -0
  490. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_generic.h +262 -0
  491. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/pendulum.h +197 -0
  492. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui.h +97 -0
  493. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui_xeus.h +124 -0
  494. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_cpu.h +426 -0
  495. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_generic.h +424 -0
  496. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/reacher.h +137 -0
  497. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/loop.h +15 -0
  498. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/config.h +28 -0
  499. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/operations_cpu.h +233 -0
  500. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/persist.h +30 -0
  501. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/state.h +21 -0
  502. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/config.h +25 -0
  503. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/operations_generic.h +47 -0
  504. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/persist.h +20 -0
  505. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/state.h +17 -0
  506. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/config.h +47 -0
  507. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/operations_generic.h +106 -0
  508. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/persist.h +40 -0
  509. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/state.h +36 -0
  510. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/config.h +22 -0
  511. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/operations_cpu.h +44 -0
  512. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/persist.h +20 -0
  513. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/state.h +26 -0
  514. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/config.h +37 -0
  515. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/operations_cpu.h +113 -0
  516. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/persist.h +20 -0
  517. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/state.h +24 -0
  518. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/config.h +43 -0
  519. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/operations_cpu.h +190 -0
  520. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/persist.h +30 -0
  521. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/state.h +37 -0
  522. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/steps.h +4 -0
  523. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/config.h +27 -0
  524. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/operations_cpu.h +52 -0
  525. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/persist.h +20 -0
  526. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/state.h +25 -0
  527. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/operations_generic.h +3 -0
  528. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/rl.h +5 -0
  529. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/evaluation.h +106 -0
  530. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_cpu.h +48 -0
  531. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_generic.h +275 -0
  532. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation.h +269 -0
  533. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation_analysis.h +85 -0
  534. hyperdrone/_vendor/rl-tools/include/rl_tools/rl_tools.h +37 -0
  535. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/client.h +50 -0
  536. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_boost.h +92 -0
  537. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_cpu.h +174 -0
  538. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_websocket.h +208 -0
  539. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/server.h +448 -0
  540. hyperdrone/_vendor/rl-tools/include/rl_tools/universe.h +4 -0
  541. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/declarations_cpu.h +13 -0
  542. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_arm.h +25 -0
  543. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cpu.h +21 -0
  544. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cuda.h +25 -0
  545. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_dummy.h +18 -0
  546. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_esp32.h +20 -0
  547. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_generic.h +19 -0
  548. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_wasm32.h +18 -0
  549. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_cpu.h +16 -0
  550. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_generic.h +14 -0
  551. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/extrack.h +129 -0
  552. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/operations_cpu.h +588 -0
  553. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/integrators.h +105 -0
  554. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/memcpy.h +16 -0
  555. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/operations_generic.h +48 -0
  556. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/tuple.h +149 -0
  557. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/typing.h +118 -0
  558. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/vector_operations.h +174 -0
  559. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_cuda.h +53 -0
  560. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_generic.h +93 -0
  561. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/string/operations_generic.h +201 -0
  562. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/zlib/operations_cpu.h +45 -0
  563. hyperdrone/_vendor/rl-tools/include/rl_tools/version.h +28 -0
  564. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/CMakeLists.txt +15 -0
  565. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/CMakeLists.txt +9 -0
  566. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/CMakeLists.txt +17 -0
  567. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/freestanding_check.cpp +113 -0
  568. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/CMakeLists.txt +31 -0
  569. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/device.metal +815 -0
  570. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/metal_cpp_impl.cpp +6 -0
  571. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/CMakeLists.txt +51 -0
  572. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/device.cu +1 -0
  573. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/overlay_accel.cu +275 -0
  574. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/CMakeLists.txt +37 -0
  575. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device.comp +865 -0
  576. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device_spirv.cpp +34 -0
  577. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/CMakeLists.txt +205 -0
  578. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/README.md +281 -0
  579. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark.cpp +175 -0
  580. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark_dynamic.cpp +494 -0
  581. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix.cpp +1629 -0
  582. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.cu +523 -0
  583. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.h +37 -0
  584. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/CMakeLists.txt +164 -0
  585. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/antialiasing.cpp +213 -0
  586. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone.cpp +367 -0
  587. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone_device.cu +385 -0
  588. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/environment.h +85 -0
  589. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/operations_cpu.h +270 -0
  590. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/example.cpp +276 -0
  591. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/fixed_pose.cpp +218 -0
  592. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/interactive.cpp +866 -0
  593. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/make_drone_glb.py +172 -0
  594. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/motion_blur.cpp +232 -0
  595. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace.cpp +1833 -0
  596. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace_motion_blur.cpp +646 -0
  597. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/CMakeLists.txt +147 -0
  598. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/README.md +15 -0
  599. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/job.sbatch +28 -0
  600. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model.h +260 -0
  601. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_config.h +24 -0
  602. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_forward_cuda.h +397 -0
  603. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_operations.h +418 -0
  604. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_persist.h +45 -0
  605. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_student.h +70 -0
  606. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.cpp +221 -0
  607. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.h +68 -0
  608. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.build-check/inference_ios.o +0 -0
  609. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.build-check/libinference_ios.a +0 -0
  610. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.gitignore +4 -0
  611. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/CMakeLists.txt +4 -0
  612. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info.plist +24 -0
  613. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info_ios.plist +36 -0
  614. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/CameraManager.swift +120 -0
  615. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/ContentView.swift +703 -0
  616. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/DatasetRecorder.swift +285 -0
  617. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/YawPredictorApp.swift +25 -0
  618. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/YawPredictor.entitlements +8 -0
  619. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build.sh +66 -0
  620. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build_ios.sh +133 -0
  621. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/generate.sh +6 -0
  622. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/h5_to_tar.cpp +82 -0
  623. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.cpp +166 -0
  624. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.h +26 -0
  625. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/project.yml +30 -0
  626. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/test_tar_vs_hdf5.cpp +173 -0
  627. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_cuda.cu +699 -0
  628. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_dataset_overlay.cpp +475 -0
  629. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_distill_cuda.cu +995 -0
  630. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_eval.cu +456 -0
  631. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_real_world_eval.cpp +660 -0
  632. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_viewer.cu +445 -0
  633. hyperdrone/cuda/__init__.py +78 -0
  634. hyperdrone/dynamics/__init__.py +22 -0
  635. hyperdrone/dynamics/_component.py +40 -0
  636. hyperdrone/dynamics/_config.py +47 -0
  637. hyperdrone/dynamics/_sim.py +201 -0
  638. hyperdrone/env/__init__.py +15 -0
  639. hyperdrone/env/_sampling.py +67 -0
  640. hyperdrone/env/_world.py +60 -0
  641. hyperdrone/examples/__init__.py +11 -0
  642. hyperdrone/examples/benchmark.py +236 -0
  643. hyperdrone/examples/benchmark_minimal.py +66 -0
  644. hyperdrone/examples/data.py +42 -0
  645. hyperdrone/examples/drone_flythrough.py +142 -0
  646. hyperdrone/examples/render_procthor.py +41 -0
  647. hyperdrone/jit/__init__.py +111 -0
  648. hyperdrone/jit/_build.py +94 -0
  649. hyperdrone/jit/_lock.py +23 -0
  650. hyperdrone/jit/_patches.py +95 -0
  651. hyperdrone/jit/_toolchain.py +13 -0
  652. hyperdrone/jit/_workspace.py +70 -0
  653. hyperdrone/render/__init__.py +48 -0
  654. hyperdrone/render/_component.py +35 -0
  655. hyperdrone/render/_config.py +90 -0
  656. hyperdrone/render/_renderer.py +306 -0
  657. hyperdrone/render/_scene.py +34 -0
  658. hyperdrone-0.1.0.dist-info/METADATA +15 -0
  659. hyperdrone-0.1.0.dist-info/RECORD +660 -0
  660. hyperdrone-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,1833 @@
1
+ #define RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS 0
2
+
3
+ #include <rl_tools/operations/cpu_mux.h>
4
+
5
+ #include "environment/environment.h"
6
+ #include "environment/operations_cpu.h"
7
+
8
+ #include <nlohmann/json.hpp>
9
+
10
+
11
+ #include <algorithm>
12
+ #include <cerrno>
13
+ #include <cctype>
14
+ #include <cmath>
15
+ #include <cstdio>
16
+ #include <cstdlib>
17
+ #include <cstring>
18
+ #include <fstream>
19
+ #include <iostream>
20
+ #include <limits>
21
+ #include <sstream>
22
+ #include <string>
23
+ #include <sys/stat.h>
24
+ #include <vector>
25
+
26
+ namespace rlt = rl_tools;
27
+ using json = nlohmann::json;
28
+
29
+ using T = float;
30
+ using TI = typename rlt::devices::DEVICE_FACTORY<>::index_t;
31
+
32
+ static constexpr TI NUM_CAMERAS = 1;
33
+ static constexpr TI NUM_PROBES = 1;
34
+ static constexpr int FRAME_JPEG_QUALITY = 90;
35
+ static constexpr TI MIN_VIDEO_DIMENSION = 2048;
36
+ static constexpr double DEFAULT_FOV_DEG = 80.0;
37
+ static constexpr double DEFAULT_SMOOTH_POSITION_SIGMA_S = 1.0;
38
+ static constexpr double DEFAULT_SMOOTH_ORIENTATION_SIGMA_S = 6.0;
39
+ static constexpr double DEFAULT_MAX_ORIENTATION_SPEED_RAD_S = 1.6;
40
+ static constexpr double DEFAULT_ORIENTATION_JUMP_RAMP_MULTIPLIER = 5.0;
41
+
42
+ struct RenderResolutionOption {
43
+ const char* name;
44
+ TI width;
45
+ TI height;
46
+ bool enabled_by_default;
47
+ const char* alias = nullptr;
48
+ };
49
+
50
+ enum class AntiAliasingSelection {
51
+ NONE,
52
+ AA2,
53
+ BOTH
54
+ };
55
+
56
+ static constexpr RenderResolutionOption RENDER_RESOLUTIONS[] = {
57
+ {"64", 64, 64, true},
58
+ {"128", 128, 128, true},
59
+ {"256", 256, 256, true},
60
+ {"512", 512, 512, true},
61
+ {"1024", 1024, 1024, true},
62
+ {"2048", 2048, 2048, true},
63
+ {"4k", 3840, 2160, true}
64
+ };
65
+
66
+ struct TracePose {
67
+ T eye[3];
68
+ T look_at[3];
69
+ T up[3];
70
+ double yaw = 0.0;
71
+ double pitch = 0.0;
72
+ double timestamp_s = 0.0;
73
+ bool has_timestamp = false;
74
+ bool has_yaw_pitch = false;
75
+ };
76
+
77
+ struct Options {
78
+ std::string trace_path;
79
+ std::string scene_path;
80
+ std::string output_dir = ".";
81
+ std::string ffmpeg = "ffmpeg";
82
+ bool ffmpeg_gpu = false;
83
+ std::string settings = "very_high";
84
+ int resolution_width = 0;
85
+ int resolution_height = 0;
86
+ int fps = 60;
87
+ int max_frames = 0;
88
+ double fov_deg = DEFAULT_FOV_DEG;
89
+ AntiAliasingSelection aa = AntiAliasingSelection::BOTH;
90
+ double smooth_position_sigma_s = DEFAULT_SMOOTH_POSITION_SIGMA_S;
91
+ double smooth_orientation_sigma_s = DEFAULT_SMOOTH_ORIENTATION_SIGMA_S;
92
+ double max_orientation_speed_rad_s = DEFAULT_MAX_ORIENTATION_SPEED_RAD_S;
93
+ double orientation_jump_ramp_multiplier = DEFAULT_ORIENTATION_JUMP_RAMP_MULTIPLIER;
94
+ bool write_frames = false;
95
+ bool help = false;
96
+ };
97
+
98
+ struct RenderRecord {
99
+ std::string name;
100
+ std::string output;
101
+ std::string profile;
102
+ std::string anti_aliasing;
103
+ std::string path;
104
+ std::string frames_dir;
105
+ std::string frame_pattern;
106
+ std::string frame_format;
107
+ std::string ffmpeg_command;
108
+ TI width = 0;
109
+ TI height = 0;
110
+ TI video_width = 0;
111
+ TI video_height = 0;
112
+ TI video_oversampling_factor = 1;
113
+ TI aa_grid_size = 1;
114
+ TI samples_per_pixel = 1;
115
+ size_t frame_count = 0;
116
+ int frame_jpeg_quality = 0;
117
+ int ffmpeg_status = 0;
118
+ bool ok = false;
119
+ };
120
+
121
+ static void print_usage(const char* argv0) {
122
+ std::cout
123
+ << "Usage: " << argv0 << " --trace pose_trace.json [options]\n"
124
+ << "Options:\n"
125
+ << " --trace <path> Camera pose JSON or trace JSON\n"
126
+ << " --scene <path> Scene path override\n"
127
+ << " --output-dir <dir> Parent output directory; renders go under <dir>/<trace-name>/ (default: .)\n"
128
+ << " --fps <n> MP4 frame rate; timestamped traces are resampled to this rate (default: 60)\n"
129
+ << " --fov <deg> Horizontal FOV in degrees (default: 80)\n"
130
+ << " --ffmpeg <path> ffmpeg binary (default: ffmpeg)\n"
131
+ << " --ffmpeg-gpu Use NVIDIA NVENC H.264 encoding instead of libx264\n"
132
+ << " --settings <list> all, rgb, depth, very_high, high, medium, low, or comma list; depth has no rendering profile\n"
133
+ << " Legacy aliases: very_high_fidelity, basic, high_fidelity, fast_flat\n"
134
+ << " --resolution <name> Render one resolution: 64, 128, 256, 512, 1024, 2048, or 4k\n"
135
+ << " 4k is UHD 3840x2160\n"
136
+ << " By default all listed resolutions are rendered\n"
137
+ << " Encoded videos are upscaled to at least 2048 pixels per axis\n"
138
+ << " --aa <mode> Anti-aliasing mode: none, aa2, or both (default: both)\n"
139
+ << " --frames Write per-frame PNG/JPEG image sequences\n"
140
+ << " Frames are written under <output-dir>/<trace-name>/frames/<render-name>/\n"
141
+ << " 64x64 and 128x128 frames are PNG; larger frames are JPEG\n"
142
+ << " --no-frames Do not write per-frame image sequences (default)\n"
143
+ << " --max-frames <n> Limit trace frames when >0\n"
144
+ << " --smooth-sigma-s <s> Gaussian smoothing sigma for position and orientation (use 0 to disable)\n"
145
+ << " --smooth-position-sigma-s <s>\n"
146
+ << " Gaussian smoothing sigma for position only (default: 1)\n"
147
+ << " --smooth-orientation-sigma-s <s>\n"
148
+ << " Gaussian smoothing sigma for orientation only (default: 6)\n"
149
+ << " --max-orientation-speed-deg-s <deg/s>\n"
150
+ << " Detect orientation jumps before smoothing (default: 91.7; use 0 to disable)\n"
151
+ << " --orientation-jump-ramp-multiplier <x>\n"
152
+ << " Lengthen detected jump slerp ramps by this factor (default: 5)\n";
153
+ }
154
+
155
+ static bool parse_int(const std::string& value, int& out) {
156
+ char* end = nullptr;
157
+ const long parsed = std::strtol(value.c_str(), &end, 10);
158
+ if(end == value.c_str() || *end != '\0') {
159
+ return false;
160
+ }
161
+ out = static_cast<int>(parsed);
162
+ return true;
163
+ }
164
+
165
+ static bool parse_resolution(const std::string& value, int& width, int& height) {
166
+ std::string lower = value;
167
+ std::transform(lower.begin(), lower.end(), lower.begin(), [](unsigned char c) {
168
+ return static_cast<char>(std::tolower(c));
169
+ });
170
+ for(const RenderResolutionOption& resolution : RENDER_RESOLUTIONS) {
171
+ if(lower == resolution.name || (resolution.alias != nullptr && lower == resolution.alias)) {
172
+ width = static_cast<int>(resolution.width);
173
+ height = static_cast<int>(resolution.height);
174
+ return true;
175
+ }
176
+ }
177
+
178
+ int requested_width = 0;
179
+ if(!parse_int(value, requested_width) || requested_width <= 0) {
180
+ return false;
181
+ }
182
+ for(const RenderResolutionOption& resolution : RENDER_RESOLUTIONS) {
183
+ if(static_cast<TI>(requested_width) == resolution.width) {
184
+ width = static_cast<int>(resolution.width);
185
+ height = static_cast<int>(resolution.height);
186
+ return true;
187
+ }
188
+ }
189
+ return false;
190
+ }
191
+
192
+ static bool should_render_resolution(const Options& options, TI width, TI height) {
193
+ if(options.resolution_width != 0 || options.resolution_height != 0) {
194
+ return static_cast<TI>(options.resolution_width) == width && static_cast<TI>(options.resolution_height) == height;
195
+ }
196
+ for(const RenderResolutionOption& resolution : RENDER_RESOLUTIONS) {
197
+ if(width == resolution.width && height == resolution.height) {
198
+ return resolution.enabled_by_default;
199
+ }
200
+ }
201
+ return false;
202
+ }
203
+
204
+ static const char* aa_selection_name(AntiAliasingSelection aa) {
205
+ switch(aa) {
206
+ case AntiAliasingSelection::NONE: return "none";
207
+ case AntiAliasingSelection::AA2: return "aa2";
208
+ case AntiAliasingSelection::BOTH: return "both";
209
+ }
210
+ return "both";
211
+ }
212
+
213
+ static bool parse_aa_selection(const std::string& value, AntiAliasingSelection& out) {
214
+ std::string lower = value;
215
+ std::transform(lower.begin(), lower.end(), lower.begin(), [](unsigned char c) {
216
+ return static_cast<char>(std::tolower(c));
217
+ });
218
+ if(lower == "none" || lower == "off" || lower == "no") {
219
+ out = AntiAliasingSelection::NONE;
220
+ return true;
221
+ }
222
+ if(lower == "aa2" || lower == "2" || lower == "on") {
223
+ out = AntiAliasingSelection::AA2;
224
+ return true;
225
+ }
226
+ if(lower == "both" || lower == "all") {
227
+ out = AntiAliasingSelection::BOTH;
228
+ return true;
229
+ }
230
+ return false;
231
+ }
232
+
233
+ static const char* video_encoder_name(const Options& options) {
234
+ return options.ffmpeg_gpu ? "h264_nvenc" : "libx264";
235
+ }
236
+
237
+ static bool should_render_aa(const Options& options, bool enabled, TI grid_size) {
238
+ switch(options.aa) {
239
+ case AntiAliasingSelection::NONE:
240
+ return !enabled;
241
+ case AntiAliasingSelection::AA2:
242
+ return enabled && grid_size == static_cast<TI>(2);
243
+ case AntiAliasingSelection::BOTH:
244
+ return true;
245
+ }
246
+ return true;
247
+ }
248
+
249
+ static bool parse_double(const std::string& value, double& out) {
250
+ char* end = nullptr;
251
+ const double parsed = std::strtod(value.c_str(), &end);
252
+ if(end == value.c_str() || *end != '\0' || !std::isfinite(parsed)) {
253
+ return false;
254
+ }
255
+ out = parsed;
256
+ return true;
257
+ }
258
+
259
+ static double degrees_to_radians(double degrees) {
260
+ return degrees * 3.14159265358979323846 / 180.0;
261
+ }
262
+
263
+ static bool option_value(int& i, int argc, char** argv, const std::string& arg, const char* name, std::string& out) {
264
+ const std::string prefix = std::string(name) + "=";
265
+ if(arg.compare(0, prefix.size(), prefix) == 0) {
266
+ out = arg.substr(prefix.size());
267
+ return true;
268
+ }
269
+ if(arg == name) {
270
+ if(i + 1 >= argc) {
271
+ std::cerr << "Missing value for " << name << std::endl;
272
+ return false;
273
+ }
274
+ out = argv[++i];
275
+ return true;
276
+ }
277
+ return false;
278
+ }
279
+
280
+ static bool parse_options(int argc, char** argv, Options& options) {
281
+ for(int i = 1; i < argc; i++) {
282
+ const std::string arg = argv[i];
283
+ std::string value;
284
+ if(arg == "-h" || arg == "--help") {
285
+ options.help = true;
286
+ return true;
287
+ }
288
+ else if(option_value(i, argc, argv, arg, "--trace", value)) {
289
+ options.trace_path = value;
290
+ }
291
+ else if(option_value(i, argc, argv, arg, "--scene", value)) {
292
+ options.scene_path = value;
293
+ }
294
+ else if(option_value(i, argc, argv, arg, "--output-dir", value)) {
295
+ options.output_dir = value;
296
+ }
297
+ else if(option_value(i, argc, argv, arg, "--ffmpeg", value)) {
298
+ options.ffmpeg = value;
299
+ }
300
+ else if(arg == "--ffmpeg-gpu") {
301
+ options.ffmpeg_gpu = true;
302
+ }
303
+ else if(option_value(i, argc, argv, arg, "--settings", value)) {
304
+ options.settings = value;
305
+ }
306
+ else if(option_value(i, argc, argv, arg, "--resolution", value)) {
307
+ if(!parse_resolution(value, options.resolution_width, options.resolution_height)) {
308
+ std::cerr << "Invalid --resolution: " << value << std::endl;
309
+ return false;
310
+ }
311
+ }
312
+ else if(option_value(i, argc, argv, arg, "--aa", value)) {
313
+ if(!parse_aa_selection(value, options.aa)) {
314
+ std::cerr << "Invalid --aa: " << value << " (expected none, aa2, or both)" << std::endl;
315
+ return false;
316
+ }
317
+ }
318
+ else if(arg == "--no-frames") {
319
+ options.write_frames = false;
320
+ }
321
+ else if(arg == "--frames") {
322
+ options.write_frames = true;
323
+ }
324
+ else if(option_value(i, argc, argv, arg, "--fps", value)) {
325
+ if(!parse_int(value, options.fps) || options.fps <= 0) {
326
+ std::cerr << "Invalid --fps: " << value << std::endl;
327
+ return false;
328
+ }
329
+ }
330
+ else if(option_value(i, argc, argv, arg, "--fov", value) || option_value(i, argc, argv, arg, "--fov-deg", value)) {
331
+ if(!parse_double(value, options.fov_deg) || options.fov_deg <= 0.0 || options.fov_deg >= 180.0) {
332
+ std::cerr << "Invalid --fov: " << value << " (expected degrees in (0, 180))" << std::endl;
333
+ return false;
334
+ }
335
+ }
336
+ else if(option_value(i, argc, argv, arg, "--max-frames", value)) {
337
+ if(!parse_int(value, options.max_frames) || options.max_frames < 0) {
338
+ std::cerr << "Invalid --max-frames: " << value << std::endl;
339
+ return false;
340
+ }
341
+ }
342
+ else if(option_value(i, argc, argv, arg, "--smooth-sigma-s", value)) {
343
+ double sigma_s = 0.0;
344
+ if(!parse_double(value, sigma_s) || sigma_s < 0.0) {
345
+ std::cerr << "Invalid --smooth-sigma-s: " << value << std::endl;
346
+ return false;
347
+ }
348
+ options.smooth_position_sigma_s = sigma_s;
349
+ options.smooth_orientation_sigma_s = sigma_s;
350
+ }
351
+ else if(option_value(i, argc, argv, arg, "--smooth-position-sigma-s", value)) {
352
+ if(!parse_double(value, options.smooth_position_sigma_s) || options.smooth_position_sigma_s < 0.0) {
353
+ std::cerr << "Invalid --smooth-position-sigma-s: " << value << std::endl;
354
+ return false;
355
+ }
356
+ }
357
+ else if(option_value(i, argc, argv, arg, "--smooth-orientation-sigma-s", value)) {
358
+ if(!parse_double(value, options.smooth_orientation_sigma_s) || options.smooth_orientation_sigma_s < 0.0) {
359
+ std::cerr << "Invalid --smooth-orientation-sigma-s: " << value << std::endl;
360
+ return false;
361
+ }
362
+ }
363
+ else if(option_value(i, argc, argv, arg, "--max-orientation-speed-deg-s", value)) {
364
+ double max_speed_deg_s = 0.0;
365
+ if(!parse_double(value, max_speed_deg_s) || max_speed_deg_s < 0.0) {
366
+ std::cerr << "Invalid --max-orientation-speed-deg-s: " << value << std::endl;
367
+ return false;
368
+ }
369
+ options.max_orientation_speed_rad_s = max_speed_deg_s * 3.14159265358979323846 / 180.0;
370
+ }
371
+ else if(option_value(i, argc, argv, arg, "--orientation-jump-ramp-multiplier", value)) {
372
+ if(!parse_double(value, options.orientation_jump_ramp_multiplier) || options.orientation_jump_ramp_multiplier < 1.0) {
373
+ std::cerr << "Invalid --orientation-jump-ramp-multiplier: " << value << std::endl;
374
+ return false;
375
+ }
376
+ }
377
+ else {
378
+ std::cerr << "Unknown argument: " << arg << std::endl;
379
+ return false;
380
+ }
381
+ }
382
+ if(options.trace_path.empty()) {
383
+ std::cerr << "--trace is required" << std::endl;
384
+ return false;
385
+ }
386
+ return true;
387
+ }
388
+
389
+ static bool mkdir_p(const std::string& path) {
390
+ if(path.empty()) {
391
+ return true;
392
+ }
393
+ std::string current;
394
+ size_t i = 0;
395
+ if(path[0] == '/') {
396
+ current = "/";
397
+ i = 1;
398
+ }
399
+ while(i <= path.size()) {
400
+ const size_t next = path.find('/', i);
401
+ std::string part = path.substr(i, next == std::string::npos ? std::string::npos : next - i);
402
+ if(!part.empty()) {
403
+ if(!current.empty() && current.back() != '/') {
404
+ current += "/";
405
+ }
406
+ current += part;
407
+ if(mkdir(current.c_str(), 0755) != 0 && errno != EEXIST) {
408
+ std::cerr << "Failed to create directory " << current << ": " << std::strerror(errno) << std::endl;
409
+ return false;
410
+ }
411
+ }
412
+ if(next == std::string::npos) {
413
+ break;
414
+ }
415
+ i = next + 1;
416
+ }
417
+ return true;
418
+ }
419
+
420
+ static std::string join_path(const std::string& a, const std::string& b) {
421
+ if(a.empty() || a == ".") {
422
+ return b;
423
+ }
424
+ if(a.back() == '/') {
425
+ return a + b;
426
+ }
427
+ return a + "/" + b;
428
+ }
429
+
430
+ static std::string path_basename(const std::string& path) {
431
+ const size_t end = path.find_last_not_of("/\\");
432
+ if(end == std::string::npos) {
433
+ return std::string();
434
+ }
435
+ const size_t begin = path.find_last_of("/\\", end);
436
+ if(begin == std::string::npos) {
437
+ return path.substr(0, end + 1);
438
+ }
439
+ return path.substr(begin + 1, end - begin);
440
+ }
441
+
442
+ static std::string strip_extension(const std::string& path) {
443
+ const size_t dot = path.find_last_of('.');
444
+ if(dot == std::string::npos || dot == 0) {
445
+ return path;
446
+ }
447
+ return path.substr(0, dot);
448
+ }
449
+
450
+ static std::string sanitize_path_component(const std::string& value) {
451
+ std::string out;
452
+ bool wrote_separator = false;
453
+ for(unsigned char c : value) {
454
+ if(std::isalnum(c) || c == '-' || c == '_' || c == '.') {
455
+ out += static_cast<char>(c);
456
+ wrote_separator = false;
457
+ }
458
+ else if(!wrote_separator) {
459
+ out += '_';
460
+ wrote_separator = true;
461
+ }
462
+ }
463
+ while(!out.empty() && out[0] == '.') {
464
+ out.erase(out.begin());
465
+ }
466
+ while(!out.empty() && out.back() == '_') {
467
+ out.pop_back();
468
+ }
469
+ return out.empty() ? std::string("trace") : out;
470
+ }
471
+
472
+ static std::string trace_output_name(const std::string& trace_path) {
473
+ const std::string basename = path_basename(trace_path);
474
+ const std::string stem = strip_extension(basename);
475
+ return sanitize_path_component(stem.empty() ? basename : stem);
476
+ }
477
+
478
+ static std::string shell_quote(const std::string& value) {
479
+ std::string quoted = "'";
480
+ for(char c : value) {
481
+ if(c == '\'') {
482
+ quoted += "'\\''";
483
+ }
484
+ else {
485
+ quoted += c;
486
+ }
487
+ }
488
+ quoted += "'";
489
+ return quoted;
490
+ }
491
+
492
+ static std::vector<std::string> split_settings(const std::string& settings) {
493
+ std::vector<std::string> tokens;
494
+ std::string token;
495
+ std::stringstream ss(settings);
496
+ while(std::getline(ss, token, ',')) {
497
+ token.erase(std::remove_if(token.begin(), token.end(), [](unsigned char c){ return std::isspace(c); }), token.end());
498
+ if(!token.empty()) {
499
+ tokens.push_back(token);
500
+ }
501
+ }
502
+ return tokens;
503
+ }
504
+
505
+ static bool contains_token(const std::vector<std::string>& tokens, const std::string& value) {
506
+ return std::find(tokens.begin(), tokens.end(), value) != tokens.end();
507
+ }
508
+
509
+ static bool contains_profile_token(const std::vector<std::string>& tokens, const std::string& profile) {
510
+ return contains_token(tokens, profile)
511
+ || (profile == "very_high" &&
512
+ (contains_token(tokens, "very_high_fidelity") ||
513
+ contains_token(tokens, "veryhigh") ||
514
+ contains_token(tokens, "veryhigh_fidelity")))
515
+ || (profile == "medium" && contains_token(tokens, "basic"))
516
+ || (profile == "high" && contains_token(tokens, "high_fidelity"))
517
+ || (profile == "low" && contains_token(tokens, "fast_flat"));
518
+ }
519
+
520
+ static bool has_profile_filter(const std::vector<std::string>& tokens) {
521
+ return contains_token(tokens, "very_high") || contains_token(tokens, "very_high_fidelity")
522
+ || contains_token(tokens, "veryhigh") || contains_token(tokens, "veryhigh_fidelity")
523
+ || contains_token(tokens, "medium") || contains_token(tokens, "basic")
524
+ || contains_token(tokens, "high") || contains_token(tokens, "high_fidelity")
525
+ || contains_token(tokens, "low") || contains_token(tokens, "fast_flat");
526
+ }
527
+
528
+ static bool should_render_setting(const Options& options, const char* output, const char* profile) {
529
+ const std::vector<std::string> tokens = split_settings(options.settings);
530
+ if(tokens.empty() || contains_token(tokens, "all")) {
531
+ return true;
532
+ }
533
+ const bool has_output_filter = contains_token(tokens, "rgb") || contains_token(tokens, "depth");
534
+ const bool has_profile_filter_value = has_profile_filter(tokens);
535
+ const bool output_ok = !has_output_filter || contains_token(tokens, output);
536
+ const bool profile_ok = !has_profile_filter_value || contains_profile_token(tokens, profile);
537
+ return output_ok && profile_ok;
538
+ }
539
+
540
+ static bool should_render_depth(const Options& options) {
541
+ const std::vector<std::string> tokens = split_settings(options.settings);
542
+ return tokens.empty() || contains_token(tokens, "all") || contains_token(tokens, "depth");
543
+ }
544
+
545
+ static bool read_json_file(const std::string& path, json& out) {
546
+ std::ifstream f(path);
547
+ if(!f) {
548
+ std::cerr << "Failed to open trace JSON: " << path << std::endl;
549
+ return false;
550
+ }
551
+ try {
552
+ f >> out;
553
+ }
554
+ catch(const std::exception& e) {
555
+ std::cerr << "Failed to parse trace JSON: " << e.what() << std::endl;
556
+ return false;
557
+ }
558
+ return true;
559
+ }
560
+
561
+ static bool read_vec3(const json& value, T out[3]) {
562
+ if(!value.is_array() || value.size() != 3) {
563
+ return false;
564
+ }
565
+ for(int i = 0; i < 3; i++) {
566
+ if(!value[i].is_number()) {
567
+ return false;
568
+ }
569
+ out[i] = value[i].get<T>();
570
+ }
571
+ return true;
572
+ }
573
+
574
+ static void normalize(T v[3]) {
575
+ const T norm = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
576
+ if(norm < static_cast<T>(1e-6)) {
577
+ v[0] = static_cast<T>(1);
578
+ v[1] = static_cast<T>(0);
579
+ v[2] = static_cast<T>(0);
580
+ return;
581
+ }
582
+ v[0] /= norm;
583
+ v[1] /= norm;
584
+ v[2] /= norm;
585
+ }
586
+
587
+ static double wrap_angle_delta(double delta) {
588
+ constexpr double two_pi = 2.0 * 3.14159265358979323846;
589
+ delta = std::fmod(delta + 3.14159265358979323846, two_pi);
590
+ if(delta < 0.0) {
591
+ delta += two_pi;
592
+ }
593
+ return delta - 3.14159265358979323846;
594
+ }
595
+
596
+ static void set_pose_yaw_pitch(TracePose& pose, double yaw, double pitch) {
597
+ pose.yaw = yaw;
598
+ pose.pitch = pitch;
599
+ pose.has_yaw_pitch = true;
600
+ pose.up[0] = static_cast<T>(0);
601
+ pose.up[1] = static_cast<T>(0);
602
+ pose.up[2] = static_cast<T>(1);
603
+ pose.look_at[0] = pose.eye[0] + static_cast<T>(std::cos(yaw) * std::cos(pitch));
604
+ pose.look_at[1] = pose.eye[1] + static_cast<T>(std::sin(yaw) * std::cos(pitch));
605
+ pose.look_at[2] = pose.eye[2] + static_cast<T>(std::sin(pitch));
606
+ }
607
+
608
+ static bool parse_pose(const json& pose_json, TracePose& pose) {
609
+ const json* source = &pose_json;
610
+ pose.timestamp_s = 0.0;
611
+ pose.has_timestamp = false;
612
+ pose.has_yaw_pitch = false;
613
+ if(pose_json.contains("timestamp_s") && pose_json["timestamp_s"].is_number()) {
614
+ pose.timestamp_s = pose_json["timestamp_s"].get<double>();
615
+ pose.has_timestamp = true;
616
+ }
617
+ if(pose_json.contains("renderer") && pose_json["renderer"].is_object()) {
618
+ source = &pose_json["renderer"];
619
+ }
620
+ if(!pose.has_timestamp && source->contains("timestamp_s") && (*source)["timestamp_s"].is_number()) {
621
+ pose.timestamp_s = (*source)["timestamp_s"].get<double>();
622
+ pose.has_timestamp = true;
623
+ }
624
+ if(!source->contains("position") || !read_vec3((*source)["position"], pose.eye)) {
625
+ return false;
626
+ }
627
+ if(source->contains("yaw") && source->contains("pitch") && (*source)["yaw"].is_number() && (*source)["pitch"].is_number()) {
628
+ pose.yaw = (*source)["yaw"].get<double>();
629
+ pose.pitch = (*source)["pitch"].get<double>();
630
+ pose.has_yaw_pitch = true;
631
+ }
632
+ if(source->contains("up")) {
633
+ if(!read_vec3((*source)["up"], pose.up)) {
634
+ return false;
635
+ }
636
+ }
637
+ else {
638
+ pose.up[0] = static_cast<T>(0);
639
+ pose.up[1] = static_cast<T>(0);
640
+ pose.up[2] = static_cast<T>(1);
641
+ }
642
+ if(source->contains("look_at")) {
643
+ return read_vec3((*source)["look_at"], pose.look_at);
644
+ }
645
+ if(source->contains("forward")) {
646
+ T forward[3];
647
+ if(!read_vec3((*source)["forward"], forward)) {
648
+ return false;
649
+ }
650
+ normalize(forward);
651
+ pose.look_at[0] = pose.eye[0] + forward[0];
652
+ pose.look_at[1] = pose.eye[1] + forward[1];
653
+ pose.look_at[2] = pose.eye[2] + forward[2];
654
+ return true;
655
+ }
656
+ if(source->contains("yaw") && source->contains("pitch") && (*source)["yaw"].is_number() && (*source)["pitch"].is_number()) {
657
+ set_pose_yaw_pitch(pose, pose.yaw, pose.pitch);
658
+ return true;
659
+ }
660
+ return false;
661
+ }
662
+
663
+ static bool load_trace(const Options& options, std::string& scene_path, std::vector<TracePose>& poses) {
664
+ json trace_json;
665
+ if(!read_json_file(options.trace_path, trace_json)) {
666
+ return false;
667
+ }
668
+ scene_path = options.scene_path;
669
+ if(scene_path.empty() && trace_json.contains("scene_path") && trace_json["scene_path"].is_string()) {
670
+ scene_path = trace_json["scene_path"].get<std::string>();
671
+ }
672
+ if(scene_path.empty()) {
673
+ std::cerr << "Trace JSON has no scene_path; pass --scene <path>" << std::endl;
674
+ return false;
675
+ }
676
+
677
+ if(trace_json.contains("poses") && trace_json["poses"].is_array()) {
678
+ for(const json& item : trace_json["poses"]) {
679
+ TracePose pose;
680
+ if(!parse_pose(item, pose)) {
681
+ std::cerr << "Invalid pose entry in trace JSON" << std::endl;
682
+ return false;
683
+ }
684
+ poses.push_back(pose);
685
+ if(options.max_frames > 0 && static_cast<int>(poses.size()) >= options.max_frames) {
686
+ break;
687
+ }
688
+ }
689
+ }
690
+ else {
691
+ TracePose pose;
692
+ if(!parse_pose(trace_json, pose)) {
693
+ std::cerr << "Trace JSON is neither a valid single pose nor a trace with poses[]" << std::endl;
694
+ return false;
695
+ }
696
+ poses.push_back(pose);
697
+ }
698
+ if(poses.empty()) {
699
+ std::cerr << "Trace contains no poses" << std::endl;
700
+ return false;
701
+ }
702
+ return true;
703
+ }
704
+
705
+ static T lerp_scalar(T a, T b, double t) {
706
+ return static_cast<T>(static_cast<double>(a) + (static_cast<double>(b) - static_cast<double>(a)) * t);
707
+ }
708
+
709
+ static void lerp_vec3(const T a[3], const T b[3], double t, T out[3]) {
710
+ out[0] = lerp_scalar(a[0], b[0], t);
711
+ out[1] = lerp_scalar(a[1], b[1], t);
712
+ out[2] = lerp_scalar(a[2], b[2], t);
713
+ }
714
+
715
+ static void pose_forward(const TracePose& pose, T out[3]) {
716
+ out[0] = pose.look_at[0] - pose.eye[0];
717
+ out[1] = pose.look_at[1] - pose.eye[1];
718
+ out[2] = pose.look_at[2] - pose.eye[2];
719
+ normalize(out);
720
+ }
721
+
722
+ static double dot_vec3(const T a[3], const T b[3]) {
723
+ return static_cast<double>(a[0]) * static_cast<double>(b[0])
724
+ + static_cast<double>(a[1]) * static_cast<double>(b[1])
725
+ + static_cast<double>(a[2]) * static_cast<double>(b[2]);
726
+ }
727
+
728
+ static bool normalize_vec3_checked(T v[3]) {
729
+ const double norm = std::sqrt(dot_vec3(v, v));
730
+ if(norm < 1e-9) {
731
+ return false;
732
+ }
733
+ v[0] = static_cast<T>(static_cast<double>(v[0]) / norm);
734
+ v[1] = static_cast<T>(static_cast<double>(v[1]) / norm);
735
+ v[2] = static_cast<T>(static_cast<double>(v[2]) / norm);
736
+ return true;
737
+ }
738
+
739
+ static void slerp_unit_vec3(const T a_in[3], const T b_in[3], double t, T out[3]) {
740
+ T a[3] = {a_in[0], a_in[1], a_in[2]};
741
+ T b[3] = {b_in[0], b_in[1], b_in[2]};
742
+ if(!normalize_vec3_checked(a)) {
743
+ a[0] = static_cast<T>(1);
744
+ a[1] = static_cast<T>(0);
745
+ a[2] = static_cast<T>(0);
746
+ }
747
+ if(!normalize_vec3_checked(b)) {
748
+ b[0] = a[0];
749
+ b[1] = a[1];
750
+ b[2] = a[2];
751
+ }
752
+
753
+ double d = dot_vec3(a, b);
754
+ d = std::min(std::max(d, -1.0), 1.0);
755
+ if(d > 0.9995) {
756
+ lerp_vec3(a, b, t, out);
757
+ normalize(out);
758
+ return;
759
+ }
760
+ if(d < -0.9995) {
761
+ T ortho[3] = {-a[1], a[0], static_cast<T>(0)};
762
+ if(!normalize_vec3_checked(ortho)) {
763
+ ortho[0] = -a[2];
764
+ ortho[1] = static_cast<T>(0);
765
+ ortho[2] = a[0];
766
+ normalize_vec3_checked(ortho);
767
+ }
768
+ const double angle = 3.14159265358979323846 * t;
769
+ const double ca = std::cos(angle);
770
+ const double sa = std::sin(angle);
771
+ for(int i = 0; i < 3; i++) {
772
+ out[i] = static_cast<T>(ca * static_cast<double>(a[i]) + sa * static_cast<double>(ortho[i]));
773
+ }
774
+ normalize(out);
775
+ return;
776
+ }
777
+
778
+ const double theta = std::acos(d);
779
+ const double sin_theta = std::sin(theta);
780
+ const double wa = std::sin((1.0 - t) * theta) / sin_theta;
781
+ const double wb = std::sin(t * theta) / sin_theta;
782
+ for(int i = 0; i < 3; i++) {
783
+ out[i] = static_cast<T>(wa * static_cast<double>(a[i]) + wb * static_cast<double>(b[i]));
784
+ }
785
+ normalize(out);
786
+ }
787
+
788
+ static void orthonormalize_up_for_forward(const T forward[3], const T preferred_up[3], T up[3]) {
789
+ up[0] = preferred_up[0];
790
+ up[1] = preferred_up[1];
791
+ up[2] = preferred_up[2];
792
+ const double projection = dot_vec3(up, forward);
793
+ for(int i = 0; i < 3; i++) {
794
+ up[i] = static_cast<T>(static_cast<double>(up[i]) - projection * static_cast<double>(forward[i]));
795
+ }
796
+ if(normalize_vec3_checked(up)) {
797
+ return;
798
+ }
799
+ T fallback[3] = {static_cast<T>(0), static_cast<T>(0), static_cast<T>(1)};
800
+ if(std::fabs(dot_vec3(fallback, forward)) > 0.95) {
801
+ fallback[0] = static_cast<T>(0);
802
+ fallback[1] = static_cast<T>(1);
803
+ fallback[2] = static_cast<T>(0);
804
+ }
805
+ const double fallback_projection = dot_vec3(fallback, forward);
806
+ for(int i = 0; i < 3; i++) {
807
+ up[i] = static_cast<T>(static_cast<double>(fallback[i]) - fallback_projection * static_cast<double>(forward[i]));
808
+ }
809
+ normalize(up);
810
+ }
811
+
812
+ static TracePose interpolate_pose(const TracePose& a, const TracePose& b, double timestamp_s) {
813
+ const double duration = b.timestamp_s - a.timestamp_s;
814
+ const double t = duration > 0.0 ? std::min(std::max((timestamp_s - a.timestamp_s) / duration, 0.0), 1.0) : 0.0;
815
+
816
+ TracePose out;
817
+ lerp_vec3(a.eye, b.eye, t, out.eye);
818
+
819
+ if(a.has_yaw_pitch && b.has_yaw_pitch) {
820
+ const double yaw = a.yaw + wrap_angle_delta(b.yaw - a.yaw) * t;
821
+ const double pitch = static_cast<double>(a.pitch) + (static_cast<double>(b.pitch) - static_cast<double>(a.pitch)) * t;
822
+ set_pose_yaw_pitch(out, yaw, pitch);
823
+ out.timestamp_s = timestamp_s;
824
+ out.has_timestamp = true;
825
+ return out;
826
+ }
827
+
828
+ T forward_a[3];
829
+ T forward_b[3];
830
+ T forward[3];
831
+ pose_forward(a, forward_a);
832
+ pose_forward(b, forward_b);
833
+ slerp_unit_vec3(forward_a, forward_b, t, forward);
834
+
835
+ T up_preferred[3];
836
+ slerp_unit_vec3(a.up, b.up, t, up_preferred);
837
+ orthonormalize_up_for_forward(forward, up_preferred, out.up);
838
+
839
+ out.look_at[0] = out.eye[0] + forward[0];
840
+ out.look_at[1] = out.eye[1] + forward[1];
841
+ out.look_at[2] = out.eye[2] + forward[2];
842
+ out.timestamp_s = timestamp_s;
843
+ out.has_timestamp = true;
844
+ return out;
845
+ }
846
+
847
+ static bool trace_timestamp_stats(const std::vector<TracePose>& poses, double& duration_s, double& implied_fps) {
848
+ duration_s = 0.0;
849
+ implied_fps = 0.0;
850
+ if(poses.size() < 2) {
851
+ return false;
852
+ }
853
+ for(size_t i = 0; i < poses.size(); i++) {
854
+ if(!poses[i].has_timestamp || !std::isfinite(poses[i].timestamp_s)) {
855
+ return false;
856
+ }
857
+ if(i > 0 && poses[i].timestamp_s <= poses[i - 1].timestamp_s) {
858
+ return false;
859
+ }
860
+ }
861
+ duration_s = poses.back().timestamp_s - poses.front().timestamp_s;
862
+ if(duration_s <= 0.0) {
863
+ return false;
864
+ }
865
+ implied_fps = static_cast<double>(poses.size() - 1) / duration_s;
866
+ return true;
867
+ }
868
+
869
+ static std::vector<TracePose> resample_trace(const std::vector<TracePose>& source, int fps, double& duration_s, double& implied_fps, bool& timestamp_resampled) {
870
+ timestamp_resampled = false;
871
+ if(!trace_timestamp_stats(source, duration_s, implied_fps)) {
872
+ return source;
873
+ }
874
+
875
+ const size_t output_frames = std::max<size_t>(1, static_cast<size_t>(std::ceil(duration_s * static_cast<double>(fps))));
876
+ std::vector<TracePose> resampled;
877
+ resampled.reserve(output_frames);
878
+
879
+ size_t segment = 0;
880
+ const double start_s = source.front().timestamp_s;
881
+ for(size_t frame_i = 0; frame_i < output_frames; frame_i++) {
882
+ const double target_s = std::min(start_s + static_cast<double>(frame_i) / static_cast<double>(fps), source.back().timestamp_s);
883
+ while(segment + 1 < source.size() && source[segment + 1].timestamp_s < target_s) {
884
+ segment++;
885
+ }
886
+ if(segment + 1 >= source.size()) {
887
+ resampled.push_back(source.back());
888
+ }
889
+ else {
890
+ resampled.push_back(interpolate_pose(source[segment], source[segment + 1], target_s));
891
+ }
892
+ }
893
+ timestamp_resampled = true;
894
+ return resampled;
895
+ }
896
+
897
+ struct Quaternion {
898
+ double w = 1.0;
899
+ double x = 0.0;
900
+ double y = 0.0;
901
+ double z = 0.0;
902
+ };
903
+
904
+ static double dot_quaternion(const Quaternion& a, const Quaternion& b) {
905
+ return a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z;
906
+ }
907
+
908
+ static Quaternion negate_quaternion(const Quaternion& q) {
909
+ Quaternion out;
910
+ out.w = -q.w;
911
+ out.x = -q.x;
912
+ out.y = -q.y;
913
+ out.z = -q.z;
914
+ return out;
915
+ }
916
+
917
+ static Quaternion normalize_quaternion(const Quaternion& q) {
918
+ const double norm = std::sqrt(dot_quaternion(q, q));
919
+ if(norm < 1e-12) {
920
+ return Quaternion{};
921
+ }
922
+ Quaternion out;
923
+ out.w = q.w / norm;
924
+ out.x = q.x / norm;
925
+ out.y = q.y / norm;
926
+ out.z = q.z / norm;
927
+ return out;
928
+ }
929
+
930
+ static double quaternion_angle(const Quaternion& a, const Quaternion& b) {
931
+ const Quaternion an = normalize_quaternion(a);
932
+ const Quaternion bn = normalize_quaternion(b);
933
+ double d = std::fabs(dot_quaternion(an, bn));
934
+ d = std::min(std::max(d, -1.0), 1.0);
935
+ return 2.0 * std::acos(d);
936
+ }
937
+
938
+ static Quaternion slerp_quaternion(const Quaternion& a_in, const Quaternion& b_in, double t) {
939
+ Quaternion a = normalize_quaternion(a_in);
940
+ Quaternion b = normalize_quaternion(b_in);
941
+ double d = dot_quaternion(a, b);
942
+ if(d < 0.0) {
943
+ b = negate_quaternion(b);
944
+ d = -d;
945
+ }
946
+ d = std::min(std::max(d, -1.0), 1.0);
947
+ if(d > 0.9995) {
948
+ Quaternion out;
949
+ out.w = a.w + (b.w - a.w) * t;
950
+ out.x = a.x + (b.x - a.x) * t;
951
+ out.y = a.y + (b.y - a.y) * t;
952
+ out.z = a.z + (b.z - a.z) * t;
953
+ return normalize_quaternion(out);
954
+ }
955
+ const double theta = std::acos(d);
956
+ const double sin_theta = std::sin(theta);
957
+ const double wa = std::sin((1.0 - t) * theta) / sin_theta;
958
+ const double wb = std::sin(t * theta) / sin_theta;
959
+ Quaternion out;
960
+ out.w = wa * a.w + wb * b.w;
961
+ out.x = wa * a.x + wb * b.x;
962
+ out.y = wa * a.y + wb * b.y;
963
+ out.z = wa * a.z + wb * b.z;
964
+ return normalize_quaternion(out);
965
+ }
966
+
967
+ static void cross3(const T a[3], const T b[3], T out[3]) {
968
+ out[0] = a[1] * b[2] - a[2] * b[1];
969
+ out[1] = a[2] * b[0] - a[0] * b[2];
970
+ out[2] = a[0] * b[1] - a[1] * b[0];
971
+ }
972
+
973
+ static double norm3(const T v[3]) {
974
+ return std::sqrt(static_cast<double>(v[0]) * static_cast<double>(v[0]) + static_cast<double>(v[1]) * static_cast<double>(v[1]) + static_cast<double>(v[2]) * static_cast<double>(v[2]));
975
+ }
976
+
977
+ static bool normalize3(T v[3]) {
978
+ const double norm = norm3(v);
979
+ if(norm < 1e-9) {
980
+ return false;
981
+ }
982
+ v[0] = static_cast<T>(static_cast<double>(v[0]) / norm);
983
+ v[1] = static_cast<T>(static_cast<double>(v[1]) / norm);
984
+ v[2] = static_cast<T>(static_cast<double>(v[2]) / norm);
985
+ return true;
986
+ }
987
+
988
+ static void pose_basis(const TracePose& pose, T forward[3], T left[3], T up[3]) {
989
+ pose_forward(pose, forward);
990
+ up[0] = pose.up[0];
991
+ up[1] = pose.up[1];
992
+ up[2] = pose.up[2];
993
+ if(!normalize3(up)) {
994
+ up[0] = static_cast<T>(0);
995
+ up[1] = static_cast<T>(0);
996
+ up[2] = static_cast<T>(1);
997
+ }
998
+ cross3(up, forward, left);
999
+ if(!normalize3(left)) {
1000
+ T reference_up[3] = {static_cast<T>(0), static_cast<T>(0), static_cast<T>(1)};
1001
+ cross3(reference_up, forward, left);
1002
+ if(!normalize3(left)) {
1003
+ reference_up[0] = static_cast<T>(0);
1004
+ reference_up[1] = static_cast<T>(1);
1005
+ reference_up[2] = static_cast<T>(0);
1006
+ cross3(reference_up, forward, left);
1007
+ normalize3(left);
1008
+ }
1009
+ }
1010
+ cross3(forward, left, up);
1011
+ normalize3(up);
1012
+ }
1013
+
1014
+ static Quaternion quaternion_from_basis(const T forward[3], const T left[3], const T up[3]) {
1015
+ const double m00 = forward[0];
1016
+ const double m01 = left[0];
1017
+ const double m02 = up[0];
1018
+ const double m10 = forward[1];
1019
+ const double m11 = left[1];
1020
+ const double m12 = up[1];
1021
+ const double m20 = forward[2];
1022
+ const double m21 = left[2];
1023
+ const double m22 = up[2];
1024
+ Quaternion q;
1025
+ const double trace = m00 + m11 + m22;
1026
+ if(trace > 0.0) {
1027
+ const double s = std::sqrt(trace + 1.0) * 2.0;
1028
+ q.w = 0.25 * s;
1029
+ q.x = (m21 - m12) / s;
1030
+ q.y = (m02 - m20) / s;
1031
+ q.z = (m10 - m01) / s;
1032
+ }
1033
+ else if(m00 > m11 && m00 > m22) {
1034
+ const double s = std::sqrt(1.0 + m00 - m11 - m22) * 2.0;
1035
+ q.w = (m21 - m12) / s;
1036
+ q.x = 0.25 * s;
1037
+ q.y = (m01 + m10) / s;
1038
+ q.z = (m02 + m20) / s;
1039
+ }
1040
+ else if(m11 > m22) {
1041
+ const double s = std::sqrt(1.0 + m11 - m00 - m22) * 2.0;
1042
+ q.w = (m02 - m20) / s;
1043
+ q.x = (m01 + m10) / s;
1044
+ q.y = 0.25 * s;
1045
+ q.z = (m12 + m21) / s;
1046
+ }
1047
+ else {
1048
+ const double s = std::sqrt(1.0 + m22 - m00 - m11) * 2.0;
1049
+ q.w = (m10 - m01) / s;
1050
+ q.x = (m02 + m20) / s;
1051
+ q.y = (m12 + m21) / s;
1052
+ q.z = 0.25 * s;
1053
+ }
1054
+ return normalize_quaternion(q);
1055
+ }
1056
+
1057
+ static Quaternion pose_quaternion(const TracePose& pose) {
1058
+ T forward[3];
1059
+ T left[3];
1060
+ T up[3];
1061
+ pose_basis(pose, forward, left, up);
1062
+ return quaternion_from_basis(forward, left, up);
1063
+ }
1064
+
1065
+ static void quaternion_to_forward_up(const Quaternion& q_in, T forward[3], T up[3]) {
1066
+ const Quaternion q = normalize_quaternion(q_in);
1067
+ const double xx = q.x * q.x;
1068
+ const double yy = q.y * q.y;
1069
+ const double zz = q.z * q.z;
1070
+ const double xy = q.x * q.y;
1071
+ const double xz = q.x * q.z;
1072
+ const double yz = q.y * q.z;
1073
+ const double wx = q.w * q.x;
1074
+ const double wy = q.w * q.y;
1075
+ const double wz = q.w * q.z;
1076
+
1077
+ forward[0] = static_cast<T>(1.0 - 2.0 * (yy + zz));
1078
+ forward[1] = static_cast<T>(2.0 * (xy + wz));
1079
+ forward[2] = static_cast<T>(2.0 * (xz - wy));
1080
+
1081
+ up[0] = static_cast<T>(2.0 * (xz + wy));
1082
+ up[1] = static_cast<T>(2.0 * (yz - wx));
1083
+ up[2] = static_cast<T>(1.0 - 2.0 * (xx + yy));
1084
+ normalize(forward);
1085
+ normalize(up);
1086
+ }
1087
+
1088
+ static std::vector<double> smoothing_times(const std::vector<TracePose>& poses, int fps) {
1089
+ double duration_s = 0.0;
1090
+ double implied_fps = 0.0;
1091
+ const bool use_trace_timestamps = trace_timestamp_stats(poses, duration_s, implied_fps);
1092
+ std::vector<double> times;
1093
+ times.reserve(poses.size());
1094
+ for(size_t i = 0; i < poses.size(); i++) {
1095
+ times.push_back(use_trace_timestamps ? poses[i].timestamp_s : static_cast<double>(i) / static_cast<double>(fps));
1096
+ }
1097
+ return times;
1098
+ }
1099
+
1100
+ static double gaussian_weight(double dt, double sigma_s) {
1101
+ const double x = dt / sigma_s;
1102
+ return std::exp(-0.5 * x * x);
1103
+ }
1104
+
1105
+ static bool trace_has_yaw_pitch(const std::vector<TracePose>& poses) {
1106
+ if(poses.empty()) {
1107
+ return false;
1108
+ }
1109
+ for(const TracePose& pose : poses) {
1110
+ if(!pose.has_yaw_pitch || !std::isfinite(pose.yaw) || !std::isfinite(pose.pitch)) {
1111
+ return false;
1112
+ }
1113
+ }
1114
+ return true;
1115
+ }
1116
+
1117
+ static std::vector<double> gaussian_smooth_scalar(const std::vector<double>& values, const std::vector<double>& times, double sigma_s) {
1118
+ if(sigma_s <= 0.0 || values.size() < 2) {
1119
+ return values;
1120
+ }
1121
+ std::vector<double> output(values.size());
1122
+ const double radius_s = 3.0 * sigma_s;
1123
+ for(size_t i = 0; i < values.size(); i++) {
1124
+ const auto begin_it = std::lower_bound(times.begin(), times.end(), times[i] - radius_s);
1125
+ const auto end_it = std::upper_bound(times.begin(), times.end(), times[i] + radius_s);
1126
+ const size_t begin = static_cast<size_t>(begin_it - times.begin());
1127
+ const size_t end = static_cast<size_t>(end_it - times.begin());
1128
+ double sum_w = 0.0;
1129
+ double sum = 0.0;
1130
+ for(size_t j = begin; j < end; j++) {
1131
+ const double w = gaussian_weight(times[j] - times[i], sigma_s);
1132
+ sum_w += w;
1133
+ sum += w * values[j];
1134
+ }
1135
+ output[i] = sum_w > 0.0 ? sum / sum_w : values[i];
1136
+ }
1137
+ return output;
1138
+ }
1139
+
1140
+ static void limit_yaw_pitch_speed(const std::vector<double>& input_yaw, const std::vector<double>& input_pitch, const std::vector<double>& times, double max_speed_rad_s, double ramp_multiplier, std::vector<double>& yaw, std::vector<double>& pitch) {
1141
+ yaw = input_yaw;
1142
+ pitch = input_pitch;
1143
+ if(max_speed_rad_s <= 0.0 || yaw.size() < 2) {
1144
+ return;
1145
+ }
1146
+ const double ramp_scale = std::max(ramp_multiplier, 1.0);
1147
+ bool ramping = false;
1148
+ for(size_t i = 1; i < yaw.size(); i++) {
1149
+ double dt = times[i] - times[i - 1];
1150
+ if(dt <= 1e-6 || !std::isfinite(dt)) {
1151
+ dt = 1.0 / 30.0;
1152
+ }
1153
+ const double trigger_angle = max_speed_rad_s * dt;
1154
+ const double ramp_angle = trigger_angle / ramp_scale;
1155
+ const double input_delta_yaw = input_yaw[i] - input_yaw[i - 1];
1156
+ const double input_delta_pitch = input_pitch[i] - input_pitch[i - 1];
1157
+ const double input_angle = std::sqrt(input_delta_yaw * input_delta_yaw + input_delta_pitch * input_delta_pitch);
1158
+ const double target_delta_yaw = input_yaw[i] - yaw[i - 1];
1159
+ const double target_delta_pitch = input_pitch[i] - pitch[i - 1];
1160
+ const double target_angle = std::sqrt(target_delta_yaw * target_delta_yaw + target_delta_pitch * target_delta_pitch);
1161
+ if(ramping || input_angle > trigger_angle) {
1162
+ if(ramp_angle > 0.0 && target_angle > ramp_angle) {
1163
+ const double alpha = ramp_angle / target_angle;
1164
+ yaw[i] = yaw[i - 1] + target_delta_yaw * alpha;
1165
+ pitch[i] = pitch[i - 1] + target_delta_pitch * alpha;
1166
+ ramping = true;
1167
+ }
1168
+ else {
1169
+ yaw[i] = input_yaw[i];
1170
+ pitch[i] = input_pitch[i];
1171
+ ramping = false;
1172
+ }
1173
+ }
1174
+ }
1175
+ }
1176
+
1177
+ static std::vector<TracePose> filter_yaw_pitch_trace(const std::vector<TracePose>& input, const Options& options, bool& yaw_pitch_filter_applied) {
1178
+ const bool filter_requested = options.max_orientation_speed_rad_s > 0.0;
1179
+ yaw_pitch_filter_applied = false;
1180
+ if(!filter_requested || input.size() < 2 || !trace_has_yaw_pitch(input)) {
1181
+ return input;
1182
+ }
1183
+
1184
+ const std::vector<double> times = smoothing_times(input, options.fps);
1185
+ std::vector<double> input_yaw(input.size());
1186
+ std::vector<double> input_pitch(input.size());
1187
+ input_yaw[0] = input[0].yaw;
1188
+ input_pitch[0] = input[0].pitch;
1189
+ for(size_t i = 1; i < input.size(); i++) {
1190
+ input_yaw[i] = input_yaw[i - 1] + wrap_angle_delta(input[i].yaw - input[i - 1].yaw);
1191
+ input_pitch[i] = input[i].pitch;
1192
+ }
1193
+
1194
+ std::vector<double> yaw;
1195
+ std::vector<double> pitch;
1196
+ limit_yaw_pitch_speed(
1197
+ input_yaw,
1198
+ input_pitch,
1199
+ times,
1200
+ options.max_orientation_speed_rad_s,
1201
+ options.orientation_jump_ramp_multiplier,
1202
+ yaw,
1203
+ pitch
1204
+ );
1205
+
1206
+ std::vector<TracePose> output = input;
1207
+ for(size_t i = 0; i < output.size(); i++) {
1208
+ set_pose_yaw_pitch(output[i], yaw[i], pitch[i]);
1209
+ }
1210
+ yaw_pitch_filter_applied = true;
1211
+ return output;
1212
+ }
1213
+
1214
+ static std::vector<Quaternion> pose_quaternions_continuous(const std::vector<TracePose>& poses) {
1215
+ std::vector<Quaternion> quaternions;
1216
+ quaternions.reserve(poses.size());
1217
+ for(const TracePose& pose : poses) {
1218
+ Quaternion q = pose_quaternion(pose);
1219
+ if(!quaternions.empty() && dot_quaternion(q, quaternions.back()) < 0.0) {
1220
+ q = negate_quaternion(q);
1221
+ }
1222
+ quaternions.push_back(q);
1223
+ }
1224
+ return quaternions;
1225
+ }
1226
+
1227
+ static void smooth_position_at(const std::vector<TracePose>& input, const std::vector<double>& times, size_t i, double sigma_s, T eye[3]) {
1228
+ const double radius_s = 3.0 * sigma_s;
1229
+ const auto begin_it = std::lower_bound(times.begin(), times.end(), times[i] - radius_s);
1230
+ const auto end_it = std::upper_bound(times.begin(), times.end(), times[i] + radius_s);
1231
+ const size_t begin = static_cast<size_t>(begin_it - times.begin());
1232
+ const size_t end = static_cast<size_t>(end_it - times.begin());
1233
+ double sum_w = 0.0;
1234
+ double sum[3] = {0.0, 0.0, 0.0};
1235
+ for(size_t j = begin; j < end; j++) {
1236
+ const double w = gaussian_weight(times[j] - times[i], sigma_s);
1237
+ sum_w += w;
1238
+ sum[0] += w * static_cast<double>(input[j].eye[0]);
1239
+ sum[1] += w * static_cast<double>(input[j].eye[1]);
1240
+ sum[2] += w * static_cast<double>(input[j].eye[2]);
1241
+ }
1242
+ if(sum_w <= 0.0) {
1243
+ eye[0] = input[i].eye[0];
1244
+ eye[1] = input[i].eye[1];
1245
+ eye[2] = input[i].eye[2];
1246
+ return;
1247
+ }
1248
+ eye[0] = static_cast<T>(sum[0] / sum_w);
1249
+ eye[1] = static_cast<T>(sum[1] / sum_w);
1250
+ eye[2] = static_cast<T>(sum[2] / sum_w);
1251
+ }
1252
+
1253
+ static Quaternion smooth_orientation_at(const std::vector<Quaternion>& quaternions, const std::vector<double>& times, size_t i, double sigma_s) {
1254
+ const double radius_s = 3.0 * sigma_s;
1255
+ const auto begin_it = std::lower_bound(times.begin(), times.end(), times[i] - radius_s);
1256
+ const auto end_it = std::upper_bound(times.begin(), times.end(), times[i] + radius_s);
1257
+ const size_t begin = static_cast<size_t>(begin_it - times.begin());
1258
+ const size_t end = static_cast<size_t>(end_it - times.begin());
1259
+ Quaternion sum;
1260
+ sum.w = 0.0;
1261
+ sum.x = 0.0;
1262
+ sum.y = 0.0;
1263
+ sum.z = 0.0;
1264
+ for(size_t j = begin; j < end; j++) {
1265
+ double w = gaussian_weight(times[j] - times[i], sigma_s);
1266
+ Quaternion q = quaternions[j];
1267
+ if(dot_quaternion(q, quaternions[i]) < 0.0) {
1268
+ q = negate_quaternion(q);
1269
+ }
1270
+ sum.w += w * q.w;
1271
+ sum.x += w * q.x;
1272
+ sum.y += w * q.y;
1273
+ sum.z += w * q.z;
1274
+ }
1275
+ return normalize_quaternion(sum);
1276
+ }
1277
+
1278
+ static std::vector<Quaternion> limit_orientation_speed(const std::vector<Quaternion>& input, const std::vector<double>& times, double max_speed_rad_s, double ramp_multiplier) {
1279
+ if(max_speed_rad_s <= 0.0 || input.size() < 2) {
1280
+ return input;
1281
+ }
1282
+ const double ramp_scale = std::max(ramp_multiplier, 1.0);
1283
+ std::vector<Quaternion> output = input;
1284
+ bool ramping = false;
1285
+ for(size_t i = 1; i < output.size(); i++) {
1286
+ double dt = times[i] - times[i - 1];
1287
+ if(dt <= 1e-6 || !std::isfinite(dt)) {
1288
+ dt = 1.0 / 30.0;
1289
+ }
1290
+ const double trigger_angle = max_speed_rad_s * dt;
1291
+ const double ramp_angle = trigger_angle / ramp_scale;
1292
+ const double input_angle = quaternion_angle(input[i - 1], input[i]);
1293
+ const double target_angle = quaternion_angle(output[i - 1], input[i]);
1294
+ if(ramping || input_angle > trigger_angle) {
1295
+ if(ramp_angle > 0.0 && target_angle > ramp_angle) {
1296
+ output[i] = slerp_quaternion(output[i - 1], input[i], ramp_angle / target_angle);
1297
+ ramping = true;
1298
+ }
1299
+ else {
1300
+ output[i] = input[i];
1301
+ ramping = false;
1302
+ }
1303
+ }
1304
+ }
1305
+ return output;
1306
+ }
1307
+
1308
+ static void set_pose_orientation(TracePose& pose, const Quaternion& q) {
1309
+ T forward[3];
1310
+ T up[3];
1311
+ quaternion_to_forward_up(q, forward, up);
1312
+ pose.up[0] = up[0];
1313
+ pose.up[1] = up[1];
1314
+ pose.up[2] = up[2];
1315
+ pose.look_at[0] = pose.eye[0] + forward[0];
1316
+ pose.look_at[1] = pose.eye[1] + forward[1];
1317
+ pose.look_at[2] = pose.eye[2] + forward[2];
1318
+ }
1319
+
1320
+ static std::vector<TracePose> smooth_trace(const std::vector<TracePose>& input, const Options& options, bool& smoothing_applied, bool source_yaw_pitch_filter_applied) {
1321
+ const bool smoothing_requested = options.smooth_position_sigma_s > 0.0 ||
1322
+ options.smooth_orientation_sigma_s > 0.0 ||
1323
+ (!source_yaw_pitch_filter_applied && options.max_orientation_speed_rad_s > 0.0);
1324
+ smoothing_applied = smoothing_requested && input.size() >= 2;
1325
+ if(!smoothing_applied) {
1326
+ return input;
1327
+ }
1328
+
1329
+ const std::vector<double> times = smoothing_times(input, options.fps);
1330
+ std::vector<TracePose> output = input;
1331
+
1332
+ if(options.smooth_position_sigma_s > 0.0) {
1333
+ for(size_t i = 0; i < input.size(); i++) {
1334
+ T forward[3];
1335
+ pose_forward(input[i], forward);
1336
+ smooth_position_at(input, times, i, options.smooth_position_sigma_s, output[i].eye);
1337
+ output[i].look_at[0] = output[i].eye[0] + forward[0];
1338
+ output[i].look_at[1] = output[i].eye[1] + forward[1];
1339
+ output[i].look_at[2] = output[i].eye[2] + forward[2];
1340
+ }
1341
+ }
1342
+
1343
+ if(options.smooth_orientation_sigma_s > 0.0 || (!source_yaw_pitch_filter_applied && options.max_orientation_speed_rad_s > 0.0)) {
1344
+ if(trace_has_yaw_pitch(input)) {
1345
+ std::vector<double> input_yaw(input.size());
1346
+ std::vector<double> input_pitch(input.size());
1347
+ input_yaw[0] = input[0].yaw;
1348
+ input_pitch[0] = input[0].pitch;
1349
+ for(size_t i = 1; i < input.size(); i++) {
1350
+ input_yaw[i] = input_yaw[i - 1] + wrap_angle_delta(input[i].yaw - input[i - 1].yaw);
1351
+ input_pitch[i] = input[i].pitch;
1352
+ }
1353
+ std::vector<double> yaw = input_yaw;
1354
+ std::vector<double> pitch = input_pitch;
1355
+ if(!source_yaw_pitch_filter_applied) {
1356
+ limit_yaw_pitch_speed(
1357
+ input_yaw,
1358
+ input_pitch,
1359
+ times,
1360
+ options.max_orientation_speed_rad_s,
1361
+ options.orientation_jump_ramp_multiplier,
1362
+ yaw,
1363
+ pitch
1364
+ );
1365
+ }
1366
+ yaw = gaussian_smooth_scalar(yaw, times, options.smooth_orientation_sigma_s);
1367
+ pitch = gaussian_smooth_scalar(pitch, times, options.smooth_orientation_sigma_s);
1368
+ for(size_t i = 0; i < input.size(); i++) {
1369
+ set_pose_yaw_pitch(output[i], yaw[i], pitch[i]);
1370
+ }
1371
+ }
1372
+ else {
1373
+ std::vector<Quaternion> quaternions = pose_quaternions_continuous(input);
1374
+ quaternions = limit_orientation_speed(
1375
+ quaternions,
1376
+ times,
1377
+ options.max_orientation_speed_rad_s,
1378
+ options.orientation_jump_ramp_multiplier
1379
+ );
1380
+ for(size_t i = 0; i < input.size(); i++) {
1381
+ const Quaternion q = options.smooth_orientation_sigma_s > 0.0
1382
+ ? smooth_orientation_at(quaternions, times, i, options.smooth_orientation_sigma_s)
1383
+ : quaternions[i];
1384
+ set_pose_orientation(output[i], q);
1385
+ }
1386
+ }
1387
+ }
1388
+
1389
+ return output;
1390
+ }
1391
+
1392
+ static std::string resolution_suffix(TI width, TI height) {
1393
+ return std::to_string(width) + "x" + std::to_string(height);
1394
+ }
1395
+
1396
+ static std::string aa_suffix(bool enabled, TI grid_size) {
1397
+ return enabled ? std::string("_aa") + std::to_string(grid_size) : std::string();
1398
+ }
1399
+
1400
+ static std::string aa_name(bool enabled, TI grid_size) {
1401
+ return enabled ? std::string("aa") + std::to_string(grid_size) : std::string("none");
1402
+ }
1403
+
1404
+ static TI video_oversampling_factor(TI width, TI height) {
1405
+ const TI width_factor = width < MIN_VIDEO_DIMENSION ? (MIN_VIDEO_DIMENSION + width - 1) / width : static_cast<TI>(1);
1406
+ const TI height_factor = height < MIN_VIDEO_DIMENSION ? (MIN_VIDEO_DIMENSION + height - 1) / height : static_cast<TI>(1);
1407
+ return std::max(width_factor, height_factor);
1408
+ }
1409
+
1410
+ static std::string ffmpeg_command(const Options& options, TI width, TI height, TI video_width, TI video_height, const std::string& output_path) {
1411
+ std::ostringstream cmd;
1412
+ cmd << shell_quote(options.ffmpeg)
1413
+ << " -hide_banner -loglevel error -y -f rawvideo -pix_fmt rgba"
1414
+ << " -s " << width << "x" << height
1415
+ << " -r " << options.fps
1416
+ << " -i -";
1417
+ if(video_width != width || video_height != height) {
1418
+ cmd << " -vf scale=" << video_width << ":" << video_height << ":flags=neighbor";
1419
+ }
1420
+ cmd << " -an -c:v " << video_encoder_name(options);
1421
+ if(options.ffmpeg_gpu) {
1422
+ cmd << " -preset p4 -tune hq -rc constqp -qp 19";
1423
+ }
1424
+ cmd << " -pix_fmt yuv420p " << shell_quote(output_path);
1425
+ return cmd.str();
1426
+ }
1427
+
1428
+ static bool write_frame(FILE* pipe, const std::vector<uint32_t>& frame, int frame_i) {
1429
+ const size_t bytes = frame.size() * sizeof(uint32_t);
1430
+ const size_t written = std::fwrite(frame.data(), 1, bytes, pipe);
1431
+ if(written != bytes) {
1432
+ std::cerr << "Failed writing frame " << frame_i << " to ffmpeg" << std::endl;
1433
+ return false;
1434
+ }
1435
+ return true;
1436
+ }
1437
+
1438
+ static bool use_png_frames(TI width, TI height) {
1439
+ return width == height && (width == 64 || width == 128);
1440
+ }
1441
+
1442
+ static const char* frame_extension(bool png) {
1443
+ return png ? "png" : "jpg";
1444
+ }
1445
+
1446
+ static const char* frame_format_name(bool png) {
1447
+ return png ? "png_rgb" : "jpeg_rgb";
1448
+ }
1449
+
1450
+ static std::string frame_filename(const std::string& frames_dir, size_t frame_i, bool png) {
1451
+ char filename[64];
1452
+ std::snprintf(filename, sizeof(filename), "frame_%06zu.%s", frame_i, frame_extension(png));
1453
+ return join_path(frames_dir, filename);
1454
+ }
1455
+
1456
+ static bool write_rgb_image_frame(const std::string& path, const std::vector<uint32_t>& frame, std::vector<uint8_t>& rgb_frame, TI width, TI height, bool png) {
1457
+ const size_t pixels = frame.size();
1458
+ if(rgb_frame.size() != pixels * 3) {
1459
+ rgb_frame.resize(pixels * 3);
1460
+ }
1461
+ for(size_t i = 0; i < pixels; i++) {
1462
+ const uint32_t rgba = frame[i];
1463
+ rgb_frame[i * 3 + 0] = static_cast<uint8_t>((rgba >> 0) & 0xFF);
1464
+ rgb_frame[i * 3 + 1] = static_cast<uint8_t>((rgba >> 8) & 0xFF);
1465
+ rgb_frame[i * 3 + 2] = static_cast<uint8_t>((rgba >> 16) & 0xFF);
1466
+ }
1467
+ const int write_ok = png
1468
+ ? stbi_write_png(path.c_str(), width, height, 3, rgb_frame.data(), width * 3)
1469
+ : stbi_write_jpg(path.c_str(), width, height, 3, rgb_frame.data(), FRAME_JPEG_QUALITY);
1470
+ if(write_ok == 0) {
1471
+ std::cerr << "Failed writing RGB " << (png ? "PNG" : "JPEG") << " frame: " << path << std::endl;
1472
+ return false;
1473
+ }
1474
+ return true;
1475
+ }
1476
+
1477
+ static void depth_range(const float* depth, size_t count, float max_depth, float& min_depth, float& max_valid_depth) {
1478
+ const float sentinel = max_depth * 0.999f;
1479
+ for(size_t i = 0; i < count; i++) {
1480
+ const float value = depth[i];
1481
+ if(std::isfinite(value) && value > 0.f && value < sentinel) {
1482
+ min_depth = std::min(min_depth, value);
1483
+ max_valid_depth = std::max(max_valid_depth, value);
1484
+ }
1485
+ }
1486
+ }
1487
+
1488
+ static void depth_to_rgba(const float* depth, std::vector<uint32_t>& frame, float max_depth, float min_valid_depth, float max_valid_depth) {
1489
+ const float sentinel = max_depth * 0.999f;
1490
+ const bool has_valid_depth = min_valid_depth <= max_valid_depth;
1491
+ const float range = has_valid_depth ? max_valid_depth - min_valid_depth : 0.f;
1492
+ for(size_t i = 0; i < frame.size(); i++) {
1493
+ uint8_t value = 0;
1494
+ const float d = depth[i];
1495
+ if(has_valid_depth && std::isfinite(d) && d > 0.f && d < sentinel) {
1496
+ const float normalized = std::fmin(std::fmax((d - min_valid_depth) / (range + 1e-6f), 0.f), 1.f);
1497
+ value = static_cast<uint8_t>((1.f - normalized) * 255.f);
1498
+ }
1499
+ frame[i] = (0xFFu << 24) | (uint32_t(value) << 16) | (uint32_t(value) << 8) | uint32_t(value);
1500
+ }
1501
+ }
1502
+
1503
+ template <typename SPEC>
1504
+ static bool render_trace_for_setting(rlt::devices::DEVICE_FACTORY<>& device, const Options& options, const std::string& scene_path, const std::vector<TracePose>& poses, const char* output_name, const char* profile_name, RenderRecord& record) {
1505
+ constexpr TI WIDTH = SPEC::CAM_WIDTH;
1506
+ constexpr TI HEIGHT = SPEC::CAM_HEIGHT;
1507
+ constexpr bool ENABLE_AA = SPEC::ENABLE_ANTI_ALIASING;
1508
+ constexpr TI AA_GRID_SIZE = ENABLE_AA ? SPEC::ANTI_ALIASING_GRID_SIZE : 1;
1509
+ record.output = output_name;
1510
+ record.profile = profile_name[0] == '\0' ? "none" : profile_name;
1511
+ record.anti_aliasing = aa_name(ENABLE_AA, AA_GRID_SIZE);
1512
+ record.width = WIDTH;
1513
+ record.height = HEIGHT;
1514
+ record.video_oversampling_factor = video_oversampling_factor(WIDTH, HEIGHT);
1515
+ record.video_width = WIDTH * record.video_oversampling_factor;
1516
+ record.video_height = HEIGHT * record.video_oversampling_factor;
1517
+ record.aa_grid_size = AA_GRID_SIZE;
1518
+ record.samples_per_pixel = AA_GRID_SIZE * AA_GRID_SIZE;
1519
+ const std::string base_name = profile_name[0] == '\0' ? std::string(output_name) : std::string(output_name) + "_" + profile_name;
1520
+ record.name = base_name + "_" + resolution_suffix(WIDTH, HEIGHT) + aa_suffix(ENABLE_AA, AA_GRID_SIZE);
1521
+ record.path = join_path(options.output_dir, std::string("trace_") + record.name + ".mp4");
1522
+ const bool png_frames = use_png_frames(WIDTH, HEIGHT);
1523
+ if(options.write_frames) {
1524
+ record.frames_dir = join_path(join_path(options.output_dir, "frames"), record.name);
1525
+ record.frame_pattern = join_path(record.frames_dir, std::string("frame_%06d.") + frame_extension(png_frames));
1526
+ record.frame_format = frame_format_name(png_frames);
1527
+ record.frame_jpeg_quality = png_frames ? 0 : FRAME_JPEG_QUALITY;
1528
+ }
1529
+ record.ffmpeg_command = ffmpeg_command(options, WIDTH, HEIGHT, record.video_width, record.video_height, record.path);
1530
+ record.frame_count = poses.size();
1531
+
1532
+ if(options.write_frames && !mkdir_p(record.frames_dir)) {
1533
+ return false;
1534
+ }
1535
+
1536
+ rlt::rl::environments::raytracing_example::Environment<SPEC> env;
1537
+ env.scene_path = scene_path.c_str();
1538
+ rlt::malloc(device, env);
1539
+ rlt::init(device, env);
1540
+
1541
+ std::vector<uint32_t> frame(static_cast<size_t>(WIDTH) * static_cast<size_t>(HEIGHT));
1542
+ FILE* pipe = popen(record.ffmpeg_command.c_str(), "w");
1543
+ if(pipe == nullptr) {
1544
+ std::cerr << "Failed to start ffmpeg for " << record.path << std::endl;
1545
+ rlt::free(device, env);
1546
+ return false;
1547
+ }
1548
+
1549
+ bool ok = true;
1550
+ std::vector<uint8_t> rgb_frame;
1551
+ const T fov = static_cast<T>(degrees_to_radians(options.fov_deg));
1552
+ for(size_t frame_i = 0; frame_i < poses.size(); frame_i++) {
1553
+ const TracePose& pose = poses[frame_i];
1554
+ const auto camera = rlt::make_camera_data(pose.eye, pose.look_at, pose.up, fov, static_cast<T>(WIDTH) / static_cast<T>(HEIGHT));
1555
+ #if defined(RL_TOOLS_RENDERING_RAYTRACING_BACKEND_OPTIX)
1556
+ cudaMemcpy(rlt::data(rlt::cameras(device, *env.renderer)), &camera, sizeof(camera), cudaMemcpyHostToDevice);
1557
+ #else
1558
+ std::memcpy(rlt::data(rlt::cameras(device, *env.renderer)), &camera, sizeof(camera));
1559
+ #endif
1560
+ if constexpr (SPEC::HAS_DEPTH) {
1561
+ rlt::render(device, *env.renderer);
1562
+ std::vector<float> depth_staging(frame.size());
1563
+ {
1564
+ #if defined(RL_TOOLS_RENDERING_RAYTRACING_BACKEND_OPTIX)
1565
+ cudaMemcpy(depth_staging.data(), rlt::data(rlt::depth_buffer(device, *env.renderer)), (depth_staging.size()) * sizeof(float), cudaMemcpyDeviceToHost);
1566
+ #else
1567
+ std::memcpy(depth_staging.data(), rlt::data(rlt::depth_buffer(device, *env.renderer)), (depth_staging.size()) * sizeof(float));
1568
+ #endif
1569
+ }
1570
+ const float miss_depth = env.renderer->camera_radius > 0 ? env.renderer->camera_radius * 2.0f : 1e30f;
1571
+ float min_depth = std::numeric_limits<float>::max();
1572
+ float max_depth_value = std::numeric_limits<float>::lowest();
1573
+ depth_range(depth_staging.data(), frame.size(), miss_depth, min_depth, max_depth_value);
1574
+ depth_to_rgba(depth_staging.data(), frame, miss_depth, min_depth, max_depth_value);
1575
+ }
1576
+ else {
1577
+ rlt::render(device, *env.renderer);
1578
+ {
1579
+ #if defined(RL_TOOLS_RENDERING_RAYTRACING_BACKEND_OPTIX)
1580
+ cudaMemcpy(frame.data(), rlt::data(rlt::frame_buffer(device, *env.renderer)), (frame.size()) * sizeof(uint32_t), cudaMemcpyDeviceToHost);
1581
+ #else
1582
+ std::memcpy(frame.data(), rlt::data(rlt::frame_buffer(device, *env.renderer)), (frame.size()) * sizeof(uint32_t));
1583
+ #endif
1584
+ }
1585
+ }
1586
+ if(options.write_frames && !write_rgb_image_frame(frame_filename(record.frames_dir, frame_i, png_frames), frame, rgb_frame, WIDTH, HEIGHT, png_frames)) {
1587
+ ok = false;
1588
+ break;
1589
+ }
1590
+ if(!write_frame(pipe, frame, static_cast<int>(frame_i))) {
1591
+ ok = false;
1592
+ break;
1593
+ }
1594
+ }
1595
+
1596
+ record.ffmpeg_status = pclose(pipe);
1597
+ record.ok = ok && record.ffmpeg_status == 0;
1598
+ if(!record.ok) {
1599
+ std::cerr << "ffmpeg failed for " << record.path << " with status " << record.ffmpeg_status << std::endl;
1600
+ }
1601
+ else {
1602
+ std::cout << "Wrote " << record.path << std::endl;
1603
+ if(options.write_frames) {
1604
+ std::cout << "Wrote RGB frames to " << record.frames_dir << std::endl;
1605
+ }
1606
+ }
1607
+
1608
+ rlt::free(device, env);
1609
+ return record.ok;
1610
+ }
1611
+
1612
+ static bool write_manifest(const Options& options, const std::string& scene_path, const std::vector<TracePose>& source_poses, const std::vector<TracePose>& render_poses, double trace_duration_s, double source_implied_fps, bool timestamp_resampled, bool smoothing_applied, bool yaw_pitch_filter_applied, const std::vector<RenderRecord>& records) {
1613
+ json manifest;
1614
+ manifest["trace_path"] = options.trace_path;
1615
+ manifest["scene_path"] = scene_path;
1616
+ manifest["output_dir"] = options.output_dir;
1617
+ manifest["fps"] = options.fps;
1618
+ manifest["fov_deg"] = options.fov_deg;
1619
+ manifest["fov_rad"] = degrees_to_radians(options.fov_deg);
1620
+ manifest["ffmpeg_gpu"] = options.ffmpeg_gpu;
1621
+ manifest["ffmpeg_encoder"] = video_encoder_name(options);
1622
+ manifest["resolutions"] = json::array();
1623
+ for(const RenderResolutionOption& resolution : RENDER_RESOLUTIONS) {
1624
+ if(should_render_resolution(options, resolution.width, resolution.height)) {
1625
+ if(resolution.width == resolution.height) {
1626
+ manifest["resolutions"].push_back(resolution.width);
1627
+ }
1628
+ else {
1629
+ manifest["resolutions"].push_back(resolution.name);
1630
+ }
1631
+ }
1632
+ }
1633
+ manifest["write_frames"] = options.write_frames;
1634
+ manifest["aa"] = aa_selection_name(options.aa);
1635
+ manifest["anti_aliasing"] = json::array();
1636
+ if(should_render_aa(options, false, 1)) {
1637
+ manifest["anti_aliasing"].push_back({
1638
+ {"name", "none"},
1639
+ {"enabled", false},
1640
+ {"grid_size", 1},
1641
+ {"samples_per_pixel", 1}
1642
+ });
1643
+ }
1644
+ if(should_render_aa(options, true, 2)) {
1645
+ manifest["anti_aliasing"].push_back({
1646
+ {"name", "aa2"},
1647
+ {"enabled", true},
1648
+ {"grid_size", 2},
1649
+ {"samples_per_pixel", 4}
1650
+ });
1651
+ }
1652
+ manifest["frames"] = render_poses.size();
1653
+ manifest["source_frames"] = source_poses.size();
1654
+ manifest["rendered_frames"] = render_poses.size();
1655
+ manifest["trace_duration_s"] = trace_duration_s;
1656
+ manifest["source_implied_fps"] = source_implied_fps;
1657
+ manifest["timestamp_resampled"] = timestamp_resampled;
1658
+ manifest["depth_visualization"] = {
1659
+ {"mapping", "per_frame_min_max"},
1660
+ {"near_value", 255},
1661
+ {"far_value", 0}
1662
+ };
1663
+ manifest["smoothing"] = {
1664
+ {"applied", smoothing_applied},
1665
+ {"algorithm", yaw_pitch_filter_applied ? "source_yaw_pitch_speed_limit_then_resample_then_yaw_pitch_gaussian" : "yaw_pitch_or_quaternion_speed_limit_then_gaussian"},
1666
+ {"source_yaw_pitch_filter_applied", yaw_pitch_filter_applied},
1667
+ {"position_sigma_s", options.smooth_position_sigma_s},
1668
+ {"orientation_sigma_s", options.smooth_orientation_sigma_s},
1669
+ {"max_orientation_speed_rad_s", options.max_orientation_speed_rad_s},
1670
+ {"max_orientation_speed_deg_s", options.max_orientation_speed_rad_s * 180.0 / 3.14159265358979323846},
1671
+ {"orientation_jump_ramp_multiplier", options.orientation_jump_ramp_multiplier}
1672
+ };
1673
+ manifest["renders"] = json::array();
1674
+ for(const RenderRecord& record : records) {
1675
+ json item;
1676
+ item["name"] = record.name;
1677
+ item["output"] = record.output;
1678
+ item["profile"] = record.profile;
1679
+ item["fidelity"] = record.profile;
1680
+ item["anti_aliasing"] = record.anti_aliasing;
1681
+ item["aa_grid_size"] = record.aa_grid_size;
1682
+ item["samples_per_pixel"] = record.samples_per_pixel;
1683
+ item["width"] = record.width;
1684
+ item["height"] = record.height;
1685
+ item["video_width"] = record.video_width;
1686
+ item["video_height"] = record.video_height;
1687
+ item["video_oversampling_factor"] = record.video_oversampling_factor;
1688
+ item["path"] = record.path;
1689
+ item["write_frames"] = options.write_frames;
1690
+ if(options.write_frames) {
1691
+ item["frames_dir"] = record.frames_dir;
1692
+ item["frame_pattern"] = record.frame_pattern;
1693
+ item["frame_format"] = record.frame_format;
1694
+ if(record.frame_jpeg_quality > 0) {
1695
+ item["frame_jpeg_quality"] = record.frame_jpeg_quality;
1696
+ }
1697
+ }
1698
+ item["frame_count"] = record.frame_count;
1699
+ item["ffmpeg_command"] = record.ffmpeg_command;
1700
+ item["ffmpeg_status"] = record.ffmpeg_status;
1701
+ item["ok"] = record.ok;
1702
+ manifest["renders"].push_back(item);
1703
+ }
1704
+
1705
+ const std::string manifest_path = join_path(options.output_dir, "trace_render_manifest.json");
1706
+ std::ofstream f(manifest_path);
1707
+ if(!f) {
1708
+ std::cerr << "Failed to write manifest: " << manifest_path << std::endl;
1709
+ return false;
1710
+ }
1711
+ f << manifest.dump(2) << "\n";
1712
+ std::cout << "Wrote " << manifest_path << std::endl;
1713
+ return true;
1714
+ }
1715
+
1716
+ template <TI WIDTH, TI HEIGHT, bool ENABLE_AA, TI AA_GRID_SIZE>
1717
+ static bool render_selected_settings_for_resolution(rlt::devices::DEVICE_FACTORY<>& device, const Options& options, const std::string& scene_path, const std::vector<TracePose>& poses, std::vector<RenderRecord>& records) {
1718
+ if(!should_render_resolution(options, WIDTH, HEIGHT)) {
1719
+ return true;
1720
+ }
1721
+ if(!should_render_aa(options, ENABLE_AA, AA_GRID_SIZE)) {
1722
+ return true;
1723
+ }
1724
+ bool ok = true;
1725
+ if(should_render_setting(options, "rgb", "very_high")) {
1726
+ using SPEC = rlt::rl::environments::raytracing_example::Specification<T, TI, NUM_CAMERAS, WIDTH, HEIGHT, NUM_PROBES, rlt::rendering::raytracing::VeryHigh, false, 1, ENABLE_AA, AA_GRID_SIZE>;
1727
+ records.emplace_back();
1728
+ ok = render_trace_for_setting<SPEC>(device, options, scene_path, poses, "rgb", "very_high", records.back()) && ok;
1729
+ }
1730
+ if(should_render_setting(options, "rgb", "high")) {
1731
+ using SPEC = rlt::rl::environments::raytracing_example::Specification<T, TI, NUM_CAMERAS, WIDTH, HEIGHT, NUM_PROBES, rlt::rendering::raytracing::High, false, 1, ENABLE_AA, AA_GRID_SIZE>;
1732
+ records.emplace_back();
1733
+ ok = render_trace_for_setting<SPEC>(device, options, scene_path, poses, "rgb", "high", records.back()) && ok;
1734
+ }
1735
+ if(should_render_setting(options, "rgb", "medium")) {
1736
+ using SPEC = rlt::rl::environments::raytracing_example::Specification<T, TI, NUM_CAMERAS, WIDTH, HEIGHT, NUM_PROBES, rlt::rendering::raytracing::Medium, false, 1, ENABLE_AA, AA_GRID_SIZE>;
1737
+ records.emplace_back();
1738
+ ok = render_trace_for_setting<SPEC>(device, options, scene_path, poses, "rgb", "medium", records.back()) && ok;
1739
+ }
1740
+ if(should_render_setting(options, "rgb", "low")) {
1741
+ using SPEC = rlt::rl::environments::raytracing_example::Specification<T, TI, NUM_CAMERAS, WIDTH, HEIGHT, NUM_PROBES, rlt::rendering::raytracing::Low, false, 1, ENABLE_AA, AA_GRID_SIZE>;
1742
+ records.emplace_back();
1743
+ ok = render_trace_for_setting<SPEC>(device, options, scene_path, poses, "rgb", "low", records.back()) && ok;
1744
+ }
1745
+ if(should_render_depth(options)) {
1746
+ using SPEC = rlt::rl::environments::raytracing_example::Specification<T, TI, NUM_CAMERAS, WIDTH, HEIGHT, NUM_PROBES, rlt::rendering::raytracing::Medium, false, 1, ENABLE_AA, AA_GRID_SIZE, false, true>;
1747
+ records.emplace_back();
1748
+ ok = render_trace_for_setting<SPEC>(device, options, scene_path, poses, "depth", "", records.back()) && ok;
1749
+ }
1750
+ return ok;
1751
+ }
1752
+
1753
+ int main(int argc, char** argv) {
1754
+ Options options;
1755
+ if(!parse_options(argc, argv, options)) {
1756
+ print_usage(argv[0]);
1757
+ return 1;
1758
+ }
1759
+ if(options.help) {
1760
+ print_usage(argv[0]);
1761
+ return 0;
1762
+ }
1763
+ options.output_dir = join_path(options.output_dir, trace_output_name(options.trace_path));
1764
+ if(!mkdir_p(options.output_dir)) {
1765
+ return 1;
1766
+ }
1767
+
1768
+ std::string scene_path;
1769
+ std::vector<TracePose> source_poses;
1770
+ if(!load_trace(options, scene_path, source_poses)) {
1771
+ return 1;
1772
+ }
1773
+ bool yaw_pitch_filter_applied = false;
1774
+ std::vector<TracePose> filtered_source_poses = filter_yaw_pitch_trace(source_poses, options, yaw_pitch_filter_applied);
1775
+ if(yaw_pitch_filter_applied) {
1776
+ std::cout << "Applied source yaw/pitch jump filter before resampling with max orientation speed "
1777
+ << (options.max_orientation_speed_rad_s * 180.0 / 3.14159265358979323846)
1778
+ << " deg/s with " << options.orientation_jump_ramp_multiplier
1779
+ << "x jump ramps" << std::endl;
1780
+ }
1781
+ double trace_duration_s = 0.0;
1782
+ double source_implied_fps = 0.0;
1783
+ bool timestamp_resampled = false;
1784
+ std::vector<TracePose> poses = resample_trace(filtered_source_poses, options.fps, trace_duration_s, source_implied_fps, timestamp_resampled);
1785
+ if(timestamp_resampled) {
1786
+ std::cout << "Resampled " << source_poses.size() << " timestamped poses over " << trace_duration_s << "s to " << poses.size() << " frames at " << options.fps << " fps" << std::endl;
1787
+ }
1788
+ else {
1789
+ std::cout << "Rendering " << poses.size() << " poses without timestamp resampling" << std::endl;
1790
+ }
1791
+ bool post_resample_smoothing_applied = false;
1792
+ poses = smooth_trace(poses, options, post_resample_smoothing_applied, yaw_pitch_filter_applied);
1793
+ const bool smoothing_applied = yaw_pitch_filter_applied || post_resample_smoothing_applied;
1794
+ if(post_resample_smoothing_applied) {
1795
+ std::cout << "Applied post-resample trace smoothing with position sigma " << options.smooth_position_sigma_s << "s";
1796
+ if(!yaw_pitch_filter_applied) {
1797
+ std::cout << ", orientation sigma " << options.smooth_orientation_sigma_s
1798
+ << "s, and max orientation speed " << (options.max_orientation_speed_rad_s * 180.0 / 3.14159265358979323846)
1799
+ << " deg/s with " << options.orientation_jump_ramp_multiplier
1800
+ << "x jump ramps";
1801
+ }
1802
+ std::cout << std::endl;
1803
+ }
1804
+
1805
+ using DEVICE = rlt::devices::DEVICE_FACTORY<>;
1806
+ DEVICE device;
1807
+ rlt::init(device);
1808
+
1809
+ std::vector<RenderRecord> records;
1810
+ bool ok = true;
1811
+
1812
+ ok = render_selected_settings_for_resolution<64, 64, false, 1>(device, options, scene_path, poses, records) && ok;
1813
+ ok = render_selected_settings_for_resolution<64, 64, true, 2>(device, options, scene_path, poses, records) && ok;
1814
+ ok = render_selected_settings_for_resolution<128, 128, false, 1>(device, options, scene_path, poses, records) && ok;
1815
+ ok = render_selected_settings_for_resolution<128, 128, true, 2>(device, options, scene_path, poses, records) && ok;
1816
+ ok = render_selected_settings_for_resolution<256, 256, false, 1>(device, options, scene_path, poses, records) && ok;
1817
+ ok = render_selected_settings_for_resolution<256, 256, true, 2>(device, options, scene_path, poses, records) && ok;
1818
+ ok = render_selected_settings_for_resolution<512, 512, false, 1>(device, options, scene_path, poses, records) && ok;
1819
+ ok = render_selected_settings_for_resolution<512, 512, true, 2>(device, options, scene_path, poses, records) && ok;
1820
+ ok = render_selected_settings_for_resolution<1024, 1024, false, 1>(device, options, scene_path, poses, records) && ok;
1821
+ ok = render_selected_settings_for_resolution<1024, 1024, true, 2>(device, options, scene_path, poses, records) && ok;
1822
+ ok = render_selected_settings_for_resolution<2048, 2048, false, 1>(device, options, scene_path, poses, records) && ok;
1823
+ ok = render_selected_settings_for_resolution<2048, 2048, true, 2>(device, options, scene_path, poses, records) && ok;
1824
+ ok = render_selected_settings_for_resolution<3840, 2160, false, 1>(device, options, scene_path, poses, records) && ok;
1825
+ ok = render_selected_settings_for_resolution<3840, 2160, true, 2>(device, options, scene_path, poses, records) && ok;
1826
+
1827
+ if(records.empty()) {
1828
+ std::cerr << "No render settings selected by --settings=" << options.settings << std::endl;
1829
+ return 1;
1830
+ }
1831
+ ok = write_manifest(options, scene_path, source_poses, poses, trace_duration_s, source_implied_fps, timestamp_resampled, smoothing_applied, yaw_pitch_filter_applied, records) && ok;
1832
+ return ok ? 0 : 1;
1833
+ }