//------------------------------------------------------------------------------------- PyObject* ScriptVector3::__py_pyFlatDistSqrTo(PyObject* self, PyObject* args) { if (PyTuple_Size(args) != 1) { PyErr_SetString(PyExc_TypeError, "args > 1 is error!\n"); PyErr_PrintEx(0); S_Return; } PyObject* pyVal = PyTuple_GET_ITEM(args, 0); if(!check(pyVal)) { S_Return; } ScriptVector3* sv = static_cast<ScriptVector3*>(self); Vector3& v = sv->getVector(); Vector3 v1; convertPyObjectToVector3(v1, pyVal); float x = v.x - v1.x; float z = v.z - v1.z; return PyFloat_FromDouble(x*x + z*z); }
//------------------------------------------------------------------------------------- PyObject* ScriptVector3::py_subtract(PyObject *a, PyObject *b) { if(!check(a) || !check(b)) { PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Vector3 av; Vector3 bv; convertPyObjectToVector3(av, a); convertPyObjectToVector3(bv, b); return new ScriptVector3(av - bv); }
//------------------------------------------------------------------------------------- PyObject* ScriptVector3::__py_pySet(PyObject* self, PyObject* args) { ScriptVector3* sv = static_cast<ScriptVector3*>(self); bool good = false; Vector3 v; // 如果参数只有1个元素 int tupleSize = (int)PyTuple_Size(args); if(tupleSize == 1) { PyObject* pyItem = PyTuple_GetItem(args, 0); if(ScriptVector3::check(pyItem, false)) { convertPyObjectToVector3(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) { convertPyObjectToVector3(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* ScriptVector3::py_divide(PyObject *a, PyObject *b) { if(!check(a)) { PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Vector3 av; convertPyObjectToVector3(av, a); float f = float(PyFloat_AsDouble(b)); return new ScriptVector3(av / f); }
//------------------------------------------------------------------------------------- PyObject* ScriptVector3::__py_pyFlatDistTo(PyObject* self, PyObject* args) { if (PyTuple_Size(args) != 1) { PyErr_SetString(PyExc_TypeError, "args > 1 is error!\n"); PyErr_PrintEx(0); S_Return; } ScriptVector3* sv = static_cast<ScriptVector3*>(self); Vector3& v = sv->getVector(); Vector3 v1; convertPyObjectToVector3(v1, PyTuple_GET_ITEM(args, 0)); return PyFloat_FromDouble(KBEVec3CalcVec2Length(v, v1)); }
//------------------------------------------------------------------------------------- PyObject* ScriptVector3::py_inplace_subtract(PyObject *self, PyObject *b) { if(!check(b)) { PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Vector3 bv; convertPyObjectToVector3(bv, b); ScriptVector3* sv = static_cast<ScriptVector3*>(self); Vector3& v = sv->getVector(); v -= bv; Py_INCREF(sv); return sv; }
//------------------------------------------------------------------------------------- PyObject* ScriptVector3::__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; } PyObject* pyVal = PyTuple_GET_ITEM(args, 0); if(!check(pyVal)) { S_Return; } ScriptVector3* sv = static_cast<ScriptVector3*>(self); Vector3& v = sv->getVector(); Vector3 v1; convertPyObjectToVector3(v1, pyVal); Vector3 rv = (v - v1); return PyFloat_FromDouble(KBEVec3LengthSq(&rv)); //计算点乘并返回 }
//------------------------------------------------------------------------------------- PyObject* ScriptVector3::py_inplace_multiply(PyObject *self, PyObject *b) { ScriptVector3* sv = static_cast<ScriptVector3*>(self); Vector3& v = sv->getVector(); if (check(b, false)) { Vector3 bv; convertPyObjectToVector3(bv, b); // 叉乘 v.x = (v.y * bv.z) - (v.z * bv.y); v.y = (v.z * bv.x) - (v.x * bv.z); v.z = (v.x * bv.y) - (v.y * bv.x); } else { float f = float(PyFloat_AsDouble(b)); v *= f; } Py_INCREF(sv); return sv; }