Files
FlaxEngine/Source/Engine/Level/Scene/SceneLightmapsData.cpp
2021-01-02 14:28:49 +01:00

117 lines
2.9 KiB
C++

// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
#include "SceneLightmapsData.h"
#include "Engine/Core/Log.h"
#include "Engine/Level/Level.h"
#include "Engine/Level/Scene/Scene.h"
#include "Engine/Level/Scene/Lightmap.h"
SceneLightmapsData::SceneLightmapsData(Scene* scene)
: _lightmaps(4)
, _scene(scene)
{
}
SceneLightmapsData::~SceneLightmapsData()
{
// Ensure that lightmaps has been released
ASSERT(_lightmaps.IsEmpty());
}
Lightmap* SceneLightmapsData::GetReadyLightmap(int32 index)
{
return index >= 0 && index < _lightmaps.Count() && _lightmaps[index]->IsReady() ? _lightmaps[index] : nullptr;
}
#if USE_EDITOR
void SceneLightmapsData::GetCacheFolder(String* result)
{
*result = _scene->GetDataFolderPath() / TEXT("Lightmaps");
}
void SceneLightmapsData::GetCachedLightmapPath(String* result, int32 lightmapIndex, int32 textureIndex)
{
String cacheFolder;
GetCacheFolder(&cacheFolder);
*result = cacheFolder / String::Format(TEXT("Lightmap{0:0>2}-{1}"), lightmapIndex, textureIndex) + ASSET_FILES_EXTENSION_WITH_DOT;
}
#endif
void SceneLightmapsData::ClearLightmaps()
{
UpdateLightmapsCollection(0, 0);
}
void SceneLightmapsData::LoadLightmaps(Array<SavedLightmapInfo>& lightmaps)
{
// Unload previous
UnloadLightmaps();
if (lightmaps.IsEmpty())
return;
LOG(Info, "Loading {0} lightmap(s)", lightmaps.Count());
for (int32 i = 0; i < lightmaps.Count(); i++)
{
_lightmaps.Add(New<Lightmap>(this, i, lightmaps[i]));
}
}
void SceneLightmapsData::UnloadLightmaps()
{
if (_lightmaps.HasItems())
{
LOG(Info, "Unloding {0} lightmap(s)", _lightmaps.Count());
_lightmaps.ClearDelete();
}
}
void SceneLightmapsData::SaveLightmaps(Array<SavedLightmapInfo>& lightmaps)
{
lightmaps.Resize(_lightmaps.Count(), false);
for (int32 i = 0; i < _lightmaps.Count(); i++)
{
_lightmaps[i]->GetInfo(lightmaps[i]);
}
}
void SceneLightmapsData::UpdateLightmapsCollection(int32 count, int32 size)
{
// Check if amount will change
if (_lightmaps.Count() != count)
{
LOG(Info, "Changing amount of lightmaps from {0} to {1}", _lightmaps.Count(), count);
// Remove too many entries
while (_lightmaps.Count() > count)
{
auto lightmap = _lightmaps[count];
Delete(lightmap);
_lightmaps.RemoveAt(count);
}
// Add missing entries
while (_lightmaps.Count() < count)
{
SavedLightmapInfo info;
info.Lightmap0 = Guid::Empty;
info.Lightmap1 = Guid::Empty;
info.Lightmap2 = Guid::Empty;
auto lightmap = New<Lightmap>(this, _lightmaps.Count(), info);
_lightmaps.Add(lightmap);
}
}
// Resize invalid size lightmaps
for (int32 i = 0; i < _lightmaps.Count(); i++)
{
_lightmaps[i]->EnsureSize(size);
}
}