UEdGraphNode* FMaterialGraphSchemaAction_NewFunctionCall::PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode/* = true*/) { const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "MaterialEditorNewFunctionCall", "Material Editor: New Function Call")); UMaterialExpressionMaterialFunctionCall* FunctionNode = CastChecked<UMaterialExpressionMaterialFunctionCall>( FMaterialEditorUtilities::CreateNewMaterialExpression( ParentGraph, UMaterialExpressionMaterialFunctionCall::StaticClass(), Location, bSelectNewNode, /*bAutoAssignResource*/false)); if (!FunctionNode->MaterialFunction) { UMaterialFunction* MaterialFunction = LoadObject<UMaterialFunction>(NULL, *FunctionPath, NULL, 0, NULL); UMaterialGraph* MaterialGraph = CastChecked<UMaterialGraph>(ParentGraph); if(FunctionNode->SetMaterialFunction(MaterialGraph->MaterialFunction, NULL, MaterialFunction)) { FunctionNode->PostEditChange(); FMaterialEditorUtilities::UpdateSearchResults(ParentGraph); FunctionNode->GraphNode->AutowireNewNode(FromPin); return FunctionNode->GraphNode; } else { FMaterialEditorUtilities::AddToSelection(ParentGraph, FunctionNode); FMaterialEditorUtilities::DeleteSelectedNodes(ParentGraph); } } return NULL; }
void UMaterialGraphSchema::DroppedAssetsOnGraph(const TArray<class FAssetData>& Assets, const FVector2D& GraphPosition, UEdGraph* Graph) const { UMaterialGraph* MaterialGraph = CastChecked<UMaterialGraph>(Graph); const int32 LocOffsetBetweenNodes = 32; FVector2D ExpressionPosition = GraphPosition; for (int32 AssetIdx = 0; AssetIdx < Assets.Num(); ++AssetIdx) { bool bAddedNode = false; UObject* Asset = Assets[AssetIdx].GetAsset(); UClass* MaterialExpressionClass = Cast<UClass>(Asset); UMaterialFunction* Func = Cast<UMaterialFunction>(Asset); UTexture* Tex = Cast<UTexture>(Asset); UMaterialParameterCollection* ParameterCollection = Cast<UMaterialParameterCollection>(Asset); if (MaterialExpressionClass && MaterialExpressionClass->IsChildOf(UMaterialExpression::StaticClass())) { FMaterialEditorUtilities::CreateNewMaterialExpression(Graph, MaterialExpressionClass, ExpressionPosition, true, true); bAddedNode = true; } else if ( Func ) { UMaterialExpressionMaterialFunctionCall* FunctionNode = CastChecked<UMaterialExpressionMaterialFunctionCall>( FMaterialEditorUtilities::CreateNewMaterialExpression(Graph, UMaterialExpressionMaterialFunctionCall::StaticClass(), ExpressionPosition, true, false)); if (!FunctionNode->MaterialFunction) { if(FunctionNode->SetMaterialFunction(MaterialGraph->MaterialFunction, NULL, Func)) { FunctionNode->PostEditChange(); FMaterialEditorUtilities::UpdateSearchResults(Graph); } else { FMaterialEditorUtilities::AddToSelection(Graph, FunctionNode); FMaterialEditorUtilities::DeleteSelectedNodes(Graph); continue; } } bAddedNode = true; } else if ( Tex ) { UMaterialExpressionTextureSample* TextureSampleNode = CastChecked<UMaterialExpressionTextureSample>( FMaterialEditorUtilities::CreateNewMaterialExpression(Graph, UMaterialExpressionTextureSample::StaticClass(), ExpressionPosition, true, true) ); TextureSampleNode->Texture = Tex; TextureSampleNode->AutoSetSampleType(); FMaterialEditorUtilities::ForceRefreshExpressionPreviews(Graph); bAddedNode = true; } else if ( ParameterCollection ) { UMaterialExpressionCollectionParameter* CollectionParameterNode = CastChecked<UMaterialExpressionCollectionParameter>( FMaterialEditorUtilities::CreateNewMaterialExpression(Graph, UMaterialExpressionCollectionParameter::StaticClass(), ExpressionPosition, true, true) ); CollectionParameterNode->Collection = ParameterCollection; FMaterialEditorUtilities::ForceRefreshExpressionPreviews(Graph); bAddedNode = true; } if ( bAddedNode ) { ExpressionPosition.X += LocOffsetBetweenNodes; ExpressionPosition.Y += LocOffsetBetweenNodes; } } }