X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=swig%2Fpmd.i;h=f858e8b34effaf44f2824b92f2ce4968b9b0c81a;hb=4b7b856e70fe8047f985e2598020032d0d87a672;hp=6bdfd28e9db2be43668301aef3d916244007d8e0;hpb=5b1d24fcf5aec37d73d79c1e7bd4dc0c7414d7f4;p=meshio%2Fmeshio.git diff --git a/swig/pmd.i b/swig/pmd.i index 6bdfd28..f858e8b 100644 --- a/swig/pmd.i +++ b/swig/pmd.i @@ -1,10 +1,20 @@ %module pmd + +/////////////////////////////////////////////////////////////////////////////// +// bytearray typemap +/////////////////////////////////////////////////////////////////////////////// +%include +%pybuffer_string(const char *src); + %{ #include using namespace meshio; using namespace pmd; %} %include "std_vector.i" +%include "std_wstring.i" +%include "std_string.i" +%include "std_pair.i" %include "../include/color.h" %include "../include/la.h" %include "../include/pmd.h" @@ -20,4 +30,127 @@ using namespace pmd; %template(UshortVector) std::vector; %template(Vector3Vector) std::vector; %template(PBoneVector) std::vector; +%template(BoneGroupVector) std::vector; +%template(DisplayPair) std::pair; +%template(BoneDisplayVector) std::vector >; + +/////////////////////////////////////////////////////////////////////////////// +// meshio::pmd::IO::each_vertex +/////////////////////////////////////////////////////////////////////////////// +%inline %{ +//! Thin wrapper for ONLY the increment operator +void _vertices_incr(std::vector::const_iterator* iter) +{ + // increment the iterator + ++(*iter); +} +%} + +%extend meshio::pmd::IO { +%pythoncode { + def each_vertex(self): + iter = self._beginVertices() + while True: + vertex = self._dereferenceVertex(iter) + if vertex: + _vertices_incr(iter) + yield vertex + else: + break +%} + +//! get the first element in the vector +std::vector::const_iterator* _beginVertices() +{ + return new std::vector::const_iterator( + ($self->vertices.begin())); +} + +//! dereference the iterator; return NULL if at the end +const meshio::pmd::Vertex* _dereferenceVertex( + const std::vector::const_iterator* iter ) +{ + // if at the end, return NULL + if (*iter == ($self)->vertices.end() ) { + return NULL; + } + // otherwise, return the face to which this iterator points + return &(**iter); +} +} + +/////////////////////////////////////////////////////////////////////////////// +// addVertex +// addMaterial +// addBone +// addMorph +// addIK +// addBoneDisplay +// addBoneGroup +// getToonTexture +// addRigidBody +// addConstraint +/////////////////////////////////////////////////////////////////////////////// +%extend meshio::pmd::IO { + +meshio::pmd::Vertex * addVertex() +{ + $self->vertices.push_back(meshio::pmd::Vertex()); + return &($self->vertices.back()); +} + +meshio::pmd::Material *addMaterial() +{ + $self->materials.push_back(new meshio::pmd::Material); + return $self->materials.back(); +} + +meshio::pmd::Bone *addBone() +{ + $self->bones.push_back(meshio::pmd::Bone()); + return &($self->bones.back()); +} + +meshio::pmd::Morph *addMorph() +{ + $self->morph_list.push_back(meshio::pmd::Morph()); + return &($self->morph_list.back()); +} + +meshio::pmd::IK *addIK() +{ + $self->ik_list.push_back(meshio::pmd::IK()); + return &($self->ik_list.back()); +} + +void addBoneDisplay(unsigned short bone_index, unsigned char display_index) +{ + $self->bone_display_list.push_back( + std::make_pair(bone_index, display_index)); +} + +meshio::pmd::BoneGroup *addBoneGroup() +{ + $self->bone_group_list.push_back(meshio::pmd::BoneGroup()); + return &($self->bone_group_list.back()); +} + +meshio::pmd::ToonTexture *getToonTexture(int index) +{ + return &($self->toon_textures[index]); +} + +meshio::pmd::RigidBody *addRigidBody() +{ + $self->rigidbodies.push_back(meshio::pmd::RigidBody()); + return &($self->rigidbodies.back()); +} + +meshio::pmd::Constraint *addConstraint() +{ + $self->constraints.push_back(meshio::pmd::Constraint()); + return &($self->constraints.back()); +} + +}