void SStaticMeshEditorViewport::UpdatePreviewMesh(UStaticMesh* InStaticMesh) { { const int32 SocketedComponentCount = SocketPreviewMeshComponents.Num(); for(int32 i = 0; i < SocketedComponentCount; ++i) { UStaticMeshComponent* SocketPreviewMeshComponent = SocketPreviewMeshComponents[i]; if( SocketPreviewMeshComponent ) { PreviewScene.RemoveComponent(SocketPreviewMeshComponent); } } SocketPreviewMeshComponents.Empty(); } if (PreviewMeshComponent) { PreviewScene.RemoveComponent(PreviewMeshComponent); PreviewMeshComponent = NULL; } PreviewMeshComponent = ConstructObject<UStaticMeshComponent>(UStaticMeshComponent::StaticClass()); PreviewMeshComponent->SetStaticMesh(InStaticMesh); PreviewScene.AddComponent(PreviewMeshComponent,FTransform::Identity); const int32 SocketCount = InStaticMesh->Sockets.Num(); SocketPreviewMeshComponents.Reserve(SocketCount); for(int32 i = 0; i < SocketCount; ++i) { UStaticMeshSocket* Socket = InStaticMesh->Sockets[i]; UStaticMeshComponent* SocketPreviewMeshComponent = NULL; if( Socket && Socket->PreviewStaticMesh ) { SocketPreviewMeshComponent = ConstructObject<UStaticMeshComponent>(UStaticMeshComponent::StaticClass()); SocketPreviewMeshComponent->SetStaticMesh(Socket->PreviewStaticMesh); SocketPreviewMeshComponent->SnapTo(PreviewMeshComponent, Socket->SocketName); SocketPreviewMeshComponents.Add(SocketPreviewMeshComponent); PreviewScene.AddComponent(SocketPreviewMeshComponent, FTransform::Identity); } } EditorViewportClient->SetPreviewMesh(InStaticMesh, PreviewMeshComponent); }
void SStaticMeshEditorViewport::UpdatePreviewSocketMeshes() { UStaticMesh* const PreviewStaticMesh = PreviewMeshComponent ? PreviewMeshComponent->StaticMesh : NULL; if( PreviewStaticMesh ) { const int32 SocketedComponentCount = SocketPreviewMeshComponents.Num(); const int32 SocketCount = PreviewStaticMesh->Sockets.Num(); const int32 IterationCount = FMath::Max(SocketedComponentCount, SocketCount); for(int32 i = 0; i < IterationCount; ++i) { if(i >= SocketCount) { // Handle removing an old component UStaticMeshComponent* SocketPreviewMeshComponent = SocketPreviewMeshComponents[i]; PreviewScene.RemoveComponent(SocketPreviewMeshComponent); SocketPreviewMeshComponents.RemoveAt(i, SocketedComponentCount - i); break; } else if(UStaticMeshSocket* Socket = PreviewStaticMesh->Sockets[i]) { UStaticMeshComponent* SocketPreviewMeshComponent = NULL; // Handle adding a new component if(i >= SocketedComponentCount) { SocketPreviewMeshComponent = ConstructObject<UStaticMeshComponent>(UStaticMeshComponent::StaticClass()); PreviewScene.AddComponent(SocketPreviewMeshComponent, FTransform::Identity); SocketPreviewMeshComponents.Add(SocketPreviewMeshComponent); } else { SocketPreviewMeshComponent = SocketPreviewMeshComponents[i]; } SocketPreviewMeshComponent->SetStaticMesh(Socket->PreviewStaticMesh); SocketPreviewMeshComponent->SnapTo(PreviewMeshComponent, Socket->SocketName); } } } }