|
|
@@ -207,13 +207,92 @@ __setattr__(PyObject *self, const std::string &attr_name, PyObject *assign) {
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-INLINE_LINMATH FLOATNAME(LVecBase4) Extension<FLOATNAME(LVecBase4)>::
|
|
|
-__pow__(FLOATTYPE exponent) const {
|
|
|
- return FLOATNAME(LVecBase4)(
|
|
|
- cpow(_this->_v(0), exponent),
|
|
|
- cpow(_this->_v(1), exponent),
|
|
|
- cpow(_this->_v(2), exponent),
|
|
|
- cpow(_this->_v(3), exponent));
|
|
|
+INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase4)>::
|
|
|
+__floordiv__(PyObject *self, FLOATTYPE scalar) const {
|
|
|
+ if (scalar == (FLOATTYPE)0) {
|
|
|
+ return PyErr_Format(PyExc_ZeroDivisionError, "floor division by zero");
|
|
|
+ }
|
|
|
+
|
|
|
+#ifndef CPPPARSER
|
|
|
+ extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
|
|
|
+#endif
|
|
|
+ PyObject *py_vec = PyObject_CallNoArgs((PyObject *)DtoolInstance_TYPE(self));
|
|
|
+ if (py_vec != nullptr) {
|
|
|
+ FLOATNAME(LVecBase4) *vec = (FLOATNAME(LVecBase4) *)DtoolInstance_UPCAST(py_vec, FLOATNAME(Dtool_LVecBase4));
|
|
|
+ nassertr(vec != nullptr, nullptr);
|
|
|
+
|
|
|
+#ifdef FLOATTYPE_IS_INT
|
|
|
+ if (scalar > 0) {
|
|
|
+ vec->_v(0) = (_this->_v(0) >= 0) ? _this->_v(0) / scalar : -1 - (-1 - _this->_v(0)) / scalar;
|
|
|
+ vec->_v(1) = (_this->_v(1) >= 0) ? _this->_v(1) / scalar : -1 - (-1 - _this->_v(1)) / scalar;
|
|
|
+ vec->_v(2) = (_this->_v(2) >= 0) ? _this->_v(2) / scalar : -1 - (-1 - _this->_v(2)) / scalar;
|
|
|
+ vec->_v(3) = (_this->_v(3) >= 0) ? _this->_v(3) / scalar : -1 - (-1 - _this->_v(3)) / scalar;
|
|
|
+ } else {
|
|
|
+ vec->_v(0) = (_this->_v(0) <= 0) ? _this->_v(0) / scalar : -1 + (1 - _this->_v(0)) / -scalar;
|
|
|
+ vec->_v(1) = (_this->_v(1) <= 0) ? _this->_v(1) / scalar : -1 + (1 - _this->_v(1)) / -scalar;
|
|
|
+ vec->_v(2) = (_this->_v(2) <= 0) ? _this->_v(2) / scalar : -1 + (1 - _this->_v(2)) / -scalar;
|
|
|
+ vec->_v(3) = (_this->_v(3) <= 0) ? _this->_v(3) / scalar : -1 + (1 - _this->_v(3)) / -scalar;
|
|
|
+ }
|
|
|
+#else
|
|
|
+ vec->_v(0) = std::floor(_this->_v(0) / scalar);
|
|
|
+ vec->_v(1) = std::floor(_this->_v(1) / scalar);
|
|
|
+ vec->_v(2) = std::floor(_this->_v(2) / scalar);
|
|
|
+ vec->_v(3) = std::floor(_this->_v(3) / scalar);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ return py_vec;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase4)>::
|
|
|
+__ifloordiv__(PyObject *self, FLOATTYPE scalar) {
|
|
|
+ if (scalar == (FLOATTYPE)0) {
|
|
|
+ return PyErr_Format(PyExc_ZeroDivisionError, "floor division by zero");
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef FLOATTYPE_IS_INT
|
|
|
+ if (scalar > 0) {
|
|
|
+ _this->_v(0) = (_this->_v(0) >= 0) ? _this->_v(0) / scalar : -1 - (-1 - _this->_v(0)) / scalar;
|
|
|
+ _this->_v(1) = (_this->_v(1) >= 0) ? _this->_v(1) / scalar : -1 - (-1 - _this->_v(1)) / scalar;
|
|
|
+ _this->_v(2) = (_this->_v(2) >= 0) ? _this->_v(2) / scalar : -1 - (-1 - _this->_v(2)) / scalar;
|
|
|
+ _this->_v(3) = (_this->_v(3) >= 0) ? _this->_v(3) / scalar : -1 - (-1 - _this->_v(3)) / scalar;
|
|
|
+ } else {
|
|
|
+ _this->_v(0) = (_this->_v(0) <= 0) ? _this->_v(0) / scalar : -1 + (1 - _this->_v(0)) / -scalar;
|
|
|
+ _this->_v(1) = (_this->_v(1) <= 0) ? _this->_v(1) / scalar : -1 + (1 - _this->_v(1)) / -scalar;
|
|
|
+ _this->_v(2) = (_this->_v(2) <= 0) ? _this->_v(2) / scalar : -1 + (1 - _this->_v(2)) / -scalar;
|
|
|
+ _this->_v(3) = (_this->_v(3) <= 0) ? _this->_v(3) / scalar : -1 + (1 - _this->_v(3)) / -scalar;
|
|
|
+ }
|
|
|
+#else
|
|
|
+ _this->_v(0) = std::floor(_this->_v(0) / scalar);
|
|
|
+ _this->_v(1) = std::floor(_this->_v(1) / scalar);
|
|
|
+ _this->_v(2) = std::floor(_this->_v(2) / scalar);
|
|
|
+ _this->_v(3) = std::floor(_this->_v(3) / scalar);
|
|
|
+#endif
|
|
|
+ Py_INCREF(self);
|
|
|
+ return self;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase4)>::
|
|
|
+__pow__(PyObject *self, FLOATTYPE exponent) const {
|
|
|
+#ifndef CPPPARSER
|
|
|
+ extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
|
|
|
+#endif
|
|
|
+ PyObject *py_vec = PyObject_CallNoArgs((PyObject *)DtoolInstance_TYPE(self));
|
|
|
+ if (py_vec != nullptr) {
|
|
|
+ FLOATNAME(LVecBase4) *vec = (FLOATNAME(LVecBase4) *)DtoolInstance_UPCAST(py_vec, FLOATNAME(Dtool_LVecBase4));
|
|
|
+ nassertr(vec != nullptr, nullptr);
|
|
|
+
|
|
|
+ vec->_v(0) = cpow(_this->_v(0), exponent);
|
|
|
+ vec->_v(1) = cpow(_this->_v(1), exponent);
|
|
|
+ vec->_v(2) = cpow(_this->_v(2), exponent);
|
|
|
+ vec->_v(3) = cpow(_this->_v(3), exponent);
|
|
|
+ }
|
|
|
+ return py_vec;
|
|
|
}
|
|
|
|
|
|
/**
|