Skip to content

Commit dd6af8c

Browse files
author
devsh
committed
OpenEXR writer was busted
1 parent fe8dd89 commit dd6af8c

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

include/nbl/asset/interchange/IImageAssetHandlerBase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class IImageAssetHandlerBase : public virtual core::IReferenceCounted
143143
};
144144

145145
// if texel block data does not need changing, we're good
146-
if (identityTransform) // TODO: why do we even copy!?
146+
if (identityTransform) // TODO: why do we even copy!? We should just STEAL the BUFFER DATA!
147147
{
148148
COPY_FILTER::state_type state;
149149
fillCommonState(state);

src/nbl/asset/interchange/CImageWriterOpenEXR.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ bool createAndWriteImage(std::array<ilmType*, availableChannels>& pixelsArrayIlm
148148

149149
using StreamToEXR = CRegionBlockFunctorFilter<decltype(writeTexel), true>;
150150
typename StreamToEXR::state_type state(writeTexel, image, nullptr);
151-
for (auto region : image->getRegions())
151+
for (const auto& region : image->getRegions())
152152
{
153153
if (region.imageSubresource.mipLevel || region.imageSubresource.baseArrayLayer)
154154
continue;
@@ -194,16 +194,34 @@ bool CImageWriterOpenEXR::writeAsset(system::IFile* _file, const SAssetWritePara
194194

195195
SAssetWriteContext ctx{ _params, _file };
196196

197-
auto imageSmart = asset::IImageAssetHandlerBase::createImageDataForCommonWriting(IAsset::castDown<const ICPUImageView>(_params.rootAsset), _params.logger);
198-
const asset::ICPUImage* image = imageSmart.get();
199-
if (image->missingContent())
197+
const ICPUImageView* imageView = IAsset::castDown<const ICPUImageView>(_params.rootAsset);
198+
const auto& viewParams = imageView->getCreationParameters();
199+
if (viewParams.image->missingContent())
200200
return false;
201201

202-
system::IFile* file = _override->getOutputFile(_file, ctx, { image, 0u });
202+
core::smart_refctd_ptr<ICPUImage> imageSmart;
203+
if (asset::isIntegerFormat(viewParams.format))
204+
imageSmart = IImageAssetHandlerBase::createImageDataForCommonWriting<EF_R32G32B32A32_UINT>(imageView,_params.logger);
205+
else
206+
{
207+
bool halfFloat = true;
208+
for (auto ch=0; ch<4; ch++)
209+
if (getFormatMaxValue<hlsl::float64_t>(viewParams.format,ch)>getFormatMaxValue<hlsl::float64_t>(EF_R16G16B16A16_SFLOAT,ch))
210+
{
211+
halfFloat = false;
212+
break;
213+
}
214+
if (halfFloat)
215+
imageSmart = IImageAssetHandlerBase::createImageDataForCommonWriting<EF_R16G16B16A16_SFLOAT>(imageView,_params.logger);
216+
else
217+
imageSmart = IImageAssetHandlerBase::createImageDataForCommonWriting<EF_R32G32B32A32_SFLOAT>(imageView,_params.logger);
218+
}
219+
220+
system::IFile* file = _override->getOutputFile(_file,ctx,{imageView,0u});
203221
if (!file)
204222
return false;
205223

206-
return writeImageBinary(file, image);
224+
return writeImageBinary(file,imageSmart.get());
207225
}
208226

209227
bool CImageWriterOpenEXR::writeImageBinary(system::IFile* file, const asset::ICPUImage* image)

0 commit comments

Comments
 (0)