1 ###############################################################################
3 ###############################################################################
4 class LineLoader(object):
8 __slots__=['path', 'io', 'end']
10 return "<%s current:%d, end:%d>" % (
11 self.__class__, self.getPos(), self.getEnd())
20 return (self.io.readline()).strip()
23 return self.io.tell()>=self.end
25 def load(self, path, io, end):
35 while not self.isEnd():
40 class VPDLoader(LineLoader):
43 super(VPDLoader, self).__init__()
47 return "<VPD poses:%d>" % len(self.pose)
50 if self.readline()!="Vocaloid Pose Data file":
53 RE_OPEN=re.compile('^(\w+){(.*)')
54 RE_OSM=re.compile('^\w+\.osm;')
55 RE_COUNT=re.compile('^(\d+);')
58 while not self.isEnd():
64 if not self.parseBone(m.group(2)):
65 raise Exception("invalid bone")
72 m=RE_COUNT.match(line)
74 bone_count=int(m.group(1))
77 return len(self.pose)==bone_count
79 def parseBone(self, name):
81 self.pose.append(bone)
82 bone.pos=Vector3(*[float(token) for token in self.readline().split(';')[0].split(',')])
83 bone.q=Quaternion(*[float(token) for token in self.readline().split(';')[0].split(',')])
84 return self.readline()=="}"