@@ -294,30 +294,30 @@ static core::smart_refctd_ptr<asset::ICPUImage> createDerivMap(SContext& ctx, as
294
294
295
295
return derivmap_img;
296
296
}
297
- static core::smart_refctd_ptr<asset::ICPUImage> createSingleChannelImage (const asset::ICPUImage* _img, const asset::ICPUImageView::SComponentMapping::E_SWIZZLE srcChannel, bool expandChannels )
297
+ static core::smart_refctd_ptr<asset::ICPUImage> createSingleChannelImage (const asset::ICPUImage* _img, const asset::ICPUImageView::SComponentMapping::E_SWIZZLE srcChannel)
298
298
{
299
299
auto outParams = _img->getCreationParameters ();
300
+ const auto inFormat = outParams.format ;
300
301
301
302
asset::ICPUImage::SBufferCopy region;
302
303
// pick format
303
304
{
304
- const auto inFormat = outParams.format ;
305
305
// TODO: redo the format selection when @Erfan's format promotor is operational
306
306
if (isSRGBFormat (inFormat))
307
- outParams.format = expandChannels ? asset::EF_B8G8R8A8_SRGB:asset::EF_R16_UNORM ;
307
+ outParams.format = asset::EF_B8G8R8A8_SRGB;
308
308
else
309
309
{
310
310
const double prec = asset::getFormatPrecision (inFormat,srcChannel,0.0 );
311
311
if (prec<=FLT_MIN)
312
- outParams.format = expandChannels ? asset::EF_R32G32B32A32_SFLOAT:asset::EF_R32_SFLOAT ;
312
+ outParams.format = asset::EF_R32G32B32A32_SFLOAT;
313
313
else if (prec<=1.0 /65535.0 )
314
- outParams.format = expandChannels ? asset::EF_R16G16B16A16_UNORM:asset::EF_R16_UNORM ;
314
+ outParams.format = asset::EF_R16G16B16A16_UNORM;
315
315
else if (prec<=exp2f (-14 .f ))
316
- outParams.format = expandChannels ? asset::EF_R16G16B16A16_SFLOAT:asset::EF_R16_SFLOAT ;
316
+ outParams.format = asset::EF_R16G16B16A16_SFLOAT;
317
317
else if (prec<=1.0 /1023.0 )
318
- outParams.format = expandChannels ? asset::EF_A2B10G10R10_UNORM_PACK32:asset::EF_R16_UNORM ;
318
+ outParams.format = asset::EF_A2B10G10R10_UNORM_PACK32;
319
319
else
320
- outParams.format = expandChannels ? asset::EF_R8G8B8A8_UNORM:asset::EF_R8_UNORM ;
320
+ outParams.format = asset::EF_R8G8B8A8_UNORM;
321
321
}
322
322
}
323
323
const size_t texelBytesz = asset::getTexelOrBlockBytesize (outParams.format );
@@ -345,7 +345,14 @@ static core::smart_refctd_ptr<asset::ICPUImage> createSingleChannelImage(const a
345
345
conv.outOffset = { 0u ,0u ,0u };
346
346
conv.inImage = _img;
347
347
conv.outImage = outImg.get ();
348
- conv.swizzle = {srcChannel,srcChannel,srcChannel,srcChannel};
348
+ if (srcChannel!=asset::ICPUImageView::SComponentMapping::E_SWIZZLE::ES_IDENTITY)
349
+ conv.swizzle = {srcChannel,srcChannel,srcChannel,srcChannel};
350
+ else
351
+ {
352
+ conv.swizzle = {};
353
+ for (auto i=asset::getFormatChannelCount (inFormat); i<4 ; i++)
354
+ conv.swizzle [i] = asset::ICPUImageView::SComponentMapping::E_SWIZZLE::ES_R;
355
+ }
349
356
350
357
if (!convert_filter_t::execute (std::execution::par_unseq,&conv))
351
358
{
@@ -929,7 +936,7 @@ SContext::shape_ass_type CMitsubaLoader::loadBasicShape(SContext& ctx, uint32_t
929
936
return mesh;
930
937
}
931
938
932
- void CMitsubaLoader::cacheTexture (SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* tex, const SContext ::E_IMAGE_VIEW_SEMANTIC semantic)
939
+ void CMitsubaLoader::cacheTexture (SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* tex, const CMitsubaMaterialCompilerFrontend ::E_IMAGE_VIEW_SEMANTIC semantic)
933
940
{
934
941
if (!tex)
935
942
return ;
@@ -952,7 +959,7 @@ void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const
952
959
{
953
960
auto loadParams = ctx.inner .params ;
954
961
// always restore, the only reason we haven't found a view is because either the image wasnt loaded yet, or its going to be processed with channel extraction or derivative mapping
955
- const uint32_t restoreLevels = semantic==SContext ::EIVS_IDENTITIY&&tex->bitmap .channel ==CElementTexture::Bitmap::CHANNEL::INVALID ? 0u :2u ; // all the way to the buffer providing the pixels
962
+ const uint32_t restoreLevels = semantic==CMitsubaMaterialCompilerFrontend ::EIVS_IDENTITIY&&tex->bitmap .channel ==CElementTexture::Bitmap::CHANNEL::INVALID ? 0u :2u ; // all the way to the buffer providing the pixels
956
963
loadParams.restoreLevels = std::max (loadParams.restoreLevels ,hierarchyLevel+restoreLevels);
957
964
// load using the actual filename, not the cache key
958
965
asset::SAssetBundle bundle = interm_getAssetInHierarchy (m_assetMgr,tex->bitmap .filename .svalue ,loadParams,hierarchyLevel,ctx.override_ );
@@ -974,24 +981,23 @@ void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const
974
981
}
975
982
switch (semantic)
976
983
{
977
- case SContext ::EIVS_IDENTITIY:
978
- case SContext ::EIVS_BLEND_WEIGHT:
984
+ case CMitsubaMaterialCompilerFrontend ::EIVS_IDENTITIY:
985
+ case CMitsubaMaterialCompilerFrontend ::EIVS_BLEND_WEIGHT:
979
986
{
980
- const bool isBlendWeight = semantic==SContext::EIVS_BLEND_WEIGHT;
981
987
switch (tex->bitmap .channel )
982
988
{
983
989
// no GL_R8_SRGB support yet
984
990
case CElementTexture::Bitmap::CHANNEL::R:
985
- viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_R,isBlendWeight );
991
+ viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_R);
986
992
break ;
987
993
case CElementTexture::Bitmap::CHANNEL::G:
988
- viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_G,isBlendWeight );
994
+ viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_G);
989
995
break ;
990
996
case CElementTexture::Bitmap::CHANNEL::B:
991
- viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_B,isBlendWeight );
997
+ viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_B);
992
998
break ;
993
999
case CElementTexture::Bitmap::CHANNEL::A:
994
- viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_A,isBlendWeight );
1000
+ viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_A);
995
1001
break ;
996
1002
/* special conversions needed to CIE space
997
1003
case CElementTexture::Bitmap::CHANNEL::X:
@@ -1000,16 +1006,16 @@ void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const
1000
1006
case CElementTexture::Bitmap::CHANNEL::INVALID:
1001
1007
[[fallthrough]];
1002
1008
default :
1003
- if (isBlendWeight && asset::getFormatChannelCount (viewParams.image ->getCreationParameters ().format )<3u )
1004
- viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_R, true );
1009
+ if (semantic==CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT && asset::getFormatChannelCount (viewParams.image ->getCreationParameters ().format )<3u )
1010
+ viewParams.image = createSingleChannelImage (viewParams.image .get (),asset::ICPUImageView::SComponentMapping::ES_IDENTITY );
1005
1011
break ;
1006
1012
}
1007
1013
}
1008
1014
break ;
1009
- case SContext ::EIVS_NORMAL_MAP:
1015
+ case CMitsubaMaterialCompilerFrontend ::EIVS_NORMAL_MAP:
1010
1016
viewParams.image = createDerivMap (ctx,viewParams.image .get (),samplerParams,true );
1011
1017
break ;
1012
- case SContext ::EIVS_BUMP_MAP:
1018
+ case CMitsubaMaterialCompilerFrontend ::EIVS_BUMP_MAP:
1013
1019
viewParams.image = createDerivMap (ctx,viewParams.image .get (),samplerParams,false );
1014
1020
break ;
1015
1021
default :
@@ -1075,7 +1081,7 @@ auto CMitsubaLoader::getBSDFtreeTraversal(SContext& ctx, const CElementBSDF* bsd
1075
1081
auto CMitsubaLoader::genBSDFtreeTraversal (SContext& ctx, const CElementBSDF* _bsdf) -> SContext::bsdf_type
1076
1082
{
1077
1083
{
1078
- auto cachePropertyTexture = [&](const auto & const_or_tex, const SContext ::E_IMAGE_VIEW_SEMANTIC semantic=SContext ::EIVS_IDENTITIY) -> void
1084
+ auto cachePropertyTexture = [&](const auto & const_or_tex, const CMitsubaMaterialCompilerFrontend ::E_IMAGE_VIEW_SEMANTIC semantic=CMitsubaMaterialCompilerFrontend ::EIVS_IDENTITIY) -> void
1079
1085
{
1080
1086
if (const_or_tex.value .type ==SPropertyElementData::INVALID)
1081
1087
cacheTexture (ctx,0u ,const_or_tex.texture ,semantic);
@@ -1143,13 +1149,13 @@ auto CMitsubaLoader::genBSDFtreeTraversal(SContext& ctx, const CElementBSDF* _bs
1143
1149
cachePropertyTexture (bsdf->plastic .alphaV );
1144
1150
break ;
1145
1151
case CElementBSDF::BUMPMAP:
1146
- cacheTexture (ctx,0u ,bsdf->bumpmap .texture ,bsdf->bumpmap .wasNormal ? SContext ::EIVS_NORMAL_MAP:SContext ::EIVS_BUMP_MAP);
1152
+ cacheTexture (ctx,0u ,bsdf->bumpmap .texture ,bsdf->bumpmap .wasNormal ? CMitsubaMaterialCompilerFrontend ::EIVS_NORMAL_MAP:CMitsubaMaterialCompilerFrontend ::EIVS_BUMP_MAP);
1147
1153
break ;
1148
1154
case CElementBSDF::BLEND_BSDF:
1149
- cachePropertyTexture (bsdf->blendbsdf .weight ,SContext ::EIVS_BLEND_WEIGHT);
1155
+ cachePropertyTexture (bsdf->blendbsdf .weight ,CMitsubaMaterialCompilerFrontend ::EIVS_BLEND_WEIGHT);
1150
1156
break ;
1151
1157
case CElementBSDF::MASK:
1152
- cachePropertyTexture (bsdf->mask .opacity );
1158
+ cachePropertyTexture (bsdf->mask .opacity ,CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT );
1153
1159
break ;
1154
1160
default : break ;
1155
1161
}
0 commit comments