@ -173,7 +173,7 @@ namespace AZ
const ShaderInputContract : : StreamChannelInfo & contractStreamChannel ,
StreamInfoList : : const_iterator defaultUv ,
StreamInfoList : : const_iterator firstUv ,
UvStreamTangent Index& uvStreamTangentIndex Out) const
UvStreamTangent Bitmask* uvStreamTangentBitmask Out) const
{
const Mesh & mesh = m_meshes [ meshIndex ] ;
auto iter = mesh . m_streamInfo . end ( ) ;
@ -197,8 +197,8 @@ namespace AZ
// Cost of linear search UV names is low because the size is extremely limited.
return uvNamePair . m_shaderInput = = contractStreamChannel . m_semantic ;
} ) ;
const bool I sUv = materialUvIter ! = materialUvNameMap . end ( ) ;
if ( I sUv)
const bool i sUv = materialUvIter ! = materialUvNameMap . end ( ) ;
if ( i sUv)
{
const AZ : : Name & materialUvName = materialUvIter - > m_uvName ;
auto modelUvMapIter = materialModelUvMap . find ( materialUvIter - > m_shaderInput ) ;
@ -237,14 +237,14 @@ namespace AZ
} ) ;
}
if ( iter = = mesh . m_streamInfo . end ( ) & & I sUv)
if ( iter = = mesh . m_streamInfo . end ( ) & & i sUv)
{
iter = defaultUv ;
}
if ( IsUv )
if ( isUv & & uvStreamTangentBitmaskOut )
{
uvStreamTangent IndexOut. ApplyTangentIndex ( iter = = firstUv ? 0 : UvStreamTangent Index: : UnassignedTangentIndex ) ;
uvStreamTangent BitmaskOut- > ApplyTangent ( iter = = firstUv ? 0 : UvStreamTangent Bitmask: : UnassignedTangent ) ;
}
return iter ;
@ -253,7 +253,7 @@ namespace AZ
bool ModelLod : : GetStreamsForMesh (
RHI : : InputStreamLayout & layoutOut ,
StreamBufferViewList & streamBufferViewsOut ,
UvStreamTangent Index& uvStreamTangentIndex Out,
UvStreamTangent Bitmask* uvStreamTangentBitmask Out,
const ShaderInputContract & contract ,
size_t meshIndex ,
const MaterialModelUvOverrideMap & materialModelUvMap ,
@ -272,11 +272,14 @@ namespace AZ
// Searching for the first UV in the mesh, so it can be used to paired with tangent/bitangent stream
auto firstUv = FindFirstUvStreamFromMesh ( meshIndex ) ;
auto defaultUv = FindDefaultUvStream ( meshIndex , materialUvNameMap ) ;
uvStreamTangentIndexOut . Reset ( ) ;
if ( uvStreamTangentBitmaskOut )
{
uvStreamTangentBitmaskOut - > Reset ( ) ;
}
for ( auto & contractStreamChannel : contract . m_streamChannels )
{
auto iter = FindMatchingStream ( meshIndex , materialModelUvMap , materialUvNameMap , contractStreamChannel , defaultUv , firstUv , uvStreamTangent Index Out) ;
auto iter = FindMatchingStream ( meshIndex , materialModelUvMap , materialUvNameMap , contractStreamChannel , defaultUv , firstUv , uvStreamTangent Bitmask Out) ;
if ( iter = = mesh . m_streamInfo . end ( ) )
{
@ -363,7 +366,6 @@ namespace AZ
auto defaultUv = FindDefaultUvStream ( meshIndex , materialUvNameMap ) ;
auto firstUv = FindFirstUvStreamFromMesh ( meshIndex ) ;
UvStreamTangentIndex dummyUvStreamTangentIndex ;
for ( auto & contractStreamChannel : contract . m_streamChannels )
{
@ -374,7 +376,7 @@ namespace AZ
AZ_Assert ( contractStreamChannel . m_streamBoundIndicatorIndex . IsValid ( ) , " m_streamBoundIndicatorIndex was invalid for an optional shader input stream " ) ;
auto iter = FindMatchingStream ( meshIndex , materialModelUvMap , materialUvNameMap , contractStreamChannel , defaultUv , firstUv , dummyUvStreamTangentIndex ) ;
auto iter = FindMatchingStream ( meshIndex , materialModelUvMap , materialUvNameMap , contractStreamChannel , defaultUv , firstUv , nullptr ) ;
ShaderOptionValue isStreamBound = ( iter = = mesh . m_streamInfo . end ( ) ) ? ShaderOptionValue { 0 } : ShaderOptionValue { 1 } ;
shaderOptions . SetValue ( contractStreamChannel . m_streamBoundIndicatorIndex , isStreamBound ) ;
@ -438,55 +440,55 @@ namespace AZ
return static_cast < uint32_t > ( m_buffers . size ( ) - 1 ) ;
}
uint32_t UvStreamTangent Index: : GetFullFlag ( ) const
uint32_t UvStreamTangent Bitmask: : GetFullTangentBitmask ( ) const
{
return m_ flag ;
return m_ mask ;
}
uint32_t UvStreamTangent Index: : GetNextAvailableUvIndex ( ) const
uint32_t UvStreamTangent Bitmask: : GetUvStreamCount ( ) const
{
return m_ flag > > ( sizeof ( m_flag ) * CHAR_BIT - BitsForUvIndex ) ;
return m_ mask > > ( sizeof ( m_mask ) * CHAR_BIT - BitsForUvIndex ) ;
}
uint32_t UvStreamTangent Index: : GetTangentIndex AtUv( uint32_t uvIndex ) const
uint32_t UvStreamTangent Bitmask: : GetTangent AtUv( uint32_t uvIndex ) const
{
return ( m_ flag > > ( BitsPerTangent Index * uvIndex ) ) & 0b1111u ;
return ( m_ mask > > ( BitsPerTangent * uvIndex ) ) & 0b1111u ;
}
void UvStreamTangent Index: : ApplyTangentIndex ( uint32_t tangentIndex )
void UvStreamTangent Bitmask: : ApplyTangent ( uint32_t tangentIndex )
{
uint32_t currentSlot = Get NextAvailableUvIndex ( ) ;
if ( currentSlot > = Max Tangen ts)
uint32_t currentSlot = Get UvStreamCount ( ) ;
if ( currentSlot > = Max UvSlo ts)
{
AZ_Error ( " UV Stream " , false , " Reaching the max of avaiblable stream slots. " ) ;
return ;
}
if ( tangentIndex > UnassignedTangent Index )
if ( tangentIndex > UnassignedTangent )
{
AZ_Warning (
" UV Stream " , false ,
" Tangent index must use %d bits as defined in UvStreamTangentIndex::m_flag. Unassigned index will be applied. " ,
BitsPerTangent Index ) ;
tangentIndex = UnassignedTangent Index ;
BitsPerTangent ) ;
tangentIndex = UnassignedTangent ;
}
uint32_t m ask = 0b1111u < < ( BitsPerTangent Index * currentSlot ) ;
mask = ~ m ask;
uint32_t clearM ask = 0b1111u < < ( BitsPerTangent * currentSlot ) ;
clearMask = ~ clearM ask;
// Clear the writing bits in case
m_ flag & = m ask;
m_ mask & = clearM ask;
// Write the bits to the slot
m_ flag | = ( tangentIndex < < ( BitsPerTangent Index * currentSlot ) ) ;
m_ mask | = ( tangentIndex < < ( BitsPerTangent * currentSlot ) ) ;
// Increase the index
m_ flag + = ( 1u < < ( sizeof ( m_ flag ) * CHAR_BIT - BitsForUvIndex ) ) ;
m_ mask + = ( 1u < < ( sizeof ( m_ mask ) * CHAR_BIT - BitsForUvIndex ) ) ;
}
void UvStreamTangent Index : : Reset ( )
void UvStreamTangent Bitmask : : Reset ( )
{
m_ flag = 0 ;
m_ mask = 0 ;
}
} // namespace RPI
} // namespace AZ