//------------------------------------------------------------------------------------- PyObject* ScriptVector4::py_inplace_subtract(PyObject *self, PyObject *b) { if(!check(b)) { PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Vector4 bv; convertPyObjectToVector4(bv, b); ScriptVector4* sv = static_cast<ScriptVector4*>(self); Vector4& v = sv->getVector(); v -= bv; Py_INCREF(sv); return sv; }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::__py_pySet(PyObject* self, PyObject* args) { ScriptVector4* sv = static_cast<ScriptVector4*>(self); bool good = false; Vector4 v; // 如果参数只有1个元素 int tupleSize = (int)PyTuple_Size(args); if(tupleSize == 1) { PyObject* pyItem = PyTuple_GetItem(args, 0); if(ScriptVector4::check(pyItem, false)) { convertPyObjectToVector4(v, pyItem); good = true; } else { float f = float(PyFloat_AsDouble(pyItem)); for (int i=0; i < VECTOR_SIZE; ++i) { v[i] = f; } good = true; } } else if(tupleSize >= VECTOR_SIZE) { convertPyObjectToVector4(v, args); good = true; } if(!good) { PyErr_Format(PyExc_TypeError, "Vector.set must be set to a tuple of %d floats, or one float", VECTOR_SIZE); PyErr_PrintEx(0); return NULL; } sv->setVector(v); S_Return; }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::__py_pyList(PyObject* self, PyObject* args) { if (PyTuple_Size(args) != 0) { PyErr_SetString(PyExc_TypeError, "Vector.tuple takes no arguments"); PyErr_PrintEx(0); return NULL; } PyObject* pyList = PyList_New(VECTOR_SIZE); ScriptVector4* sv = static_cast<ScriptVector4*>(self); Vector4& v = sv->getVector(); for (int i=0; i < VECTOR_SIZE; ++i) PyList_SetItem(pyList, i, PyFloat_FromDouble(v[i])); return pyList; }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::__py_pyDistSqrTo(PyObject* self, PyObject* args) { if (PyTuple_Size(args) != 1) { PyErr_SetString(PyExc_TypeError, "args > 1 is error!\n"); PyErr_PrintEx(0); S_Return; } ScriptVector4* sv = static_cast<ScriptVector4*>(self); Vector4& v = sv->getVector(); Vector4 v1; convertPyObjectToVector4(v1, PyTuple_GET_ITEM(args, 0)); Vector4 rv = (v - v1); return PyFloat_FromDouble(KBEVec4LengthSq(&rv)); //计算点乘并返回 }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::__reduce_ex__(PyObject* self, PyObject* protocol) { ScriptVector4* sv = static_cast<ScriptVector4*>(self); Vector4& v = sv->getVector(); PyObject* args = PyTuple_New(2); PyObject* unpickleMethod = script::Pickler::getUnpickleFunc("Vector4"); PyTuple_SET_ITEM(args, 0, unpickleMethod); PyObject* args1 = PyTuple_New(VECTOR_SIZE); PyTuple_SET_ITEM(args1, 0, PyFloat_FromDouble(v.x)); PyTuple_SET_ITEM(args1, 1, PyFloat_FromDouble(v.y)); PyTuple_SET_ITEM(args1, 1, PyFloat_FromDouble(v.z)); PyTuple_SET_ITEM(args1, 1, PyFloat_FromDouble(v.w)); PyTuple_SET_ITEM(args, 1, args1); if(unpickleMethod == NULL){ Py_DECREF(args); return NULL; } return args; }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::py_multiply(PyObject *a, PyObject *b) { float f; if(check(a)) { ScriptVector4* sv = static_cast<ScriptVector4*>(a); f = float(PyFloat_AsDouble(b)); return new ScriptVector4(sv->getVector() * f); } else if(check(b)) { ScriptVector4* sv = static_cast<ScriptVector4*>(b); f = float(PyFloat_AsDouble(a)); return new ScriptVector4(sv->getVector() * f); } PyErr_Clear(); Py_INCREF( Py_NotImplemented ); return Py_NotImplemented; }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::py_positive(PyObject *self) { ScriptVector4* sv = static_cast<ScriptVector4*>(self); return new ScriptVector4(sv->getVector() * -1.f); }
//------------------------------------------------------------------------------------- PyObject* ScriptVector4::seq_slice(PyObject* self, Py_ssize_t startIndex, Py_ssize_t endIndex) { if(startIndex < 0) startIndex = 0; if(endIndex > VECTOR_SIZE) endIndex = VECTOR_SIZE; if(endIndex < startIndex) endIndex = startIndex; ScriptVector4* sv = static_cast<ScriptVector4*>(self); Vector4& my_v = sv->getVector(); PyObject* pyResult = NULL; int length = endIndex - startIndex; if (length == VECTOR_SIZE) { pyResult = sv; Py_INCREF(pyResult); } else switch(length) { case 0: pyResult = PyTuple_New(0); break; case 1: pyResult = PyTuple_New(1); PyTuple_SET_ITEM(pyResult, 0, PyFloat_FromDouble(sv->getVector()[static_cast<int>(startIndex)])); break; case 2: { Vector2 v; for(int i = startIndex; i < endIndex; ++i){ v[i - static_cast<int>(startIndex)] = my_v[i]; } pyResult = new ScriptVector2(v); break; } case 3: { Vector3 v; for (int i = startIndex; i < endIndex; ++i){ v[i - static_cast<int>(startIndex)] = my_v[i]; } pyResult = new ScriptVector3(v); break; } default: PyErr_Format(PyExc_IndexError, "Bad slice indexes [%d, %d] for Vector%d", startIndex, endIndex, VECTOR_SIZE); PyErr_PrintEx(0); break; } return pyResult; }