void InfoFileExporter::visit(const scene::INodePtr& node) { // Don't export the layer settings for models and particles, as they are not there // at map load/parse time - these shouldn't even be passed in here assert(node && !Node_isModel(node) && !particles::isParticleNode(node)); // Open a Node block _stream << "\t\t" << InfoFile::NODE << " { "; scene::LayerList layers = node->getLayers(); // Write a space-separated list of node IDs for (scene::LayerList::const_iterator i = layers.begin(); i != layers.end(); ++i) { _stream << *i << " "; } // Close the Node block _stream << "}"; // Write additional node info, for easier debugging of layer issues _stream << " // " << getNodeInfo(node); _stream << std::endl; _layerInfoCount++; }
void ModelExporter::processNodes() { AABB bounds = calculateModelBounds(); if (_centerObjects) { // Depending on the center point, we need to use the object bounds // or just the translation towards the user-defined origin, ignoring bounds _centerTransform = _useOriginAsCenter ? Matrix4::getTranslation(-_origin) : Matrix4::getTranslation(-bounds.origin); } for (const scene::INodePtr& node : _nodes) { if (Node_isModel(node)) { model::ModelNodePtr modelNode = Node_getModel(node); // Push the geometry into the exporter model::IModel& model = modelNode->getIModel(); Matrix4 exportTransform = node->localToWorld().getPremultipliedBy(_centerTransform); for (int s = 0; s < model.getSurfaceCount(); ++s) { const model::IModelSurface& surface = model.getSurface(s); if (isExportableMaterial(surface.getActiveMaterial())) { _exporter->addSurface(surface, exportTransform); } } } else if (Node_isBrush(node)) { processBrush(node); } else if (Node_isPatch(node)) { processPatch(node); } else if (_exportLightsAsObjects && Node_getLightNode(node)) { processLight(node); } } }
AABB ModelExporter::calculateModelBounds() { AABB bounds; for (const scene::INodePtr& node : _nodes) { // Only consider the node types supported by processNodes() if (!Node_isModel(node) && !Node_isBrush(node) && !Node_isPatch(node)) { continue; } bounds.includeAABB(node->worldAABB()); } return bounds; }