2 #include "linereader.h"
15 bool operator()(char c)
29 typedef LineSplitter<DELIMITER> SPLITTER;
36 std::vector<Material> &materials;
37 std::vector<Object> &objects;
40 Implementation(Scene &_scene, std::vector<Material> &_materials,
41 std::vector<Object> &_objects)
42 : scene(_scene), materials(_materials), objects(_objects)
45 template<class READER> bool
48 while(!reader.isEnd()){
49 cstr line=reader.getLine();
50 SPLITTER splitter(line);
51 cstr key=splitter.get();
53 if(!readSceneChunk(reader)){
57 else if(key=="Material"){
58 if(!readMaterialChunk(reader, splitter.getInt())){
62 else if(key=="Object"){
63 if(!readObjectChunk(reader, splitter.getQuated())){
68 if(materials.empty()){
70 //materials.push_back(Material());
75 std::cout << "not found 'EOF'" << std::endl;
81 template<class READER> bool
82 readObjectChunk(READER &reader, cstr name)
84 objects.push_back(Object());
85 Object &object=objects.back();
86 object.name=name.str();
87 while(!reader.isEnd()){
88 cstr line=reader.getLine();
92 SPLITTER splitter(line);
93 cstr key=splitter.get();
95 object.depth=splitter.getInt();
97 else if(key=="folding"){
98 object.folding=splitter.getInt();
100 else if(key=="scale"){
101 object.scale=splitter.getVector3();
103 else if(key=="rotation"){
104 object.rotation=splitter.getVector3();
106 else if(key=="translation"){
107 object.translation=splitter.getVector3();
109 else if(key=="visible"){
110 object.visible=splitter.getInt();
112 else if(key=="locking"){
113 object.locking=splitter.getInt();
115 else if(key=="shading"){
116 object.shading=splitter.getInt();
118 else if(key=="facet"){
119 object.smoothing=splitter.getFloat();
121 else if(key=="color"){
122 object.color=splitter.getVector3();
124 else if(key=="color_type"){
125 object.color_type=splitter.getInt();
127 else if(key=="vertex"){
128 if(!readObjectVertexChunk(reader, object, splitter.getInt())){
132 else if(key=="face"){
133 if(!readObjectFaceChunk(reader, object, splitter.getInt())){
137 else if(key=="segment"){
141 else if(key=="patch"){
145 else if(key=="mirror"){
146 object.mirror=splitter.getInt();
149 std::cout << "unknown object key: " << key << std::endl;
152 std::cout << "fail to readObjectChunk" << std::endl;
155 template<class READER> bool
156 readObjectVertexChunk(READER &reader,
157 Object &object, size_t vertex_count)
159 while(!reader.isEnd()){
160 cstr line=reader.getLine();
162 if(object.vertices.size()!=vertex_count){
163 std::cout << "invalid vertex count."
164 << " expected " << vertex_count
165 << ", but " << object.vertices.size()
171 object.vertices.push_back(SPLITTER(line).getVector3());
173 std::cout << "fail to readObjectVertexChunk" << std::endl;
177 template<class READER> bool
178 readObjectFaceChunk(READER &reader,
179 Object &object, size_t face_count)
181 while(!reader.isEnd()){
182 cstr line=reader.getLine();
184 if(object.faces.size()!=face_count){
185 std::cout << "invalid face count."
186 << " expected " << face_count
187 << ", but " << object.faces.size()
193 if(!readObjectFaceLine(object, line)){
197 std::cout << "fail to readFaceChunk" << std::endl;
202 readObjectFaceLine(Object &object, cstr line)
204 object.faces.push_back(Face());
205 Face &face=object.faces.back();
206 SPLITTER splitter(line);
207 face.index_count=splitter.getInt();
209 cstr key=splitter.get();
215 for(size_t i=0; i<face.index_count; ++i){
216 face.indices[i]=splitter.getInt();
220 face.material_index=splitter.getInt();
223 for(size_t i=0; i<face.index_count; ++i){
224 face.uv[i]=splitter.getVector2();
228 for(size_t i=0; i<face.index_count; ++i){
230 fRGBA::createFromUInt(splitter.getInt());
234 std::cout << "unknown face key: "
235 << '"' << key << '"' << std::endl
244 template<class READER> bool
245 readMaterialChunk(READER &reader, size_t material_count)
247 while(!reader.isEnd()){
248 cstr line=reader.getLine();
250 if(materials.size()!=material_count){
251 std::cout << "invalid material count."
252 << " expected " << material_count
253 << ", but " << materials.size()
259 readMaterialLine(line);
261 std::cout << "fail to readMaterialChunk" << std::endl;
266 readMaterialLine(cstr line)
268 materials.push_back(Material());
269 Material &material=materials.back();
271 SPLITTER splitter(line);
272 material.name=splitter.getQuated().str();
274 cstr key=splitter.get();
278 else if(key=="shader"){
279 material.shader=splitter.getInt();
282 material.color=splitter.getFloatRGBA();
285 material.diffuse=splitter.getFloat();
288 material.ambient=splitter.getFloat();
291 material.emit=splitter.getFloat();
294 material.specular=splitter.getFloat();
296 else if(key=="power"){
297 material.power=splitter.getFloat();
300 material.texture=splitter.getQuated().str();
302 else if(key=="aplane"){
303 material.alphamap=splitter.getQuated().str();
305 else if(key=="bump"){
306 material.bumpmap=splitter.getQuated().str();
308 else if(key=="vcol"){
309 material.vcol=splitter.getInt();
312 std::cout << "unknown material key: \"" << key << '"' << std::endl;
319 template<class READER> bool
320 readSceneChunk(READER &reader)
322 while(!reader.isEnd()){
323 cstr line=reader.getLine();
327 SPLITTER splitter(line);
328 cstr key=splitter.get();
330 scene.pos=splitter.getVector3();
332 else if(key=="lookat"){
333 scene.lookat=splitter.getVector3();
335 else if(key=="head"){
336 scene.head=splitter.getFloat();
338 else if(key=="pich") {
339 scene.pitch=splitter.getFloat();
341 else if(key=="ortho"){
342 scene.ortho=splitter.getInt();
344 else if(key=="zoom2"){
345 scene.zoom2=splitter.getFloat();
348 scene.ambient=splitter.getVector3();
351 std::cout << "unknown scene key: " << key << std::endl;
354 std::cout << "fail to readSceneChunk" << std::endl;
358 template<class READER> bool
359 readChunk(READER &reader)
362 while(!reader.isEnd()){
363 cstr line=reader.getLine();
370 else if(line.include('{')){
381 bool IO::read(binary::IReader &input)
383 LineReader<IsCRLF, IsWhiteSpace, IsEmpty>
385 cstr line=reader.getLine();
386 if(line!="Metasequoia Document"){
389 line=reader.getLine();
390 if(line!="Format Text Ver 1.0"){
394 return Implementation(scene, materials, objects).parse(reader);
397 bool IO::read(const char *path)
399 std::vector<char> all;
400 binary::readAll(path, all);
404 binary::MemoryReader reader(&all[0], all.size());
408 bool IO::write(binary::IWriter &writer)
411 writer.printLn("Metasequoia Document");
412 writer.printLn("Format Text Ver 1.0");
416 writer.printLn("Scene {");
417 writer.printLn("\tpos 0.0000 0.0000 1500.0000");
418 writer.printLn("\tlookat 0.0000 0.0000 0.0000");
419 writer.printLn("\thead -0.5236");
420 writer.printLn("\tpich 0.5236");
421 writer.printLn("\tortho 0");
422 writer.printLn("\tzoom2 5.0000");
423 writer.printLn("\tamb 0.250 0.250 0.250");
427 if(materials.size()>0){
428 writer.printLn("Material %d {", materials.size());
430 for(size_t i=0; i<materials.size(); ++i){
431 Material &m=materials[i];
438 for(size_t i=0; i<objects.size(); ++i){
439 Object &o=objects[i];
440 writer.printLn("Object \"%s\" {", o.name.c_str());
441 writer.printLn("\tdepth 0");
442 writer.printLn("\tfolding 0");
443 writer.printLn("\tscale 1.000000 1.000000 1.000000");
444 writer.printLn("\trotation 0.000000 0.000000 0.000000");
445 writer.printLn("\ttranslation 0.000000 0.000000 0.000000");
446 writer.printLn("\tvisible 15");
447 writer.printLn("\tlocking 0");
448 writer.printLn("\tshading 1");
449 writer.printLn("\tfacet 59.5");
450 writer.printLn("\tcolor 0.898 0.400 0.137");
451 writer.printLn("\tcolor_type 0");
453 writer.printLn("\tvertex %d {", o.vertices.size());
454 for(size_t j=0; j<o.vertices.size(); ++j){
455 Vector3 &v=o.vertices[j];
456 writer.printLn("\t\t%.4f %.4f %.4f", v.x, v.y, v.z);
458 writer.printLn("\t}");
460 writer.printLn("\tface %d {", o.faces.size());
461 for(size_t j=0; j<o.faces.size(); ++j){
464 std::stringstream ss;
465 ss.setf(std::ios_base::fixed, std::ios_base::floatfield);
471 for(size_t k=0; k<f.index_count; ++k){
478 for(size_t k=0; k<f.index_count; ++k){
484 << std::setprecision(5) << uv.x
485 << ' ' << std::setprecision(5) << uv.y;
489 writer.printLn(ss.str().c_str());
491 writer.printLn("\t}");
496 writer.printLn("Eof");
501 bool IO::write(const char *path)
503 binary::FileWriter writer(path);
504 return write(writer);