Add material render state and pipeline caching
This commit is contained in:
@@ -37,6 +37,11 @@ TEST(Material, SetGetShader) {
|
||||
TEST(Material, DefaultRenderMetadata) {
|
||||
Material material;
|
||||
EXPECT_EQ(material.GetRenderQueue(), static_cast<XCEngine::Core::int32>(MaterialRenderQueue::Geometry));
|
||||
EXPECT_EQ(material.GetRenderState().cullMode, MaterialCullMode::None);
|
||||
EXPECT_FALSE(material.GetRenderState().blendEnable);
|
||||
EXPECT_TRUE(material.GetRenderState().depthTestEnable);
|
||||
EXPECT_TRUE(material.GetRenderState().depthWriteEnable);
|
||||
EXPECT_EQ(material.GetRenderState().depthFunc, MaterialComparisonFunc::Less);
|
||||
EXPECT_TRUE(material.GetShaderPass().Empty());
|
||||
EXPECT_EQ(material.GetTagCount(), 0u);
|
||||
}
|
||||
@@ -51,6 +56,40 @@ TEST(Material, SetGetRenderQueue) {
|
||||
EXPECT_EQ(material.GetRenderQueue(), 2600);
|
||||
}
|
||||
|
||||
TEST(Material, SetGetRenderState) {
|
||||
Material material;
|
||||
|
||||
MaterialRenderState renderState;
|
||||
renderState.cullMode = MaterialCullMode::Back;
|
||||
renderState.blendEnable = true;
|
||||
renderState.srcBlend = MaterialBlendFactor::SrcAlpha;
|
||||
renderState.dstBlend = MaterialBlendFactor::InvSrcAlpha;
|
||||
renderState.srcBlendAlpha = MaterialBlendFactor::One;
|
||||
renderState.dstBlendAlpha = MaterialBlendFactor::InvSrcAlpha;
|
||||
renderState.blendOp = MaterialBlendOp::Add;
|
||||
renderState.blendOpAlpha = MaterialBlendOp::Add;
|
||||
renderState.depthTestEnable = true;
|
||||
renderState.depthWriteEnable = false;
|
||||
renderState.depthFunc = MaterialComparisonFunc::LessEqual;
|
||||
renderState.colorWriteMask = 0x7;
|
||||
|
||||
material.SetRenderState(renderState);
|
||||
|
||||
const MaterialRenderState& result = material.GetRenderState();
|
||||
EXPECT_EQ(result.cullMode, MaterialCullMode::Back);
|
||||
EXPECT_TRUE(result.blendEnable);
|
||||
EXPECT_EQ(result.srcBlend, MaterialBlendFactor::SrcAlpha);
|
||||
EXPECT_EQ(result.dstBlend, MaterialBlendFactor::InvSrcAlpha);
|
||||
EXPECT_EQ(result.srcBlendAlpha, MaterialBlendFactor::One);
|
||||
EXPECT_EQ(result.dstBlendAlpha, MaterialBlendFactor::InvSrcAlpha);
|
||||
EXPECT_EQ(result.blendOp, MaterialBlendOp::Add);
|
||||
EXPECT_EQ(result.blendOpAlpha, MaterialBlendOp::Add);
|
||||
EXPECT_TRUE(result.depthTestEnable);
|
||||
EXPECT_FALSE(result.depthWriteEnable);
|
||||
EXPECT_EQ(result.depthFunc, MaterialComparisonFunc::LessEqual);
|
||||
EXPECT_EQ(result.colorWriteMask, 0x7);
|
||||
}
|
||||
|
||||
TEST(Material, SetGetShaderPass) {
|
||||
Material material;
|
||||
|
||||
|
||||
@@ -70,6 +70,14 @@ TEST(MaterialLoader, LoadValidMaterialParsesRenderMetadata) {
|
||||
materialFile << " \"tags\": {\n";
|
||||
materialFile << " \"LightMode\": \"ForwardBase\",\n";
|
||||
materialFile << " \"RenderType\": \"Transparent\"\n";
|
||||
materialFile << " },\n";
|
||||
materialFile << " \"renderState\": {\n";
|
||||
materialFile << " \"cull\": \"Back\",\n";
|
||||
materialFile << " \"blend\": true,\n";
|
||||
materialFile << " \"srcBlend\": \"SrcAlpha\",\n";
|
||||
materialFile << " \"dstBlend\": \"InvSrcAlpha\",\n";
|
||||
materialFile << " \"depthWrite\": false,\n";
|
||||
materialFile << " \"depthFunc\": \"LessEqual\"\n";
|
||||
materialFile << " }\n";
|
||||
materialFile << "}";
|
||||
}
|
||||
@@ -87,6 +95,12 @@ TEST(MaterialLoader, LoadValidMaterialParsesRenderMetadata) {
|
||||
EXPECT_EQ(material->GetShaderPass(), "ForwardLit");
|
||||
EXPECT_EQ(material->GetTag("LightMode"), "ForwardBase");
|
||||
EXPECT_EQ(material->GetTag("RenderType"), "Transparent");
|
||||
EXPECT_EQ(material->GetRenderState().cullMode, MaterialCullMode::Back);
|
||||
EXPECT_TRUE(material->GetRenderState().blendEnable);
|
||||
EXPECT_EQ(material->GetRenderState().srcBlend, MaterialBlendFactor::SrcAlpha);
|
||||
EXPECT_EQ(material->GetRenderState().dstBlend, MaterialBlendFactor::InvSrcAlpha);
|
||||
EXPECT_FALSE(material->GetRenderState().depthWriteEnable);
|
||||
EXPECT_EQ(material->GetRenderState().depthFunc, MaterialComparisonFunc::LessEqual);
|
||||
|
||||
delete material;
|
||||
std::remove(materialPath.string().c_str());
|
||||
@@ -110,4 +124,21 @@ TEST(MaterialLoader, RejectsUnknownRenderQueueName) {
|
||||
std::remove(materialPath.string().c_str());
|
||||
}
|
||||
|
||||
TEST(MaterialLoader, RejectsUnknownRenderStateEnum) {
|
||||
const std::filesystem::path materialPath =
|
||||
std::filesystem::current_path() / "material_loader_invalid_render_state.material";
|
||||
|
||||
{
|
||||
std::ofstream materialFile(materialPath);
|
||||
ASSERT_TRUE(materialFile.is_open());
|
||||
materialFile << "{ \"renderState\": { \"cull\": \"Sideways\" } }";
|
||||
}
|
||||
|
||||
MaterialLoader loader;
|
||||
LoadResult result = loader.Load(materialPath.string().c_str());
|
||||
EXPECT_FALSE(result);
|
||||
|
||||
std::remove(materialPath.string().c_str());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user