+\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
+ self.ios=ios\r
+\r
+ def is_end(self):\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