OSDN Git Service

separate vertex with uv or normal.
[meshio/meshio.git] / swig / pmd.i
index 7fd2b74..f858e8b 100644 (file)
@@ -1,7 +1,156 @@
 %module pmd
+
+///////////////////////////////////////////////////////////////////////////////
+// bytearray typemap
+///////////////////////////////////////////////////////////////////////////////
+%include <pybuffer.i>
+%pybuffer_string(const char *src);
+
 %{
 #include <pmd.h>
 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"
 
+%template(VertexVector) std::vector<meshio::pmd::Vertex>;
+%template(MaterialVector) std::vector<meshio::pmd::Material*>;
+%template(BoneVector) std::vector<meshio::pmd::Bone>;
+%template(IKVector) std::vector<meshio::pmd::IK>;
+%template(MorphVector) std::vector<meshio::pmd::Morph>;
+%template(RigidBodyVector) std::vector<meshio::pmd::RigidBody>;
+%template(ConstraintVector) std::vector<meshio::pmd::Constraint>;
+%template(UintVector) std::vector<unsigned int>;
+%template(UshortVector) std::vector<unsigned short>;
+%template(Vector3Vector) std::vector<meshio::pmd::Vector3>;
+%template(PBoneVector) std::vector<meshio::pmd::Bone*>;
+%template(BoneGroupVector) std::vector<meshio::pmd::BoneGroup>;
+%template(DisplayPair) std::pair<unsigned short, unsigned char>;
+%template(BoneDisplayVector) std::vector<std::pair<unsigned short, unsigned char> >;
+
+///////////////////////////////////////////////////////////////////////////////
+// meshio::pmd::IO::each_vertex
+///////////////////////////////////////////////////////////////////////////////
+%inline %{
+//! Thin wrapper for ONLY the increment operator
+void _vertices_incr(std::vector<meshio::pmd::Vertex>::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<meshio::pmd::Vertex>::const_iterator* _beginVertices()
+{
+    return new std::vector<meshio::pmd::Vertex>::const_iterator(
+            ($self->vertices.begin()));
+}
+
+//! dereference the iterator; return NULL if at the end
+const meshio::pmd::Vertex* _dereferenceVertex(
+        const std::vector<meshio::pmd::Vertex>::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());
+}
+
+}
+