diff --git a/src/python/magnum/math.vector.h b/src/python/magnum/math.vector.h index 3ea3129..afb8875 100644 --- a/src/python/magnum/math.vector.h +++ b/src/python/magnum/math.vector.h @@ -93,7 +93,6 @@ template void everyVector(py::class_& c) { .def(py::init(), "Default constructor") /* Operators */ - .def(-py::self, "Negated vector") .def(py::self += py::self, "Add and assign a vector") .def(py::self + py::self, "Add a vector") #ifdef __clang__ @@ -124,6 +123,10 @@ template void everyVector(py::class_& c) { .def(typename T::Type{} / py::self, "Divide a vector with a scalar and invert"); } +template void everyVectorSigned(py::class_& c) { + c.def(-py::self, "Negated vector"); +} + /* Separate because it needs to be registered after the type conversion constructors. Needs to be called also for subclasses. */ template void everyVectorBuffer(py::class_& c) { @@ -272,10 +275,6 @@ template void vector2(py::class_>& c) { .def_static("y_scale", &Math::Vector2::yScale, "Scaling vector in a direction of Y axis (height)", py::arg("scale")) - /* Methods */ - .def("perpendicular", &Math::Vector2::perpendicular, - "Perpendicular vector") - /* Properties */ .def_property("x", static_cast::*)() const>(&Math::Vector2::x), @@ -287,6 +286,11 @@ template void vector2(py::class_>& c) { "Y component"); } +template void vector2Signed(py::class_>& c) { + /* Cast needed because these are enabled only for signed types */ + c.def("perpendicular", static_cast(Math::Vector2::*)() const>(&Math::Vector2::perpendicular), "Perpendicular vector"); +} + template void vector3(py::class_>& c) { py::implicitly_convertible&, Math::Vector3>(); diff --git a/src/python/magnum/math.vectorfloat.cpp b/src/python/magnum/math.vectorfloat.cpp index 97907b0..1f4ac96 100644 --- a/src/python/magnum/math.vectorfloat.cpp +++ b/src/python/magnum/math.vectorfloat.cpp @@ -59,19 +59,23 @@ template void vectorsFloat(py::module& m, py::class_>& .def("cross", static_cast&, const Math::Vector2&)>(Math::cross), "2D cross product"); everyVector(vector2_); + everyVectorSigned(vector2_); vector>(m, vector2_); vectorFloat>(m, vector2_); vector2(vector2_); + vector2Signed(vector2_); vector3_ .def("cross", static_cast(*)(const Math::Vector3&, const Math::Vector3&)>(Math::cross), "Cross product"); everyVector(vector3_); + everyVectorSigned(vector3_); vector>(m, vector3_); vectorFloat>(m, vector3_); vector3(vector3_); everyVector(vector4_); + everyVectorSigned(vector4_); vector>(m, vector4_); vectorFloat>(m, vector4_); vector4(vector4_); @@ -132,9 +136,11 @@ void mathVectorFloat(py::module& root, py::module& m) { vectorsFloat(m, vector2, vector3, vector4); vectorsFloat(m, vector2d, vector3d, vector4d); everyVector(color3_); + everyVectorSigned(color3_); color(color3_); color3(color3_); everyVector(color4_); + everyVectorSigned(color4_); color(color4_); color4(color4_); } diff --git a/src/python/magnum/math.vectorintegral.cpp b/src/python/magnum/math.vectorintegral.cpp index 0e71ca9..33f2e54 100644 --- a/src/python/magnum/math.vectorintegral.cpp +++ b/src/python/magnum/math.vectorintegral.cpp @@ -98,6 +98,13 @@ template void vectorsIntegral(py::module& m, py::class_(vector4_); } +template void vectorsIntegralSigned(py::class_>& vector2_, py::class_>& vector3_, py::class_>& vector4_) { + everyVectorSigned(vector2_); + everyVectorSigned(vector3_); + everyVectorSigned(vector4_); + vector2Signed(vector2_); +} + } void mathVectorIntegral(py::module& root, py::module& m) { @@ -131,6 +138,7 @@ void mathVectorIntegral(py::module& root, py::module& m) { /* Now register the generic from-list constructors and everything else */ vectorsIntegral(m, vector2i, vector3i, vector4i); + vectorsIntegralSigned(vector2i, vector3i, vector4i); vectorsIntegral(m, vector2ui, vector3ui, vector4ui); }