%include %include %define texture_coordinate_typemap(type_name) %ignore type_name; %inline{ template<> struct Caster { static type_name fromPy(PyObject* listObject) { return type_name{ Caster::fromPy(PyList_GetItem(listObject, 0)), Caster::fromPy(PyList_GetItem(listObject, 1)) }; } static PyObject* toPy(type_name textureCoordinate) { PyObject* pyTextureCoordinate = PyList_New(static_cast(2)); PyList_SetItem(pyTextureCoordinate, static_cast(0), Caster::toPy(textureCoordinate.u)); PyList_SetItem(pyTextureCoordinate, static_cast(1), Caster::toPy(textureCoordinate.v)); return pyTextureCoordinate; } }; } %typemap(in) (type_name) { if (PyList_Check($input)) { $1 = Caster::fromPy($input); } else { SWIG_exception(SWIG_TypeError, "list expected"); } }; %typemap(out) type_name { $result = Caster<$1_basetype>::toPy($1); } %typemap(typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY) type_name { $1 = PyList_Check($input) ? 1 : 0; } %enddef %define vertex_layout_typemap(type_name) %ignore type_name; %inline { template<> struct Caster { static type_name fromPy(PyObject* listObject) { return type_name{ Caster::fromPy(PyList_GetItem(listObject, 0)), Caster::fromPy(PyList_GetItem(listObject, 1)), Caster::fromPy(PyList_GetItem(listObject, 2)) }; } static PyObject* toPy(type_name vertexLayout) { PyObject* pyVertexLayout = PyList_New(static_cast(3)); PyList_SetItem(pyVertexLayout, static_cast(0), Caster::toPy(vertexLayout.position)); PyList_SetItem(pyVertexLayout, static_cast(1), Caster::toPy(vertexLayout.textureCoordinate)); PyList_SetItem(pyVertexLayout, static_cast(2), Caster::toPy(vertexLayout.normal)); return pyVertexLayout; } }; } %typemap(in) (type_name) { if (PyList_Check($input)) { $1 = Caster::fromPy($input); } else { SWIG_exception(SWIG_TypeError, "list expected"); } }; %typemap(out) type_name { $result = Caster<$1_basetype>::toPy($1); } %typemap(typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY) type_name { $1 = PyList_Check($input) ? 1 : 0; } %enddef