#include <fstream>
#include <vector>
#include <assert.h>
+#include <stdarg.h>
namespace meshio {
namespace binary {
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
}
///////////////////////////////////////////////////////////////////////////////
+// readALL
+///////////////////////////////////////////////////////////////////////////////
static void readALL_(FILE *fp, std::vector<char> &buf)
{
int iRet = fseek(fp, 0L, SEEK_END);
}
#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
#include "mqo.h"
#include <iostream>
#include <fstream>
+#include <sstream>
+#include <iomanip>
#include <vector>
#include "text.h"
else if(key=="Eof"){
if(materials.empty()){
// fallback
- materials.push_back(Material());
+ //materials.push_back(Material());
}
return true;
}
}
#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);
+}
}
}
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"));