common utilities.\r
"""\r
import math\r
-\r
-def radian_to_degree(x):\r
- """darian to deglee"""\r
-\r
- return x/math.pi * 180.0\r
+import struct\r
\r
\r
"""\r
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
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
return Quaternion(axis[0]*s, axis[1]*s, axis[2]*s, c)\r
\r
\r
+class RGB(object):\r
+ """\r
+ material color\r
+ """\r
+ __slots__=['r', 'g', 'b']\r
+ def __init__(self, r=0, g=0, b=0):\r
+ self.r=r\r
+ self.g=g\r
+ self.b=b\r
+\r
+ def __getitem__(self, key):\r
+ if key==0:\r
+ return self.r\r
+ elif key==1:\r
+ return self.g\r
+ elif key==2:\r
+ return self.b\r
+ else:\r
+ assert(False)\r
+\r
+\r
class RGBA(object):\r
"""\r
material color\r
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
+ 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 BinaryLoader(object):\r
+ """general BinaryLoader\r
+ """\r
+ def __init__(self, io):\r
+ self.io=io\r
+\r
+ def unpack(self, fmt, size):\r
+ result=struct.unpack(fmt, self.io.read(size))\r
+ return result[0]\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