OSDN Git Service

implement vertex attributes
[meshio/pymeshio.git] / pymeshio / common.py
index 7dadc16..9083fb6 100644 (file)
@@ -3,12 +3,22 @@
 common utilities.\r
 """\r
 import math\r
+import struct\r
+import sys\r
+import io\r
 \r
-def radian_to_degree(x):\r
-    """darian to deglee"""\r
 \r
-    return x/math.pi * 180.0\r
+def unicode(src):\r
+    """\r
+    literal to unicode for python2 and python3 compatiblity.\r
 \r
+    in python2 str to unicode.\r
+    in python3 str(as unicode) to str.\r
+    """\r
+    if sys.version_info[0]<3:\r
+        return src.decode('utf-8')\r
+    else:\r
+        return src\r
 \r
 """\r
 common structures.\r
@@ -25,6 +35,12 @@ class Vector2(object):
     def __str__(self):\r
         return "<%f %f>" % (self.x, self.y)\r
 \r
+    def __eq__(self, rhs):\r
+        return self.x==rhs.x and self.y==rhs.y\r
+\r
+    def __ne__(self, rhs):\r
+        return not self.__eq__(rhs)\r
+\r
     def __getitem__(self, key):\r
         if key==0:\r
             return self.x\r
@@ -36,6 +52,10 @@ class Vector2(object):
     def to_tuple(self):\r
         return (self.x, self.y)\r
 \r
+    def cross(self, rhs):\r
+        """cross(outer) product"""\r
+        return self.x*rhs.y-self.y*rhs.x\r
+\r
 \r
 class Vector3(object):\r
     """\r
@@ -48,7 +68,13 @@ class Vector3(object):
         self.z=z\r
 \r
     def __str__(self):\r
-        return "<%f %f %f>" % (self.x, self.y, self.z)\r
+        return "<%f %.32f %f>" % (self.x, self.y, self.z)\r
+\r
+    def __eq__(self, rhs):\r
+        return self.x==rhs.x and self.y==rhs.y and self.z==rhs.z\r
+\r
+    def __ne__(self, rhs):\r
+        return not self.__eq__(rhs)\r
 \r
     def __getitem__(self, key):\r
         if key==0:\r
@@ -63,8 +89,39 @@ class Vector3(object):
     def to_tuple(self):\r
         return (self.x, self.y, self.z)\r
 \r
-    def __add__(l, r):\r
-        return Vector3(l.x+r.x, l.y+r.y, l.z+r.z)\r
+    def __add__(self, r):\r
+        return Vector3(self.x+r.x, self.y+r.y, self.z+r.z)\r
+\r
+    def __sub__(self, rhs):\r
+        return Vector3(self.x-rhs.x, self.y-rhs.y, self.z-rhs.z)\r
+\r
+    def getSqNorm(self):\r
+        return self.x*self.x + self.y*self.y + self.z*self.z\r
+\r
+    def getNorm(self):\r
+        return math.sqrt(self.getSqNorm())\r
+\r
+    def normalize(self):\r
+        factor=1.0/self.getNorm()\r
+        self.x*=factor\r
+        self.y*=factor\r
+        self.z*=factor\r
+        return self\r
+\r
+    def to_a(self):\r
+        return [self.x, self.y, self.z]\r
+\r
+    def dot(self, rhs):\r
+        """dot(inner) product"""\r
+        return self.x*rhs.x + self.y*rhs.y + self.z*rhs.z\r
+\r
+    def cross(self, rhs):\r
+        """cross(outer) product"""\r
+        return Vector3(\r
+                self.y*rhs.z - rhs.y*self.z,\r
+                self.z*rhs.x - rhs.z*self.x,\r
+                self.x*rhs.y - rhs.x*self.y,\r
+                )\r
 \r
 \r
 class Quaternion(object):\r
@@ -181,6 +238,12 @@ class RGB(object):
         self.g=g\r
         self.b=b\r
 \r
+    def __eq__(self, rhs):\r
+        return self.r==rhs.r and self.g==rhs.g and self.b==rhs.b\r
+\r
+    def __ne__(self, rhs):\r
+        return not self.__eq__(rhs)\r
+\r
     def __getitem__(self, key):\r
         if key==0:\r
             return self.r\r
@@ -203,6 +266,12 @@ class RGBA(object):
         self.b=b\r
         self.a=a\r
 \r
+    def __eq__(self, rhs):\r
+        return self.r==rhs.r and self.g==rhs.g and self.b==rhs.b and self.a==rhs.a\r
+\r
+    def __ne__(self, rhs):\r
+        return not self.__eq__(rhs)\r
+\r
     def __getitem__(self, key):\r
         if key==0:\r
             return self.r\r
@@ -215,3 +284,151 @@ class RGBA(object):
         else:\r
             assert(False)\r
 \r
+\r
+"""\r
+utilities\r
+"""\r
+def radian_to_degree(x):\r
+    """darian to deglee"""\r
+\r
+    return x/math.pi * 180.0\r
+\r
+\r
+class ParseException(Exception):\r
+    """\r
+    Exception in reader\r
+    """\r
+    pass\r
+\r
+\r
+def readall(path):\r
+    """read all bytes from path\r
+    """\r
+    with open(path, "rb") as f:\r
+        return f.read()\r
+\r
+\r
+class BinaryReader(object):\r
+    """general BinaryReader\r
+    """\r
+    def __init__(self, ios):\r
+        current=ios.tell()\r
+        ios.seek(0, io.SEEK_END)\r
+        self.end=ios.tell()\r
+        ios.seek(current)\r
+        self.ios=ios\r
+\r
+    def is_end(self):\r
+        #print(self.ios.tell(), self.end)\r
+        return self.ios.tell()>=self.end\r
+        #return not self.ios.readable()\r
+\r
+    def unpack(self, fmt, size):\r
+        result=struct.unpack(fmt, self.ios.read(size))\r
+        return result[0]\r
+\r
+    def read_int(self, size):\r
+        if size==1:\r
+            return self.unpack("b", size)\r
+        if size==2:\r
+            return self.unpack("h", size)\r
+        if size==4:\r
+            return self.unpack("i", size)\r
+        print("not reach here")\r
+        raise ParseException("invalid int size: "+size)\r
+\r
+    def read_uint(self, size):\r
+        if size==1:\r
+            return self.unpack("B", size)\r
+        if size==2:\r
+            return self.unpack("H", size)\r
+        if size==4:\r
+            return self.unpack("I", size)\r
+        print("not reach here")\r
+        raise ParseException("invalid int size: "+size)\r
+\r
+    def read_float(self):\r
+        return self.unpack("f", 4)\r
+\r
+    def read_vector2(self):\r
+        return Vector2(\r
+                self.read_float(), \r
+                self.read_float()\r
+                )\r
+\r
+    def read_vector3(self):\r
+        return Vector3(\r
+                self.read_float(), \r
+                self.read_float(), \r
+                self.read_float()\r
+                )\r
+\r
+    def read_rgba(self):\r
+        return RGBA(\r
+                self.read_float(), \r
+                self.read_float(), \r
+                self.read_float(),\r
+                self.read_float()\r
+                )\r
+\r
+    def read_rgb(self):\r
+        return RGB(\r
+                self.read_float(), \r
+                self.read_float(), \r
+                self.read_float()\r
+                )\r
+\r
+\r
+class WriteException(Exception):\r
+    """\r
+    Exception in writer\r
+    """\r
+    pass\r
+\r
+\r
+class BinaryWriter(object):\r
+    def __init__(self, ios):\r
+        self.ios=ios\r
+\r
+    def write_bytes(self, v, size=None):\r
+        if size:\r
+            self.ios.write(struct.pack("={0}s".format(size), v))\r
+        else:\r
+            self.ios.write(v)\r
+\r
+    def write_float(self, v):\r
+        self.ios.write(struct.pack("f", v))\r
+\r
+    def write_int(self, v, size):\r
+        if size==1:\r
+            self.ios.write(struct.pack("b", v))\r
+        elif size==2:\r
+            self.ios.write(struct.pack("h", v))\r
+        elif size==4:\r
+            self.ios.write(struct.pack("i", v))\r
+        else:\r
+            raise WriteError("invalid int uint size")\r
+\r
+    def write_uint(self, v, size):\r
+        if size==1:\r
+            self.ios.write(struct.pack("B", v))\r
+        elif size==2:\r
+            self.ios.write(struct.pack("H", v))\r
+        elif size==4:\r
+            self.ios.write(struct.pack("I", v))\r
+        else:\r
+            raise WriteError("invalid int uint size")\r
+\r
+    def write_vector2(self, v):\r
+        self.ios.write(struct.pack("=2f", v.x, v.y))\r
+\r
+    def write_vector3(self, v):\r
+        self.ios.write(struct.pack("=3f", v.x, v.y, v.z))\r
+\r
+    def write_rgb(self, v):\r
+        self.ios.write(struct.pack("=3f", v.r, v.g, v.b))\r
+\r
+    def write_rgba(self, v):\r
+        self.ios.write(struct.pack("=4f", v.r, v.g, v.b, v.a))\r
+\r
+\r