@@ -148,7 +148,7 @@ bool createAndWriteImage(std::array<ilmType*, availableChannels>& pixelsArrayIlm
148
148
149
149
using StreamToEXR = CRegionBlockFunctorFilter<decltype (writeTexel), true >;
150
150
typename StreamToEXR::state_type state (writeTexel, image, nullptr );
151
- for (auto region : image->getRegions ())
151
+ for (const auto & region : image->getRegions ())
152
152
{
153
153
if (region.imageSubresource .mipLevel || region.imageSubresource .baseArrayLayer )
154
154
continue ;
@@ -194,16 +194,34 @@ bool CImageWriterOpenEXR::writeAsset(system::IFile* _file, const SAssetWritePara
194
194
195
195
SAssetWriteContext ctx{ _params, _file };
196
196
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 ())
200
200
return false ;
201
201
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 });
203
221
if (!file)
204
222
return false ;
205
223
206
- return writeImageBinary (file, image );
224
+ return writeImageBinary (file,imageSmart. get () );
207
225
}
208
226
209
227
bool CImageWriterOpenEXR::writeImageBinary (system::IFile* file, const asset::ICPUImage* image)
0 commit comments