void USoundCueGraphNode_Base::ReconstructNode() { // Break any links to 'orphan' pins for (int32 PinIndex = 0; PinIndex < Pins.Num(); ++PinIndex) { UEdGraphPin* Pin = Pins[PinIndex]; TArray<class UEdGraphPin*>& LinkedToRef = Pin->LinkedTo; for (int32 LinkIdx=0; LinkIdx < LinkedToRef.Num(); LinkIdx++) { UEdGraphPin* OtherPin = LinkedToRef[LinkIdx]; // If we are linked to a pin that its owner doesn't know about, break that link if (!OtherPin->GetOwningNode()->Pins.Contains(OtherPin)) { Pin->LinkedTo.Remove(OtherPin); } } } // Store the old Input and Output pins TArray<UEdGraphPin*> OldInputPins; GetInputPins(OldInputPins); UEdGraphPin* OldOutputPin = GetOutputPin(); // Move the existing pins to a saved array TArray<UEdGraphPin*> OldPins(Pins); Pins.Empty(); // Recreate the new pins AllocateDefaultPins(); // Get new Input and Output pins TArray<UEdGraphPin*> NewInputPins; GetInputPins(NewInputPins); UEdGraphPin* NewOutputPin = GetOutputPin(); for (int32 PinIndex = 0; PinIndex < OldInputPins.Num(); PinIndex++) { if (PinIndex < NewInputPins.Num()) { NewInputPins[PinIndex]->CopyPersistentDataFromOldPin(*OldInputPins[PinIndex]); } } NewOutputPin->CopyPersistentDataFromOldPin(*OldOutputPin); OldInputPins.Empty(); OldOutputPin = NULL; // Throw away the original pins for (int32 OldPinIndex = 0; OldPinIndex < OldPins.Num(); ++OldPinIndex) { UEdGraphPin* OldPin = OldPins[OldPinIndex]; OldPin->Modify(); OldPin->BreakAllPinLinks(); UEdGraphNode::DestroyPin(OldPin); } OldPins.Empty(); }
void USoundCueGraphNode::RemoveInputPin(UEdGraphPin* InGraphPin) { const FScopedTransaction Transaction( NSLOCTEXT("UnrealEd", "SoundCueEditorDeleteInput", "Delete Sound Cue Input") ); Modify(); TArray<class UEdGraphPin*> InputPins; GetInputPins(InputPins); for (int32 InputIndex = 0; InputIndex < InputPins.Num(); InputIndex++) { if (InGraphPin == InputPins[InputIndex]) { InGraphPin->MarkPendingKill(); Pins.Remove(InGraphPin); // also remove the SoundNode child node so ordering matches SoundNode->Modify(); SoundNode->RemoveChildNode(InputIndex); break; } } USoundCue* SoundCue = CastChecked<USoundCueGraph>(GetGraph())->GetSoundCue(); SoundCue->CompileSoundNodesFromGraphNodes(); SoundCue->MarkPackageDirty(); // Refresh the current graph, so the pins can be updated GetGraph()->NotifyGraphChanged(); }
void UMaterialGraphNode_Base::ReplaceNode(UMaterialGraphNode_Base* OldNode) { check(OldNode); check(OldNode != this); // Get Pins from node passed in TArray<UEdGraphPin*> OldInputPins; TArray<UEdGraphPin*> OldOutputPins; OldNode->GetInputPins(OldInputPins); OldNode->GetOutputPins(OldOutputPins); // Get our Input and Output pins TArray<UEdGraphPin*> NewInputPins; TArray<UEdGraphPin*> NewOutputPins; GetInputPins(NewInputPins); GetOutputPins(NewOutputPins); // Copy Inputs from old node for (int32 PinIndex = 0; PinIndex < OldInputPins.Num(); PinIndex++) { if (PinIndex < NewInputPins.Num()) { ModifyAndCopyPersistentPinData(*NewInputPins[PinIndex], *OldInputPins[PinIndex]); } } // Copy Outputs from old node for (int32 PinIndex = 0; PinIndex < OldOutputPins.Num(); PinIndex++) { // If we can't find an equivalent output in this node, just use the first // The user will have to fix up any issues from the mismatch int32 FoundPinIndex = 0; // Try to find an equivalent output in this node for (int32 NewPinIndex = 0; NewPinIndex < NewOutputPins.Num(); NewPinIndex++) { if (OldOutputPins[PinIndex]->PinType == NewOutputPins[NewPinIndex]->PinType) { FoundPinIndex = NewPinIndex; break; } } if (FoundPinIndex < NewOutputPins.Num()) { ModifyAndCopyPersistentPinData(*NewOutputPins[FoundPinIndex], *OldOutputPins[PinIndex]); } } // Break the original pin links for (int32 OldPinIndex = 0; OldPinIndex < OldNode->Pins.Num(); ++OldPinIndex) { UEdGraphPin* OldPin = OldNode->Pins[OldPinIndex]; OldPin->Modify(); OldPin->BreakAllPinLinks(); } }
int32 UMaterialGraphNode::GetInputIndex(const UEdGraphPin* InputPin) const { TArray<UEdGraphPin*> InputPins; GetInputPins(InputPins); for (int32 Index = 0; Index < InputPins.Num(); ++Index) { if (InputPin == InputPins[Index]) { return Index; } } return -1; }
void UNiagaraNodeOutput::ReallocatePins() { Modify(); // Break any links to 'orphan' pins for (int32 PinIndex = 0; PinIndex < Pins.Num(); ++PinIndex) { UEdGraphPin* Pin = Pins[PinIndex]; TArray<class UEdGraphPin*>& LinkedToRef = Pin->LinkedTo; for (int32 LinkIdx = 0; LinkIdx < LinkedToRef.Num(); LinkIdx++) { UEdGraphPin* OtherPin = LinkedToRef[LinkIdx]; // If we are linked to a pin that its owner doesn't know about, break that link if (!OtherPin->GetOwningNode()->Pins.Contains(OtherPin)) { Pin->LinkedTo.Remove(OtherPin); } } } // Store the old Input and Output pins TArray<UEdGraphPin*> OldInputPins; TArray<UEdGraphPin*> OldOutputPins; GetInputPins(OldInputPins); GetOutputPins(OldOutputPins); // Move the existing pins to a saved array TArray<UEdGraphPin*> OldPins(Pins); Pins.Empty(); // Recreate the new pins AllocateDefaultPins(); // Get new Input and Output pins TArray<UEdGraphPin*> NewInputPins; TArray<UEdGraphPin*> NewOutputPins; GetInputPins(NewInputPins); GetOutputPins(NewOutputPins); for (int32 PinIndex = 0; PinIndex < OldInputPins.Num(); PinIndex++) { if (PinIndex < NewInputPins.Num()) { NewInputPins[PinIndex]->CopyPersistentDataFromOldPin(*OldInputPins[PinIndex]); } } for (int32 PinIndex = 0; PinIndex < OldOutputPins.Num(); PinIndex++) { if (PinIndex < NewOutputPins.Num()) { NewOutputPins[PinIndex]->CopyPersistentDataFromOldPin(*OldOutputPins[PinIndex]); } } OldInputPins.Empty(); OldOutputPins.Empty(); // Throw away the original pins for (int32 OldPinIndex = 0; OldPinIndex < OldPins.Num(); ++OldPinIndex) { UEdGraphPin* OldPin = OldPins[OldPinIndex]; OldPin->Modify(); OldPin->BreakAllPinLinks(); #if 0 UEdGraphNode::ReturnPinToPool(OldPin); #else OldPin->Rename(NULL, GetTransientPackage(), REN_None); OldPin->RemoveFromRoot(); OldPin->MarkPendingKill(); #endif } OldPins.Empty(); GetGraph()->NotifyGraphChanged(); }
void UNiagaraNodeInput::ReallocatePins() { const UEdGraphSchema_Niagara* Schema = GetDefault<UEdGraphSchema_Niagara>(); Modify(); // Break any links to 'orphan' pins for (int32 PinIndex = 0; PinIndex < Pins.Num(); ++PinIndex) { UEdGraphPin* Pin = Pins[PinIndex]; TArray<class UEdGraphPin*>& LinkedToRef = Pin->LinkedTo; for (int32 LinkIdx = 0; LinkIdx < LinkedToRef.Num(); LinkIdx++) { UEdGraphPin* OtherPin = LinkedToRef[LinkIdx]; // If we are linked to a pin that its owner doesn't know about, break that link if (!OtherPin->GetOwningNode()->Pins.Contains(OtherPin)) { Pin->LinkedTo.Remove(OtherPin); } } } // Store the old Input and Output pins TArray<UEdGraphPin*> OldInputPins; TArray<UEdGraphPin*> OldOutputPins; GetInputPins(OldInputPins); GetOutputPins(OldOutputPins); // Move the existing pins to a saved array TArray<UEdGraphPin*> OldPins(Pins); Pins.Empty(); switch (Input.Type) { case ENiagaraDataType::Scalar: { CreatePin(EGPD_Output, Schema->PC_Float, TEXT(""), NULL, false, false, Input.Name.ToString()); } break; case ENiagaraDataType::Vector: { CreatePin(EGPD_Output, Schema->PC_Vector, TEXT(""), NULL, false, false, Input.Name.ToString()); } break; case ENiagaraDataType::Matrix: { CreatePin(EGPD_Output, Schema->PC_Matrix, TEXT(""), NULL, false, false, Input.Name.ToString()); } break; case ENiagaraDataType::Curve: { CreatePin(EGPD_Output, Schema->PC_Curve, TEXT(""), NULL, false, false, Input.Name.ToString()); } break; }; // Get new Input and Output pins TArray<UEdGraphPin*> NewInputPins; TArray<UEdGraphPin*> NewOutputPins; GetInputPins(NewInputPins); GetOutputPins(NewOutputPins); for (int32 PinIndex = 0; PinIndex < OldInputPins.Num(); PinIndex++) { if (PinIndex < NewInputPins.Num()) { NewInputPins[PinIndex]->CopyPersistentDataFromOldPin(*OldInputPins[PinIndex]); } } for (int32 PinIndex = 0; PinIndex < OldOutputPins.Num(); PinIndex++) { if (PinIndex < NewOutputPins.Num()) { NewOutputPins[PinIndex]->CopyPersistentDataFromOldPin(*OldOutputPins[PinIndex]); } } OldInputPins.Empty(); OldOutputPins.Empty(); // Throw away the original pins for (int32 OldPinIndex = 0; OldPinIndex < OldPins.Num(); ++OldPinIndex) { UEdGraphPin* OldPin = OldPins[OldPinIndex]; OldPin->Modify(); OldPin->BreakAllPinLinks(); #if 0 UEdGraphNode::ReturnPinToPool(OldPin); #else OldPin->Rename(NULL, GetTransientPackage(), REN_None); OldPin->RemoveFromRoot(); OldPin->MarkPendingKill(); #endif } OldPins.Empty(); GetGraph()->NotifyGraphChanged(); }