Skip to content

Commit

Permalink
Convert gltf image lambda to use capture instead of passing context.
Browse files Browse the repository at this point in the history
  • Loading branch information
Duttenheim committed Apr 4, 2024
1 parent 9dfac7f commit e59cab5
Showing 1 changed file with 20 additions and 33 deletions.
53 changes: 20 additions & 33 deletions toolkit/toolkitutil/model/import/gltf/ngltfexporter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ NglTFExporter::ParseScene()
this->outputFiles.AppendArray(outputs);
}

static const Util::String tmpDir = "temp:textureconverter";
Util::String intermediateDir = Util::String::Sprintf("%s/%s/%s", tmpDir.AsCharPtr(), this->category.AsCharPtr(), this->file.AsCharPtr());
const Util::String tmpDir = Util::String::Sprintf("temp:textureconverter/%s", this->category.AsCharPtr());
Util::String intermediateDir = Util::String::Sprintf("%s/%s/%s/temp", tmpDir.AsCharPtr(), this->category.AsCharPtr(), this->file.AsCharPtr());

bool hasEmbedded = false;
for (IndexT i = 0; i < gltfScene.materials.Size(); i++)
Expand Down Expand Up @@ -179,17 +179,6 @@ NglTFExporter::ParseScene()
// Create intermediate directory
IO::IoServer::Instance()->CreateDirectory(intermediateDir);

struct ImageJob
{
Gltf::Image* const* image;
const Gltf::Document* scene;
const Util::String* category;
const Util::String* baseDir;
const Util::String* intermediateDir;
ToolkitUtil::Logger* logger;
TextureConverter* converter;
} imageJob;

Util::Array<Gltf::Image*> images;
for (IndexT i = 0; i < gltfScene.images.Size(); i++)
{
Expand All @@ -199,25 +188,23 @@ NglTFExporter::ParseScene()
}
}

imageJob.image = images.ConstBegin();
imageJob.scene = &gltfScene;
imageJob.category = &this->category;
imageJob.converter = this->texConverter;
imageJob.baseDir = &this->file;
imageJob.logger = this->logger;
imageJob.intermediateDir = &intermediateDir;

auto job = [](SizeT totalJobs, SizeT groupSize, IndexT groupIndex, SizeT invocationOffset, void* ctx)
auto job = [
image = images.ConstBegin()
, scene = &gltfScene
, category = &this->category
, converter = this->texConverter
, baseDir = &this->file
, logger = this->logger
, intermediateDir = &intermediateDir
](SizeT totalJobs, SizeT groupSize, IndexT groupIndex, SizeT invocationOffset)
{
ImageJob* jobCtx = static_cast<ImageJob*>(ctx);

for (int i = 0; i < groupSize; i++)
{
int index = invocationOffset + i;
if (index >= totalJobs)
continue;

Gltf::Image const& image = jobCtx->scene->images[index];
Gltf::Image const& image = scene->images[index];

void const* data;
size_t dataSize = 0;
Expand All @@ -229,36 +216,36 @@ NglTFExporter::ParseScene()
}
else
{
auto const& bufferView = jobCtx->scene->bufferViews[image.bufferView];
data = (const char*)jobCtx->scene->buffers[bufferView.buffer].data.GetPtr() + bufferView.byteOffset;
auto const& bufferView = scene->bufferViews[image.bufferView];
data = (const char*)scene->buffers[bufferView.buffer].data.GetPtr() + bufferView.byteOffset;
dataSize = bufferView.byteLength;
}

Util::String format = (image.type == Gltf::Image::Type::Jpg) ? "jpg" : "png";

// export the content of blob to a temporary file
Ptr<IO::BinaryWriter> writer = IO::BinaryWriter::Create();
Util::String intermediateFile = Util::String::Sprintf("%s/%d.%s", jobCtx->intermediateDir->AsCharPtr(), index, format.AsCharPtr());
Util::String intermediateFile = Util::String::Sprintf("%s/%d.%s", intermediateDir->AsCharPtr(), index, format.AsCharPtr());
writer->SetStream(IO::IoServer::Instance()->CreateStream(intermediateFile));
if (!writer->Open())
{
jobCtx->logger->Warning(" [glTF - Could not open filestream to write intermediate image format]\n");
logger->Warning(" [glTF - Could not open filestream to write intermediate image format]\n");
return;
}
writer->GetStream()->Write(data, dataSize);
writer->Close();

auto dstFile = Util::String::Sprintf("tex:%s/%s/%d", jobCtx->category->AsCharPtr(), jobCtx->baseDir->AsCharPtr(), index);
auto dstFile = Util::String::Sprintf("tex:%s/%s/%d", category->AsCharPtr(), baseDir->AsCharPtr(), index);

// content is base 64 encoded in uri
if (!jobCtx->converter->ConvertTexture(intermediateFile, dstFile, tmpDir))
if (!converter->ConvertTexture(intermediateFile, dstFile, *intermediateDir))
{
jobCtx->logger->Error(" [glTF - Failed to convert texture]\n");
logger->Error(" [glTF - Failed to convert texture]\n");
}
}
};
Threading::Event event;
Jobs2::JobDispatch(job, gltfScene.images.Size(), 1, imageJob, nullptr, nullptr, &event);
Jobs2::JobDispatch(job, gltfScene.images.Size(), 1, nullptr, nullptr, &event);

for (IndexT i = 0; i < gltfScene.images.Size(); i++)
{
Expand Down

0 comments on commit e59cab5

Please sign in to comment.