本文整理汇总了C++中Shader::GetUserOptions方法的典型用法代码示例。如果您正苦于以下问题:C++ Shader::GetUserOptions方法的具体用法?C++ Shader::GetUserOptions怎么用?C++ Shader::GetUserOptions使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Shader
的用法示例。
在下文中一共展示了Shader::GetUserOptions方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: enabledChoice
void Helium::Material::PreSerialize( const Reflect::Field* field )
{
m_userOptions.Resize(0);
Shader* pShader = m_spShader;
if( pShader )
{
const Shader::Options& rUserOptions = pShader->GetUserOptions();
DynamicArray< Name > enabledToggles;
rUserOptions.GetOptionSetFromIndex(
RShader::TYPE_FIRST,
m_persistentResourceData.m_shaderVariantIndices[ 0 ],
enabledToggles,
m_userOptions );
size_t enabledToggleCount = enabledToggles.GetSize();
Shader::SelectPair optionPair;
Name enabledChoice( TXT( "1" ) );
Name disabledChoice( TXT( "0" ) );
const DynamicArray< Shader::Toggle >& rUserToggles = rUserOptions.GetToggles();
size_t userToggleCount = rUserToggles.GetSize();
for( size_t userToggleIndex = 0; userToggleIndex < userToggleCount; ++userToggleIndex )
{
optionPair.name = rUserToggles[ userToggleIndex ].name;
size_t enabledToggleIndex;
for( enabledToggleIndex = 0; enabledToggleIndex < enabledToggleCount; ++enabledToggleIndex )
{
if( enabledToggles[ enabledToggleIndex ] == optionPair.name )
{
break;
}
}
optionPair.choice =
( enabledToggleIndex < enabledToggleCount ? enabledChoice : disabledChoice );
m_userOptions.Push( optionPair );
}
}
}
示例2: CacheResource
/// @copydoc ResourceHandler::CacheResource()
bool MaterialResourceHandler::CacheResource(
AssetPreprocessor* pAssetPreprocessor,
Resource* pResource,
const String& /*rSourceFilePath*/ )
{
HELIUM_ASSERT( pAssetPreprocessor );
HELIUM_ASSERT( pResource );
Material* pMaterial = Reflect::AssertCast< Material >( pResource );
Shader* pShader = pMaterial->GetShader();
bool failedToWriteASubdata = false;
StrongPtr< Material::PersistentResourceData > resource_data( new Material::PersistentResourceData() );
// Compute the shader variant indices from the user options selected in the material, as the array of indices in
// the material is not yet initialized.
//uint32_t shaderVariantIndices[ RShader::TYPE_MAX ];
if( pShader )
{
const Shader::Options& rShaderUserOptions = pShader->GetUserOptions();
const DynamicArray< Shader::SelectPair >& rMaterialUserOptions = pMaterial->GetUserOptions();
for( size_t shaderTypeIndex = 0; shaderTypeIndex < RShader::TYPE_MAX; ++shaderTypeIndex )
{
size_t optionSetIndex = rShaderUserOptions.GetOptionSetIndex(
static_cast< RShader::EType >( shaderTypeIndex ),
rMaterialUserOptions.GetData(),
rMaterialUserOptions.GetSize() );
resource_data->m_shaderVariantIndices[ shaderTypeIndex ] = static_cast< uint32_t >( optionSetIndex );
}
}
else
{
MemoryZero( resource_data->m_shaderVariantIndices, sizeof( resource_data->m_shaderVariantIndices ) );
}
size_t float1ParameterCount = pMaterial->GetFloat1ParameterCount();
size_t float2ParameterCount = pMaterial->GetFloat2ParameterCount();
size_t float3ParameterCount = pMaterial->GetFloat3ParameterCount();
size_t float4ParameterCount = pMaterial->GetFloat4ParameterCount();
Name parameterConstantBufferName = Material::GetParameterConstantBufferName();
for( size_t platformIndex = 0; platformIndex < static_cast< size_t >( Cache::PLATFORM_MAX ); ++platformIndex )
{
PlatformPreprocessor* pPreprocessor = pAssetPreprocessor->GetPlatformPreprocessor(
static_cast< Cache::EPlatform >( platformIndex ) );
if( !pPreprocessor )
{
continue;
}
Resource::PreprocessedData& rPreprocessedData = pResource->GetPreprocessedData(
static_cast< Cache::EPlatform >( platformIndex ) );
SaveObjectToPersistentDataBuffer(resource_data.Get(), rPreprocessedData.persistentDataBuffer);
rPreprocessedData.bLoaded = true;
// Write out the parameter constant buffer data as the resource sub-data.
size_t shaderProfileCount = pPreprocessor->GetShaderProfileCount();
DynamicArray< DynamicArray< uint8_t > >& rSubDataBuffers = rPreprocessedData.subDataBuffers;
rSubDataBuffers.Clear();
rSubDataBuffers.Reserve( shaderProfileCount * RShader::TYPE_MAX );
rSubDataBuffers.Resize( shaderProfileCount * RShader::TYPE_MAX );
if( pShader )
{
// deserializer.SetByteSwapping( bSwapBytes );
for( size_t shaderTypeIndex = 0; shaderTypeIndex < RShader::TYPE_MAX; ++shaderTypeIndex )
{
RShader::EType shaderType = static_cast< RShader::EType >( shaderTypeIndex );
size_t variantLoadId = pShader->BeginLoadVariant(
shaderType,
resource_data->m_shaderVariantIndices[ shaderTypeIndex ] );
if( IsInvalid( variantLoadId ) )
{
continue;
}
ShaderVariantPtr spVariant;
while( !pShader->TryFinishLoadVariant( variantLoadId, spVariant ) )
{
}
ShaderVariant* pVariant = spVariant;
if( !pVariant )
{
continue;
}
const Resource::PreprocessedData& rVariantData = pVariant->GetPreprocessedData(
static_cast< Cache::EPlatform >( platformIndex ) );
HELIUM_ASSERT( rVariantData.bLoaded );
const DynamicArray< DynamicArray< uint8_t > >& rVariantSubDataBuffers = rVariantData.subDataBuffers;
size_t variantSubDataCount = rVariantSubDataBuffers.GetSize();
HELIUM_ASSERT( variantSubDataCount != 0 );
//.........这里部分代码省略.........
示例3: CacheResource
/// @copydoc ResourceHandler::CacheResource()
bool ShaderVariantResourceHandler::CacheResource(
ObjectPreprocessor* pObjectPreprocessor,
Resource* pResource,
const String& rSourceFilePath )
{
HELIUM_ASSERT( pObjectPreprocessor );
HELIUM_ASSERT( pResource );
ShaderVariant* pVariant = Reflect::AssertCast< ShaderVariant >( pResource );
// Parse the shader type and user option index from the variant name.
Name variantName = pVariant->GetName();
const tchar_t* pVariantNameString = *variantName;
HELIUM_ASSERT( pVariantNameString );
tchar_t shaderTypeCharacter = pVariantNameString[ 0 ];
HELIUM_ASSERT( shaderTypeCharacter != TXT( '\0' ) );
RShader::EType shaderType;
switch( shaderTypeCharacter )
{
case TXT( 'v' ):
{
shaderType = RShader::TYPE_VERTEX;
break;
}
case TXT( 'p' ):
{
shaderType = RShader::TYPE_PIXEL;
break;
}
default:
{
HELIUM_TRACE(
TRACE_ERROR,
( TXT( "ShaderVariantResourceHandler: Failed to determine shader type from the name of object " )
TXT( "\"%s\".\n" ) ),
*pVariant->GetPath().ToString() );
return false;
}
}
uint32_t userOptionIndex = 0;
++pVariantNameString;
int parseResult;
#if HELIUM_UNICODE
#if HELIUM_CC_CL
parseResult = swscanf_s( pVariantNameString, TXT( "%" ) TSCNu32, &userOptionIndex );
#else
parseResult = swscanf( pVariantNameString, TXT( "%" ) TSCNu32, &userOptionIndex );
#endif
#else
#if HELIUM_CC_CL
parseResult = sscanf_s( pVariantNameString, TXT( "%" ) TSCNu32, &userOptionIndex );
#else
parseResult = sscanf( pVariantNameString, TXT( "%" ) TSCNu32, &userOptionIndex );
#endif
#endif
if( parseResult != 1 )
{
HELIUM_TRACE(
TRACE_ERROR,
( TXT( "ShaderVariantResourceHandler: Failed to parse user shader option set index from the name of " )
TXT( "option \"%s\".\n" ) ),
*pVariant->GetPath().ToString() );
return false;
}
// Get the parent shader.
Shader* pShader = Reflect::AssertCast< Shader >( pVariant->GetOwner() );
HELIUM_ASSERT( pShader );
HELIUM_ASSERT( pShader->GetAnyFlagSet( GameObject::FLAG_PRECACHED ) );
// Acquire the user preprocessor option set associated with the target shader type and user option set index.
const Shader::Options& rUserOptions = pShader->GetUserOptions();
DynArray< Name > toggleNames;
DynArray< Shader::SelectPair > selectPairs;
rUserOptions.GetOptionSetFromIndex( shaderType, userOptionIndex, toggleNames, selectPairs );
DynArray< PlatformPreprocessor::ShaderToken > shaderTokens;
size_t userToggleNameCount = toggleNames.GetSize();
for( size_t toggleNameIndex = 0; toggleNameIndex < userToggleNameCount; ++toggleNameIndex )
{
PlatformPreprocessor::ShaderToken* pToken = shaderTokens.New();
HELIUM_ASSERT( pToken );
StringConverter< tchar_t, char >::Convert( pToken->name, *toggleNames[ toggleNameIndex ] );
pToken->definition = "1";
}
size_t userSelectPairCount = selectPairs.GetSize();
for( size_t selectPairIndex = 0; selectPairIndex < userSelectPairCount; ++selectPairIndex )
{
const Shader::SelectPair& rPair = selectPairs[ selectPairIndex ];
//.........这里部分代码省略.........
示例4: BeginPrecacheResourceData
/// @copydoc GameObject::BeginPrecacheResourceData()
bool Material::BeginPrecacheResourceData()
{
#if HELIUM_TOOLS
// Convert shader options to variant indices if we just loaded a set of options.
if( m_bLoadedOptions )
{
MemoryZero( m_persistentResourceData.m_shaderVariantIndices, sizeof( m_persistentResourceData.m_shaderVariantIndices ) );
Shader* pShader = m_spShader;
if( pShader )
{
const Shader::Options& rUserOptions = pShader->GetUserOptions();
for( size_t shaderTypeIndex = 0;
shaderTypeIndex < HELIUM_ARRAY_COUNT( m_persistentResourceData.m_shaderVariantIndices );
++shaderTypeIndex )
{
m_persistentResourceData.m_shaderVariantIndices[ shaderTypeIndex ] = static_cast< uint32_t >( rUserOptions.GetOptionSetIndex(
static_cast< RShader::EType >( shaderTypeIndex ),
m_userOptions.GetData(),
m_userOptions.GetSize() ) );
}
}
m_userOptions.Clear();
m_bLoadedOptions = false;
}
#endif
// Preload shader variant resources.
Shader* pShader = m_spShader;
if( !pShader )
{
for( size_t shaderTypeIndex = 0; shaderTypeIndex < HELIUM_ARRAY_COUNT( m_shaderVariants ); ++shaderTypeIndex )
{
HELIUM_ASSERT( IsInvalid( m_shaderVariantLoadIds[ shaderTypeIndex ] ) );
m_shaderVariants[ shaderTypeIndex ].Release();
}
}
else
{
for( size_t shaderTypeIndex = 0; shaderTypeIndex < HELIUM_ARRAY_COUNT( m_shaderVariants ); ++shaderTypeIndex )
{
HELIUM_ASSERT( IsInvalid( m_shaderVariantLoadIds[ shaderTypeIndex ] ) );
m_shaderVariantLoadIds[ shaderTypeIndex ] = pShader->BeginLoadVariant(
static_cast< RShader::EType >( shaderTypeIndex ),
m_persistentResourceData.m_shaderVariantIndices[ shaderTypeIndex ] );
}
}
// Preload the constant buffers for shader parameters.
Renderer* pRenderer = Renderer::GetStaticInstance();
if( pRenderer )
{
for( size_t shaderTypeIndex = 0; shaderTypeIndex < HELIUM_ARRAY_COUNT( m_constantBuffers ); ++shaderTypeIndex )
{
HELIUM_ASSERT( !m_constantBuffers[ shaderTypeIndex ] );
HELIUM_ASSERT( IsInvalid( m_constantBufferLoadIds[ shaderTypeIndex ] ) );
size_t bufferSize = GetSubDataSize( static_cast< uint32_t >( shaderTypeIndex ) );
if( bufferSize == 0 )
{
continue;
}
RConstantBufferPtr spBuffer = pRenderer->CreateConstantBuffer(
bufferSize,
RENDERER_BUFFER_USAGE_STATIC );
if( !spBuffer )
{
HELIUM_TRACE(
TraceLevels::Error,
( TXT( "Material::BeginPrecacheResourceData(): Failed to allocate constant buffer of %" )
TPRIuSZ TXT( " bytes for parameter usage for material \"%s\".\n" ) ),
bufferSize,
*GetPath().ToString() );
continue;
}
void* pBufferData = spBuffer->Map();
if( !pBufferData )
{
HELIUM_TRACE(
TraceLevels::Error,
( TXT( "Material::BeginPrecacheResourceData(): Failed to map constant buffer data for " )
TXT( "material \"%s\".\n" ) ),
*GetPath().ToString() );
continue;
}
size_t loadId = BeginLoadSubData( pBufferData, static_cast< uint32_t >( shaderTypeIndex ) );
if( IsInvalid( loadId ) )
{
HELIUM_TRACE(
TraceLevels::Error,
( TXT( "Material::BeginPrecacheResourceData(): Failed to begin loading resource sub-data %" )
//.........这里部分代码省略.........
示例5: Serialize
/// @copydoc GameObject::Serialize()
void Material::Serialize( Serializer& s )
{
L_SERIALIZE_BASE( s );
s << L_TAGGED( m_spShader );
#if L_EDITOR
if( s.CanResolveTags() )
{
m_userOptions.Resize( 0 );
Serializer::EMode serializerMode = s.GetMode();
bool bSaving = ( serializerMode == Serializer::MODE_SAVE );
bool bLoading = ( serializerMode == Serializer::MODE_LOAD );
if( bSaving )
{
// Aggregate all user options from the resource information into the single "m_userOptions" array.
Shader* pShader = m_spShader;
if( pShader )
{
const Shader::Options& rUserOptions = pShader->GetUserOptions();
DynArray< Name > enabledToggles;
rUserOptions.GetOptionSetFromIndex(
RShader::TYPE_FIRST,
m_shaderVariantIndices[ 0 ],
enabledToggles,
m_userOptions );
size_t enabledToggleCount = enabledToggles.GetSize();
Shader::SelectPair optionPair;
Name enabledChoice( TXT( "1" ) );
Name disabledChoice( TXT( "0" ) );
const DynArray< Shader::Toggle >& rUserToggles = rUserOptions.GetToggles();
size_t userToggleCount = rUserToggles.GetSize();
for( size_t userToggleIndex = 0; userToggleIndex < userToggleCount; ++userToggleIndex )
{
optionPair.name = rUserToggles[ userToggleIndex ].name;
size_t enabledToggleIndex;
for( enabledToggleIndex = 0; enabledToggleIndex < enabledToggleCount; ++enabledToggleIndex )
{
if( enabledToggles[ enabledToggleIndex ] == optionPair.name )
{
break;
}
}
optionPair.choice =
( enabledToggleIndex < enabledToggleCount ? enabledChoice : disabledChoice );
m_userOptions.Push( optionPair );
}
}
}
else if( bLoading )
{
DynArray< String > propertyTagNames;
s.GetPropertyTagNames( propertyTagNames );
Shader::SelectPair optionPair;
optionPair.choice.Clear();
size_t propertyTagCount = propertyTagNames.GetSize();
for( size_t tagIndex = 0; tagIndex < propertyTagCount; ++tagIndex )
{
const String& rTagName = propertyTagNames[ tagIndex ];
if( !rTagName.Contains( TXT( '.' ) ) )
{
optionPair.name.Set( rTagName );
m_userOptions.Push( optionPair );
}
}
}
s.PushPropertyFlags( Serializer::FLAG_EDITOR_ONLY );
size_t userOptionCount = m_userOptions.GetSize();
for( size_t optionIndex = 0; optionIndex < userOptionCount; ++optionIndex )
{
Shader::SelectPair& rOptionPair = m_userOptions[ optionIndex ];
s << Serializer::Tag( *rOptionPair.name ) << rOptionPair.choice;
}
// XXX TMC TODO: Replace with flexible name resolution support (a la m_userOptions above).
s << L_TAGGED_STRUCT_DYNARRAY( m_float1Parameters );
s << L_TAGGED_STRUCT_DYNARRAY( m_float2Parameters );
s << L_TAGGED_STRUCT_DYNARRAY( m_float3Parameters );
s << L_TAGGED_STRUCT_DYNARRAY( m_float4Parameters );
s.PopPropertyFlags();
if( bSaving )
{
m_userOptions.Clear();
//.........这里部分代码省略.........