- remove some code duplication

This commit is contained in:
Magnus Norddahl 2018-12-31 17:37:19 +01:00
parent d03ded7f94
commit 28d7bb586f
2 changed files with 70 additions and 88 deletions

View file

@ -54,6 +54,50 @@ LightmapBuilder::~LightmapBuilder()
{
}
void LightmapBuilder::CreateLightmaps(FLevel &doomMap, int sampleDistance, int textureSize)
{
map = &doomMap;
samples = sampleDistance;
textureWidth = textureSize;
textureHeight = textureSize;
mesh = std::make_unique<LevelMesh>(doomMap);
CreateSurfaceLights();
CreateTraceTasks();
SetupLightCellGrid();
SetupTaskProcessed("Tracing cells", grid.blocks.size());
Worker::RunJob(grid.blocks.size(), [=](int id) {
LightBlock(id);
PrintTaskProcessed();
});
printf("Cells traced: %i \n\n", tracedTexels);
SetupTaskProcessed("Tracing surfaces", traceTasks.size());
Worker::RunJob(traceTasks.size(), [=](int id) {
LightSurface(id);
PrintTaskProcessed();
});
printf("Texels traced: %i \n\n", tracedTexels);
if (LightBounce > 0)
{
SetupTaskProcessed("Tracing indirect", traceTasks.size());
Worker::RunJob(traceTasks.size(), [=](int id) {
LightIndirect(id);
PrintTaskProcessed();
});
printf("Texels traced: %i \n\n", tracedTexels);
}
for (auto &surf : mesh->surfaces)
{
FinishSurface(surf.get());
}
}
BBox LightmapBuilder::GetBoundsFromSurface(const Surface *surface)
{
Vec3 low(M_INFINITY, M_INFINITY, M_INFINITY);
@ -597,34 +641,12 @@ void LightmapBuilder::LightSurface(const int taskid)
{
const TraceTask &task = traceTasks[taskid];
TraceSurface(mesh->surfaces[task.surface].get(), task.offset);
std::unique_lock<std::mutex> lock(mutex);
int numtasks = traceTasks.size();
int lastproc = processed * 100 / numtasks;
processed++;
int curproc = processed * 100 / numtasks;
if (lastproc != curproc || processed == 1)
{
float remaining = (float)processed / (float)numtasks;
printf("%i%c done\r", (int)(remaining * 100.0f), '%');
}
}
void LightmapBuilder::LightIndirect(const int taskid)
{
const TraceTask &task = traceTasks[taskid];
TraceIndirectLight(mesh->surfaces[task.surface].get(), task.offset);
int numtasks = traceTasks.size();
int lastproc = processed * 100 / numtasks;
processed++;
int curproc = processed * 100 / numtasks;
if (lastproc != curproc || processed == 1)
{
float remaining = (float)processed / (float)numtasks;
printf("%i%c done\r", (int)(remaining * 100.0f), '%');
}
}
void LightmapBuilder::CreateSurfaceLights()
@ -667,59 +689,6 @@ void LightmapBuilder::CreateSurfaceLights()
}
}
void LightmapBuilder::CreateLightmaps(FLevel &doomMap, int sampleDistance, int textureSize)
{
map = &doomMap;
samples = sampleDistance;
textureWidth = textureSize;
textureHeight = textureSize;
mesh = std::make_unique<LevelMesh>(doomMap);
CreateSurfaceLights();
CreateTraceTasks();
printf("-------------- Tracing cells ---------------\n");
SetupLightCellGrid();
processed = 0;
tracedTexels = 0;
Worker::RunJob(grid.blocks.size(), [=](int id) {
LightBlock(id);
});
printf("Cells traced: %i \n\n", tracedTexels);
printf("------------- Tracing surfaces -------------\n");
tracedTexels = 0;
processed = 0;
Worker::RunJob(traceTasks.size(), [=](int id) {
LightSurface(id);
});
printf("Texels traced: %i \n\n", tracedTexels);
if (LightBounce > 0)
{
printf("------------- Tracing indirect -------------\n");
tracedTexels = 0;
processed = 0;
Worker::RunJob(traceTasks.size(), [=](int id) {
LightIndirect(id);
});
printf("Texels traced: %i \n\n", tracedTexels);
}
for (auto &surf : mesh->surfaces)
{
FinishSurface(surf.get());
}
}
void LightmapBuilder::SetupLightCellGrid()
{
BBox worldBBox = mesh->CollisionMesh->get_bbox();
@ -819,18 +788,6 @@ void LightmapBuilder::LightBlock(int id)
block.z = 0;
block.layers = 0;
}
std::unique_lock<std::mutex> lock(mutex);
int numblocks = grid.blocks.size();
int lastproc = processed * 100 / numblocks;
processed++;
int curproc = processed * 100 / numblocks;
if (lastproc != curproc || processed == 1)
{
float remaining = (float)processed / (float)numblocks;
printf("%i%c cells done\r", (int)(remaining * 100.0f), '%');
}
}
void LightmapBuilder::AddLightmapLump(FWadWriter &wadFile)
@ -969,6 +926,28 @@ void LightmapBuilder::AddLightmapLump(FWadWriter &wadFile)
zout.Write(buffer.data(), lumpFile.BufferAt() - lumpFile.Buffer());
}
void LightmapBuilder::SetupTaskProcessed(const char *name, int total)
{
printf("-------------- %s ---------------\n", name);
processed = 0;
progresstotal = total;
}
void LightmapBuilder::PrintTaskProcessed()
{
std::unique_lock<std::mutex> lock(mutex);
int lastproc = processed * 100 / progresstotal;
processed++;
int curproc = processed * 100 / progresstotal;
if (lastproc != curproc || processed == 1)
{
float remaining = (float)processed / (float)progresstotal;
printf("%i%c done\r", (int)(remaining * 100.0f), '%');
}
}
/////////////////////////////////////////////////////////////////////////////
LightmapTexture::LightmapTexture(int width, int height) : textureWidth(width), textureHeight(height)

View file

@ -107,6 +107,9 @@ private:
void CreateSurfaceLights();
void SetupTaskProcessed(const char *name, int total);
void PrintTaskProcessed();
uint16_t *AllocTextureRoom(Surface *surface, int *x, int *y);
FLevel *map;
@ -118,11 +121,11 @@ private:
std::vector<std::unique_ptr<SurfaceLight>> surfaceLights;
std::vector<std::unique_ptr<LightmapTexture>> textures;
std::vector<TraceTask> traceTasks;
int extraSamples = 2;
int tracedTexels = 0;
LightCellGrid grid;
std::mutex mutex;
int processed = 0;
int progresstotal = 0;
};