🌞 Victory Plugin ~ Rama's Extra Blueprint Nodes for UE5, No C++ Required!

Rama, I don’t use any of your plugins, but I enjoy that you make the world a little bit better with your positive attitude in every post. Without any hate and quarrels. Thank you for that and keep bringing :heart: to the people!

1 Like

@pladux Hee hee, thank you for the Lovely Message!

Positive Attitude + :heart: to the people = :zap: Victory! :rose:

:heart:

Rama

PS: I am doing a new UE5 plugin version right now!


New Victory Plugin 5 Update!


Dear :zap: Awesome :sparkling_heart: UE Community, :sparkling_heart:

:unicorn: I’ve added the requested nodes! :unicorn:

Please do let me know if you have other requests!

Part of the reason I am doing this sort of interview process is also to trim the plugin, getting rid of nodes ppl were not using so as to make the plugin a more streamlined complimentary :rose: Rama Gift to You All. :rose:

:heart:

Rama

PS: The :rainbow: Joyful Colors :star2: version of UE5 UI doesn’t come with the plugin, but I could upload my UI Color file if you like!

Download Link Here:


:star2: Get Text From Any :racehorse: :dash: Running .EXE on Your Computer! :sparkling_heart:

URamaVictoryPluginCreateProcessPipe Object :zap: is Born! :zap:


:zap: Below is a picture of me capturing the output of a .exe on my computer, a video compression tool, HandBrake! :zap:

The output of STDOUT of the .exe is coming directly into UE4, :rose: using only Blueprints! :rose:

I’ve made a new version of the Victory Plugin ( 4.27 (win32, win64 only) in original post ) !

This new version allows you to create a :rose: Very Special :rose: URamaVictoryPluginCreateProcessPipe to capture your Process output, if the Process is outputting to STDOUT (console window) or STDERR

  1. Construct the RamaVictoryPluginCreateProcessPipe object

  2. Pass it into VictoryCreateProc

  3. Call ReadFromPipe on the object periodically to get updates from your process

  4. When done, please call ClosePipe on the object, and null the reference to the object (I call ClosePipe inside of object BeginDestroy, but might as well :zap: take initiative :zap: yourself and close the actual OS pipe yourself immediately, rather than waiting for Garbage Collection)


Relevant UE4 C++ Code


.h

/** 
	Made With Love By Rama for Use with @VictoryCreateProc
	So that you can receive feedback from your processes.
	
	♥
	
	Rama
*/
UCLASS(Blueprintable,BlueprintType)
class URamaVictoryPluginCreateProcessPipe : public UObject
{
	GENERATED_BODY()
public:
	 
	UFUNCTION(BlueprintCallable, Category = "Joy Flow")
	bool CreatePipe();
	
	UFUNCTION(BlueprintCallable, Category = "Joy Flow")
	void ClosePipe();
	
	/** 
		This has exec pins because it is an expensive action and the output is saved/cached on the output pin, whereas a Pure node would repeat the action many times, each time node is accessed.
		
		@Return false if the pipes were not created yet
		
		♥ Rama 
	*/
	UFUNCTION(BlueprintCallable, Category = "Joy Flow")
	bool ReadFromPipe(FString& PipeContents);
	
	UFUNCTION(BlueprintPure, Category = "Joy Flow")
	bool PipeIsValid();
	
public:
	void* ReadPipe = nullptr;
	void* WritePipe = nullptr;
	
	virtual void BeginDestroy() override;
};

.cpp

bool URamaVictoryPluginCreateProcessPipe::CreatePipe()
{
	if(PipeIsValid())
	{
		//Ignore repeat creates without a close inbetween <3 Rama
		return true;
	}
	return FPlatformProcess::CreatePipe( ReadPipe, WritePipe );
}
void URamaVictoryPluginCreateProcessPipe::ClosePipe()
{
	if(PipeIsValid())
	{
		FPlatformProcess::ClosePipe(ReadPipe, WritePipe);
		ReadPipe = nullptr;
		WritePipe = nullptr;
	}
}
bool URamaVictoryPluginCreateProcessPipe::ReadFromPipe(FString& PipeContents)
{
	PipeContents = "";
	
	if(!PipeIsValid()) 
	{
		return false;
	}
	PipeContents = FPlatformProcess::ReadPipe(ReadPipe);
	return true;
}
bool URamaVictoryPluginCreateProcessPipe::PipeIsValid()
{
	return ReadPipe != nullptr && WritePipe != nullptr;
}

void URamaVictoryPluginCreateProcessPipe::BeginDestroy()
{
	Super::BeginDestroy();
	//~~~~~~~~~~~~~~~~~~~~
	
	//Close pipe if it was still open! ♥ Rama
	ClosePipe();
}

:heart:

Rama

Hi Rama!! Can you help me with the UMG Color wheel for UE5? It is not visible in UMG. Is the color wheel not working or available or how to install it properly?

:heart: Rama’s UE5 Color Picker For You :heart:

Dear UE Community,

I’ve integrated my implementation of the UE Editor Color Picker into the UE5 version of Victory Plugin!

:zap: :star2: :rose:This Color Picker, The UE Color Picker Itself, Will Indeed Work In Packaged Games :rose: :star2: :zap:

Many Thanks To :sparkling_heart: Nick Darnell :sparkling_heart:, for it was he who exposed the UE Color Picker Slate class (Runtime/AppFramework) so we could use it in :rose:packaged games! :rose:

My role was to create the UMG Class wrapper of the Slate Code so that the Color Picker can be accessed from the :rose: UMG Designer :rose:, as you can see in the video below!

@M1te Your UMG Color Picker Gift is Ready at the Download link in original post, enjoy!


UE5 C++ Code


.h

/*
	By Rama for You
	
	You are welcome to use this code anywhere as long as you include this notice.
*/

#pragma once

//UE5 Color Picker
//		Requires module in build.cs
//			APPFRAMEWORK 
#include "Runtime/AppFramework/Public/Widgets/Colors/SColorPicker.h"

class SJoyColorPicker
	: public SColorPicker
{ 
	typedef SColorPicker Super;
	
public: //! <~~~~~
	FORCEINLINE void SetColorRGB(const FLinearColor& NewColor)
	{
		//This is protected in SColorPicker 
		//		so can't call it from UMG component
		SetNewTargetColorRGB( NewColor, true ); //Force Update
	}
	
//Animation
public:
 
	FLinearColor InstantColor;
	bool Animation_SkipToFinalForOneTick = false; 
	virtual void Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime ) override
	{ 
		//Skip to final, then resume normal animation behavior
		if(Animation_SkipToFinalForOneTick)
		{  
			Animation_SkipToFinalForOneTick = false;  
			Super::Tick(AllottedGeometry, InCurrentTime, 10000); //<~~~ because all the required vars like CurrentTime are private :)
			SetColorRGB(InstantColor);
			return;
			//~~~~
		}
		
		//Animate normally!
		Super::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);
	}
};
#pragma once

#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Styling/SlateColor.h"
#include "Styling/SlateTypes.h"
#include "Widgets/SWidget.h"
#include "Components/Widget.h"

#include "RamaColorPicker.generated.h"

class SJoyColorPicker;

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnJoyColorChangedEvent, const FLinearColor&, NewColor);

/**
 * Rama Color Picker For You! ♥ Rama
 */
UCLASS()
class VICTORYBPLIBRARY_API URamaColorPicker : public UWidget
{
	GENERATED_UCLASS_BODY()
	
public:

	/** The currently Chosen Color for this Color Picker! ♥ Rama*/
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="Rama Color Picker",meta=(Keywords="getcolor"))
	FLinearColor JoyColor = FLinearColor::Red;
	
	/** Called whenever the color is changed programmatically or interactively by the user */
	UPROPERTY(BlueprintAssignable, Category="Rama Color Picker", meta=(DisplayName="OnColorChanged (Rama Color Picker)"))
	FOnJoyColorChangedEvent OnColorChanged;
	
	/**
	 * Directly sets the current color, for saving user preferences of chosen color, or loading existing color of an in-game clicked actor!
	 * @param InColor The color to assign to the widget
	 */
	UFUNCTION(BlueprintCallable, Category = "Rama Color Picker",meta=(Keywords="setcolor"))
	void SetJoyColor(FLinearColor NewColor, bool SkipAnimation=false);
	
public:
	void ColorUpdated(FLinearColor NewValue);

#if WITH_EDITOR
public:
	
	// UWidget interface
	//virtual const FSlateBrush* GetEditorIcon() override;
	virtual const FText GetPaletteCategory() override;
	// End UWidget interface
	
	// UObject interface
	virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;
	// End of UObject interface
	
#endif

public:
	
	//~ Begin UWidget Interface
	virtual void SynchronizeProperties() override;
	//~ End UWidget Interface
	
protected:
	//~ Begin UWidget Interface
	virtual TSharedRef<SWidget> RebuildWidget() override;
	// End of UWidget
	
	// UVisual interface
	virtual void ReleaseSlateResources(bool bReleaseChildren) override;
	// End of UVisual interface
	
protected:
	TSharedPtr<SJoyColorPicker> MySlateColorPicker;
	
};

#include "RamaColorPicker.h"

#include "UObject/ConstructorHelpers.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "SJoyColorPicker.h"

#define LOCTEXT_NAMESPACE "UMG"

URamaColorPicker::URamaColorPicker(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
	, JoyColor(FLinearColor::Red)
{}

#if WITH_EDITOR
/*
const FSlateBrush* UJoyColorWheel::GetEditorIcon()
{
	return FUMGStyle::Get().GetBrush("Widget.Image");
}
*/ 
 
const FText URamaColorPicker::GetPaletteCategory()
{
	return LOCTEXT("Victory Plugin", "Victory Plugin");
}

void URamaColorPicker::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
	Super::PostEditChangeProperty(PropertyChangedEvent);

	FName PropertyName = (PropertyChangedEvent.Property != NULL) ? PropertyChangedEvent.Property->GetFName() : NAME_None;
  
	//Update Picker to JoyColor property change!
	if (PropertyName == TEXT("JoyColor"))
	{  
		SetJoyColor(JoyColor,true);
	}	
} 
#endif

void URamaColorPicker::SetJoyColor(FLinearColor NewColor, bool SkipAnimation)
{
	if(!MySlateColorPicker.IsValid()) 
	{
		return;
	}
	
	//Skip Anim?
	if(SkipAnimation)
	{
		MySlateColorPicker->InstantColor = NewColor; 
		MySlateColorPicker->Animation_SkipToFinalForOneTick = true;		//See SJoyColorPicker.h
	}
	else
	{
		//Set!
		MySlateColorPicker->SetColorRGB(NewColor);
	}
}

void URamaColorPicker::ColorUpdated(FLinearColor NewValue)
{
	JoyColor = NewValue; 
	 
	if(OnColorChanged.IsBound())
	{
		OnColorChanged.Broadcast(JoyColor);
	}
} 

TSharedRef<SWidget> URamaColorPicker::RebuildWidget()
{
	MySlateColorPicker = SNew( SJoyColorPicker )
		.TargetColorAttribute( JoyColor )
		.OnColorCommitted( FOnLinearColorValueChanged::CreateUObject( this, &URamaColorPicker::ColorUpdated) );
	
	return MySlateColorPicker.ToSharedRef();
}

//Release
void URamaColorPicker::ReleaseSlateResources(bool bReleaseChildren)
{
	Super::ReleaseSlateResources(bReleaseChildren);

	if(MySlateColorPicker.IsValid()) 
	{
		MySlateColorPicker.Reset();
	}
}

void URamaColorPicker::SynchronizeProperties()
{
	Super::SynchronizeProperties();
	 
	SetJoyColor(JoyColor,true);
}


/////////////////////////////////////////////////////

#undef LOCTEXT_NAMESPACE
1 Like

OMG RAMA!!! Have no words in the world to thank you!!!

1 Like

Hee heee!

Love and Joy to You tooo!

Have fun!

I have used this very color picker in my own :sparkling_heart: packaged games :sparkling_heart:, so I know it works!

Enjoy!

:sparkling_heart:

Rama

1 Like

Hi… sorry for the offtopic, but I am curious. When seeing your theme color which tries its best to make my eyes bleed, I am just wondering if you suffer from some significant vision impairment, requiring you to configure your editor color theme this way, or if it’s just some sort of ■■■ infused preference? :slight_smile:

I am not trying to be a jerk. I am just genuinely curious why would anyone voluntarily undergo this degree of visual suffering.

(EDIT: Why the hell does this forum censor L S D? :face_with_raised_eyebrow:)

Lovely to hear from you again @Rawalanche !

I believe the experience you are currently having with my color theme is similar to what happens if you are in a cave for a long time with very little light, and then, after 15 years, if you just rush out into the Blazing Light of Day, it can be too much,

and the instinctive response perhaps is to think that the Light is Too Bright, rather than thinking that maybe your eyes have become too accustomed to dim places.

I believe this automatic response comes from the fact that when dealing with the realm of Perceptions, we tend to assume our perceptions are the correct and only way of perceiving, simply because they are the only set of perceptions we are experiencing, and therefore it is easy to assume that our perceptions are the only ones that even exist.

If you embrace the concept that perhaps there are Other Perceptions, and sets of perceptions that you are not currently having, that are also valid and good, and perhaps even :unicorn: wildly different :parrot: than your own, then you enter the realm of True Comprehension of just how vast and varied everyone’s experience of Life really is!

It is only when we encounter someone else’s choices that :zap: vary greatly :zap: from our own that we realize… they must be perceiving life very differently than us!

Then of course the question becomes, how do you systematically alter your perceptions toward the set of perceptions that are only the ones that you prefer?

Once you adapt to the :zap: :rose: Frequency Range of my Color Theme :rose: :zap: I do think you will realize that what you are currently experiencing will transition into “Wow, Instant Joy and Happiness every time I look at this color theme!”

Yes modern culture required many curious adjustments on our part in order to fit in, and modern culture just has not done a great job with Color in my opinion, notable exceptions are tye-dye shirts and Nature Herself.

I consider it to be my responsibility to help you Pre-Adapt to the :star2: Blazingly Intense Colors :star2: that are the guaranteed Future experience of all of us,

:star2: for so very many reasons :star2:

not the smallest of which is the fact that :star2: :rose: Bright Pure Colors :rose: :star2: really are Foundational Elements of Life Itself, and have great power to heal your body.

~

I am not contradicting my statement of supporting and encouraging variety of perceptions among all people, I am indicating that:

We will be having a :star2: :zap: Perception Convergence :zap: :star2: in the Near Future, that is already Ongoing…

Due to the changing physical nature of our Solar System!

The need for this convergence is already evident in your post and my reply, for communication among people, and mutual understanding (even if mutual respect is already there, :star2: true understanding :star2: would be even better) really should be easier than it currently is!

I think our exchange already makes it obvious that a Perception Convergence among people would facilitate not just mutual respect and appreciation, but also true resonance, harmony, and the ability for us both to use the same (or similar) color theme in our UE editors!

~

To put it simply, :rose: Friendship will be greatly facilitated :zap: by a global / solar-system-wide Perception Convergence.

Agreeing to disagree is one thing.

Finding it :rose: Easy to Agree as Friends :rose: who can :star2: easily :star2: understand each other’s perspective would be :rainbow: Waaaaay Better! :rainbow:

~

Fun Experiment

So I ask you (and anyone who reads this is welcome to try it too), is there any 1 or several colors that you do actually still enjoy, even when they are very bright?

Take a paint program maybe, and let me know what your absolute favorite very-bright colors are.


Color-Based Healing and Empowerment is Real


:tulip: Ask any Flower! :blossom:

:zap: :rose: :sparkling_heart: :rose: :zap:

Rama

2 Likes

Man, I really wish I could be the kind of person who experiences instant joy and happiness every time I look at that theme. Right now I experience a need to reach for a screwdriver I can shove right onto my eyeballs :smiley:

Anyway, I am just having a hard time reconciliating my confusion about someone who on the one hand supports the Unreal Engine community with so many great resources and pieces of code, but on the other hand has such… “unique” taste :slight_smile:

I mean, seeing how you approach the visual aspect of the Engine, I’d totally expect your C++ code to be totally unreadable to me, yet it’s actually quite fine. So it’s just this contradiction that I find so fascinating :slight_smile:

1 Like

You said the magic word @Rawalanche ! “Contradiction!”

Any time we are faced with an “apparent” contradiction (it looks smells and tastes like a contradiction, but maybe isn’t), that is a moment to dive into and research deeply.

The feeling of “contradiction” : “Wait… how can these two things coexist side by side in a person/situation/experience I am having?”

Is an almost-guranteed indicator that you are experiencing an Unusual Frequency Range (UFR) and if you explore the feeling of contradiction, and the elements that seem to contradict each other, in depth,

You will almost always find there is actually Another Realm, Another Dimension,

:star2: :zap: Another Angle of Analysis :zap: :star2:

where the seemingly contradictory elements are actually Perfectly In Harmony with each other, but the Connective Tissue of these elements was previously not within your “acclimated” perception range.

I am indicating that :zap: you and everyone are more than capable of basically anything :zap:,

it is just that we get into a Perception Range Groove (PRG) based on what life has expected of us so far,

and you can easily exit that groove and see New Angles on Life,

if you learn to enjoy apparant contradictions / that feeling, and discover where the Connective Tissue does actually exist.

~

:rose: :zap: Facilitating Perception Range Expansion :zap: :rose:

If you obtain Essential Oil of Lavender, you will find that Lavender activate the Human Pineal Gland, and will improve both :zap: Your Unreal Engine Development Cycle :zap: (faster programming, faster comprehension of bugs in the code, and the overall game experience) as well as making it easy for you to expand your perception range and handle frequencies and experiences that previously might have overloaded your system.

:rose: Yes, it is true, Flowers help me Code in UE C++. :rose:

~

The Awesome Power Of Unreal Engine

:zap: :zap: :zap: The Awesome Thing about Unreal Engine, :zap: :zap: :zap:

:rose: :rose: :rose: that I always appreciate every day, :rose: :rose: :rose:

is that the Ceiling of Potential of what I can create is basically non-existent,


:zap: If I can imagine it, I can create it, in Unreal Engine! :zap::sparkling_heart: Rama


Well :rainbow: Essential Oil of Lavender :rainbow: helps to restore your obviously Enormous Imagination,

by :zap: stimulating your Pineal Gland :zap:

You could mix a few drops of Essential Oil of Lavender in water, and drink it daily,

and then you will see your Unreal Engine Development Cycle become more and more fun, with faster results, cleaner code, and :rose: very happy players. :rose:

:tulip: :rose: :sparkling_heart: :rose: :tulip:

Rama

PS: Now you know the Truth, My Victory Plugin is :tulip: Flower-Powered UE C++ Code! :tulip:

2 Likes

SwitchByte (uint8 faster) SwitchWildcard please!

Hello.
I’m trying to use functions Get pixels. Function “Get Pixel from T2D” doesn’t work at all, it always returns 0 by color and false as return value. Function “Get Pixels Array from T2D” crashes the editor.
Can anyone help understand how to use it.

:sparkling_heart: Welcome to the Unreal Engine Forums @darkflash007 !!!:sparkling_heart:

I have to say, that is one Sexy name you have!

Dark flash… trying to envision in our physical universe, what a Dark Flash would even look like…

Wow!

~

What engine version are you using?

I have to test with the same engine version to be sure my solution will work for you!

:heart:

Rama

Dear @Dreika

Can you please explain more what you mean?

What should the node do?

The more detailed you are, with mock up pictures and such, the better I can help

I prefer more words and media to less, to know exactly what you are trying to Achieve!

:sparkling_heart:

Rama

Thank you )
im using 5.0

Greetins @Rama ! I hope you’re doing well :slight_smile:

Is the victory plugin able to work with UE 5.1.0 (from Epic’s ue5-main branch?) Or is it still just UE5 EA right now?

Ya know I probably should have guessed that given the name of thread …

Hee hee!

Sorry I’ve been bouncing back and forth between my two Victory Plugin threads and forgot!

Can you send me a picture of the Texture2D Asset you are trying to get pixels from, particularly the compression?

You have to use a specific format, which does not compress the pixel data, otherwise it will never be the direct mapping you are expecting from your image editor, when viewing the pixel-level.

Any form of compression removes the 1:1 relationship / Lossless transition into UE you are probably hoping to achieve.

The comment on the node indicate this:

/** This will modify the original T2D to remove sRGB and change compression to VectorDisplacementMap to ensure accurate pixel reading. -Rama*/

This in particular → VectorDisplacementMap

Picture:

Confirm?

Can you confirm you are using this format please?

:heart:

Rama

Thanks!

Ya know for a second there I thought you were dialing in from a planet or dimension where UE5 has already been released…

If that IS the case, please take a picture so we can see what Life is like over where you are! … Please? :giraffe: I mean I give you all this free stuff, and all I want is a :tulip: picture :tulip: of what Life is like for you…

If however, you actually meant the git repo of UE5, no I do not yet have a git repo version, because a git repo is likely to change constantly and won’t work anyway.

But I assume if you are using the git repo, surely you must already know that it changes constantly, or… * everyone gasps who already comprehends where I am headed… or I didn’t read some Epic newsletter I was supposed to have read* Did Epic already lock down the git of UE5?

So there’s only two cases + a mysteriously possibly Magical 3rd:

  1. You really Are dialing in from another planet where UE5 5.1.0 Release is being used by a nearly-infinite number of Hyper-Intelligent Beautiful Goddesses making :zap: :zap: :zap: The Most Colorful Videos Games That Have Ever Existed. :zap: :zap: :zap:

or

  1. :star2: :zap: UE5 is about to be Released :zap: :star2: * Everyone starts clapping *

or

  1. Something Even Grander, but my electron field is struggling to grasp the Beauty of that that could possibly be…

:sparkling_heart: :unicorn: :sparkling_heart:

Rama

PS: I make it a habit to consider every case that could Ever Be, when I am programming in UE C++, so I can maximize the stability of my code in advance, and properly handle the whole variety of user inputs that could Ever Occur.

And I can’t think of ANY other cases given the inputs you have provided to me.

So that means :zap: :zap: :zap: SOMETHING AWESOME IS ABOUT TO HAPPEN :zap: :zap: :zap:

Because I Love all 3 cases I have presented to you!

Maybe @PresumptivePanda knows what this is all about…

1 Like