CelticCraft/Plugins/VoxelFree/Source/VoxelGraph/Private/VoxelGraphPreviewSettings.cpp

116 lines
No EOL
3.7 KiB
C++

// Copyright 2020 Phyronnaz
#include "VoxelGraphPreviewSettings.h"
#include "IVoxelGraphEditor.h"
#include "VoxelUtilities/VoxelMathUtilities.h"
#include "Engine/StaticMesh.h"
#include "Materials/MaterialInterface.h"
#include "UObject/ConstructorHelpers.h"
UVoxelGraphPreviewSettings::UVoxelGraphPreviewSettings()
{
static ConstructorHelpers::FObjectFinderOptional<UStaticMesh> MeshObject(TEXT("/Voxel/Preview/SM_Plane"));
static ConstructorHelpers::FObjectFinderOptional<UMaterialInterface> HeightmapMaterialObject(TEXT("/Voxel/Preview/M_PreviewMaterial"));
static ConstructorHelpers::FObjectFinderOptional<UMaterialInterface> SliceMaterialObject(TEXT("/Voxel/Preview/M_2DPreviewMaterial"));
Mesh = MeshObject.Get();
HeightmapMaterial = HeightmapMaterialObject.Get();
SliceMaterial = SliceMaterialObject.Get();
IndexColors.Add(FColorList::Red);
IndexColors.Add(FColorList::Green);
IndexColors.Add(FColorList::Blue);
IndexColors.Add(FColorList::Yellow);
IndexColors.Add(FColorList::Magenta);
IndexColors.Add(FColorList::Cyan);
IndexColors.Add(FColorList::Orange);
IndexColors.Add(FColorList::Aquamarine);
IndexColors.Add(FColorList::BakerChocolate);
IndexColors.Add(FColorList::Brass);
IndexColors.Add(FColorList::Gold);
}
#if WITH_EDITOR
void UVoxelGraphPreviewSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
Super::PostEditChangeProperty(PropertyChangedEvent);
if (LeftToRight == BottomToTop)
{
// Else crash
if (PropertyChangedEvent.MemberProperty &&
PropertyChangedEvent.MemberProperty->GetFName() == GET_MEMBER_NAME_STATIC(UVoxelGraphPreviewSettings, BottomToTop))
{
LeftToRight = EVoxelGraphPreviewAxes((int32(BottomToTop) + 1) % 3);
}
else
{
BottomToTop = EVoxelGraphPreviewAxes((int32(LeftToRight) + 1) % 3);
}
}
NumRangeAnalysisChunksPerAxis = FMath::Clamp(NumRangeAnalysisChunksPerAxis, 1, Resolution);
const FVoxelGraphPreviewSettingsWrapper Wrapper(*this);
ResolutionMultiplierLog = Wrapper.LOD;
PreviewedBounds = Wrapper.Bounds;
// Don't let the previewed voxel go out of the bounds
PreviewedVoxel = Wrapper.Bounds.Clamp(PreviewedVoxel);
if (Graph && PropertyChangedEvent.MemberProperty)
{
const bool bAutomatic = PropertyChangedEvent.MemberProperty->HasMetaData(STATIC_FNAME("Automatic"));
const bool bUpdateItems = PropertyChangedEvent.MemberProperty->HasMetaData(STATIC_FNAME("UpdateItems"));
const bool bMeshOnly = PropertyChangedEvent.MemberProperty->HasMetaData(STATIC_FNAME("MeshOnly"));
if (!bAutomatic || PropertyChangedEvent.ChangeType != EPropertyChangeType::Interactive)
{
EVoxelGraphPreviewFlags Flags = EVoxelGraphPreviewFlags::None;
if (!bAutomatic)
{
Flags |= EVoxelGraphPreviewFlags::ManualPreview;
}
Flags |= EVoxelGraphPreviewFlags::UpdateMeshSettings;
if (!bMeshOnly)
{
Flags |= EVoxelGraphPreviewFlags::UpdateTextures;
}
if (bUpdateItems)
{
Flags |= EVoxelGraphPreviewFlags::UpdatePlaceableItems;
}
IVoxelGraphEditor::GetVoxelGraphEditor()->UpdatePreview(Graph, Flags);
}
}
}
#endif
FVoxelGraphPreviewSettingsWrapper::FVoxelGraphPreviewSettingsWrapper(const UVoxelGraphPreviewSettings& Settings)
{
LOD = FMath::Clamp(Settings.ResolutionMultiplierLog, 0, 20);
Step = 1 << LOD;
Resolution = Settings.Resolution;
LeftToRight = Settings.LeftToRight;
BottomToTop = Settings.BottomToTop;
Center = FVoxelUtilities::DivideRound(Settings.Center, Step) * Step;
{
Start = Center;
const int32 Offset = Resolution / 2 * Step;
GetAxis(Start, LeftToRight) -= Offset;
GetAxis(Start, BottomToTop) -= Offset;
}
{
Size = FIntVector(1, 1, 1);
GetAxis(Size, LeftToRight) = Resolution;
GetAxis(Size, BottomToTop) = Resolution;
}
Bounds = FVoxelIntBox(Start, Start + Size * Step);
}