コード例 #1
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::py_inplace_multiply(PyObject *self, PyObject *b)
{
	float value = float(PyFloat_AsDouble(b));
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	sv->setVector(sv->getVector() * value);
	Py_INCREF(sv);
	return sv;
}
コード例 #2
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
int ScriptVector2::py_nonzero(PyObject *self)
{
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	// 点乘
	Vector2 v = sv->getVector();
	float val = v.x * v.x + v.y * v.y;
	return val > 0.f;
}
コード例 #3
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::py_inplace_divide(PyObject *self, PyObject *b)
{
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& v = sv->getVector();
	float f = float(PyFloat_AsDouble(b));
	v /= f;

	Py_INCREF(sv);
	return sv;
}
コード例 #4
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::seq_item(PyObject* self, Py_ssize_t index)
{
	if (index < 0 || VECTOR_SIZE <= index)
	{
		PyErr_SetString(PyExc_IndexError, "Vector2 index out of range");
		//PyErr_PrintEx(0);
		return NULL;
	}

	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	return PyFloat_FromDouble(sv->getVector()[static_cast<int32>(static_cast<int>(index))]);
}
コード例 #5
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__py_pyDot(PyObject* self, PyObject* args)
{
	ScriptVector2* v = new ScriptVector2(0,0);

	PyObject* pyResult = v->__py_pySet((PyObject*)v, args);
	if(pyResult)
		Py_DECREF(pyResult);

	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	float result = KBEVec2Dot(const_cast<Vector2*>(&sv->getVector()), const_cast<Vector2*>(&v->getVector()));
	Py_DECREF(v);
	return PyFloat_FromDouble(result);
}
コード例 #6
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__py_pyScale(PyObject* self, PyObject* args)
{
	if(PyTuple_Size(args) == 1)
	{
		ScriptVector2* sv = static_cast<ScriptVector2*>(self);
		Vector2& v = sv->getVector();
		PyObject* pItem = PyTuple_GetItem(args, 0);
		return new ScriptVector2(v * float(PyFloat_AsDouble(pItem)));
	}

	PyErr_SetString(PyExc_TypeError, "Vector.scale expects a float argument");
	PyErr_PrintEx(0);
	return NULL;
}
コード例 #7
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__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;
	}

	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& v = sv->getVector();
	KBEVec2Normalize(&v, &v);
	S_Return;
}
コード例 #8
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
int ScriptVector2::seq_ass_item(PyObject* self, Py_ssize_t index, PyObject* value)
{
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);

	if (index < 0 || VECTOR_SIZE <= index)
	{
		PyErr_SetString(PyExc_IndexError, "Vector assignment index out of range");
		PyErr_PrintEx(0);
		return -1;
	}

	Vector2& v = sv->getVector();
	v[static_cast<int>(index)] = float(PyFloat_AsDouble(value));
	return 0;
}
コード例 #9
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__py_pyCross2D(PyObject* self, PyObject* args)
{
	ScriptVector2* v = new ScriptVector2(0,0);
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);

	PyObject* pyResult = v->__py_pySet((PyObject*)v, args);
	if(pyResult)
		Py_DECREF(pyResult);

	const Vector2 otherV = v->getVector();
	const Vector2 thisV = sv->getVector();
	float result = thisV[0] * otherV[1] - thisV[1] * otherV[0];
	Py_DECREF(v);
	return PyFloat_FromDouble(result);
}
コード例 #10
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::py_inplace_subtract(PyObject *self, PyObject *b)
{
	if(!check(b))
	{
		PyErr_Clear();
		Py_INCREF(Py_NotImplemented);
		return Py_NotImplemented;
	}
	
	Vector2 bv;
	convertPyObjectToVector2(bv, b);
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& v = sv->getVector();
	v -= bv;
	Py_INCREF(sv);
	return sv;
}
コード例 #11
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__reduce_ex__(PyObject* self, PyObject* protocol)
{
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& v = sv->getVector();
	PyObject* args = PyTuple_New(2);
	PyObject* unpickleMethod = script::Pickler::getUnpickleFunc("Vector2");
	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(args, 1, args1);
	
	if(unpickleMethod == NULL){
		Py_DECREF(args);
		return NULL;
	}
	return args;
}
コード例 #12
0
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__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;
	}
	
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& v = sv->getVector();
	
	Vector2 v1;
	convertPyObjectToVector2(v1, PyTuple_GET_ITEM(args, 0));
	
	Vector2 rv = (v - v1);
	return PyFloat_FromDouble(KBEVec2LengthSq(&rv)); //计算点乘并返回
}
コード例 #13
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__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);
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& v = sv->getVector();
	
	for (int i=0; i < VECTOR_SIZE; ++i)
		PyList_SetItem(pyList, i, PyFloat_FromDouble(v[i]));

	return pyList;
}
コード例 #14
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::__py_pySet(PyObject* self, PyObject* args)
{
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	bool good = false;
	Vector2 v;

	// 如果参数只有1个元素
	int tupleSize = (int)PyTuple_Size(args);
	if(tupleSize == 1)
	{
		PyObject* pyItem = PyTuple_GetItem(args, 0);

		if(ScriptVector2::check(pyItem, false))
		{
			convertPyObjectToVector2(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)
	{
		convertPyObjectToVector2(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;
}
コード例 #15
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::py_multiply(PyObject *a, PyObject *b)
{
	float f;
	
	if(check(a))
	{
		ScriptVector2* sv = static_cast<ScriptVector2*>(a);
		f = float(PyFloat_AsDouble(b));
		return new ScriptVector2(sv->getVector() * f);
	}
	else if(check(b))
	{
		ScriptVector2* sv = static_cast<ScriptVector2*>(b);
		f = float(PyFloat_AsDouble(a));
		return new ScriptVector2(sv->getVector() * f);
	}

	PyErr_Clear();
	Py_INCREF( Py_NotImplemented );
	return Py_NotImplemented;
}
コード例 #16
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::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;

	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	Vector2& my_v = sv->getVector();
	PyObject* pyResult = NULL;

	int length = (int)(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 = (int)startIndex; i < (int)endIndex; ++i){
					v[i - static_cast<int>(startIndex)] = my_v[i];
				}

				pyResult = new ScriptVector2(v);
				break;
			}
			case 3:
			{
				Vector3 v;
				for (int i = (int)startIndex; i < (int)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;
}
コード例 #17
0
ファイル: vector2.cpp プロジェクト: 1564143452/kbengine
//-------------------------------------------------------------------------------------
PyObject* ScriptVector2::py_positive(PyObject *self)
{
	ScriptVector2* sv = static_cast<ScriptVector2*>(self);
	return new ScriptVector2(sv->getVector() * -1.f);
}