bool UMaterialGraphNode::CanPasteHere(const UEdGraph* TargetGraph, const UEdGraphSchema* Schema) const { if (Super::CanPasteHere(TargetGraph, Schema)) { const UMaterialGraph* MaterialGraph = Cast<const UMaterialGraph>(TargetGraph); if (MaterialGraph) { // Check whether we're trying to paste a material function into a function that depends on it UMaterialExpressionMaterialFunctionCall* FunctionExpression = Cast<UMaterialExpressionMaterialFunctionCall>(MaterialExpression); bool bIsValidFunctionExpression = true; if (MaterialGraph->MaterialFunction && FunctionExpression && FunctionExpression->MaterialFunction && FunctionExpression->MaterialFunction->IsDependent(MaterialGraph->MaterialFunction)) { bIsValidFunctionExpression = false; } if (bIsValidFunctionExpression && IsAllowedExpressionType(MaterialExpression->GetClass(), MaterialGraph->MaterialFunction != NULL)) { return true; } } } return false; }
void FMaterialEditorUtilities::AddMaterialExpressionCategory(FGraphActionMenuBuilder& ActionMenuBuilder, FString CategoryName, TArray<struct FMaterialExpression>* MaterialExpressions, bool bMaterialFunction) { // Get type of dragged pin uint32 FromPinType = 0; if (ActionMenuBuilder.FromPin) { FromPinType = UMaterialGraphSchema::GetMaterialValueType(ActionMenuBuilder.FromPin); } for (int32 Index = 0; Index < MaterialExpressions->Num(); ++Index) { const FMaterialExpression& MaterialExpression = (*MaterialExpressions)[Index]; if (IsAllowedExpressionType(MaterialExpression.MaterialClass, bMaterialFunction)) { if (!ActionMenuBuilder.FromPin || HasCompatibleConnection(MaterialExpression.MaterialClass, FromPinType, ActionMenuBuilder.FromPin->Direction, bMaterialFunction)) { FFormatNamedArguments Arguments; Arguments.Add(TEXT("Name"), FText::FromString( *MaterialExpression.Name )); const FText ToolTip = FText::Format( LOCTEXT( "NewMaterialExpressionTooltip", "Adds a {Name} node here" ), Arguments ); TSharedPtr<FMaterialGraphSchemaAction_NewNode> NewNodeAction(new FMaterialGraphSchemaAction_NewNode( CategoryName, FText::FromString(MaterialExpression.Name), ToolTip.ToString(), 0)); ActionMenuBuilder.AddAction(NewNodeAction); NewNodeAction->MaterialExpressionClass = MaterialExpression.MaterialClass; NewNodeAction->Keywords = CastChecked<UMaterialExpression>(MaterialExpression.MaterialClass->GetDefaultObject())->GetKeywords(); } } } }