OSDN Git Service

fix
[meshio/pymeshio.git] / pymeshio / mqo / __init__.py
1 # coding: utf-8\r
2 """ \r
3 ======================\r
4 Metasequioa MQO format\r
5 ======================\r
6 \r
7 file format\r
8 ~~~~~~~~~~~\r
9 * http://www.metaseq.net/metaseq/format.html\r
10 \r
11 specs\r
12 ~~~~~\r
13 * textencoding: bytes(cp932)\r
14 * coordinate: right handed y-up\r
15 * uv origin: \r
16 * face: edge(2), triangle(3), quadrangle(4)\r
17 * backculling: enable\r
18 \r
19 """\r
20 \r
21 import os\r
22 import sys\r
23 import math\r
24 import warnings\r
25 from .. import common\r
26 \r
27 \r
28 """\r
29 MQO loader\r
30 """\r
31 class Material(object):\r
32     """mqo material\r
33 \r
34     Attributes:\r
35         name: cp932\r
36         shader: \r
37         color: rgba\r
38         diffuse:\r
39         ambient:\r
40         emit:\r
41         specular:\r
42         power:\r
43         tex: cp932 windows file path\r
44     """\r
45     __slots__=[\r
46             "name", "shader", "color", "diffuse", \r
47             "ambient", "emit", "specular", "power",\r
48             "tex",\r
49             ]\r
50     def __init__(self, name):\r
51         self.name=name\r
52         self.shader=3\r
53         self.color=common.RGBA(0.5, 0.5, 0.5, 1.0)\r
54         self.diffuse=1.0\r
55         self.ambient=0.0\r
56         self.emit=0.0\r
57         self.specular=0.0\r
58         self.power=5.0\r
59         self.tex=b""\r
60 \r
61     def getName(self): return self.name\r
62     def getTexture(self): return self.tex\r
63 \r
64     def parse(self, line):\r
65         offset=0\r
66         while True:\r
67             leftParenthesis=line.find(b"(", offset)\r
68             if leftParenthesis==-1:\r
69                 break\r
70             key=line[offset:leftParenthesis]\r
71             rightParenthesis=line.find(b")", leftParenthesis+1)\r
72             if rightParenthesis==-1:\r
73                 raise ValueError("assert")\r
74 \r
75             param=line[leftParenthesis+1:rightParenthesis]\r
76             if key==b"shader":\r
77                 self.shader=int(param)\r
78             elif key==b"col":\r
79                 self.color=common.RGBA(*[float(e) for e in param.split()])\r
80             elif key==b"dif":\r
81                 self.diffuse=float(param)\r
82             elif key==b"amb":\r
83                 self.ambient=float(param)\r
84             elif key==b"emi":\r
85                 self.emit=float(param)\r
86             elif key==b"spc":\r
87                 self.specular=float(param)\r
88             elif key==b"power":\r
89                 self.power=float(param)\r
90             elif key==b"tex":\r
91                 self.tex=param[1:-1]\r
92             else:\r
93                 print(\r
94                         "%s#parse" % self.name, \r
95                         "unknown key: %s" %  key\r
96                         )\r
97 \r
98             offset=rightParenthesis+2\r
99 \r
100     def __str__(self):\r
101         return "<Material %s shader: %d [%f, %f, %f, %f] %f>" % (\r
102                 self.name, self.shader,\r
103                 self.color[0], self.color[1], self.color[2], self.color[3],\r
104                 self.diffuse)\r
105 \r
106 \r
107 class Obj(object):\r
108     """mqo object\r
109 \r
110     Attributes:\r
111         name: cp932\r
112         depth: object hierarchy \r
113         folding: \r
114         scale:\r
115         rotation:\r
116         translation:\r
117         visible:\r
118         locking:\r
119         shading:\r
120         facet: smoothing threshold\r
121         color:\r
122         color_type:\r
123         mirror: mirroring\r
124         mirror_axis:\r
125         vertices:\r
126         faces:\r
127         edges:\r
128         smoothing:\r
129     """\r
130     __slots__=["name", "depth", "folding", \r
131             "scale", "rotation", "translation",\r
132             "visible", "locking", "shading", "facet",\r
133             "color", "color_type", "mirror", "mirror_axis",\r
134             "vertices", "faces", "edges", "smoothing",\r
135             ]\r
136 \r
137     def __init__(self, name):\r
138         self.name=name\r
139         self.vertices=[]\r
140         self.faces=[]\r
141         self.edges=[]\r
142         self.depth=0\r
143         self.folding=0\r
144         self.scale=[1, 1, 1]\r
145         self.rotation=[0, 0, 0]\r
146         self.translation=[0, 0, 0]\r
147         self.visible=15\r
148         self.locking=0\r
149         self.shading=0\r
150         self.facet=59.5\r
151         self.color=[1, 1, 1]\r
152         self.color_type=0\r
153         self.mirror=0\r
154         self.smoothing=0\r
155 \r
156     def getName(self): return self.name\r
157 \r
158     def addVertex(self, x, y, z):\r
159         self.vertices.append(common.Vector3(x, y, z))\r
160 \r
161     def addFace(self, face):\r
162         if face.index_count==2:\r
163             self.edges.append(face)\r
164         else:\r
165             self.faces.append(face)\r
166 \r
167     def __str__(self):\r
168         return "<Object %s, %d vertices, %d faces>" % (\r
169                 self.name, len(self.vertices), len(self.faces))\r
170 \r
171 \r
172 class Face(object):\r
173     """mqo face\r
174 \r
175     Attributes:\r
176         index_count: 2 or 3 or 4\r
177         indices: index x index_count\r
178         material_index:\r
179         col: vertex_color x index_count\r
180         uv: Vector2 x index_count\r
181     """\r
182     __slots__=[\r
183             "index_count",\r
184             "indices", "material_index", "col", "uv",\r
185             ]\r
186     def __init__(self, index_count, line):\r
187         if index_count<2 or index_count>4:\r
188             raise ValueError("invalid vertex count: %d" % index_count)\r
189         self.material_index=0\r
190         self.col=[]\r
191         self.uv=[common.Vector2(0, 0)]*4\r
192         self.index_count=index_count\r
193         offset=0\r
194         while True:\r
195             leftParenthesis=line.find(b"(", offset)\r
196             if leftParenthesis==-1:\r
197                 break\r
198             key=line[offset:leftParenthesis]\r
199             rightParenthesis=line.find(b")", leftParenthesis+1)\r
200             if rightParenthesis==-1:\r
201                 raise ValueError("assert")\r
202             params=line[leftParenthesis+1:rightParenthesis].split()\r
203             if key==b"V":\r
204                 self.indices=[int(e) for e in params]\r
205             elif key==b"M":\r
206                 self.material_index=int(params[0])\r
207             elif key==b"UV":\r
208                 uv_list=[float(e) for e in params]\r
209                 self.uv=[]\r
210                 for i in range(0, len(uv_list), 2):\r
211                     self.uv.append(common.Vector2(uv_list[i], uv_list[i+1]))\r
212             elif key==b"COL":\r
213                 for n in params:\r
214                     d=int(n)\r
215                     # R\r
216                     d, m=divmod(d, 256)\r
217                     self.col.append(m)\r
218                     # G\r
219                     d, m=divmod(d, 256)\r
220                     self.col.append(m)\r
221                     # B\r
222                     d, m=divmod(d, 256)\r
223                     self.col.append(m)\r
224                     # A\r
225                     d, m=divmod(d, 256)\r
226                     self.col.append(m)\r
227             else:\r
228                 print("Face#__init__:unknown key: %s" % key)\r
229 \r
230             offset=rightParenthesis+2\r
231 \r
232     def getIndex(self, i): return self.indices[i]\r
233     def getUV(self, i): return self.uv[i] if i<len(self.uv) else common.Vector2(0, 0)\r
234 \r
235 \r
236 class Model(object):\r
237     def __init__(self):\r
238         self.has_mikoto=False\r
239         self.materials=[]\r
240         self.objects=[]\r
241 \r
242 \r