bool pre(const scene::INodePtr& node) { Entity* entity = Node_getEntity(node); // Check for an entity if (entity != NULL) { // greebo: Check for a Doom3Group scene::GroupNodePtr groupNode = Node_getGroupNode(node); // Don't handle the worldspawn children, they're safe&sound if (groupNode != NULL && entity->getKeyValue("classname") != "worldspawn") { groupNode->removeOriginFromChildren(); // Don't traverse the children return false; } } return true; }
// Try to create a CM from the selected entity void createCMFromSelection(const cmd::ArgumentList& args) { // Check the current selection state const SelectionInfo& info = GlobalSelectionSystem().getSelectionInfo(); if (info.totalCount == info.entityCount && info.totalCount == 1) { // Retrieve the node, instance and entity const scene::INodePtr& entityNode = GlobalSelectionSystem().ultimateSelected(); // Try to retrieve the group node scene::GroupNodePtr groupNode = Node_getGroupNode(entityNode); // Remove the entity origin from the brushes if (groupNode != NULL) { groupNode->removeOriginFromChildren(); // Deselect the node Node_setSelected(entityNode, false); // Select all the child nodes NodeSelector visitor; entityNode->traverse(visitor); BrushPtrVector brushes = algorithm::getSelectedBrushes(); // Create a new collisionmodel on the heap using a shared_ptr cmutil::CollisionModelPtr cm(new cmutil::CollisionModel()); // Add all the brushes to the collision model for (std::size_t i = 0; i < brushes.size(); i++) { cm->addBrush(brushes[i]->getBrush()); } ui::ModelSelectorResult modelAndSkin = ui::ModelSelector::chooseModel("", false, false); std::string basePath = GlobalGameManager().getModPath(); std::string modelPath = basePath + modelAndSkin.model; std::string newExtension = "." + GlobalRegistry().get(RKEY_CM_EXT); // Set the model string to correctly associate the clipmodel cm->setModel(modelAndSkin.model); try { // create the new autosave filename by changing the extension Path cmPath = boost::filesystem::change_extension( Path(modelPath, boost::filesystem::native), newExtension ); // Open the stream to the output file std::ofstream outfile(cmPath.string().c_str()); if (outfile.is_open()) { // Insert the CollisionModel into the stream outfile << *cm; // Close the file outfile.close(); globalOutputStream() << "CollisionModel saved to " << cmPath.string() << std::endl; } else { gtkutil::errorDialog( (boost::format("Couldn't save to file: %s") % cmPath.string()).str(), GlobalMainFrame().getTopLevelWindow()); } } catch (boost::filesystem::filesystem_error f) { globalErrorStream() << "CollisionModel: " << f.what() << std::endl; } // De-select the child brushes GlobalSelectionSystem().setSelectedAll(false); // Re-add the origin to the brushes groupNode->addOriginToChildren(); // Re-select the node Node_setSelected(entityNode, true); } } else { gtkutil::errorDialog( _(ERRSTR_WRONG_SELECTION.c_str()), GlobalMainFrame().getTopLevelWindow()); } }