Files
FlaxEngine/Source/Engine/ShadowsOfMordor/AtlasChartsPacker.h
2024-02-26 19:00:48 +01:00

72 lines
2.0 KiB
C++

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#include "Builder.h"
#include "Engine/Utilities/RectPack.h"
#if COMPILE_WITH_GI_BAKING
namespace ShadowsOfMordor
{
class AtlasChartsPacker
{
public:
struct Node : RectPack<Node>
{
Builder::LightmapUVsChart* Chart = nullptr;
Node(uint32 x, uint32 y, uint32 width, uint32 height)
: RectPack<Node>(x, y, width, height)
{
}
void OnInsert(Builder::LightmapUVsChart* chart, const LightmapSettings* settings)
{
Chart = chart;
const float invSize = 1.0f / (int32)settings->AtlasSize;
chart->Result.UVsArea = Rectangle(X * invSize, Y * invSize, chart->Width * invSize, chart->Height * invSize);
}
};
private:
Node _root;
const LightmapSettings* _settings;
public:
/// <summary>
/// Initializes a new instance of the <see cref="AtlasChartsPacker"/> class.
/// </summary>
/// <param name="settings">The settings.</param>
AtlasChartsPacker(const LightmapSettings* settings)
: _root(settings->ChartsPadding, settings->ChartsPadding, (int32)settings->AtlasSize - settings->ChartsPadding, (int32)settings->AtlasSize - settings->ChartsPadding)
, _settings(settings)
{
}
/// <summary>
/// Finalizes an instance of the <see cref="AtlasChartsPacker"/> class.
/// </summary>
~AtlasChartsPacker()
{
}
public:
/// <summary>
/// Inserts the specified chart into atlas .
/// </summary>
/// <param name="chart">The chart.</param>
/// <returns></returns>
Node* Insert(Builder::LightmapUVsChart* chart)
{
return _root.Insert(chart->Width, chart->Height, _settings->ChartsPadding, chart, _settings);
}
};
};
#endif