CelticCraft/Plugins/VoxelFree/Source/VoxelGraph/Private/VoxelNodes/VoxelGeneratorMergeNode.cpp

107 lines
No EOL
2.5 KiB
C++

// Copyright 2020 Phyronnaz
#include "VoxelNodes/VoxelGeneratorMergeNode.h"
#include "VoxelGraphGenerator.h"
#include "VoxelGraphErrorReporter.h"
#include "VoxelGenerators/VoxelGeneratorInit.h"
#include "VoxelGenerators/VoxelGeneratorInstance.h"
#include "VoxelGraphOutputsConfig.h"
#include "NodeFunctions/VoxelNodeFunctions.h"
constexpr int32 NumDefaultInputPins_WGMN = 3 + 2 * 4;
inline TArray<FName> GetFloatOutputs(UVoxelGraphOutputsConfig* Config)
{
TArray<FName> Result;
if (Config)
{
for (auto& Output : Config->Outputs)
{
if (Output.Category == EVoxelDataPinCategory::Float)
{
Result.Add(Output.Name);
}
}
}
return Result;
}
UVoxelNode_GeneratorMerge::UVoxelNode_GeneratorMerge()
{
SetInputs({
{ "X", EC::Float, "X" },
{ "Y", EC::Float, "Y" },
{ "Z", EC::Float, "Z" },
{ "Index 0", EC::Int, "First generator index" },
{ "Alpha 0", EC::Float, "First generator alpha" },
{ "Index 1", EC::Int, "Second generator index" },
{ "Alpha 1", EC::Float, "Second generator alpha" },
{ "Index 2", EC::Int, "Third generator index" },
{ "Alpha 2", EC::Float, "Third generator alpha" },
{ "Index 3", EC::Int, "Fourth generator index" },
{ "Alpha 3", EC::Float, "Fourth generator alpha" } });
check(UVoxelNodeHelper::GetMinInputPins() == NumDefaultInputPins_WGMN);
}
FText UVoxelNode_GeneratorMerge::GetTitle() const
{
return FText::Format(VOXEL_LOCTEXT("Generator Merge: {0}"), Super::GetTitle());
}
int32 UVoxelNode_GeneratorMerge::GetOutputPinsCount() const
{
return 2 + GetFloatOutputs(Outputs).Num() + 1;
}
FName UVoxelNode_GeneratorMerge::GetOutputPinName(int32 PinIndex) const
{
if (PinIndex == 0)
{
return "Value";
}
if (PinIndex == 1)
{
return "Material";
}
if (PinIndex == GetOutputPinsCount() - 1)
{
return "Num Queried Generators";
}
PinIndex -= 2;
auto FloatOutputs = GetFloatOutputs(Outputs);
if (FloatOutputs.IsValidIndex(PinIndex))
{
return FloatOutputs[PinIndex];
}
return "Error";
}
EVoxelPinCategory UVoxelNode_GeneratorMerge::GetOutputPinCategory(int32 PinIndex) const
{
if (PinIndex == 1)
{
return EC::Material;
}
else if (PinIndex == GetOutputPinsCount() - 1)
{
return EC::Int;
}
else
{
return EC::Float;
}
}
void UVoxelNode_GeneratorMerge::LogErrors(FVoxelGraphErrorReporter& ErrorReporter)
{
Super::LogErrors(ErrorReporter);
for (auto& Generator : Generators)
{
if (!Generator.IsValid())
{
ErrorReporter.AddMessageToNode(this, "invalid generator", EVoxelGraphNodeMessageType::Error);
}
}
}