2 ###############################################################################
4 ###############################################################################
5 class LineLoader(object):
9 __slots__=['path', 'io', 'end']
11 return "<%s current:%d, end:%d>" % (
12 self.__class__, self.getPos(), self.getEnd())
21 return (self.io.readline()).strip()
24 return self.io.tell()>=self.end
26 def load(self, path, io, end):
36 while not self.isEnd():
41 class VPDLoader(LineLoader):
44 super(VPDLoader, self).__init__()
48 return "<VPD poses:%d>" % len(self.pose)
51 if self.readline()!="Vocaloid Pose Data file":
54 RE_OPEN=re.compile('^(\w+){(.*)')
55 RE_OSM=re.compile('^\w+\.osm;')
56 RE_COUNT=re.compile('^(\d+);')
59 while not self.isEnd():
65 if not self.parseBone(m.group(2)):
66 raise Exception("invalid bone")
73 m=RE_COUNT.match(line)
75 bone_count=int(m.group(1))
78 return len(self.pose)==bone_count
80 def parseBone(self, name):
82 self.pose.append(bone)
83 bone.pos=Vector3(*[float(token) for token in self.readline().split(';')[0].split(',')])
84 bone.q=Quaternion(*[float(token) for token in self.readline().split(';')[0].split(',')])
85 return self.readline()=="}"