12 bool operator()(char c)
26 typedef text::LineSplitter<DELIMITER> SPLITTER;
33 std::vector<Material> &materials;
34 std::vector<Object> &objects;
37 Implementation(Scene &_scene, std::vector<Material> &_materials,
38 std::vector<Object> &_objects)
39 : scene(_scene), materials(_materials), objects(_objects)
42 template<class READER> bool
45 while(!reader.isEnd()){
46 text::cstr line=reader.getLine();
47 SPLITTER splitter(line);
48 text::cstr key=splitter.get();
50 if(!readSceneChunk(reader)){
54 else if(key=="Material"){
55 if(!readMaterialChunk(reader, splitter.getInt())){
59 else if(key=="Object"){
60 if(!readObjectChunk(reader, splitter.getQuated())){
65 if(materials.empty()){
67 materials.push_back(Material());
72 std::cout << "not found 'EOF'" << std::endl;
78 template<class READER> bool
79 readObjectChunk(READER &reader, text::cstr name)
81 objects.push_back(Object());
82 Object &object=objects.back();
83 object.name=name.str();
84 while(!reader.isEnd()){
85 text::cstr line=reader.getLine();
89 SPLITTER splitter(line);
90 text::cstr key=splitter.get();
92 object.depth=splitter.getInt();
94 else if(key=="folding"){
95 object.folding=splitter.getInt();
97 else if(key=="scale"){
98 object.scale=splitter.getVector3();
100 else if(key=="rotation"){
101 object.rotation=splitter.getVector3();
103 else if(key=="translation"){
104 object.translation=splitter.getVector3();
106 else if(key=="visible"){
107 object.visible=splitter.getInt();
109 else if(key=="locking"){
110 object.locking=splitter.getInt();
112 else if(key=="shading"){
113 object.shading=splitter.getInt();
115 else if(key=="facet"){
116 object.smoothing=splitter.getFloat();
118 else if(key=="color"){
119 object.color=splitter.getVector3();
121 else if(key=="color_type"){
122 object.color_type=splitter.getInt();
124 else if(key=="vertex"){
125 if(!readObjectVertexChunk(reader, object, splitter.getInt())){
129 else if(key=="face"){
130 if(!readObjectFaceChunk(reader, object, splitter.getInt())){
134 else if(key=="segment"){
138 else if(key=="patch"){
142 else if(key=="mirror"){
143 object.mirror=splitter.getInt();
146 std::cout << "unknown object key: " << key << std::endl;
149 std::cout << "fail to readObjectChunk" << std::endl;
152 template<class READER> bool
153 readObjectVertexChunk(READER &reader,
154 Object &object, size_t vertex_count)
156 while(!reader.isEnd()){
157 text::cstr line=reader.getLine();
159 if(object.vertices.size()!=vertex_count){
160 std::cout << "invalid vertex count."
161 << " expected " << vertex_count
162 << ", but " << object.vertices.size()
168 object.vertices.push_back(SPLITTER(line).getVector3());
170 std::cout << "fail to readObjectVertexChunk" << std::endl;
174 template<class READER> bool
175 readObjectFaceChunk(READER &reader,
176 Object &object, size_t face_count)
178 while(!reader.isEnd()){
179 text::cstr line=reader.getLine();
181 if(object.faces.size()!=face_count){
182 std::cout << "invalid face count."
183 << " expected " << face_count
184 << ", but " << object.faces.size()
190 if(!readObjectFaceLine(object, line)){
194 std::cout << "fail to readFaceChunk" << std::endl;
199 readObjectFaceLine(Object &object, text::cstr line)
201 object.faces.push_back(Face());
202 Face &face=object.faces.back();
203 SPLITTER splitter(line);
204 face.index_count=splitter.getInt();
206 text::cstr key=splitter.get();
212 for(size_t i=0; i<face.index_count; ++i){
213 face.indices[i]=splitter.getInt();
217 face.material_index=splitter.getInt();
220 for(size_t i=0; i<face.index_count; ++i){
221 face.uv[i]=splitter.getVector2();
225 for(size_t i=0; i<face.index_count; ++i){
227 color::fRGBA::createFromUInt(splitter.getInt());
231 std::cout << "unknown face key: "
232 << '"' << key << '"' << std::endl
241 template<class READER> bool
242 readMaterialChunk(READER &reader, size_t material_count)
244 while(!reader.isEnd()){
245 text::cstr line=reader.getLine();
247 if(materials.size()!=material_count){
248 std::cout << "invalid material count."
249 << " expected " << material_count
250 << ", but " << materials.size()
256 readMaterialLine(line);
258 std::cout << "fail to readMaterialChunk" << std::endl;
263 readMaterialLine(text::cstr line)
265 materials.push_back(Material());
266 Material &material=materials.back();
268 SPLITTER splitter(line);
269 material.name=splitter.getQuated().str();
271 text::cstr key=splitter.get();
275 else if(key=="shader"){
276 material.shader=splitter.getInt();
279 material.color=splitter.getFloatRGBA();
282 material.diffuse=splitter.getFloat();
285 material.ambient=splitter.getFloat();
288 material.emmit=splitter.getFloat();
291 material.specular=splitter.getFloat();
293 else if(key=="power"){
294 material.power=splitter.getFloat();
297 material.texture=splitter.getQuated().str();
299 else if(key=="aplane"){
300 material.alphamap=splitter.getQuated().str();
302 else if(key=="bump"){
303 material.bumpmap=splitter.getQuated().str();
305 else if(key=="vcol"){
306 material.vcol=splitter.getInt();
309 std::cout << "unknown material key: \"" << key << '"' << std::endl;
316 template<class READER> bool
317 readSceneChunk(READER &reader)
319 while(!reader.isEnd()){
320 text::cstr line=reader.getLine();
324 SPLITTER splitter(line);
325 text::cstr key=splitter.get();
327 scene.pos=splitter.getVector3();
329 else if(key=="lookat"){
330 scene.lookat=splitter.getVector3();
332 else if(key=="head"){
333 scene.head=splitter.getFloat();
335 else if(key=="pich") {
336 scene.pitch=splitter.getFloat();
338 else if(key=="ortho"){
339 scene.ortho=splitter.getInt();
341 else if(key=="zoom2"){
342 scene.zoom2=splitter.getFloat();
345 scene.ambient=splitter.getVector3();
348 std::cout << "unknown scene key: " << key << std::endl;
351 std::cout << "fail to readSceneChunk" << std::endl;
355 template<class READER> bool
356 readChunk(READER &reader)
359 while(!reader.isEnd()){
360 text::cstr line=reader.getLine();
367 else if(line.include('{')){
377 ///////////////////////////////////////////////////////////////////////////////
379 ///////////////////////////////////////////////////////////////////////////////
380 bool IO::read(binary::IReader &input)
382 text::LineReader<text::IsCRLF, text::IsWhiteSpace, text::IsEmpty>
384 text::cstr line=reader.getLine();
385 if(line!="Metasequoia Document"){
388 line=reader.getLine();
389 if(line!="Format Text Ver 1.0"){
393 return Implementation(scene, materials, objects).parse(reader);
396 bool IO::read(const char *path)
398 std::vector<char> all;
399 binary::readAll(path, all);
403 binary::MemoryReader reader(&all[0], all.size());
407 bool IO::write(std::ostream &os)