void MapExporter::post(const scene::INodePtr& node) { try { Entity* entity = Node_getEntity(node); if (entity != NULL) { _writer.endWriteEntity(*entity, _mapStream); return; } IBrush* brush = Node_getIBrush(node); if (brush != NULL && brush->hasContributingFaces()) { _writer.endWriteBrush(*brush, _mapStream); return; } IPatch* patch = Node_getIPatch(node); if (patch != NULL) { _writer.endWritePatch(*patch, _mapStream); return; } } catch (IMapWriter::FailureException& ex) { rError() << "Failure exporting a node (post): " << ex.what() << std::endl; } }
bool MapExporter::pre(const scene::INodePtr& node) { try { Entity* entity = Node_getEntity(node); if (entity != NULL) { // Progress dialog handling onNodeProgress(); _writer.beginWriteEntity(*entity, _mapStream); if (_infoFileExporter) _infoFileExporter->visit(node); return true; } IBrush* brush = Node_getIBrush(node); if (brush != NULL && brush->hasContributingFaces()) { // Progress dialog handling onNodeProgress(); _writer.beginWriteBrush(*brush, _mapStream); if (_infoFileExporter) _infoFileExporter->visit(node); return true; } IPatch* patch = Node_getIPatch(node); if (patch != NULL) { // Progress dialog handling onNodeProgress(); _writer.beginWritePatch(*patch, _mapStream); if (_infoFileExporter) _infoFileExporter->visit(node); return true; } } catch (IMapWriter::FailureException& ex) { rError() << "Failure exporting a node (pre): " << ex.what() << std::endl; } return true; // full traversal }
void ModelExporter::processBrush(const scene::INodePtr& node) { IBrush* brush = Node_getIBrush(node); if (brush == nullptr) return; Matrix4 exportTransform = node->localToWorld().getPremultipliedBy(_centerTransform); for (std::size_t b = 0; b < brush->getNumFaces(); ++b) { const IFace& face = brush->getFace(b); const std::string& materialName = face.getShader(); if (!isExportableMaterial(materialName)) continue; const IWinding& winding = face.getWinding(); std::vector<model::ModelPolygon> polys; if (winding.size() < 3) { rWarning() << "Skipping face with less than 3 winding verts" << std::endl; continue; } // Create triangles for this winding for (std::size_t i = 1; i < winding.size() - 1; ++i) { model::ModelPolygon poly; poly.a = convertWindingVertex(winding[i + 1]); poly.b = convertWindingVertex(winding[i]); poly.c = convertWindingVertex(winding[0]); polys.push_back(poly); } _exporter->addPolygons(materialName, polys, exportTransform); } }