CelticCraft/Plugins/VoxelFree/Source/Voxel/Private/VoxelTools/Tools/VoxelRevertTool.cpp

66 lines
1.4 KiB
C++
Raw Permalink Normal View History

2023-07-03 16:17:13 +00:00
// Copyright 2020 Phyronnaz
#include "VoxelTools/Tools/VoxelRevertTool.h"
#include "VoxelTools/Impl/VoxelSphereToolsImpl.h"
#include "VoxelTools/Impl/VoxelSphereToolsImpl.inl"
#include "VoxelWorld.h"
UVoxelRevertTool::UVoxelRevertTool()
{
ToolName = TEXT("Revert");
}
void UVoxelRevertTool::Tick()
{
Super::Tick();
CurrentHistoryPosition = GetVoxelWorld()->GetData().GetHistoryPosition();
HistoryPosition = FMath::Clamp(HistoryPosition, 0, CurrentHistoryPosition);
}
FVoxelIntBoxWithValidity UVoxelRevertTool::DoEdit()
{
VOXEL_FUNCTION_COUNTER();
auto& World = *GetVoxelWorld();
const FVoxelVector VoxelPosition = World.GlobalToLocalFloat(GetToolPosition());
const float VoxelRadius = SharedConfig->BrushSize / 2.f / World.VoxelSize;
const FVoxelIntBox Bounds = FVoxelSphereToolsImpl::GetBounds(VoxelPosition, VoxelRadius);
if (!Bounds.IsValid())
{
return {};
}
const auto BoundsToCache = GetBoundsToCache(Bounds);
auto& Data = World.GetData();
auto DataImpl = GetDataImpl(Data);
FVoxelWriteScopeLock Lock(Data, BoundsToCache, FUNCTION_FNAME);
CacheData<FVoxelValue>(Data, BoundsToCache);
if (GetTickData().IsAlternativeMode())
{
FVoxelSphereToolsImpl::RevertSphereToGenerator(
DataImpl,
VoxelPosition,
VoxelRadius,
bRevertValues,
bRevertMaterials);
}
else
{
FVoxelSphereToolsImpl::RevertSphere(
DataImpl,
VoxelPosition,
VoxelRadius,
HistoryPosition,
bRevertValues,
bRevertMaterials);
}
return Bounds;
}