| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <AzTest/AzTest.h>
- #include <Common/RPITestFixture.h>
- #include <Common/JsonTestUtils.h>
- #include <Common/ErrorMessageFinder.h>
- #include <Common/ShaderAssetTestUtils.h>
- #include <AzCore/Script/ScriptAsset.h>
- #include <Atom/RPI.Edit/Material/LuaMaterialFunctorSourceData.h>
- #include <Atom/RPI.Reflect/Material/LuaMaterialFunctor.h>
- #include <Atom/RPI.Reflect/Material/MaterialTypeAsset.h>
- #include <Atom/RPI.Reflect/Material/MaterialTypeAssetCreator.h>
- #include <Atom/RPI.Reflect/Material/MaterialAsset.h>
- #include <Atom/RPI.Reflect/Material/MaterialAssetCreator.h>
- #include <Atom/RPI.Public/Material/Material.h>
- #include <Material/MaterialAssetTestUtils.h>
- namespace UnitTest
- {
- using namespace AZ;
- using namespace RPI;
- class LuaMaterialFunctorTests
- : public RPITestFixture
- {
- public:
- static void AddLuaFunctor(MaterialTypeAssetCreator& materialTypeCreator, const AZStd::string& script, Name materialPipelineName = MaterialPipelineNone)
- {
- // See also MaterialTypeSourceData::AddFunctors
- LuaMaterialFunctorSourceData functorSourceData;
- functorSourceData.m_luaScript = script;
- MaterialNameContext nameContext;
- MaterialFunctorSourceData::RuntimeContext createFunctorContext{
- "Dummy.materialtype",
- materialTypeCreator.GetMaterialPropertiesLayout(materialPipelineName),
- (materialPipelineName == MaterialPipelineNone) ? materialTypeCreator.GetMaterialShaderResourceGroupLayout() : nullptr,
- &nameContext
- };
- MaterialFunctorSourceData::FunctorResult result = functorSourceData.CreateFunctor(createFunctorContext);
- EXPECT_TRUE(result.IsSuccess());
- if (result.IsSuccess())
- {
- materialTypeCreator.AddMaterialFunctor(result.GetValue(), materialPipelineName);
- for (auto& shaderOption : functorSourceData.GetShaderOptionDependencies())
- {
- materialTypeCreator.ClaimShaderOptionOwnership(shaderOption);
- }
- }
- }
- protected:
- void SetUp() override
- {
- RPITestFixture::SetUp();
- }
- void TearDown() override
- {
- RPITestFixture::TearDown();
- }
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> CreateCommonTestShaderOptionsLayout()
- {
- AZStd::vector<RPI::ShaderOptionValuePair> boolOptionValues = CreateBoolShaderOptionValues();
- AZStd::vector<RPI::ShaderOptionValuePair> intRangeOptionValues = CreateIntRangeShaderOptionValues(0, 15);
- AZStd::vector<RPI::ShaderOptionValuePair> qualityOptionValues = CreateEnumShaderOptionValues({"Quality::Low", "Quality::Medium", "Quality::High"});
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> shaderOptions = RPI::ShaderOptionGroupLayout::Create();
- shaderOptions->AddShaderOption(ShaderOptionDescriptor{Name{"o_bool"}, ShaderOptionType::Boolean, 0, 0, boolOptionValues, Name{"False"}});
- shaderOptions->AddShaderOption(ShaderOptionDescriptor{Name{"o_uint"}, ShaderOptionType::IntegerRange, 1, 1, intRangeOptionValues, Name{"0"}});
- shaderOptions->AddShaderOption(ShaderOptionDescriptor{Name{"o_enum"}, ShaderOptionType::Enumeration, 5, 2, qualityOptionValues, Name{"Quality::Low"}});
- shaderOptions->Finalize();
- return shaderOptions;
- }
- };
- class TestMaterialData
- {
- public:
- // Setup for a single material property and nothing else, used in particular to test setting render states
- void Setup(
- MaterialPropertyDataType dataType,
- const char* materialPropertyName,
- const char* luaFunctorScript)
- {
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom()), AZ::RPI::ShaderVariantId{}, Name{"TestShader"});
- materialTypeCreator.BeginMaterialProperty(Name{materialPropertyName}, dataType);
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScript);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(), m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{materialPropertyName});
- }
- // Setup for a single material property and a specific shader constant input
- void Setup(
- RHI::Ptr<RHI::ShaderResourceGroupLayout> materialSrgLayout,
- MaterialPropertyDataType dataType,
- const char* materialPropertyName,
- const char* shaderInputName,
- const char* luaFunctorScript)
- {
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout));
- materialTypeCreator.BeginMaterialProperty(Name{materialPropertyName}, dataType);
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScript);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(),m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{materialPropertyName});
- m_srgConstantIndex = m_material->GetRHIShaderResourceGroup()->GetData().FindShaderInputConstantIndex(Name{shaderInputName});
- }
- // Setup for a single material property and a specific shader option
- void Setup(
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> shaderOptionsLayout,
- MaterialPropertyDataType dataType,
- const char* materialPropertyName,
- const char* shaderOptionName,
- const char* luaFunctorScript)
- {
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom(), {}, shaderOptionsLayout), AZ::RPI::ShaderVariantId{}, Name{"TestShader"});
- materialTypeCreator.BeginMaterialProperty(Name{materialPropertyName}, dataType);
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScript);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(), m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{materialPropertyName});
- m_shaderOptionIndex = shaderOptionsLayout->FindShaderOptionIndex(Name{shaderOptionName});
- }
- // Setup for two material properties for testing one property affecting another property's metadata
- void Setup(
- MaterialPropertyDataType primaryPropertyDataType,
- const char* primaryPropertyName,
- MaterialPropertyDataType secondaryPropertyDataType,
- const char* secondaryPropertyName,
- const char* luaFunctorScript)
- {
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom()));
- materialTypeCreator.BeginMaterialProperty(Name{primaryPropertyName}, primaryPropertyDataType);
- materialTypeCreator.EndMaterialProperty();
- materialTypeCreator.BeginMaterialProperty(Name{secondaryPropertyName}, secondaryPropertyDataType);
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScript);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(), m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{primaryPropertyName});
- m_otherMaterialPropertyIndex = m_material->FindPropertyIndex(Name{secondaryPropertyName});
- }
- // Setup for a single material property connected to a material pipeline property, with a material pipeline functor
- void SetupMaterialPipeline(
- MaterialPropertyDataType dataType,
- const char* materialPropertyName,
- const char* pipelineMaterialPropertyName,
- const char* luaFunctorScriptForMaterialPipeline)
- {
- Name materialPipelineName{"TestPipeline"};
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom()), AZ::RPI::ShaderVariantId{}, Name{"TestShader"}, materialPipelineName);
- materialTypeCreator.BeginMaterialProperty(Name{pipelineMaterialPropertyName}, dataType, materialPipelineName);
- materialTypeCreator.EndMaterialProperty();
- materialTypeCreator.BeginMaterialProperty(Name{materialPropertyName}, dataType);
- materialTypeCreator.ConnectMaterialPropertyToInternalProperty(Name{pipelineMaterialPropertyName});
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScriptForMaterialPipeline, materialPipelineName);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(), m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{materialPropertyName});
- }
- // Setup for a single material property connected to a material pipeline property, with a material pipeline functor, including a shader option
- void SetupMaterialPipeline(
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> shaderOptionsLayout,
- MaterialPropertyDataType dataType,
- const char* materialPropertyName,
- const char* pipelineMaterialPropertyName,
- const char* shaderOptionName,
- const char* luaFunctorScriptForMaterialPipeline)
- {
- Name materialPipelineName{"TestPipeline"};
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom(), {}, shaderOptionsLayout), AZ::RPI::ShaderVariantId{}, Name{"TestShader"}, materialPipelineName);
- materialTypeCreator.BeginMaterialProperty(Name{pipelineMaterialPropertyName}, dataType, materialPipelineName);
- materialTypeCreator.EndMaterialProperty();
- materialTypeCreator.BeginMaterialProperty(Name{materialPropertyName}, dataType);
- materialTypeCreator.ConnectMaterialPropertyToInternalProperty(Name{pipelineMaterialPropertyName});
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScriptForMaterialPipeline, materialPipelineName);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(), m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{materialPropertyName});
- m_shaderOptionIndex = shaderOptionsLayout->FindShaderOptionIndex(Name{shaderOptionName});
- }
- // Setup for a single material property with a material functor, and a material pipeline property with a material pipeline functor
- void SetupMaterialPipeline(
- MaterialPropertyDataType materialPropertyType,
- const char* materialPropertyName,
- const char* luaFunctorScript,
- MaterialPropertyDataType pipelineMaterialPropertyType,
- const char* pipelineMaterialPropertyName,
- const char* luaFunctorScriptForMaterialPipeline)
- {
- Name materialPipelineName{"TestPipeline"};
- MaterialTypeAssetCreator materialTypeCreator;
- materialTypeCreator.Begin(Uuid::CreateRandom());
- materialTypeCreator.AddShader(CreateTestShaderAsset(Uuid::CreateRandom()), AZ::RPI::ShaderVariantId{}, Name{"TestShader"}, materialPipelineName);
- materialTypeCreator.BeginMaterialProperty(Name{pipelineMaterialPropertyName}, pipelineMaterialPropertyType, materialPipelineName);
- materialTypeCreator.EndMaterialProperty();
- materialTypeCreator.BeginMaterialProperty(Name{materialPropertyName}, materialPropertyType);
- materialTypeCreator.ConnectMaterialPropertyToInternalProperty(Name{pipelineMaterialPropertyName});
- materialTypeCreator.EndMaterialProperty();
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScript);
- LuaMaterialFunctorTests::AddLuaFunctor(materialTypeCreator, luaFunctorScriptForMaterialPipeline, materialPipelineName);
- EXPECT_TRUE(materialTypeCreator.End(m_materialTypeAsset));
- Data::Asset<MaterialAsset> materialAsset;
- MaterialAssetCreator materialCreator;
- materialCreator.Begin(Uuid::CreateRandom(), m_materialTypeAsset);
- EXPECT_TRUE(materialCreator.End(materialAsset));
- m_material = Material::Create(materialAsset);
- m_materialPropertyIndex = m_material->FindPropertyIndex(Name{materialPropertyName});
- }
- Data::Asset<MaterialTypeAsset> GetMaterialTypeAsset() { return m_materialTypeAsset; }
- Data::Instance<Material> GetMaterial() { return m_material; }
- MaterialPropertyIndex GetMaterialPropertyIndex() { return m_materialPropertyIndex; }
- MaterialPropertyIndex GetOtherMaterialPropertyIndex() { return m_otherMaterialPropertyIndex; }
- RHI::ShaderInputConstantIndex GetSrgConstantIndex() { return m_srgConstantIndex; }
- ShaderOptionIndex GetShaderOptionIndex() { return m_shaderOptionIndex; }
- private:
- Data::Asset<MaterialTypeAsset> m_materialTypeAsset;
- Data::Instance<Material> m_material;
- MaterialPropertyIndex m_materialPropertyIndex;
- MaterialPropertyIndex m_otherMaterialPropertyIndex;
- RHI::ShaderInputConstantIndex m_srgConstantIndex;
- ShaderOptionIndex m_shaderOptionIndex;
- };
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Bool)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestBool"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("general.TestBool")
- context:SetShaderConstant_bool("m_bool", value)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Bool, "general.TestBool", "m_bool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(true, testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<bool>(testData.GetSrgConstantIndex()));
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(false, testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<bool>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Float)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestFloat"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_float("general.TestFloat")
- context:SetShaderConstant_float("m_float", value * 2.0)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Float, "general.TestFloat", "m_float", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1.25f});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_FLOAT_EQ(2.5f, testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<float>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Int)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestInt"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_int("general.TestInt")
- context:SetShaderConstant_int("m_int", value * -1)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Int, "general.TestInt", "m_int", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{2});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(-2, testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<int32_t>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_UInt)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestUInt"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_uint("general.TestUInt")
- context:SetShaderConstant_uint("m_uint", value + 5)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::UInt, "general.TestUInt", "m_uint", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{2u});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(7, testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<uint32_t>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Float2)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestVector2"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_Vector2("general.TestVector2")
- local swap = value.y
- value.y = value.x
- value.x = swap
- context:SetShaderConstant_Vector2("m_float2", value)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Vector2, "general.TestVector2", "m_float2", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{Vector2(1.0f, 2.0f)});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(Vector2(2.0f, 1.0f), testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<Vector2>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Vector3)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestVector3"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_Vector3("general.TestVector3")
- value:Normalize()
- context:SetShaderConstant_Vector3("m_float3", value)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Vector3, "general.TestVector3", "m_float3", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{Vector3(5.0f, 4.0f, 3.0f)});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(Vector3(5.0f, 4.0f, 3.0f).GetNormalized(), testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<Vector3>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Vector4)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestVector4"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_Vector4("general.TestVector4")
- value:Homogenize()
- context:SetShaderConstant_Vector4("m_float4", value)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Vector4, "general.TestVector4", "m_float4", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{Vector4(1.0f, 2.0f, 3.0f, 4.0f)});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(Vector4(1.0f, 2.0f, 3.0f, 4.0f) / 4.0f, testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<Vector4>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetShaderConstant_Color)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestColor"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_Color("general.TestColor")
- value.r = value.r * value.a
- value.g = value.g * value.a
- value.b = value.b * value.a
- context:SetShaderConstant_Color("m_color", value)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Color, "general.TestColor", "m_color", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{Color(1.0f, 0.5f, 0.4f, 0.5f)});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(Color(0.5f, 0.25f, 0.2f, 0.5f), testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<Color>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderConstant_Matrix3x3)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.Scale"}
- end
- function Process(context)
- local scale = context:GetMaterialPropertyValue_float("general.Scale")
- local tansform = Matrix3x3.CreateScale(Vector3(scale, scale, 1.0))
- context:SetShaderConstant_Matrix3x3("m_float3x3", tansform)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Float, "general.Scale", "m_float3x3", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0.5f});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(Matrix3x3::CreateScale(Vector3(0.5f, 0.5f, 1.0f)), testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<Matrix3x3>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderConstant_Matrix4x4)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.Offset"}
- end
- function Process(context)
- local offset = context:GetMaterialPropertyValue_Vector3("general.Offset")
- local tansform = Matrix4x4.CreateTranslation(offset)
- context:SetShaderConstant_Matrix4x4("m_float4x4", tansform)
- end
- )";
- auto materialSrgLayout = CreateCommonTestMaterialSrgLayout();
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), materialSrgLayout);
- TestMaterialData testData;
- testData.Setup(materialSrgLayout, MaterialPropertyDataType::Vector3, "general.Offset", "m_float4x4", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{Vector3(1.0f, 2.0f, 3.0f)});
- ProcessQueuedSrgCompilations(shaderAsset, materialSrgLayout->GetName());
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(Matrix4x4::CreateTranslation(Vector3(1.0f, 2.0f, 3.0f)), testData.GetMaterial()->GetRHIShaderResourceGroup()->GetData().GetConstant<Matrix4x4>(testData.GetSrgConstantIndex()));
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderOption_Bool)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestBool"}
- end
- function GetShaderOptionDependencies()
- return {"o_bool"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("general.TestBool")
- context:SetShaderOptionValue_bool("o_bool", value)
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.Setup(options, MaterialPropertyDataType::Bool, "general.TestBool", "o_bool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(1, testData.GetMaterial()->GetGeneralShaderCollection()[0].GetShaderOptions()->GetValue(Name{"o_bool"}).GetIndex());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(0, testData.GetMaterial()->GetGeneralShaderCollection()[0].GetShaderOptions()->GetValue(Name{"o_bool"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderOption_UInt)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestInt"}
- end
- function GetShaderOptionDependencies()
- return {"o_uint"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_int("general.TestInt")
- context:SetShaderOptionValue_uint("o_uint", value * 2)
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.Setup(options, MaterialPropertyDataType::Int, "general.TestInt", "o_uint", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{6});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(12, testData.GetMaterial()->GetGeneralShaderCollection()[0].GetShaderOptions()->GetValue(Name{"o_uint"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderOption_Enum)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.UseHighQuality"}
- end
- function GetShaderOptionDependencies()
- return {"o_enum"}
- end
- function Process(context)
- local useHighQuality = context:GetMaterialPropertyValue_bool("general.UseHighQuality")
- if (useHighQuality) then
- context:SetShaderOptionValue_enum("o_enum", "Quality::High")
- else
- context:SetShaderOptionValue_enum("o_enum", "Quality::Medium")
- end
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.Setup(options, MaterialPropertyDataType::Bool, "general.UseHighQuality", "o_enum", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(2, testData.GetMaterial()->GetGeneralShaderCollection()[0].GetShaderOptions()->GetValue(Name{"o_enum"}).GetIndex());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(1, testData.GetMaterial()->GetGeneralShaderCollection()[0].GetShaderOptions()->GetValue(Name{"o_enum"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_ShaderItem_SetShaderOption_Bool)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestBool"}
- end
- function GetShaderOptionDependencies()
- return {"o_bool"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("general.TestBool")
- context:GetShaderByTag("TestShader"):SetShaderOptionValue_bool("o_bool", value)
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.Setup(options, MaterialPropertyDataType::Bool, "general.TestBool", "o_bool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(
- 1, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].GetShaderOptions()->GetValue(Name{"o_bool"}).GetIndex());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(
- 0, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].GetShaderOptions()->GetValue(Name{"o_bool"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_ShaderItem_SetShaderOption_UInt)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestInt"}
- end
- function GetShaderOptionDependencies()
- return {"o_uint"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_int("general.TestInt")
- context:GetShaderByTag("TestShader"):SetShaderOptionValue_uint("o_uint", value * 2)
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.Setup(options, MaterialPropertyDataType::Int, "general.TestInt", "o_uint", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{6});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(
- 12, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].GetShaderOptions()->GetValue(Name{"o_uint"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_ShaderItem_SetShaderOption_Enum)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.UseHighQuality"}
- end
- function GetShaderOptionDependencies()
- return {"o_enum"}
- end
- function Process(context)
- local useHighQuality = context:GetMaterialPropertyValue_bool("general.UseHighQuality")
- if (useHighQuality) then
- context:GetShaderByTag("TestShader"):SetShaderOptionValue_enum("o_enum", "Quality::High")
- else
- context:GetShaderByTag("TestShader"):SetShaderOptionValue_enum("o_enum", "Quality::Medium")
- end
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.Setup(options, MaterialPropertyDataType::Bool, "general.UseHighQuality", "o_enum", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(
- 2, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].GetShaderOptions()->GetValue(Name{"o_enum"}).GetIndex());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(
- 1, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].GetShaderOptions()->GetValue(Name{"o_enum"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_EditorContext_SetMaterialPropertyVisibility)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return { "general.mode" }
- end
- function ProcessEditor(context)
- local mode = context:GetMaterialPropertyValue_uint("general.mode")
- if (mode == 1) then
- context:SetMaterialPropertyVisibility("general.value", MaterialPropertyVisibility_Enabled)
- elseif (mode == 2) then
- context:SetMaterialPropertyVisibility("general.value", MaterialPropertyVisibility_Disabled)
- else
- context:SetMaterialPropertyVisibility("general.value", MaterialPropertyVisibility_Hidden)
- end
- end
- )";
- TestMaterialData testData;
- testData.Setup(
- MaterialPropertyDataType::UInt, "general.mode",
- MaterialPropertyDataType::Float, "general.value",
- functorScript);
-
- AZStd::unordered_set<AZ::Name> changedPropertyNames;
- AZStd::unordered_map<Name, MaterialPropertyDynamicMetadata> propertyDynamicMetadata;
- propertyDynamicMetadata[Name{"general.mode"}] = {};
- propertyDynamicMetadata[Name{"general.value"}] = {};
-
- AZStd::unordered_set<AZ::Name> changedPropertyGroupNames;
- AZStd::unordered_map<Name, MaterialPropertyGroupDynamicMetadata> propertyGroupDynamicMetadata;
- propertyGroupDynamicMetadata[Name{"general"}] = {};
- Ptr<MaterialFunctor> functor = testData.GetMaterialTypeAsset()->GetMaterialFunctors()[0];
- AZ::RPI::MaterialFunctorAPI::EditorContext context = AZ::RPI::MaterialFunctorAPI::EditorContext(
- testData.GetMaterial()->GetPropertyCollection(),
- propertyDynamicMetadata,
- propertyGroupDynamicMetadata,
- changedPropertyNames,
- changedPropertyGroupNames,
- &functor->GetMaterialPropertyDependencies()
- );
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0u});
- functor->Process(context);
- EXPECT_EQ(MaterialPropertyVisibility::Hidden, propertyDynamicMetadata[Name{"general.value"}].m_visibility);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1u});
- functor->Process(context);
- EXPECT_EQ(MaterialPropertyVisibility::Enabled, propertyDynamicMetadata[Name{"general.value"}].m_visibility);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{2u});
- functor->Process(context);
- EXPECT_EQ(MaterialPropertyVisibility::Disabled, propertyDynamicMetadata[Name{"general.value"}].m_visibility);
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_EditorContext_SetMaterialPropertyDescriptionAndRanges)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return { "general.units" }
- end
- function ProcessEditor(context)
- local units = context:GetMaterialPropertyValue_uint("general.units")
- if (units == 0) then
- context:SetMaterialPropertyDescription("general.distance", "Distance in meters")
- context:SetMaterialPropertyMinValue_float("general.distance", -10)
- context:SetMaterialPropertyMaxValue_float("general.distance", 10)
- context:SetMaterialPropertySoftMinValue_float("general.distance", -1)
- context:SetMaterialPropertySoftMaxValue_float("general.distance", 1)
- else
- context:SetMaterialPropertyDescription("general.distance", "Distance in centimeters")
- context:SetMaterialPropertyMinValue_float("general.distance", -1000)
- context:SetMaterialPropertyMaxValue_float("general.distance", 1000)
- context:SetMaterialPropertySoftMinValue_float("general.distance", -100)
- context:SetMaterialPropertySoftMaxValue_float("general.distance", 100)
- end
- end
- )";
- TestMaterialData testData;
- testData.Setup(
- MaterialPropertyDataType::UInt, "general.units",
- MaterialPropertyDataType::Float, "general.distance",
- functorScript);
- AZStd::unordered_set<AZ::Name> changedPropertyNames;
- AZStd::unordered_map<Name, MaterialPropertyDynamicMetadata> propertyDynamicMetadata;
- propertyDynamicMetadata[Name{"general.units"}] = {};
- propertyDynamicMetadata[Name{"general.distance"}] = {};
-
- AZStd::unordered_set<AZ::Name> changedPropertyGroupNames;
- AZStd::unordered_map<Name, MaterialPropertyGroupDynamicMetadata> propertyGroupDynamicMetadata;
- propertyGroupDynamicMetadata[Name{"general"}] = {};
- Ptr<MaterialFunctor> functor = testData.GetMaterialTypeAsset()->GetMaterialFunctors()[0];
- AZ::RPI::MaterialFunctorAPI::EditorContext context = AZ::RPI::MaterialFunctorAPI::EditorContext(
- testData.GetMaterial()->GetPropertyCollection(),
- propertyDynamicMetadata,
- propertyGroupDynamicMetadata,
- changedPropertyNames,
- changedPropertyGroupNames,
- &functor->GetMaterialPropertyDependencies()
- );
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0u});
- functor->Process(context);
- EXPECT_STREQ("Distance in meters", propertyDynamicMetadata[Name{"general.distance"}].m_description.c_str());
- EXPECT_EQ(-10.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_min.GetValue<float>());
- EXPECT_EQ(10.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_max.GetValue<float>());
- EXPECT_EQ(-1.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_softMin.GetValue<float>());
- EXPECT_EQ(1.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_softMax.GetValue<float>());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1u});
- functor->Process(context);
- EXPECT_STREQ("Distance in centimeters", propertyDynamicMetadata[Name{"general.distance"}].m_description.c_str());
- EXPECT_EQ(-1000.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_min.GetValue<float>());
- EXPECT_EQ(1000.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_max.GetValue<float>());
- EXPECT_EQ(-100.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_softMin.GetValue<float>());
- EXPECT_EQ(100.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_softMax.GetValue<float>());
- }
-
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_EditorContext_SetMaterialPropertyGroupVisibility)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return { "general.mode" }
- end
- function ProcessEditor(context)
- local mode = context:GetMaterialPropertyValue_uint("general.mode")
- if (mode == 1) then
- context:SetMaterialPropertyGroupVisibility("otherGroup", MaterialPropertyGroupVisibility_Enabled)
- else
- context:SetMaterialPropertyGroupVisibility("otherGroup", MaterialPropertyGroupVisibility_Hidden)
- end
- end
- )";
- TestMaterialData testData;
- testData.Setup(
- MaterialPropertyDataType::UInt, "general.mode",
- MaterialPropertyDataType::Float, "otherGroup.value",
- functorScript);
-
- AZStd::unordered_set<AZ::Name> changedPropertyNames;
- AZStd::unordered_map<Name, MaterialPropertyDynamicMetadata> propertyDynamicMetadata;
- propertyDynamicMetadata[Name{"general.mode"}] = {};
- propertyDynamicMetadata[Name{"otherGroup.value"}] = {};
-
- AZStd::unordered_set<AZ::Name> changedPropertyGroupNames;
- AZStd::unordered_map<Name, MaterialPropertyGroupDynamicMetadata> propertyGroupDynamicMetadata;
- propertyGroupDynamicMetadata[Name{"general"}] = {};
- propertyGroupDynamicMetadata[Name{"otherGroup"}] = {};
- Ptr<MaterialFunctor> functor = testData.GetMaterialTypeAsset()->GetMaterialFunctors()[0];
- AZ::RPI::MaterialFunctorAPI::EditorContext context = AZ::RPI::MaterialFunctorAPI::EditorContext(
- testData.GetMaterial()->GetPropertyCollection(),
- propertyDynamicMetadata,
- propertyGroupDynamicMetadata,
- changedPropertyNames,
- changedPropertyGroupNames,
- &functor->GetMaterialPropertyDependencies()
- );
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0u});
- functor->Process(context);
- EXPECT_EQ(MaterialPropertyGroupVisibility::Enabled, propertyGroupDynamicMetadata[Name{"general"}].m_visibility);
- EXPECT_EQ(MaterialPropertyGroupVisibility::Hidden, propertyGroupDynamicMetadata[Name{"otherGroup"}].m_visibility);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1u});
- functor->Process(context);
- EXPECT_EQ(MaterialPropertyGroupVisibility::Enabled, propertyGroupDynamicMetadata[Name{"general"}].m_visibility);
- EXPECT_EQ(MaterialPropertyGroupVisibility::Enabled, propertyGroupDynamicMetadata[Name{"otherGroup"}].m_visibility);
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetRenderStates)
- {
- using namespace AZ::RPI;
- // We aren't testing every single render state here, but just getting a representative set...
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function Process(context)
- local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool")
- if(boolValue) then
- context:GetShader(0):GetRenderStatesOverride():SetMultisampleCustomPositionCount(1)
- context:GetShader(0):GetRenderStatesOverride():SetMultisampleCustomPosition(0, 2, 4)
- context:GetShader(0):GetRenderStatesOverride():SetCullMode(CullMode_None)
- context:GetShader(0):GetRenderStatesOverride():SetBlendEnabled(1, true)
- context:GetShader(0):GetRenderStatesOverride():SetDepthBias(-1)
- context:GetShader(0):GetRenderStatesOverride():SetDepthBiasClamp(0.2)
- context:GetShader(0):GetRenderStatesOverride():SetStencilWriteMask(0xF0)
- else
- context:GetShader(0):GetRenderStatesOverride():ClearMultisampleCustomPositionCount()
- context:GetShader(0):GetRenderStatesOverride():ClearMultisampleCustomPosition(0)
- context:GetShader(0):GetRenderStatesOverride():ClearCullMode()
- context:GetShader(0):GetRenderStatesOverride():ClearBlendEnabled(1)
- context:GetShader(0):GetRenderStatesOverride():ClearDepthBias()
- context:GetShader(0):GetRenderStatesOverride():ClearDepthBiasClamp()
- context:GetShader(0):GetRenderStatesOverride():ClearStencilWriteMask()
- end
- end
- )";
- TestMaterialData testData;
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- const ShaderCollection& shaderCollection = testData.GetMaterial()->GetGeneralShaderCollection();
- EXPECT_EQ(1, shaderCollection[0].GetRenderStatesOverlay()->m_multisampleState.m_customPositionsCount);
- EXPECT_EQ(2, shaderCollection[0].GetRenderStatesOverlay()->m_multisampleState.m_customPositions[0].m_x);
- EXPECT_EQ(4, shaderCollection[0].GetRenderStatesOverlay()->m_multisampleState.m_customPositions[0].m_y);
- EXPECT_EQ(RHI::CullMode::None, shaderCollection[0].GetRenderStatesOverlay()->m_rasterState.m_cullMode);
- EXPECT_EQ(1, shaderCollection[0].GetRenderStatesOverlay()->m_blendState.m_targets[1].m_enable);
- EXPECT_EQ(-1, shaderCollection[0].GetRenderStatesOverlay()->m_rasterState.m_depthBias);
- EXPECT_FLOAT_EQ(0.2, shaderCollection[0].GetRenderStatesOverlay()->m_rasterState.m_depthBiasClamp);
- EXPECT_EQ(0xF0, shaderCollection[0].GetRenderStatesOverlay()->m_depthStencilState.m_stencil.m_writeMask);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(RHI::RenderStates_InvalidUInt, shaderCollection[0].GetRenderStatesOverlay()->m_multisampleState.m_customPositionsCount);
- EXPECT_EQ(RHI::Limits::Pipeline::MultiSampleCustomLocationGridSize, shaderCollection[0].GetRenderStatesOverlay()->m_multisampleState.m_customPositions[0].m_x);
- EXPECT_EQ(RHI::Limits::Pipeline::MultiSampleCustomLocationGridSize, shaderCollection[0].GetRenderStatesOverlay()->m_multisampleState.m_customPositions[0].m_y);
- EXPECT_EQ(RHI::CullMode::Invalid, shaderCollection[0].GetRenderStatesOverlay()->m_rasterState.m_cullMode);
- EXPECT_EQ(RHI::RenderStates_InvalidBool, shaderCollection[0].GetRenderStatesOverlay()->m_blendState.m_targets[1].m_enable);
- EXPECT_EQ(RHI::RenderStates_InvalidInt, shaderCollection[0].GetRenderStatesOverlay()->m_rasterState.m_depthBias);
- EXPECT_FLOAT_EQ(RHI::RenderStates_InvalidFloat, shaderCollection[0].GetRenderStatesOverlay()->m_rasterState.m_depthBiasClamp);
- EXPECT_EQ(RHI::RenderStates_InvalidUInt, shaderCollection[0].GetRenderStatesOverlay()->m_depthStencilState.m_stencil.m_writeMask);
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderEnabledByTag)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function Process(context)
- local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool")
- context:GetShaderByTag("TestShader"):SetEnabled(boolValue)
- end
- )";
- TestMaterialData testData;
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(true, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].IsEnabled());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetShaderDrawListTagOverride)
- {
- using namespace AZ::RPI;
- RHI::DrawListTagRegistry* drawListTagRegistry = RHI::RHISystemInterface::Get()->GetDrawListTagRegistry();
- drawListTagRegistry->AcquireTag(Name{"TestDrawListTag"});
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function Process(context)
- context:GetShaderByTag("TestShader"):SetDrawListTagOverride("TestDrawListTag")
- end
- )";
- TestMaterialData testData;
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- RHI::DrawListTag tag = drawListTagRegistry->FindTag(Name{"TestDrawListTag"});
- EXPECT_EQ(tag, testData.GetMaterial()->GetGeneralShaderCollection()[Name{"TestShader"}].GetDrawListTagOverride());
- drawListTagRegistry->ReleaseTag(tag);
- }
-
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_PsoChangesNotAllowed_Error)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function GetShaderOptionDependencies()
- return {}
- end
- function Process(context)
- local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool")
- if(boolValue) then
- context:GetShader(0):GetRenderStatesOverride():SetFillMode(FillMode_Wireframe)
- else
- context:GetShader(0):GetRenderStatesOverride():ClearFillMode()
- end
- end
- )";
- TestMaterialData testData;
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- ErrorMessageFinder errorMessageFinder;
- errorMessageFinder.AddExpectedErrorMessage("not be changed at runtime because they impact Pipeline State Objects: general.MyBool");
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- errorMessageFinder.CheckExpectedErrorsFound();
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_MultisampleCustomPositionCountIndex_Error)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function GetShaderOptionDependencies()
- return {}
- end
- function Process(context)
- local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool")
- if(boolValue) then
- context:GetShader(0):GetRenderStatesOverride():SetMultisampleCustomPositionCount(20)
- else
- context:GetShader(0):GetRenderStatesOverride():ClearMultisampleCustomPositionCount()
- end
- end
- )";
- TestMaterialData testData;
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- testData.GetMaterial()->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- ErrorMessageFinder errorMessageFinder;
- errorMessageFinder.AddExpectedErrorMessage("SetMultisampleCustomPositionCount(20) value is out of range. Must be less than 16.");
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- errorMessageFinder.CheckExpectedErrorsFound();
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_MultisampleCustomPositionIndex_Error)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function GetShaderOptionDependencies()
- return {}
- end
- function Process(context)
- local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool")
- if(boolValue) then
- context:GetShader(0):GetRenderStatesOverride():SetMultisampleCustomPosition(17, 0, 0)
- else
- context:GetShader(0):GetRenderStatesOverride():ClearMultisampleCustomPosition(18)
- end
- end
- )";
- TestMaterialData testData;
- ErrorMessageFinder errorMessageFinder;
- errorMessageFinder.AddExpectedErrorMessage("ClearMultisampleCustomPosition(18,...) index is out of range. Must be less than 16.");
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- errorMessageFinder.CheckExpectedErrorsFound();
-
- testData.GetMaterial()->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- errorMessageFinder.AddExpectedErrorMessage("SetMultisampleCustomPosition(17,...) index is out of range. Must be less than 16.");
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- errorMessageFinder.CheckExpectedErrorsFound();
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_BlendStateIndex_Error)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.MyBool"}
- end
- function GetShaderOptionDependencies()
- return {}
- end
- function Process(context)
- local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool")
- if(boolValue) then
- context:GetShader(0):GetRenderStatesOverride():SetBlendEnabled(9, false)
- else
- context:GetShader(0):GetRenderStatesOverride():ClearBlendEnabled(10)
- end
- end
- )";
- TestMaterialData testData;
- ErrorMessageFinder errorMessageFinder;
- errorMessageFinder.AddExpectedErrorMessage("ClearBlendEnabled(10,...) index is out of range. Must be less than 8.");
- testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript);
- errorMessageFinder.CheckExpectedErrorsFound();
-
- testData.GetMaterial()->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- errorMessageFinder.AddExpectedErrorMessage("SetBlendEnabled(9,...) index is out of range. Must be less than 8.");
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- errorMessageFinder.CheckExpectedErrorsFound();
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_PipelineRuntimeContext_GetMaterialProperty_SetShaderEnabled_Bool)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"EnableTestShader"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("EnableTestShader")
- context:GetShaderByTag("TestShader"):SetEnabled(value)
- end
- )";
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), nullptr);
- TestMaterialData testData;
- testData.SetupMaterialPipeline(MaterialPropertyDataType::Bool, "general.TestBool", "EnableTestShader", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_TRUE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_FALSE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_PipelineRuntimeContext_SetShaderOption_Bool)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function GetShaderOptionDependencies()
- return {"o_bool"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("TestPipelineProperty")
- context:SetShaderOptionValue_bool("o_bool", value)
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.SetupMaterialPipeline(options, MaterialPropertyDataType::Bool, "general.TestBool", "TestPipelineProperty", "o_bool", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(1, testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[0].GetShaderOptions()->GetValue(Name{"o_bool"}).GetIndex());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(0, testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[0].GetShaderOptions()->GetValue(Name{"o_bool"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_PipelineRuntimeContext_SetShaderOption_UInt)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function GetShaderOptionDependencies()
- return {"o_uint"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_int("TestPipelineProperty")
- context:SetShaderOptionValue_uint("o_uint", value * 2)
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.SetupMaterialPipeline(options, MaterialPropertyDataType::Int, "general.TestInt", "TestPipelineProperty", "o_uint", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{6});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(12, testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[0].GetShaderOptions()->GetValue(Name{"o_uint"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_PipelineRuntimeContext_SetShaderOption_Enum)
- {
- using namespace AZ::RPI;
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function GetShaderOptionDependencies()
- return {"o_enum"}
- end
- function Process(context)
- local useHighQuality = context:GetMaterialPropertyValue_bool("TestPipelineProperty")
- if (useHighQuality) then
- context:SetShaderOptionValue_enum("o_enum", "Quality::High")
- else
- context:SetShaderOptionValue_enum("o_enum", "Quality::Medium")
- end
- end
- )";
- AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> options = CreateCommonTestShaderOptionsLayout();
- TestMaterialData testData;
- testData.SetupMaterialPipeline(options, MaterialPropertyDataType::Bool, "general.UseHighQuality", "TestPipelineProperty", "o_enum", functorScript);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(2, testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[0].GetShaderOptions()->GetValue(Name{"o_enum"}).GetIndex());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_EQ(1, testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[0].GetShaderOptions()->GetValue(Name{"o_enum"}).GetIndex());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetInternalProperty_Bool)
- {
- using namespace AZ::RPI;
- // One functor passes a property value to an internal property of the material pipeline,
- // then a material pipeline functor uses that value to enable or disable a shader.
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("general.TestProperty")
- context:SetInternalMaterialPropertyValue_bool("TestPipelineProperty", value)
- end
- )";
- const char* functorScriptForPipeline =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_bool("TestPipelineProperty")
- context:GetShaderByTag("TestShader"):SetEnabled(value)
- end
- )";
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), nullptr);
- TestMaterialData testData;
- testData.SetupMaterialPipeline(
- MaterialPropertyDataType::Bool, "general.TestProperty", functorScript,
- MaterialPropertyDataType::Bool, "TestPipelineProperty", functorScriptForPipeline);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_TRUE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{false});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_FALSE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetInternalProperty_Float)
- {
- using namespace AZ::RPI;
- // One functor passes a property value to an internal property of the material pipeline,
- // then a material pipeline functor uses that value to enable or disable a shader.
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_float("general.TestProperty")
- context:SetInternalMaterialPropertyValue_float("TestPipelineProperty", value)
- end
- )";
- const char* functorScriptForPipeline =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_float("TestPipelineProperty")
- context:GetShaderByTag("TestShader"):SetEnabled(value > 0.0)
- end
- )";
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), nullptr);
- TestMaterialData testData;
- testData.SetupMaterialPipeline(
- MaterialPropertyDataType::Float, "general.TestProperty", functorScript,
- MaterialPropertyDataType::Float, "TestPipelineProperty", functorScriptForPipeline);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1.0f});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_TRUE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{-1.0f});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_FALSE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetInternalProperty_Int)
- {
- using namespace AZ::RPI;
- // One functor passes a property value to an internal property of the material pipeline,
- // then a material pipeline functor uses that value to enable or disable a shader.
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_int("general.TestProperty")
- context:SetInternalMaterialPropertyValue_int("TestPipelineProperty", value)
- end
- )";
- const char* functorScriptForPipeline =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_int("TestPipelineProperty")
- context:GetShaderByTag("TestShader"):SetEnabled(value ~= 0)
- end
- )";
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), nullptr);
- TestMaterialData testData;
- testData.SetupMaterialPipeline(
- MaterialPropertyDataType::Int, "general.TestProperty", functorScript,
- MaterialPropertyDataType::Int, "TestPipelineProperty", functorScriptForPipeline);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{-1});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_TRUE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_FALSE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- }
- TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_GetMaterialProperty_SetInternalProperty_UInt)
- {
- using namespace AZ::RPI;
- // One functor passes a property value to an internal property of the material pipeline,
- // then a material pipeline functor uses that value to enable or disable a shader.
- const char* functorScript =
- R"(
- function GetMaterialPropertyDependencies()
- return {"general.TestProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_uint("general.TestProperty")
- context:SetInternalMaterialPropertyValue_uint("TestPipelineProperty", value)
- end
- )";
- const char* functorScriptForPipeline =
- R"(
- function GetMaterialPropertyDependencies()
- return {"TestPipelineProperty"}
- end
- function Process(context)
- local value = context:GetMaterialPropertyValue_uint("TestPipelineProperty")
- context:GetShaderByTag("TestShader"):SetEnabled(value ~= 0)
- end
- )";
- auto shaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), nullptr);
- TestMaterialData testData;
- testData.SetupMaterialPipeline(
- MaterialPropertyDataType::UInt, "general.TestProperty", functorScript,
- MaterialPropertyDataType::UInt, "TestPipelineProperty", functorScriptForPipeline);
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1u});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_TRUE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0u});
- EXPECT_TRUE(testData.GetMaterial()->Compile());
- EXPECT_FALSE(testData.GetMaterial()->GetShaderCollection(Name{"TestPipeline"})[Name{"TestShader"}].IsEnabled());
- }
- }
|