14 Material::getName()const
16 return text::trim(text::to_WideChar(CP_OEMCP, name));
20 Material::getTexture()const
22 return text::trim(text::to_WideChar(CP_OEMCP, texture));
26 Object::getName()const
28 return text::trim(text::to_WideChar(CP_OEMCP, name));
34 bool operator()(char c)
48 typedef text::LineSplitter<DELIMITER> SPLITTER;
55 std::vector<Material> &materials;
56 std::vector<Object> &objects;
59 Implementation(Scene &_scene, std::vector<Material> &_materials,
60 std::vector<Object> &_objects)
61 : scene(_scene), materials(_materials), objects(_objects)
64 template<class READER> bool
67 while(!reader.isEnd()){
68 text::cstr line=reader.getLine();
69 SPLITTER splitter(line);
70 text::cstr key=splitter.get();
72 if(!readSceneChunk(reader)){
76 else if(key=="Material"){
77 if(!readMaterialChunk(reader, splitter.getInt())){
81 else if(key=="Object"){
82 if(!readObjectChunk(reader, splitter.getQuated())){
87 if(materials.empty()){
89 //materials.push_back(Material());
94 std::cout << "not found 'EOF'" << std::endl;
100 template<class READER> bool
101 readObjectChunk(READER &reader, text::cstr name)
103 objects.push_back(Object());
104 Object &object=objects.back();
105 object.name=name.str();
106 while(!reader.isEnd()){
107 text::cstr line=reader.getLine();
111 SPLITTER splitter(line);
112 text::cstr key=splitter.get();
114 object.depth=splitter.getInt();
116 else if(key=="folding"){
117 object.folding=splitter.getInt();
119 else if(key=="scale"){
120 object.scale=splitter.getVector3();
122 else if(key=="rotation"){
123 object.rotation=splitter.getVector3();
125 else if(key=="translation"){
126 object.translation=splitter.getVector3();
128 else if(key=="visible"){
129 object.visible=splitter.getInt();
131 else if(key=="locking"){
132 object.locking=splitter.getInt();
134 else if(key=="shading"){
135 object.shading=splitter.getInt();
137 else if(key=="facet"){
138 object.smoothing=splitter.getFloat();
140 else if(key=="color"){
141 object.color=splitter.getVector3();
143 else if(key=="color_type"){
144 object.color_type=splitter.getInt();
146 else if(key=="vertex"){
147 if(!readObjectVertexChunk(reader, object, splitter.getInt())){
151 else if(key=="face"){
152 if(!readObjectFaceChunk(reader, object, splitter.getInt())){
156 else if(key=="segment"){
160 else if(key=="patch"){
164 else if(key=="mirror"){
165 object.mirror=splitter.getInt();
168 std::cout << "unknown object key: " << key << std::endl;
171 std::cout << "fail to readObjectChunk" << std::endl;
174 template<class READER> bool
175 readObjectVertexChunk(READER &reader,
176 Object &object, size_t vertex_count)
178 while(!reader.isEnd()){
179 text::cstr line=reader.getLine();
181 if(object.vertices.size()!=vertex_count){
182 std::cout << "invalid vertex count."
183 << " expected " << vertex_count
184 << ", but " << object.vertices.size()
190 object.vertices.push_back(SPLITTER(line).getVector3());
192 std::cout << "fail to readObjectVertexChunk" << std::endl;
196 template<class READER> bool
197 readObjectFaceChunk(READER &reader,
198 Object &object, size_t face_count)
200 while(!reader.isEnd()){
201 text::cstr line=reader.getLine();
203 if(object.faces.size()!=face_count){
204 std::cout << "invalid face count."
205 << " expected " << face_count
206 << ", but " << object.faces.size()
212 if(!readObjectFaceLine(object, line)){
216 std::cout << "fail to readFaceChunk" << std::endl;
221 readObjectFaceLine(Object &object, text::cstr line)
223 object.faces.push_back(Face());
224 Face &face=object.faces.back();
225 SPLITTER splitter(line);
226 face.index_count=splitter.getInt();
228 text::cstr key=splitter.get();
234 for(size_t i=0; i<face.index_count; ++i){
235 face.indices[i]=splitter.getInt();
239 face.material_index=splitter.getInt();
242 for(size_t i=0; i<face.index_count; ++i){
243 face.uv[i]=splitter.getVector2();
247 for(size_t i=0; i<face.index_count; ++i){
249 color::fRGBA::createFromUInt(splitter.getInt());
253 std::cout << "unknown face key: "
254 << '"' << key << '"' << std::endl
263 template<class READER> bool
264 readMaterialChunk(READER &reader, size_t material_count)
266 while(!reader.isEnd()){
267 text::cstr line=reader.getLine();
269 if(materials.size()!=material_count){
270 std::cout << "invalid material count."
271 << " expected " << material_count
272 << ", but " << materials.size()
278 readMaterialLine(line);
280 std::cout << "fail to readMaterialChunk" << std::endl;
285 readMaterialLine(text::cstr line)
287 materials.push_back(Material());
288 Material &material=materials.back();
290 SPLITTER splitter(line);
291 material.name=splitter.getQuated().str();
293 text::cstr key=splitter.get();
297 else if(key=="shader"){
298 material.shader=splitter.getInt();
301 material.color=splitter.getFloatRGBA();
304 material.diffuse=splitter.getFloat();
307 material.ambient=splitter.getFloat();
310 material.emit=splitter.getFloat();
313 material.specular=splitter.getFloat();
315 else if(key=="power"){
316 material.power=splitter.getFloat();
319 material.texture=splitter.getQuated().str();
321 else if(key=="aplane"){
322 material.alphamap=splitter.getQuated().str();
324 else if(key=="bump"){
325 material.bumpmap=splitter.getQuated().str();
327 else if(key=="vcol"){
328 material.vcol=splitter.getInt();
331 std::cout << "unknown material key: \"" << key << '"' << std::endl;
338 template<class READER> bool
339 readSceneChunk(READER &reader)
341 while(!reader.isEnd()){
342 text::cstr line=reader.getLine();
346 SPLITTER splitter(line);
347 text::cstr key=splitter.get();
349 scene.pos=splitter.getVector3();
351 else if(key=="lookat"){
352 scene.lookat=splitter.getVector3();
354 else if(key=="head"){
355 scene.head=splitter.getFloat();
357 else if(key=="pich") {
358 scene.pitch=splitter.getFloat();
360 else if(key=="ortho"){
361 scene.ortho=splitter.getInt();
363 else if(key=="zoom2"){
364 scene.zoom2=splitter.getFloat();
367 scene.ambient=splitter.getVector3();
370 std::cout << "unknown scene key: " << key << std::endl;
373 std::cout << "fail to readSceneChunk" << std::endl;
377 template<class READER> bool
378 readChunk(READER &reader)
381 while(!reader.isEnd()){
382 text::cstr line=reader.getLine();
389 else if(line.include('{')){
399 ///////////////////////////////////////////////////////////////////////////////
401 ///////////////////////////////////////////////////////////////////////////////
402 bool IO::read(binary::IReader &input)
404 text::LineReader<text::IsCRLF, text::IsWhiteSpace, text::IsEmpty>
406 text::cstr line=reader.getLine();
407 if(line!="Metasequoia Document"){
410 line=reader.getLine();
411 if(line!="Format Text Ver 1.0"){
415 return Implementation(scene, materials, objects).parse(reader);
418 bool IO::read(const char *path)
420 std::vector<char> all;
421 binary::readAll(path, all);
425 binary::MemoryReader reader(&all[0], all.size());
430 bool IO::read(const wchar_t *path)
432 std::vector<char> all;
433 binary::readAll(path, all);
437 binary::MemoryReader reader(&all[0], all.size());
442 bool IO::write(binary::IWriter &writer)
445 writer.printLn("Metasequoia Document");
446 writer.printLn("Format Text Ver 1.0");
450 writer.printLn("Scene {");
451 writer.printLn("\tpos 0.0000 0.0000 1500.0000");
452 writer.printLn("\tlookat 0.0000 0.0000 0.0000");
453 writer.printLn("\thead -0.5236");
454 writer.printLn("\tpich 0.5236");
455 writer.printLn("\tortho 0");
456 writer.printLn("\tzoom2 5.0000");
457 writer.printLn("\tamb 0.250 0.250 0.250");
461 if(materials.size()>0){
462 writer.printLn("Material %d {", materials.size());
463 for(size_t i=0; i<materials.size(); ++i){
464 Material &m=materials[i];
470 for(size_t i=0; i<objects.size(); ++i){
471 Object &o=objects[i];
472 writer.printLn("Object \"%s\" {", o.name.c_str());
473 writer.printLn("\tdepth 0");
474 writer.printLn("\tfolding 0");
475 writer.printLn("\tscale 1.000000 1.000000 1.000000");
476 writer.printLn("\trotation 0.000000 0.000000 0.000000");
477 writer.printLn("\ttranslation 0.000000 0.000000 0.000000");
478 writer.printLn("\tvisible 15");
479 writer.printLn("\tlocking 0");
480 writer.printLn("\tshading 1");
481 writer.printLn("\tfacet 59.5");
482 writer.printLn("\tcolor 0.898 0.400 0.137");
483 writer.printLn("\tcolor_type 0");
485 writer.printLn("\tvertex %d {", o.vertices.size());
486 for(size_t j=0; j<o.vertices.size(); ++j){
487 Vector3 &v=o.vertices[j];
488 writer.printLn("\t\t%.4f %.4f %.4f", v.x, v.y, v.z);
490 writer.printLn("\t}");
492 writer.printLn("\tface %d {", o.faces.size());
493 for(size_t j=0; j<o.faces.size(); ++j){
496 std::stringstream ss;
497 ss.setf(std::ios_base::fixed, std::ios_base::floatfield);
503 for(size_t k=0; k<f.index_count; ++k){
510 for(size_t k=0; k<f.index_count; ++k){
516 << std::setprecision(5) << uv.x
517 << ' ' << std::setprecision(5) << uv.y;
521 writer.printLn(ss.str().c_str());
523 writer.printLn("\t}");
528 writer.printLn("Eof");
533 bool IO::write(const char *path)
535 binary::FileWriter writer(path);
536 return write(writer);