You're breathtaking!
This commit is contained in:
119
Source/Engine/ContentExporters/ExportTexture.cpp
Normal file
119
Source/Engine/ContentExporters/ExportTexture.cpp
Normal file
@@ -0,0 +1,119 @@
|
||||
// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
|
||||
|
||||
#if COMPILE_WITH_ASSETS_EXPORTER
|
||||
|
||||
#include "AssetExporters.h"
|
||||
#include "Engine/Core/Log.h"
|
||||
#include "Engine/Content/Assets/CubeTexture.h"
|
||||
#include "Engine/Graphics/RenderTools.h"
|
||||
#include "Engine/Graphics/Textures/TextureData.h"
|
||||
#include "Engine/Tools/TextureTool/TextureTool.h"
|
||||
|
||||
ExportAssetResult AssetExporters::ExportTexture(ExportAssetContext& context)
|
||||
{
|
||||
// Prepare
|
||||
auto asset = (TextureBase*)context.Asset.Get();
|
||||
auto lock = asset->Storage->LockSafe();
|
||||
auto path = GET_OUTPUT_PATH(context, "png");
|
||||
|
||||
// Load the top mip data
|
||||
const int32 chunkIndex = 0;
|
||||
if (asset->LoadChunk(chunkIndex))
|
||||
return ExportAssetResult::CannotLoadData;
|
||||
BytesContainer data;
|
||||
asset->GetMipData(0, data);
|
||||
if (data.IsInvalid())
|
||||
return ExportAssetResult::Error;
|
||||
|
||||
// Peek image description
|
||||
const auto format = asset->Format();
|
||||
const int32 width = asset->Width();
|
||||
const int32 height = asset->Height();
|
||||
uint32 rowPitch, slicePitch;
|
||||
RenderTools::ComputePitch(format, width, height, rowPitch, slicePitch);
|
||||
|
||||
// Setup texture data
|
||||
TextureData textureData;
|
||||
textureData.Width = width;
|
||||
textureData.Height = height;
|
||||
textureData.Depth = 1;
|
||||
textureData.Format = format;
|
||||
textureData.Items.Resize(1);
|
||||
auto& item = textureData.Items[0];
|
||||
item.Mips.Resize(1);
|
||||
auto& mip = item.Mips[0];
|
||||
mip.RowPitch = rowPitch;
|
||||
mip.DepthPitch = slicePitch;
|
||||
mip.Lines = height;
|
||||
mip.Data.Link(data.Get(), slicePitch);
|
||||
|
||||
// Export to file
|
||||
if (TextureTool::ExportTexture(path, textureData))
|
||||
{
|
||||
return ExportAssetResult::Error;
|
||||
}
|
||||
|
||||
return ExportAssetResult::Ok;
|
||||
}
|
||||
|
||||
ExportAssetResult AssetExporters::ExportCubeTexture(ExportAssetContext& context)
|
||||
{
|
||||
// Prepare
|
||||
auto asset = (CubeTexture*)context.Asset.Get();
|
||||
auto lock = asset->Storage->LockSafe();
|
||||
auto path = GET_OUTPUT_PATH(context, "dds");
|
||||
|
||||
// Load the asset data
|
||||
if (asset->LoadChunks(ALL_ASSET_CHUNKS))
|
||||
return ExportAssetResult::CannotLoadData;
|
||||
|
||||
// Peek image description
|
||||
const auto format = asset->Format();
|
||||
const int32 width = asset->Width();
|
||||
const int32 height = asset->Height();
|
||||
const int32 mipLevels = asset->StreamingTexture()->TotalMipLevels();
|
||||
const int32 arraySize = 6;
|
||||
|
||||
// Setup texture data
|
||||
TextureData textureData;
|
||||
textureData.Width = width;
|
||||
textureData.Height = height;
|
||||
textureData.Depth = 1;
|
||||
textureData.Format = format;
|
||||
textureData.Items.Resize(arraySize);
|
||||
for (int32 arrayIndex = 0; arrayIndex < 6; arrayIndex++)
|
||||
{
|
||||
auto& item = textureData.Items[arrayIndex];
|
||||
item.Mips.Resize(mipLevels);
|
||||
for (int32 mipIndex = 0; mipIndex < mipLevels; mipIndex++)
|
||||
{
|
||||
auto& mip = item.Mips[mipIndex];
|
||||
|
||||
const int32 mipWidth = Math::Max(1, width >> mipIndex);
|
||||
const int32 mipHeight = Math::Max(1, height >> mipIndex);
|
||||
uint32 rowPitch, slicePitch;
|
||||
RenderTools::ComputePitch(format, mipWidth, mipHeight, rowPitch, slicePitch);
|
||||
|
||||
mip.RowPitch = rowPitch;
|
||||
mip.DepthPitch = slicePitch;
|
||||
mip.Lines = mipHeight;
|
||||
|
||||
BytesContainer wholeMipData;
|
||||
asset->GetMipData(mipIndex, wholeMipData);
|
||||
if (wholeMipData.IsInvalid())
|
||||
return ExportAssetResult::Error;
|
||||
|
||||
mip.Data.Link(wholeMipData.Get() + slicePitch * arrayIndex, slicePitch);
|
||||
}
|
||||
}
|
||||
|
||||
// Export to file
|
||||
if (TextureTool::ExportTexture(path, textureData))
|
||||
{
|
||||
return ExportAssetResult::Error;
|
||||
}
|
||||
|
||||
return ExportAssetResult::Ok;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user