OSDN Git Service

implement mqo write.
authorousttrue <ousttrue@gmail.com>
Mon, 17 May 2010 20:36:15 +0000 (05:36 +0900)
committerousttrue <ousttrue@gmail.com>
Mon, 17 May 2010 20:36:15 +0000 (05:36 +0900)
include/binary.h
include/mqo.h
src/binary.cpp
src/mqo.cpp
test/main.cpp

index 1e5260c..c85a8ee 100644 (file)
@@ -4,6 +4,7 @@
 #include <fstream>
 #include <vector>
 #include <assert.h>
+#include <stdarg.h>
 
 namespace meshio {
 namespace binary {
@@ -109,6 +110,36 @@ public:
  void readAll(const wchar_t *path, std::vector<char> &all);
 #endif
 
+/**
+ * \83f\81[\83^\8f\91\82«\8d\9e\82Ý\83C\83\93\83^\81[\83t\83F\81[\83X
+ */
+class IWriter
+{
+public:
+       virtual ~IWriter(){}
+       virtual void write(char *buf, unsigned int size)=0;
+       void writeLn(const char *fmt, ...)
+       {
+               char buf[1024];
+               va_list list;
+               va_start(list, fmt);
+               vsprintf(buf, fmt, list);
+               write(buf, strlen(buf));
+               write("\r\n", 2);
+               va_end(list);
+       }
+};
+
+class FileWriter : public IWriter
+{
+       FILE *io_;
+
+public:
+       FileWriter(const char *path);
+       virtual ~FileWriter();
+       virtual void write(char *buf, unsigned int size);
+};
+
 } // namespace binary
 } // namespace meshio
 
index 6664694..b64c7f6 100644 (file)
@@ -251,7 +251,8 @@ struct IO
 //#ifdef _WIN32
        bool read(const wchar_t *path);
 //#endif
-       bool write(std::ostream &os);
+       bool write(binary::IWriter &writer);
+       bool write(const char *path);
 };
 
 } // namespace mqo
index 4fcbe20..08bc752 100644 (file)
@@ -72,6 +72,8 @@ bool MemoryReader::isEnd()const
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+// readALL
+///////////////////////////////////////////////////////////////////////////////
 static void readALL_(FILE *fp, std::vector<char> &buf)
 {
        int iRet = fseek(fp, 0L, SEEK_END);
@@ -114,5 +116,24 @@ void readAll(const wchar_t *path, std::vector<char> &buf)
 }
 #endif
 
+///////////////////////////////////////////////////////////////////////////////
+// FileWriter
+///////////////////////////////////////////////////////////////////////////////
+FileWriter::FileWriter(const char *path)
+{
+       io_=fopen(path, "wb");
+}
+
+FileWriter::~FileWriter()
+{
+       fclose(io_);
+}
+
+void FileWriter::write(char *buf, unsigned int size)
+{
+       fwrite(buf, size, 1, io_);
+}
+
+
 } // namespace binary
 } // namespace meshio
index 88325f1..d55d070 100644 (file)
@@ -1,6 +1,8 @@
 #include "mqo.h"
 #include <iostream>
 #include <fstream>
+#include <sstream>
+#include <iomanip>
 #include <vector>
 
 #include "text.h"
@@ -84,7 +86,7 @@ public:
                                else if(key=="Eof"){
                                        if(materials.empty()){
                                                // fallback
-                                               materials.push_back(Material());
+                                               //materials.push_back(Material());
                                        }
                                        return true;
                                }
@@ -437,11 +439,102 @@ bool IO::read(const wchar_t *path)
 }
 #endif
 
-bool IO::write(std::ostream &os)
+bool IO::write(binary::IWriter &writer)
 {
-       return false;
+       // header
+       writer.writeLn("Metasequoia Document");
+       writer.writeLn("Format Text Ver 1.0");
+       writer.writeLn("");
+
+       // scene
+       writer.writeLn("Scene {");
+       writer.writeLn("\tpos 0.0000 0.0000 1500.0000");
+       writer.writeLn("\tlookat 0.0000 0.0000 0.0000");
+       writer.writeLn("\thead -0.5236");
+       writer.writeLn("\tpich 0.5236");
+       writer.writeLn("\tortho 0");
+       writer.writeLn("\tzoom2 5.0000");
+       writer.writeLn("\tamb 0.250 0.250 0.250");
+       writer.writeLn("}");
+
+       // materials
+       if(materials.size()>0){
+               writer.writeLn("Material %d {", materials.size());
+               for(size_t i=0; i<materials.size(); ++i){
+                       Material &m=materials[i];
+               }
+               writer.writeLn("}");
+       }
+
+       // objects
+       for(size_t i=0; i<objects.size(); ++i){
+               Object &o=objects[i];
+               writer.writeLn("Object \"%s\" {", o.name.c_str());
+               writer.writeLn("\tdepth 0");
+               writer.writeLn("\tfolding 0");
+               writer.writeLn("\tscale 1.000000 1.000000 1.000000");
+               writer.writeLn("\trotation 0.000000 0.000000 0.000000");
+               writer.writeLn("\ttranslation 0.000000 0.000000 0.000000");
+               writer.writeLn("\tvisible 15");
+               writer.writeLn("\tlocking 0");
+               writer.writeLn("\tshading 1");
+               writer.writeLn("\tfacet 59.5");
+               writer.writeLn("\tcolor 0.898 0.400 0.137");
+               writer.writeLn("\tcolor_type 0");
+               // vertex
+               writer.writeLn("\tvertex %d {", o.vertices.size());
+               for(size_t j=0; j<o.vertices.size(); ++j){
+                       Vector3 &v=o.vertices[j];
+                       writer.writeLn("\t\t%.4f %.4f %.4f", v.x, v.y, v.z);
+               }
+               writer.writeLn("\t}");
+               // face
+               writer.writeLn("\tface %d {", o.faces.size());
+               for(size_t j=0; j<o.faces.size(); ++j){
+                       Face &f=o.faces[j];
+
+                       std::stringstream ss;
+                       ss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+                       ss 
+                               << "\t\t"
+                               << f.index_count
+                               ;
+                       ss << " V(";
+                       for(size_t k=0; k<f.index_count; ++k){
+                               if(k){
+                                       ss << ' ';
+                               }
+                               ss << f.indices[k];
+                       }
+                       ss << ") UV(";
+                       for(size_t k=0; k<f.index_count; ++k){
+                               if(k){
+                                       ss << ' ';
+                               }
+                               Vector2 &uv=f.uv[k];
+                               ss 
+                                       << std::setprecision(5) << uv.x 
+                                       << ' ' << std::setprecision(5) << uv.y;
+                       }
+                       ss << ")";
+
+                       writer.writeLn(ss.str().c_str());
+               }
+               writer.writeLn("\t}");
+               // close
+               writer.writeLn("}");
+       }
+       // Eof
+       writer.writeLn("Eof");
+
+       return true;
 }
 
+bool IO::write(const char *path)
+{
+       binary::FileWriter writer(path);
+       return write(writer);
+}
 
 }
 }
index 6ff6c5e..685a592 100644 (file)
@@ -70,6 +70,27 @@ TEST(mqo, read)
        EXPECT_EQ(6, io.objects[0].faces.size());
 }
 
+TEST(mqo, write) 
+{ 
+       {
+               mqo::IO io;
+               EXPECT_TRUE(io.read("cube.mqo"));
+               EXPECT_EQ(1, io.objects.size());
+               EXPECT_EQ(8, io.objects[0].vertices.size());
+               EXPECT_EQ(6, io.objects[0].faces.size());
+               EXPECT_TRUE(io.write("cube2.mqo"));
+               EXPECT_EQ(0, io.materials.size());
+       }
+
+       {
+               mqo::IO io;
+               EXPECT_TRUE(io.read("cube2.mqo"));
+               EXPECT_EQ(1, io.objects.size());
+               EXPECT_EQ(8, io.objects[0].vertices.size());
+               EXPECT_EQ(6, io.objects[0].faces.size());
+       }
+}
+
 TEST(pmd, read) 
 { 
        std::locale::global(std::locale("japanese"));