For .obj conversion terminate lines with "\n" rather than std::endl causing a significant speed increase due to longer intermittently flushing the stream

This commit is contained in:
aothms
2014-03-22 11:12:50 +00:00
parent b4e1b15da5
commit ba0ba1973a
+16 -16
View File
@@ -28,7 +28,7 @@ bool WaveFrontOBJSerializer::ready() {
} }
void WaveFrontOBJSerializer::writeHeader() { void WaveFrontOBJSerializer::writeHeader() {
obj_stream << "# File generated by IfcOpenShell " << IFCOPENSHELL_VERSION << std::endl; obj_stream << "# File generated by IfcOpenShell " << IFCOPENSHELL_VERSION << "\n";
#ifdef WIN32 #ifdef WIN32
const char dir_separator = '\\'; const char dir_separator = '\\';
#else #else
@@ -39,29 +39,29 @@ void WaveFrontOBJSerializer::writeHeader() {
if (slash != std::string::npos) { if (slash != std::string::npos) {
mtl_basename = mtl_basename.substr(slash+1); mtl_basename = mtl_basename.substr(slash+1);
} }
obj_stream << "mtllib " << mtl_basename << std::endl; obj_stream << "mtllib " << mtl_basename << "\n";
mtl_stream << "# File generated by IfcOpenShell " << IFCOPENSHELL_VERSION << std::endl; mtl_stream << "# File generated by IfcOpenShell " << IFCOPENSHELL_VERSION << "\n";
} }
void WaveFrontOBJSerializer::writeMaterial(const IfcGeomObjects::Material& style) { void WaveFrontOBJSerializer::writeMaterial(const IfcGeomObjects::Material& style) {
mtl_stream << "newmtl " << style.name() << std::endl; mtl_stream << "newmtl " << style.name() << "\n";
if (style.hasDiffuse()) { if (style.hasDiffuse()) {
const double* diffuse = style.diffuse(); const double* diffuse = style.diffuse();
mtl_stream << "Kd " << diffuse[0] << " " << diffuse[1] << " " << diffuse[2] << std::endl; mtl_stream << "Kd " << diffuse[0] << " " << diffuse[1] << " " << diffuse[2] << "\n";
} }
if (style.hasSpecular()) { if (style.hasSpecular()) {
const double* specular = style.specular(); const double* specular = style.specular();
mtl_stream << "Ks " << specular[0] << " " << specular[1] << " " << specular[2] << std::endl; mtl_stream << "Ks " << specular[0] << " " << specular[1] << " " << specular[2] << "\n";
} }
if (style.hasSpecularity()) { if (style.hasSpecularity()) {
mtl_stream << "Ns " << style.specularity() << std::endl; mtl_stream << "Ns " << style.specularity() << "\n";
} }
if (style.hasTransparency()) { if (style.hasTransparency()) {
const double transparency = 1.0 - style.transparency(); const double transparency = 1.0 - style.transparency();
if (transparency < 1) { if (transparency < 1) {
mtl_stream << "Tr " << transparency << std::endl; mtl_stream << "Tr " << transparency << "\n";
mtl_stream << "d " << transparency << std::endl; mtl_stream << "d " << transparency << "\n";
mtl_stream << "D " << transparency << std::endl; mtl_stream << "D " << transparency << "\n";
} }
} }
} }
@@ -71,8 +71,8 @@ void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject
std::replace( tmp.begin(), tmp.end(), ' ', '_'); std::replace( tmp.begin(), tmp.end(), ' ', '_');
const std::string name = tmp; const std::string name = tmp;
obj_stream << "g " << name << std::endl; obj_stream << "g " << name << "\n";
obj_stream << "s 1" << std::endl; obj_stream << "s 1" << "\n";
const IfcGeomObjects::IfcRepresentationTriangulation& mesh = o->mesh(); const IfcGeomObjects::IfcRepresentationTriangulation& mesh = o->mesh();
@@ -81,13 +81,13 @@ void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject
const double x = *(it++); const double x = *(it++);
const double y = *(it++); const double y = *(it++);
const double z = *(it++); const double z = *(it++);
obj_stream << "v " << x << " " << y << " " << z << std::endl; obj_stream << "v " << x << " " << y << " " << z << "\n";
} }
for ( std::vector<float>::const_iterator it = mesh.normals().begin(); it != mesh.normals().end(); ) { for ( std::vector<float>::const_iterator it = mesh.normals().begin(); it != mesh.normals().end(); ) {
const double x = *(it++); const double x = *(it++);
const double y = *(it++); const double y = *(it++);
const double z = *(it++); const double z = *(it++);
obj_stream << "vn " << x << " " << y << " " << z << std::endl; obj_stream << "vn " << x << " " << y << " " << z << "\n";
} }
int previous_material_id = -2; int previous_material_id = -2;
@@ -104,7 +104,7 @@ void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject
material = IfcGeomObjects::Material(IfcGeom::get_default_style(o->type())); material = IfcGeomObjects::Material(IfcGeom::get_default_style(o->type()));
} }
const std::string material_name = material.name(); const std::string material_name = material.name();
obj_stream << "usemtl " << material_name << std::endl; obj_stream << "usemtl " << material_name << "\n";
if (materials.find(material_name) == materials.end()) { if (materials.find(material_name) == materials.end()) {
writeMaterial(material); writeMaterial(material);
materials.insert(material_name); materials.insert(material_name);
@@ -115,7 +115,7 @@ void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject
const int v1 = *(it++)+vcount_total; const int v1 = *(it++)+vcount_total;
const int v2 = *(it++)+vcount_total; const int v2 = *(it++)+vcount_total;
const int v3 = *(it++)+vcount_total; const int v3 = *(it++)+vcount_total;
obj_stream << "f " << v1 << "//" << v1 << " " << v2 << "//" << v2 << " " << v3 << "//" << v3 << std::endl; obj_stream << "f " << v1 << "//" << v1 << " " << v2 << "//" << v2 << " " << v3 << "//" << v3 << "\n";
} }
vcount_total += vcount; vcount_total += vcount;
} }