Example #1
0
//-------------------------------------------------------------------------------------
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;
}
Example #2
0
//-------------------------------------------------------------------------------------
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;
}
Example #3
0
//-------------------------------------------------------------------------------------
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;
}
Example #4
0
//-------------------------------------------------------------------------------------
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)); //计算点乘并返回
}
Example #5
0
//-------------------------------------------------------------------------------------
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;
}
Example #6
0
//-------------------------------------------------------------------------------------
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;
}
Example #7
0
//-------------------------------------------------------------------------------------
PyObject* ScriptVector4::py_positive(PyObject *self)
{
	ScriptVector4* sv = static_cast<ScriptVector4*>(self);
	return new ScriptVector4(sv->getVector() * -1.f);
}
Example #8
0
//-------------------------------------------------------------------------------------
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;
}