/****************************************************************************** * Applies a modifier by appending it to the end of the node's modification * pipeline. ******************************************************************************/ void ObjectNode::applyModifier(Modifier* modifier) { if(!dataProvider()) throw Exception("Cannot insert modifier into a modification pipeline without a data source."); PipelineObject* pipelineObj = dynamic_object_cast<PipelineObject>(dataProvider()); if(!pipelineObj) { OORef<PipelineObject> p = new PipelineObject(dataset()); p->setSourceObject(dataProvider()); setDataProvider(p); pipelineObj = p; } pipelineObj->insertModifier(modifier, pipelineObj->modifierApplications().size()); }
/****************************************************************************** * Inserts the given modifier into the modification pipeline of the * selected scene nodes. ******************************************************************************/ void ModificationListModel::applyModifier(Modifier* modifier) { // Get the selected stack entry. The new modifier is inserted just behind it. ModificationListItem* currentItem = selectedItem(); // On the next list update, the new modifier should be selected. _nextToSelectObject = modifier; if(currentItem) { if(dynamic_object_cast<Modifier>(currentItem->object())) { for(ModifierApplication* modApp : currentItem->modifierApplications()) { PipelineObject* pipelineObj = modApp->pipelineObject(); OVITO_CHECK_OBJECT_POINTER(pipelineObj); pipelineObj->insertModifier(modifier, pipelineObj->modifierApplications().indexOf(modApp) + 1); } return; } else if(dynamic_object_cast<PipelineObject>(currentItem->object())) { PipelineObject* pipelineObj = static_object_cast<PipelineObject>(currentItem->object()); OVITO_CHECK_OBJECT_POINTER(pipelineObj); pipelineObj->insertModifier(modifier, 0); return; } else if(dynamic_object_cast<DataObject>(currentItem->object())) { if(PipelineObject* pipelineObj = hiddenPipelineObject()) { pipelineObj->insertModifier(modifier, 0); return; } } } // Apply modifier to each selected node. for(ObjectNode* objNode : selectedNodes()) { objNode->applyModifier(modifier); } }