spatialgeometry 1.2.0__tar.gz → 1.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. spatialgeometry-1.4.0/.gitattributes +1 -0
  2. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/.github/workflows/build.yml +1 -1
  3. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/.github/workflows/cibuildwheel.yml +11 -4
  4. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/.gitignore +1 -0
  5. spatialgeometry-1.4.0/AGENTS.md +23 -0
  6. spatialgeometry-1.4.0/CHANGELOG.md +224 -0
  7. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/CMakeLists.txt +3 -3
  8. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/PKG-INFO +29 -3
  9. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/README.md +20 -0
  10. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/docs/Makefile +7 -1
  11. spatialgeometry-1.4.0/docs/figs/panda_hand.dae +403 -0
  12. spatialgeometry-1.4.0/docs/source/_static/css/custom.css +36 -0
  13. spatialgeometry-1.4.0/docs/source/_templates/autosummary/class.rst +8 -0
  14. spatialgeometry-1.4.0/docs/source/_templates/footer.html +5 -0
  15. spatialgeometry-1.4.0/docs/source/api.rst +185 -0
  16. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/docs/source/conf.py +103 -7
  17. spatialgeometry-1.4.0/docs/source/fileformats.rst +249 -0
  18. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/docs/source/index.rst +1 -0
  19. spatialgeometry-1.4.0/docs/source/intro.rst +398 -0
  20. spatialgeometry-1.4.0/examples/cube.py +21 -0
  21. spatialgeometry-1.4.0/examples/mesh.py +10 -0
  22. spatialgeometry-1.4.0/examples/room.py +34 -0
  23. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/pyproject.toml +10 -3
  24. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/src/spatialgeometry/__init__.py +17 -2
  25. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/scene_nb.cpp +6 -6
  26. spatialgeometry-1.4.0/src/spatialgeometry/geom/CollisionShape.py +736 -0
  27. spatialgeometry-1.4.0/src/spatialgeometry/geom/SceneGroup.py +118 -0
  28. spatialgeometry-1.4.0/src/spatialgeometry/geom/SceneNode.py +480 -0
  29. spatialgeometry-1.4.0/src/spatialgeometry/geom/Shape.py +906 -0
  30. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/src/spatialgeometry/geom/__init__.py +7 -1
  31. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/src/spatialgeometry/scene.py +12 -12
  32. spatialgeometry-1.4.0/tests/test_Shape.py +870 -0
  33. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/tests/test_collision.py +291 -9
  34. spatialgeometry-1.2.0/.gitattributes +0 -1
  35. spatialgeometry-1.2.0/docs/source/_static/css/custom.css +0 -15
  36. spatialgeometry-1.2.0/docs/source/api.rst +0 -51
  37. spatialgeometry-1.2.0/docs/source/intro.rst +0 -107
  38. spatialgeometry-1.2.0/src/spatialgeometry/geom/CollisionShape.py +0 -294
  39. spatialgeometry-1.2.0/src/spatialgeometry/geom/SceneGroup.py +0 -26
  40. spatialgeometry-1.2.0/src/spatialgeometry/geom/SceneNode.py +0 -315
  41. spatialgeometry-1.2.0/src/spatialgeometry/geom/Shape.py +0 -420
  42. spatialgeometry-1.2.0/tests/test_Shape.py +0 -199
  43. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/.github/Makefile +0 -0
  44. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/LICENSE +0 -0
  45. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/Makefile +0 -0
  46. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/environment.yml +0 -0
  47. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/Core +0 -0
  48. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ArithmeticSequence.h +0 -0
  49. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Array.h +0 -0
  50. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ArrayBase.h +0 -0
  51. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ArrayWrapper.h +0 -0
  52. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Assign.h +0 -0
  53. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/AssignEvaluator.h +0 -0
  54. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Assign_MKL.h +0 -0
  55. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/BandMatrix.h +0 -0
  56. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Block.h +0 -0
  57. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/BooleanRedux.h +0 -0
  58. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CommaInitializer.h +0 -0
  59. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ConditionEstimator.h +0 -0
  60. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CoreEvaluators.h +0 -0
  61. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CoreIterators.h +0 -0
  62. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CwiseBinaryOp.h +0 -0
  63. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CwiseNullaryOp.h +0 -0
  64. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CwiseTernaryOp.h +0 -0
  65. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CwiseUnaryOp.h +0 -0
  66. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/CwiseUnaryView.h +0 -0
  67. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/DenseBase.h +0 -0
  68. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/DenseCoeffsBase.h +0 -0
  69. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/DenseStorage.h +0 -0
  70. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Diagonal.h +0 -0
  71. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/DiagonalMatrix.h +0 -0
  72. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/DiagonalProduct.h +0 -0
  73. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Dot.h +0 -0
  74. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/EigenBase.h +0 -0
  75. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ForceAlignedAccess.h +0 -0
  76. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Fuzzy.h +0 -0
  77. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/GeneralProduct.h +0 -0
  78. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/GenericPacketMath.h +0 -0
  79. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/GlobalFunctions.h +0 -0
  80. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/IO.h +0 -0
  81. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/IndexedView.h +0 -0
  82. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Inverse.h +0 -0
  83. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Map.h +0 -0
  84. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/MapBase.h +0 -0
  85. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/MathFunctions.h +0 -0
  86. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/MathFunctionsImpl.h +0 -0
  87. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Matrix.h +0 -0
  88. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/MatrixBase.h +0 -0
  89. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/NestByValue.h +0 -0
  90. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/NoAlias.h +0 -0
  91. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/NumTraits.h +0 -0
  92. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/PartialReduxEvaluator.h +0 -0
  93. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/PermutationMatrix.h +0 -0
  94. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/PlainObjectBase.h +0 -0
  95. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Product.h +0 -0
  96. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ProductEvaluators.h +0 -0
  97. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Random.h +0 -0
  98. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Redux.h +0 -0
  99. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Ref.h +0 -0
  100. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Replicate.h +0 -0
  101. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Reshaped.h +0 -0
  102. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/ReturnByValue.h +0 -0
  103. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Reverse.h +0 -0
  104. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Select.h +0 -0
  105. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/SelfAdjointView.h +0 -0
  106. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/SelfCwiseBinaryOp.h +0 -0
  107. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Solve.h +0 -0
  108. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/SolveTriangular.h +0 -0
  109. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/SolverBase.h +0 -0
  110. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/StableNorm.h +0 -0
  111. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/StlIterators.h +0 -0
  112. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Stride.h +0 -0
  113. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Swap.h +0 -0
  114. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Transpose.h +0 -0
  115. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Transpositions.h +0 -0
  116. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/TriangularMatrix.h +0 -0
  117. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/VectorBlock.h +0 -0
  118. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/VectorwiseOp.h +0 -0
  119. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/Visitor.h +0 -0
  120. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX/Complex.h +0 -0
  121. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX/MathFunctions.h +0 -0
  122. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX/PacketMath.h +0 -0
  123. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX/TypeCasting.h +0 -0
  124. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX512/Complex.h +0 -0
  125. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX512/MathFunctions.h +0 -0
  126. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX512/PacketMath.h +0 -0
  127. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AVX512/TypeCasting.h +0 -0
  128. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AltiVec/Complex.h +0 -0
  129. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AltiVec/MathFunctions.h +0 -0
  130. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +0 -0
  131. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +0 -0
  132. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +0 -0
  133. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/AltiVec/PacketMath.h +0 -0
  134. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/CUDA/Complex.h +0 -0
  135. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/BFloat16.h +0 -0
  136. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/ConjHelper.h +0 -0
  137. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +0 -0
  138. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +0 -0
  139. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/Half.h +0 -0
  140. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/Settings.h +0 -0
  141. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/Default/TypeCasting.h +0 -0
  142. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/GPU/MathFunctions.h +0 -0
  143. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/GPU/PacketMath.h +0 -0
  144. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/GPU/TypeCasting.h +0 -0
  145. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/HIP/hcc/math_constants.h +0 -0
  146. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/MSA/Complex.h +0 -0
  147. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/MSA/MathFunctions.h +0 -0
  148. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/MSA/PacketMath.h +0 -0
  149. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/NEON/Complex.h +0 -0
  150. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +0 -0
  151. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/NEON/MathFunctions.h +0 -0
  152. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/NEON/PacketMath.h +0 -0
  153. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/NEON/TypeCasting.h +0 -0
  154. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SSE/Complex.h +0 -0
  155. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SSE/MathFunctions.h +0 -0
  156. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SSE/PacketMath.h +0 -0
  157. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SSE/TypeCasting.h +0 -0
  158. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SVE/MathFunctions.h +0 -0
  159. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SVE/PacketMath.h +0 -0
  160. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SVE/TypeCasting.h +0 -0
  161. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SYCL/InteropHeaders.h +0 -0
  162. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SYCL/MathFunctions.h +0 -0
  163. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SYCL/PacketMath.h +0 -0
  164. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -0
  165. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/SYCL/TypeCasting.h +0 -0
  166. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/ZVector/Complex.h +0 -0
  167. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/ZVector/MathFunctions.h +0 -0
  168. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/arch/ZVector/PacketMath.h +0 -0
  169. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/functors/AssignmentFunctors.h +0 -0
  170. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/functors/BinaryFunctors.h +0 -0
  171. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/functors/NullaryFunctors.h +0 -0
  172. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/functors/StlFunctors.h +0 -0
  173. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/functors/TernaryFunctors.h +0 -0
  174. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/functors/UnaryFunctors.h +0 -0
  175. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralBlockPanelKernel.h +0 -0
  176. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralMatrixMatrix.h +0 -0
  177. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +0 -0
  178. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +0 -0
  179. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +0 -0
  180. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralMatrixVector.h +0 -0
  181. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +0 -0
  182. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/Parallelizer.h +0 -0
  183. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +0 -0
  184. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +0 -0
  185. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/SelfadjointMatrixVector.h +0 -0
  186. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +0 -0
  187. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/SelfadjointProduct.h +0 -0
  188. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/SelfadjointRank2Update.h +0 -0
  189. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularMatrixMatrix.h +0 -0
  190. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +0 -0
  191. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularMatrixVector.h +0 -0
  192. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +0 -0
  193. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularSolverMatrix.h +0 -0
  194. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +0 -0
  195. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/products/TriangularSolverVector.h +0 -0
  196. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/BlasUtil.h +0 -0
  197. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/ConfigureVectorization.h +0 -0
  198. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/Constants.h +0 -0
  199. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/DisableStupidWarnings.h +0 -0
  200. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/ForwardDeclarations.h +0 -0
  201. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/IndexedViewHelper.h +0 -0
  202. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/IntegralConstant.h +0 -0
  203. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/MKL_support.h +0 -0
  204. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/Macros.h +0 -0
  205. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/Memory.h +0 -0
  206. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/Meta.h +0 -0
  207. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/NonMPL2.h +0 -0
  208. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/ReenableStupidWarnings.h +0 -0
  209. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/ReshapedHelper.h +0 -0
  210. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/StaticAssert.h +0 -0
  211. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/SymbolicIndex.h +0 -0
  212. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/Core/util/XprHelper.h +0 -0
  213. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -0
  214. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -0
  215. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/BlockMethods.h +0 -0
  216. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -0
  217. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -0
  218. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/IndexedViewMethods.h +0 -0
  219. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -0
  220. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -0
  221. {spatialgeometry-1.2.0/src/spatialgeometry/core → spatialgeometry-1.4.0/src/spatialgeometry/cpp-extension}/Eigen/src/plugins/ReshapedMethods.h +0 -0
  222. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/src/spatialgeometry/tools/__init__.py +0 -0
  223. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/tests/__init__.py +0 -0
  224. {spatialgeometry-1.2.0 → spatialgeometry-1.4.0}/tests/test_scene_backend.py +0 -0
@@ -0,0 +1 @@
1
+ spatialgeometry/cpp-extension/Eigen/** linguist-vendored
@@ -67,7 +67,7 @@ jobs:
67
67
 
68
68
  - name: Install docs dependencies
69
69
  run: |
70
- pip install .[docs]
70
+ pip install .[docs,collision]
71
71
  pip install sympy
72
72
  sudo apt-get install -y graphviz
73
73
 
@@ -1,5 +1,13 @@
1
1
  # Build wheels for all platforms and publish to PyPI.
2
- # Triggered on GitHub release creation or manually via workflow_dispatch.
2
+ #
3
+ # To ship a release: bump the version in pyproject.toml, merge that to
4
+ # main, then on GitHub go to Releases -> "Draft a new release", pick a
5
+ # tag matching the new version, and click "Publish release". That single
6
+ # click is the only trigger for this workflow -- it builds every wheel
7
+ # (including Pyodide/wasm32), uploads everything to PyPI, and attaches
8
+ # the Pyodide wheel to the release as a downloadable asset. There is no
9
+ # separate manual/workflow_dispatch path, so there's only one way to
10
+ # publish and it always does the full job.
3
11
  #
4
12
  # Uses OIDC trusted publishing -- no stored PyPI token required.
5
13
 
@@ -7,8 +15,7 @@ name: Publish to PyPI
7
15
 
8
16
  on:
9
17
  release:
10
- types: [created]
11
- workflow_dispatch:
18
+ types: [published]
12
19
 
13
20
  jobs:
14
21
  build_wheels:
@@ -84,7 +91,7 @@ jobs:
84
91
  upload_pyodide_asset:
85
92
  name: Attach Pyodide wheel to GitHub release
86
93
  needs: build_pyodide
87
- if: github.event_name == 'release' && needs.build_pyodide.result == 'success'
94
+ if: needs.build_pyodide.result == 'success'
88
95
  runs-on: ubuntu-latest
89
96
  permissions:
90
97
  contents: write
@@ -159,6 +159,7 @@ devel_isolated/
159
159
  # Ignore generated docs
160
160
  *.dox
161
161
  *.wikidoc
162
+ docs/source/generated/
162
163
 
163
164
  # eclipse stuff
164
165
  .project
@@ -0,0 +1,23 @@
1
+ # spatialgeometry — Agent Instructions
2
+
3
+ Part of the RVC ecosystem. **Read [rvc-ecosystem/AGENTS.md](https://github.com/petercorke/rvc-ecosystem/blob/main/AGENTS.md) first** — it defines shared conventions: repo ownership, math invariants, dependency boundaries, git/PR workflow, code standards, tech-debt tracking. This file only adds what's specific to this repo.
4
+
5
+ | | |
6
+ |---|---|
7
+ | PyPI package | `spatialgeometry` |
8
+ | Nickname | SG |
9
+ | Owner | Jesse Haviland (`jhavl`) — **not Peter Corke** |
10
+ | Default branch | `main` |
11
+ | Contribution model | **PR only** |
12
+
13
+ ## Notes specific to this repo
14
+
15
+ - **This is not Peter's repo.** Collaborator push access exists but must never be used —
16
+ every change goes through a PR, even trivial docs fixes. If your local clone has a `fork`
17
+ remote (Peter's copy) and an `origin` remote (this upstream repo), push branches to `fork`
18
+ and open the PR from there. Never push to `origin`.
19
+ - Compiles `nanobind` C++ extensions via `scikit-build-core`.
20
+ - Depends on `spatialmath` only. `robotics-toolbox-python` and `swift` both depend on this
21
+ repo — a breaking API change here has two downstream repos to check.
22
+ - Default branch is `main` — this repo has already migrated off `master`; don't assume
23
+ otherwise from old references.
@@ -0,0 +1,224 @@
1
+ # Changelog
2
+
3
+ Notable changes to this project are documented in this file. Starts from
4
+ v1.2.0 — earlier releases aren't documented retroactively.
5
+
6
+ ## [1.4.0] - 2026-08-23
7
+
8
+ ### New
9
+
10
+ - **`Ellipsoid` shape**: a native `coal.Ellipsoid` collision primitive,
11
+ parameterised as `radii=[rx, ry, rz]` (three semi-axis lengths), following
12
+ the same pattern as `Sphere`/`Cylinder`/`Cuboid`.
13
+ - **`Shape.corners()`/`bounds()`/`extents()`** for a shape's axis-aligned
14
+ bounding box — `corners(world=False)`, `bounds(world=False)`,
15
+ `extents(world=False)`; pass `world=True` for the posed shape's envelope
16
+ in the world frame. Implemented for `Cuboid`/`Box`, `Sphere`, `Cylinder`,
17
+ `Mesh`; `Axes`/`Arrow`/`Polyline` raise `NotImplementedError` for now rather
18
+ than a silently wrong value.
19
+ - **`SceneNode.tree()`/`tree_children()`**: render a scene graph (or just
20
+ one node's own subtree) as human-readable indented text, one `repr()` per
21
+ line, with `tree()` marking the calling node's position with a trailing
22
+ `<==`. `SceneGroup` needs no special-casing — the tree walk is generic.
23
+ - **`CollisionShapeGroup`**: an ordered, list-like collection of
24
+ `CollisionShape`/`CollisionShapeGroup` instances that itself behaves like
25
+ a single collision-checkable shape — `iscollided()`/`closest_point()` work
26
+ in every combination of shape/group, including arbitrarily nested groups.
27
+ Comes with a new **`&` operator** (`a & b` is `a.iscollided(b)`) that
28
+ works uniformly across shapes and groups.
29
+ - **`Shape.opacity` property**: a convenient way to get/set just the alpha
30
+ channel of `color` without needing to know or re-specify the current
31
+ `(r, g, b)`. `set_alpha()` is deprecated in its favor.
32
+ - **`Arrow.FromTo(start, end)`**: construct an arrow spanning two 3-vectors
33
+ directly, with `length` and `pose` computed automatically instead of by
34
+ hand.
35
+ - Tutorial introduction: substantially expanded, with worked examples
36
+ covering shape creation, bounding boxes, collision checking, scene
37
+ graphs, and groups.
38
+
39
+ ### Mesh
40
+
41
+ A cluster of related `Mesh` improvements landed together this release:
42
+
43
+ - **New `y_up` param**, for mesh files authored with +Y as "up" (a common
44
+ convention in general 3D/graphics tooling) rather than this ecosystem's
45
+ +Z-up convention — applies a fixed correction to the mesh's own vertex
46
+ data at load time, so it survives re-posing/animation. `scale` also now
47
+ accepts a single scalar (uniform on all 3 axes), not just a 3-element
48
+ list.
49
+ - **New `mesh` extra** (`pip install spatialgeometry[mesh]`): just
50
+ `trimesh`, split out of `collision` — unlike Coal, trimesh has no
51
+ Windows-wheel problem, so mesh-only functionality that never touches Coal
52
+ (`corners()`/`bounds()`/`extents()`, which work independent of
53
+ `collision=True/False`) is now reachable via `pip` on Windows.
54
+ `collision` still pulls in `mesh` transitively, nothing changes for
55
+ existing `collision` users.
56
+ - **Now tracks whether an explicit color was ever given**
57
+ (`use_vertex_colors` in `to_dict()`), so a renderer has a signal to
58
+ prefer a mesh file's own baked-in per-vertex/per-face colors over a flat
59
+ default grey when no color was ever actually requested.
60
+ - **`filename`/`y_up` are now read-only.** There's no use case for
61
+ repointing an existing `Mesh` at a different file or a different up-axis
62
+ convention — construct a new one instead. (Both are also only ever read
63
+ once, inside `_init_coal()`, which is cached after first use — a setter
64
+ would have silently done nothing after a shape's first
65
+ `closest_point()`/`iscollided()` call.)
66
+ - **`Mesh(filename=...)` now raises `FileNotFoundError` at construction**
67
+ if the file doesn't exist, instead of deferring the failure to the first
68
+ `closest_point()`/`iscollided()` call.
69
+ - **Fixed: `corners()`/`bounds()`/`extents()` now correctly apply the
70
+ `y_up` correction.** Previously the `+Y → +Z` correction was only applied
71
+ to the collision geometry, not the bounding box, so a `y_up=True` mesh's
72
+ bounding box didn't match its actual (corrected) orientation.
73
+
74
+ ### Changed
75
+
76
+ - **`repr()` now shows `color`, and `opacity` when not fully opaque** —
77
+ previously only subclass-specific params (`radius`, `scale`, ...) and
78
+ `pose` were shown.
79
+ - **`Path` shape renamed to `Polyline`**, to avoid clashing with the
80
+ standard library's `pathlib.Path` — a source of confusing type errors in
81
+ code that imports both. `Path` remains available as a deprecated alias
82
+ (`class Path(Polyline)`), emitting a `FutureWarning` on construction.
83
+ - **`SceneNode.__init__`'s `T=` kwarg renamed to `pose=`**, now accepting
84
+ `SE3` as well as a raw `ndarray` — matching the convenience `Shape` (and
85
+ every concrete shape) already had. `SceneNode` is the base class for the
86
+ whole scene graph, so this had been implemented one level too low;
87
+ `SceneGroup` previously had no way to accept an `SE3` pose at
88
+ construction, only a raw `ndarray` via `T=`.
89
+ - **`update()` is now the public method for refreshing the scene graph's
90
+ world transforms**, replacing `_propogate_scene_tree()` (a straight
91
+ misspelling of "propagate", and not actually private in practice —
92
+ called directly by `robotics-toolbox-python` and `swift`, and
93
+ demonstrated in this project's own tutorial). `_propogate_scene_tree()`
94
+ still works, emitting a `FutureWarning`, for one release cycle.
95
+ - **Color-parsing error messages now name matplotlib explicitly** and link
96
+ to its full named-colors reference, rather than a bare "invalid color
97
+ name" with no pointer to where valid names are defined.
98
+ - Internal: `src/spatialgeometry/core` renamed to `cpp-extension`, for
99
+ naming consistency — nothing importable changed.
100
+ - Docs: substantial API reference cleanup — a new page on mesh file format
101
+ support (which formats work for display vs. collision, and why);
102
+ `autoclass_content='both'` so each class's own constructor parameters
103
+ (previously invisible on most pages, since Sphinx's default only shows
104
+ the class docstring) now actually appear; several stale/incorrect
105
+ passages fixed in the intro tutorial.
106
+
107
+ ### Fixed
108
+
109
+ - **`Cylinder`'s collision geometry was half its documented length.**
110
+ `_init_coal()` passed `length / 2.0` to Coal on the mistaken assumption
111
+ its constructor took a half-length — it takes the full length, so
112
+ `Cylinder(radius=1, length=4)`'s actual collision geometry was only 2
113
+ units tall. No existing test exercised a cylinder along its own axis, only
114
+ radially, so this went undetected.
115
+ - **`scene_parent` assignments that would create a cycle are now rejected**
116
+ (`a.scene_parent = b; b.scene_parent = a`, a self-loop, or a longer
117
+ cycle). Previously nothing validated this, and the scene-graph
118
+ root-finding walk (used by `update()` every call) has no cycle detection
119
+ of its own — a cycle made it spin forever rather than raise.
120
+ - **`SceneGroup`'s list mutators (`append`/`extend`/`insert`/`remove`/
121
+ `pop`/`clear`/item assignment) didn't wire `scene_parent`** — elements
122
+ added this way never actually became children in the scene graph, only
123
+ in the list. The constructor also now accepts an initial list
124
+ (`SceneGroup([a, b])` previously raised `TypeError`).
125
+ - `repr()` could leak `numpy.float64` values (e.g. `np.float64(1.0)`
126
+ instead of `1.0`) into `color`/`opacity` — harmless functionally, ugly in
127
+ a repr.
128
+
129
+ ## [1.3.0] - 2026-08-03
130
+
131
+ ### New
132
+
133
+ - **`Path` shape**: a polyline through a sequence of waypoints — straight
134
+ segments joining consecutive points, for drawing paths and trajectories
135
+ in the scene. `radius`/`linewidth` mirror `Arrow`'s existing mutual
136
+ exclusivity (a real tube when `radius > 0`, a line honoring `linewidth`
137
+ otherwise). Deliberately a plain `Shape`, not `CollisionShape` — Coal has
138
+ no native "tube along a polyline" primitive.
139
+ - **`Axes` gains `arrows=False`** (render each axis as a colored `Arrow`
140
+ instead of a plain line) plus `radius`/`linewidth`, passed straight
141
+ through to each constituent `Arrow` when `arrows=True`.
142
+ - **`Arrow` gains `linewidth`**: when `radius == 0` (the existing
143
+ "shaft is a line" fallback), `linewidth` now actually controls that
144
+ line's width in pixels — previously uncontrolled, whatever the browser's
145
+ default happened to render.
146
+ - **`__version__`** is now exposed, matching the other packages in the
147
+ toolbox family (`spatialmath-python`, `robotics-toolbox-python`, `bdsim`,
148
+ `machinevision-toolbox-python`).
149
+
150
+ ### Changed
151
+
152
+ - **`Shape` and `CollisionShape` are now abstract base classes.** Neither
153
+ was meant to be instantiated directly — `Shape.to_dict` and
154
+ `CollisionShape._init_coal` are `@abstractmethod`; every concrete shape
155
+ already overrode both.
156
+ - **`T` (pose) moved from `Shape` up to `SceneNode`.** It was a thin
157
+ wrapper with nothing `Shape`-specific about it; moving it up means
158
+ `SceneGroup` (and any future `SceneNode` subclass) gets the same
159
+ convenient, `SE3`-accepting pose property that only `Shape` had before —
160
+ so a whole group of shapes can now be moved as one unit via `group.T`.
161
+ - **`repr()`/`str()` rewritten.** `repr()` previously showed only the
162
+ shape's `stype` string plus translation — not unambiguous (`Box`, a
163
+ deprecated alias of `Cuboid`, was indistinguishable from `Cuboid`) and
164
+ broke visually the moment more than one shape appeared together (e.g. in
165
+ a list, or a `SceneGroup`). Now single-line and constructor-style, e.g.
166
+ `Cylinder(radius=1.0, length=2.0, pose='t = 0, 0, 0; rpy/zyx = 0°, 0°, 0°')`.
167
+ - **Type hints modernized** across the scene-graph/shape classes —
168
+ `typing.Union`/`List`/`Dict`/`Tuple`/`Optional` replaced with
169
+ `X | Y`/`list`/`dict`/`tuple`, and filled in on several public
170
+ constructors/properties that had none at all.
171
+ - Docs: the Sphinx build's `docs` extra now also installs `collision`, so
172
+ the intro chapter's `closest_point()`/`iscollided()` example actually
173
+ runs instead of silently baking a traceback into the rendered page.
174
+ - Docs: intro chapter rewritten with mesh/collision worked examples, mouse
175
+ navigation controls, and scene-graph parenting; `sphinx-copybutton`,
176
+ `sphinx-codeautolink`, `sphinxcontrib-mermaid`, and a `make livehtml`
177
+ target wired up for faster doc iteration.
178
+
179
+ ### Fixed
180
+
181
+ - **`Shape.color`'s setter left an all-integer color input as
182
+ `numpy.int64`** (e.g. `color=[1, 0, 0, 1]`, a very natural way to write
183
+ "opaque red") rather than a plain `float` — `self.color[3]` (opacity)
184
+ being `int64` broke real (non-mocked) `json.dumps()` sends. Never caught
185
+ by the existing test suite since those tests are `FakeBrowser`-mocked.
186
+ - **`SceneNode._T`'s setter referenced a nonexistent `self.parent.wT`**
187
+ (should have been `self._scene_parent._wT`) — setting a node's pose
188
+ while it already had a `scene_parent` raised `AttributeError` instead of
189
+ composing the world transform. No test coverage existed for this path
190
+ before.
191
+ - `SceneNode.scene_parent`'s return type was annotated `Type["SceneNode"]`
192
+ (the class itself) rather than an instance; corrected to
193
+ `SceneNode | None`.
194
+
195
+ ## [1.2.0] - 2026-07-28
196
+
197
+ First release since v1.1.0 (2023) — mostly packaging and build-system work, plus a collision-backend swap.
198
+
199
+ ### New
200
+
201
+ - **Coal replaces PyBullet as the collision backend.** PyBullet wouldn't build with clang on macOS, so all collision checking now runs on [Coal](https://github.com/coal-library/coal) instead.
202
+ - **NumPy 2 support.**
203
+ - **Pyodide (WebAssembly) wheels**, so spatialgeometry can run in-browser (e.g. JupyterLite), alongside the usual platform wheels. Since there's no C++ compiler to target under Pyodide, that wheel ships a pure-Python fallback for the scene-graph transform math instead of the compiled extension — same API, just not compiled.
204
+ - **Prebuilt wheels for more platforms**: native Linux arm64 and macOS arm64 in addition to Linux/Windows x86_64 — no compiler needed on install for any of them.
205
+
206
+ ### Changed
207
+
208
+ - **Build system rewritten**: the C++ extension now builds with **nanobind + scikit-build-core** (previously a hand-rolled hatchling build hook). Faster builds, and the vendored Eigen copy was trimmed from Eigen's full 337-file tree down to the ~175 files this project actually uses.
209
+ - **Project layout moved to `src/`**, and the build backend moved from setuptools to hatchling and then to scikit-build-core over the course of this work.
210
+ - **Docs rewritten**: the README, intro chapter, and API reference no longer borrow content from the Robotics Toolbox docs — they now describe spatialgeometry on its own terms, with a Swift-based display example.
211
+ - **Dependency cleanup**: `roboticstoolbox` is no longer pulled into the `dev` extra, removing a version-pin collision some installs were hitting.
212
+
213
+ ### Fixed
214
+
215
+ - macOS build failures caused by PyBullet + clang (resolved by the Coal switch above).
216
+ - NumPy 2 compatibility issues.
217
+ - Windows wheel builds failing over an overly long temp-file path.
218
+ - Several wheel-tagging/build-hook bugs that could produce a stale or wrong-architecture compiled extension, or silently fall back to a non-compiled wheel.
219
+ - The PyPI publish pipeline itself: a workflow bug was letting the Pyodide/wasm32 wheel — which PyPI doesn't accept — get bundled into the same upload batch as the real wheels, aborting the upload partway through. Publishing now uses a single, unambiguous trigger (creating a GitHub Release) that always completes the full publish.
220
+
221
+ ### Known limitations
222
+
223
+ - Collision checking (Coal) isn't available via `pip` on Windows — one of Coal's own dependencies doesn't publish a Windows wheel. Everything else works there; `pip install spatialgeometry[collision]` will just have no effect on that platform for now.
224
+ **Workaround:** conda-forge publishes `coal-python` for `win-64` against its own assimp build, so `conda install -c conda-forge coal-python` followed by `pip install spatialgeometry trimesh` gets collision checking working on Windows today.
@@ -18,7 +18,7 @@ find_package(nanobind CONFIG REQUIRED HINTS "${NB_DIR}")
18
18
  # ---------------------------------------------------------------------------
19
19
  # scene — scene-graph transform propagation
20
20
  # Eigen is vendored as header-only (Core module only -- see
21
- # src/spatialgeometry/core/Eigen) in src/spatialgeometry/core/Eigen/
21
+ # src/spatialgeometry/cpp-extension/Eigen) in src/spatialgeometry/cpp-extension/Eigen/
22
22
  # scene_nb.cpp is the nanobind glue; math lives inline in that file.
23
23
  #
24
24
  # Skipped entirely under Pyodide/Emscripten: no compiler there worth
@@ -29,10 +29,10 @@ find_package(nanobind CONFIG REQUIRED HINTS "${NB_DIR}")
29
29
  # ---------------------------------------------------------------------------
30
30
  if(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
31
31
  nanobind_add_module(scene
32
- src/spatialgeometry/core/scene_nb.cpp
32
+ src/spatialgeometry/cpp-extension/scene_nb.cpp
33
33
  )
34
34
  target_include_directories(scene PRIVATE
35
- src/spatialgeometry/core
35
+ src/spatialgeometry/cpp-extension
36
36
  )
37
37
 
38
38
  install(TARGETS scene DESTINATION spatialgeometry)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: spatialgeometry
3
- Version: 1.2.0
3
+ Version: 1.4.0
4
4
  Summary: A Shape and Geometry Description Package
5
5
  Keywords: python,robotics,robotics-toolbox,kinematics,dynamics,motion-planning,trajectory-generation,jacobian,hessian,control,simulation,robot-manipulator,mobile-robot
6
6
  Author-Email: Jesse Haviland <j.haviland@qut.edu.au>, Peter Corke <rvc@petercorke.com>
@@ -38,9 +38,12 @@ Project-URL: documentation, https://jhavl.github.io/spatialgeometry/
38
38
  Project-URL: repository, https://github.com/jhavl/spatialgeometry
39
39
  Requires-Python: >=3.10
40
40
  Requires-Dist: spatialmath-python>=1.0.0
41
+ Provides-Extra: mesh
42
+ Requires-Dist: trimesh; extra == "mesh"
41
43
  Provides-Extra: collision
44
+ Requires-Dist: spatialgeometry[mesh]; extra == "collision"
42
45
  Requires-Dist: coal; sys_platform != "win32" and extra == "collision"
43
- Requires-Dist: trimesh; extra == "collision"
46
+ Requires-Dist: pycollada; extra == "collision"
44
47
  Provides-Extra: dev
45
48
  Requires-Dist: black; extra == "dev"
46
49
  Requires-Dist: editables; extra == "dev"
@@ -53,7 +56,10 @@ Requires-Dist: trimesh; extra == "dev"
53
56
  Provides-Extra: docs
54
57
  Requires-Dist: sphinx; extra == "docs"
55
58
  Requires-Dist: sphinx_rtd_theme; extra == "docs"
56
- Requires-Dist: sphinx-autorun; extra == "docs"
59
+ Requires-Dist: sphinx-pyrunblock; extra == "docs"
60
+ Requires-Dist: sphinx-copybutton; extra == "docs"
61
+ Requires-Dist: sphinx-codeautolink; extra == "docs"
62
+ Requires-Dist: sphinxcontrib-mermaid; extra == "docs"
57
63
  Description-Content-Type: text/markdown
58
64
 
59
65
  # Spatial Geometry
@@ -136,6 +142,26 @@ required there.
136
142
  > version range Coal needs), so the `collision` extra skips it there and
137
143
  > collision checking is unavailable via `pip` on Windows. Everything else
138
144
  > in the package works normally.
145
+ >
146
+ > Workaround: conda-forge publishes `coal-python` built for `win-64`
147
+ > against its own assimp, sidestepping the missing wheel entirely:
148
+ >
149
+ > ```shell
150
+ > conda install -c conda-forge coal-python
151
+ > pip install spatialgeometry trimesh
152
+ > ```
153
+
154
+ If you don't need collision checking but do want to work with mesh files --
155
+ e.g. `Mesh.corners()`/`bounds()`/`extents()` for a mesh's bounding box, which
156
+ reads the file via [trimesh](https://trimesh.org) but never touches Coal at
157
+ all -- install just that piece:
158
+
159
+ ```shell
160
+ pip install spatialgeometry[mesh]
161
+ ```
162
+
163
+ Unlike `collision`, this works on Windows too: trimesh has no Windows-wheel
164
+ problem of its own, only Coal does.
139
165
 
140
166
  ### conda / conda-forge
141
167
 
@@ -78,6 +78,26 @@ required there.
78
78
  > version range Coal needs), so the `collision` extra skips it there and
79
79
  > collision checking is unavailable via `pip` on Windows. Everything else
80
80
  > in the package works normally.
81
+ >
82
+ > Workaround: conda-forge publishes `coal-python` built for `win-64`
83
+ > against its own assimp, sidestepping the missing wheel entirely:
84
+ >
85
+ > ```shell
86
+ > conda install -c conda-forge coal-python
87
+ > pip install spatialgeometry trimesh
88
+ > ```
89
+
90
+ If you don't need collision checking but do want to work with mesh files --
91
+ e.g. `Mesh.corners()`/`bounds()`/`extents()` for a mesh's bounding box, which
92
+ reads the file via [trimesh](https://trimesh.org) but never touches Coal at
93
+ all -- install just that piece:
94
+
95
+ ```shell
96
+ pip install spatialgeometry[mesh]
97
+ ```
98
+
99
+ Unlike `collision`, this works on Windows too: trimesh has no Windows-wheel
100
+ problem of its own, only Coal does.
81
101
 
82
102
  ### conda / conda-forge
83
103
 
@@ -12,7 +12,13 @@ BUILDDIR = build
12
12
  help:
13
13
  @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
14
 
15
- .PHONY: help Makefile
15
+ # Live-rebuild and reload in the browser on every source change.
16
+ livehtml:
17
+ sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)/html" $(SPHINXOPTS) $(O) \
18
+ --open-browser \
19
+ --ignore "$(SOURCEDIR)/generated/*"
20
+
21
+ .PHONY: help livehtml Makefile
16
22
 
17
23
  # Catch-all target: route all unknown targets to Sphinx using the new
18
24
  # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).