1 Star 0 Fork 121

blog/kbengine

forked from likecg/kbengine 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
vector4.cpp 23.15 KB
一键复制 编辑 原始数据 按行查看 历史
liquidx 提交于 2014-12-22 15:34 +08:00 . 做点小优化
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
/*
This source file is part of KBEngine
For the latest info, see http://www.kbengine.org/
Copyright (c) 2008-2012 KBEngine.
KBEngine is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KBEngine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with KBEngine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vector2.h"
#include "vector3.h"
#include "vector4.h"
#include "pyscript/py_gc.h"
namespace KBEngine{ namespace script{
const int ScriptVector4::VECTOR_SIZE = sizeof(Vector4) / sizeof(float);
PySequenceMethods ScriptVector4::seqMethods =
{
ScriptVector4::seq_length, /* sq_length */
0, /* sq_concat */
0, /* sq_repeat */
ScriptVector4::seq_item, /* sq_item */
0,//ScriptVector4::seq_slice, /* sq_slice */
ScriptVector4::seq_ass_item, /* sq_ass_item */
0, /* sq_ass_slice */
0, /* sq_contains */
0, /* sq_inplace_concat */
0, /* sq_inplace_repeat */
};
PyNumberMethods ScriptVector4::numberMethods =
{
ScriptVector4::py_add, //binaryfunc nb_add;
ScriptVector4::py_subtract, //binaryfunc nb_subtract;
ScriptVector4::py_multiply, //binaryfunc nb_multiply;
//ScriptVector4::py_divide, //binaryfunc nb_divide;
0, //binaryfunc nb_remainder;
0, //binaryfunc nb_divmod;
0, //ternaryfunc nb_power;
ScriptVector4::py_negative, //unaryfunc nb_negative;
ScriptVector4::py_positive, //unaryfunc nb_positive;
0, //unaryfunc nb_absolute;
ScriptVector4::py_nonzero, //inquiry nb_nonzero nb_nonzero重命名为nb_bool,__nonzero__()重命名为__bool__();
0, //unaryfunc nb_invert;
0, //binaryfunc nb_lshift;
0, //binaryfunc nb_rshift;
0, //binaryfunc nb_and;
0, //binaryfunc nb_xor;
0, //binaryfunc nb_or;
//0, //coercion nb_coerce;
0, //unaryfunc nb_int;
0, // void *nb_reserved;
//0, //unaryfunc nb_long;
0, //unaryfunc nb_float;
//0, //unaryfunc nb_oct;
//0, //unaryfunc nb_hex;
ScriptVector4::py_inplace_add, //binaryfunc nb_inplace_add;
ScriptVector4::py_inplace_subtract, //binaryfunc nb_inplace_subtract;
ScriptVector4::py_inplace_multiply, //binaryfunc nb_inplace_multiply;
//ScriptVector4::py_inplace_divide, //binaryfunc nb_inplace_divide;
0, //binaryfunc nb_inplace_remainder;
0, //ternaryfunc nb_inplace_power;
0, //binaryfunc nb_inplace_lshift;
0, //binaryfunc nb_inplace_rshift;
0, //binaryfunc nb_inplace_and;
0, //binaryfunc nb_inplace_xor;
0, //binaryfunc nb_inplace_or;
// Added in release 2.2
0, //binaryfunc nb_floor_divide;
0, //binaryfunc nb_true_divide;
0, //binaryfunc nb_inplace_floor_divide;
0, //binaryfunc nb_inplace_true_divide;
};
/*
static int tp_compare(PyObject* v, PyObject* w)
{
if (ScriptVector4::check(v) && ScriptVector4::check(w)){
const Vector4& a = ((ScriptVector4 *)v)->getVector();
const Vector4& b = ((ScriptVector4 *)w)->getVector();
return (a < b) ? -1 : (b < a) ? 1 : 0;
}
return 0;
}
*/
SCRIPT_METHOD_DECLARE_BEGIN(ScriptVector4)
SCRIPT_METHOD_DECLARE("distTo", pyDistTo, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("distSqrTo", pyDistSqrTo, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("scale", pyScale, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("dot", pyDot, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("normalise", pyNormalise, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("tuple", pyTuple, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("list", pyList, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE("set", pySet, METH_VARARGS, 0)
SCRIPT_DIRECT_METHOD_DECLARE("__reduce_ex__", __reduce_ex__, METH_VARARGS, 0)
SCRIPT_METHOD_DECLARE_END()
SCRIPT_MEMBER_DECLARE_BEGIN(ScriptVector4)
SCRIPT_MEMBER_DECLARE_END()
SCRIPT_GETSET_DECLARE_BEGIN(ScriptVector4)
SCRIPT_GETSET_DECLARE("x", pyGetX, pySetX, 0, 0)
SCRIPT_GETSET_DECLARE("y", pyGetY, pySetY, 0, 0)
SCRIPT_GETSET_DECLARE("z", pyGetZ, pySetZ, 0, 0)
SCRIPT_GETSET_DECLARE("w", pyGetW, pySetW, 0, 0)
SCRIPT_GET_DECLARE("length", pyGetVectorLength, 0, 0)
SCRIPT_GET_DECLARE("lengthSquared", pyGetVectorLengthSquared, 0, 0)
SCRIPT_GETSET_DECLARE_END()
SCRIPT_INIT(ScriptVector4, 0, &ScriptVector4::seqMethods, 0, 0, 0)
//-------------------------------------------------------------------------------------
ScriptVector4::ScriptVector4(Vector4* v):
ScriptObject(getScriptType(), false),
val_(v),
isCopy_(true)
{
script::PyGC::incTracing("Vector4");
}
//-------------------------------------------------------------------------------------
ScriptVector4::ScriptVector4(Vector4 v):
ScriptObject(getScriptType(), false),
isCopy_(false)
{
val_ = new Vector4(v);
script::PyGC::incTracing("Vector4");
}
//-------------------------------------------------------------------------------------
ScriptVector4::ScriptVector4(float x, float y, float z, float w):
ScriptObject(getScriptType(), false),
isCopy_(false)
{
val_ = new Vector4(x, y, z, w);
script::PyGC::incTracing("Vector4");
}
//-------------------------------------------------------------------------------------
ScriptVector4::~ScriptVector4()
{
if(!isCopy_)
delete val_;
script::PyGC::decTracing("Vector4");
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::tp_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
{
ScriptVector4* v = new ScriptVector4(0,0,0,0);
if(PyTuple_Size(args) > 0)
{
PyObject* pyResult = v->__py_pySet((PyObject*)v, args);
if(pyResult)
Py_DECREF(pyResult);
else
return NULL;
}
return v;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::tp_repr()
{
char str[128];
Vector4 v = this->getVector();
strcpy(str, "Vector4(");
for(int i=0; i < VECTOR_SIZE; ++i)
{
if (i > 0)
strcat(str, ", ");
kbe_snprintf(str + strlen(str), 128, "%f", v[i]);
}
strcat(str, ")");
return PyUnicode_FromString(str);
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::tp_str()
{
return tp_repr();
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::pyGetVectorLength()
{
return PyFloat_FromDouble(KBEVec4Length(&getVector()));
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::pyGetVectorLengthSquared()
{
return PyFloat_FromDouble(KBEVec4LengthSq(&getVector()));
}
//-------------------------------------------------------------------------------------
Py_ssize_t ScriptVector4::seq_length(PyObject* self)
{
ScriptVector4* seq = static_cast<ScriptVector4*>(self);
return seq->length();
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::seq_item(PyObject* self, Py_ssize_t index)
{
if (index < 0 || VECTOR_SIZE <= index)
{
PyErr_SetString(PyExc_IndexError, "Vector4 index out of range");
//PyErr_PrintEx(0);
return NULL;
}
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
return PyFloat_FromDouble(sv->getVector()[static_cast<int>(index)]);
}
//-------------------------------------------------------------------------------------
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;
}
//-------------------------------------------------------------------------------------
int ScriptVector4::seq_ass_item(PyObject* self, Py_ssize_t index, PyObject* value)
{
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
if (index < 0 || VECTOR_SIZE <= index)
{
PyErr_SetString(PyExc_IndexError, "Vector assignment index out of range");
PyErr_PrintEx(0);
return -1;
}
Vector4& v = sv->getVector();
v[static_cast<int>(index)] = float(PyFloat_AsDouble(value));
return 0;
}
//-------------------------------------------------------------------------------------
int ScriptVector4::pySetX(PyObject *value)
{
getVector().x = float(PyFloat_AsDouble(value));
return 0;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::pyGetX()
{
return PyFloat_FromDouble(getVector().x);
}
//-------------------------------------------------------------------------------------
int ScriptVector4::pySetY(PyObject *value)
{
getVector().y = float(PyFloat_AsDouble(value));
return 0;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::pyGetY()
{
return PyFloat_FromDouble(getVector().y);
}
//-------------------------------------------------------------------------------------
int ScriptVector4::pySetZ(PyObject *value)
{
getVector().z = float(PyFloat_AsDouble(value));
return 0;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::pyGetZ()
{
return PyFloat_FromDouble(getVector().z);
}
//-------------------------------------------------------------------------------------
int ScriptVector4::pySetW(PyObject *value)
{
getVector().w = float(PyFloat_AsDouble(value));
return 0;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::pyGetW()
{
return PyFloat_FromDouble(getVector().w);
}
//-------------------------------------------------------------------------------------
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::__unpickle__(PyObject* self, PyObject* args)
{
float x, y, z, w;
Py_ssize_t size = PyTuple_Size(args);
if(size != VECTOR_SIZE)
{
ERROR_MSG("ScriptVector4::__unpickle__: args is error! size != 4");
S_Return;
}
if(!PyArg_ParseTuple(args, "ffff", &x, &y, &z, &w))
{
ERROR_MSG("ScriptVector4::__unpickle__: args is error!");
S_Return;
}
return new ScriptVector4(x, y, z, w);
}
//-------------------------------------------------------------------------------------
void ScriptVector4::onInstallScript(PyObject* mod)
{
static PyMethodDef __unpickle__Method = {"Vector4", (PyCFunction)&ScriptVector4::__unpickle__, METH_VARARGS, 0};
PyObject* pyFunc = PyCFunction_New(&__unpickle__Method, NULL);
script::Pickler::registerUnpickleFunc(pyFunc, "Vector4");
Py_DECREF(pyFunc);
ScriptVector4::_scriptType.tp_as_number = &ScriptVector4::numberMethods;
//ScriptVector4::_scriptType.tp_compare = tp_compare;
ScriptVector4::_scriptType.tp_name = "Vector4";
}
//-------------------------------------------------------------------------------------
bool ScriptVector4::check(PyObject* value, bool isPrintErr)
{
if(PySequence_Check(value) <= 0)
{
if(isPrintErr)
{
PyErr_Format(PyExc_TypeError, "args of position is must a sequence.");
PyErr_PrintEx(0);
}
return false;
}
Py_ssize_t size = PySequence_Size(value);
if(size != VECTOR_SIZE)
{
if(isPrintErr)
{
PyErr_Format(PyExc_TypeError, "len(position) != %d. can't set.", VECTOR_SIZE);
PyErr_PrintEx(0);
}
return false;
}
return true;
}
//-------------------------------------------------------------------------------------
void ScriptVector4::convertPyObjectToVector4(Vector4& v, PyObject* obj)
{
PyObject* pyItem = PySequence_GetItem(obj, 0);
v.x = float(PyFloat_AsDouble(pyItem));
Py_DECREF(pyItem);
pyItem = PySequence_GetItem(obj, 1);
v.y = float(PyFloat_AsDouble(pyItem));
Py_DECREF(pyItem);
pyItem = PySequence_GetItem(obj, 2);
v.z = float(PyFloat_AsDouble(pyItem));
Py_DECREF(pyItem);
pyItem = PySequence_GetItem(obj, 3);
v.w = float(PyFloat_AsDouble(pyItem));
Py_DECREF(pyItem);
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_add(PyObject *a, PyObject *b)
{
if(!check(a) || !check(b))
{
PyErr_Clear();
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
Vector4 av;
Vector4 bv;
convertPyObjectToVector4(av, a);
convertPyObjectToVector4(bv, b);
return new ScriptVector4(av + bv);
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_subtract(PyObject *a, PyObject *b)
{
if(!check(a) || !check(b))
{
PyErr_Clear();
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
Vector4 av;
Vector4 bv;
convertPyObjectToVector4(av, a);
convertPyObjectToVector4(bv, b);
return new ScriptVector4(av - bv);
}
//-------------------------------------------------------------------------------------
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_divide(PyObject *a, PyObject *b)
{
if(!check(a))
{
PyErr_Clear();
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
Vector4 av;
convertPyObjectToVector4(av, a);
float f = float(PyFloat_AsDouble(b));
return new ScriptVector4(av / f);
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_negative(PyObject *self)
{
//ScriptVector4* sv = static_cast<ScriptVector4*>(self);
S_Return;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_positive(PyObject *self)
{
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
return new ScriptVector4(sv->getVector() * -1.f);
}
//-------------------------------------------------------------------------------------
int ScriptVector4::py_nonzero(PyObject *self)
{
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
// 点乘
Vector4 v = sv->getVector();
float val = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
return val > 0.f;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_inplace_add(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_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_inplace_multiply(PyObject *self, PyObject *b)
{
float value = float(PyFloat_AsDouble(b));
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
sv->setVector(sv->getVector() * value);
Py_INCREF(sv);
return sv;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_inplace_divide(PyObject *self, PyObject *b)
{
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
Vector4& v = sv->getVector();
float f = float(PyFloat_AsDouble(b));
v /= f;
Py_INCREF(sv);
return sv;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::__py_pyDistTo(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(KBEVec4Length(&rv)); //计算长度并返回
}
//-------------------------------------------------------------------------------------
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::__py_pyScale(PyObject* self, PyObject* args)
{
if(PyTuple_Size(args) == 1)
{
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
Vector4& v = sv->getVector();
PyObject* pItem = PyTuple_GetItem(args, 0);
return new ScriptVector4(v * float(PyFloat_AsDouble(pItem)));
}
PyErr_SetString(PyExc_TypeError, "Vector.scale expects a float argument");
PyErr_PrintEx(0);
return NULL;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::__py_pyDot(PyObject* self, PyObject* args)
{
ScriptVector4* v = new ScriptVector4(0,0,0,0);
PyObject* pyResult = v->__py_pySet((PyObject*)v, args);
if(pyResult)
Py_DECREF(pyResult);
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
float result = KBEVec4Dot(const_cast<Vector4*>(&sv->getVector()), const_cast<Vector4*>(&v->getVector()));
Py_DECREF(v);
return PyFloat_FromDouble(result);
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::__py_pyNormalise(PyObject* self, PyObject* args)
{
if (PyTuple_Size(args) != 0)
{
PyErr_SetString(PyExc_TypeError, "Vector.normalise takes no arguments(nor does it brook any dissent :)");
PyErr_PrintEx(0);
return NULL;
}
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
Vector4& v = sv->getVector();
KBEVec4Normalize(&v, &v);
S_Return;
}
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::__py_pyTuple(PyObject* self, PyObject* args)
{
if (PyTuple_Size(args) != 0)
{
PyErr_SetString(PyExc_TypeError, "Vector.tuple takes no arguments");
PyErr_PrintEx(0);
return NULL;
}
PyObject* pyTup = PyTuple_New(VECTOR_SIZE);
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
Vector4& v = sv->getVector();
for(int i = 0; i < VECTOR_SIZE; ++i)
PyTuple_SetItem(pyTup, i, PyFloat_FromDouble(v[i]));
return pyTup;
}
//-------------------------------------------------------------------------------------
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_pySet(PyObject* self, PyObject* args)
{
ScriptVector4* sv = static_cast<ScriptVector4*>(self);
bool good = false;
Vector4 v;
// 如果参数只有1个元素
int tupleSize = 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;
}
//-------------------------------------------------------------------------------------
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/blog/kbengine.git
git@gitee.com:blog/kbengine.git
blog
kbengine
kbengine
79b13fda735e573bcbf7f47457634b77cf597d00

搜索帮助