mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2026-03-25 14:03:03 +00:00
chore: add unit tests for iw3 techsets
This commit is contained in:
@@ -0,0 +1,338 @@
|
||||
#include "Game/IW3/Techset/TechniqueCompilerIW3.h"
|
||||
|
||||
#include "Game/IW3/IW3.h"
|
||||
#include "Game/IW3/Techset/PixelShaderLoaderIW3.h"
|
||||
#include "Game/IW3/Techset/VertexDeclCompilerIW3.h"
|
||||
#include "Game/IW3/Techset/VertexShaderLoaderIW3.h"
|
||||
#include "OatTestPaths.h"
|
||||
#include "SearchPath/MockSearchPath.h"
|
||||
#include "Shader/ShaderCommon.h"
|
||||
#include "Utils/MemoryManager.h"
|
||||
#include "catch2/generators/catch_generators.hpp"
|
||||
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
|
||||
using namespace IW3;
|
||||
using namespace Catch;
|
||||
using namespace std::literals;
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
namespace
|
||||
{
|
||||
void GivenVertexShaderFile(const std::string& name, MockSearchPath& searchPath)
|
||||
{
|
||||
const auto filePath = oat::paths::GetTestDirectory() / "ObjCompilingTests/Game/IW3/Techset" / std::format("vs_{}.cso", name);
|
||||
const auto fileSize = static_cast<size_t>(fs::file_size(filePath));
|
||||
|
||||
std::ifstream file(filePath, std::ios::binary);
|
||||
REQUIRE(file.is_open());
|
||||
|
||||
std::string data(fileSize, '\0');
|
||||
file.read(data.data(), fileSize);
|
||||
REQUIRE(file.gcount() == static_cast<std::streamsize>(fileSize));
|
||||
|
||||
searchPath.AddFileData(shader::GetFileNameForVertexShaderAssetName(name), std::move(data));
|
||||
}
|
||||
|
||||
void GivenPixelShaderFile(const std::string& name, MockSearchPath& searchPath)
|
||||
{
|
||||
const auto filePath = oat::paths::GetTestDirectory() / "ObjCompilingTests/Game/IW3/Techset" / std::format("ps_{}.cso", name);
|
||||
const auto fileSize = static_cast<size_t>(fs::file_size(filePath));
|
||||
|
||||
std::ifstream file(filePath, std::ios::binary);
|
||||
REQUIRE(file.is_open());
|
||||
|
||||
std::string data(fileSize, '\0');
|
||||
file.read(data.data(), fileSize);
|
||||
REQUIRE(file.gcount() == static_cast<std::streamsize>(fileSize));
|
||||
|
||||
searchPath.AddFileData(shader::GetFileNameForPixelShaderAssetName(name), std::move(data));
|
||||
}
|
||||
} // namespace
|
||||
|
||||
TEST_CASE("TechniqueCompilerIW3", "[iw3][techset][compiler]")
|
||||
{
|
||||
|
||||
Zone zone("MockZone", 0, GameId::IW3, GamePlatform::PC);
|
||||
zone.Register();
|
||||
|
||||
MemoryManager memory;
|
||||
AssetCreatorCollection creatorCollection(zone);
|
||||
IgnoredAssetLookup ignoredAssetLookup;
|
||||
AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup);
|
||||
MockSearchPath searchPath;
|
||||
|
||||
creatorCollection.AddSubAssetCreator(techset::CreateVertexDeclCompilerIW3(memory));
|
||||
creatorCollection.AddSubAssetCreator(techset::CreateVertexShaderLoaderIW3(memory, searchPath));
|
||||
creatorCollection.AddSubAssetCreator(techset::CreatePixelShaderLoaderIW3(memory, searchPath));
|
||||
|
||||
auto loader = techset::CreateTechniqueCompilerIW3(memory, zone, searchPath);
|
||||
|
||||
SECTION("Can compile simple technique")
|
||||
{
|
||||
const auto [inputName, inputData] = GENERATE(Catch::Generators::table<const char*, const char*>({
|
||||
{"auto-create args", R"TECHNIQUE(
|
||||
{
|
||||
stateMap "passthrough";
|
||||
|
||||
vertexShader 3.0 "simple.hlsl"
|
||||
{
|
||||
}
|
||||
|
||||
pixelShader 3.0 "simple.hlsl"
|
||||
{
|
||||
}
|
||||
|
||||
vertex.position = code.position;
|
||||
}
|
||||
)TECHNIQUE"},
|
||||
{"manual args", R"TECHNIQUE(
|
||||
{
|
||||
stateMap "passthrough";
|
||||
|
||||
vertexShader 3.0 "simple.hlsl"
|
||||
{
|
||||
worldMatrix = constant.worldMatrix;
|
||||
viewProjectionMatrix = constant.viewProjectionMatrix;
|
||||
}
|
||||
|
||||
pixelShader 3.0 "simple.hlsl"
|
||||
{
|
||||
}
|
||||
|
||||
vertex.position = code.position;
|
||||
}
|
||||
)TECHNIQUE"},
|
||||
}));
|
||||
|
||||
CAPTURE(inputName);
|
||||
searchPath.AddFileData("techniques/zprepass.tech", inputData);
|
||||
|
||||
GivenVertexShaderFile("simple.hlsl", searchPath);
|
||||
GivenPixelShaderFile("simple.hlsl", searchPath);
|
||||
|
||||
auto result = loader->CreateSubAsset("zprepass", context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* assetInfo = reinterpret_cast<XAssetInfo<MaterialTechnique>*>(result.GetAssetInfo());
|
||||
const auto* technique = assetInfo->Asset();
|
||||
|
||||
CHECK(technique->name == "zprepass"s);
|
||||
|
||||
CHECK(technique->flags == 0x4);
|
||||
|
||||
REQUIRE(technique->passCount == 1);
|
||||
auto& pass = technique->passArray[0];
|
||||
CHECK(pass.customSamplerFlags == 0);
|
||||
|
||||
REQUIRE(pass.vertexShader);
|
||||
CHECK(pass.vertexShader->name == "simple.hlsl"s);
|
||||
REQUIRE(pass.pixelShader);
|
||||
CHECK(pass.pixelShader->name == "simple.hlsl"s);
|
||||
|
||||
REQUIRE(pass.vertexDecl);
|
||||
auto& vertexDecl = *pass.vertexDecl;
|
||||
CHECK(vertexDecl.hasOptionalSource == false);
|
||||
REQUIRE(vertexDecl.streamCount == 1);
|
||||
CHECK(vertexDecl.routing.data[0].source == STREAM_SRC_POSITION);
|
||||
CHECK(vertexDecl.routing.data[0].dest == STREAM_DST_POSITION);
|
||||
|
||||
REQUIRE(pass.perPrimArgCount == 1);
|
||||
REQUIRE(pass.perObjArgCount == 1);
|
||||
REQUIRE(pass.stableArgCount == 0);
|
||||
CHECK(pass.args[0].type == MTL_ARG_CODE_VERTEX_CONST);
|
||||
CHECK(pass.args[0].dest == 4);
|
||||
CHECK(pass.args[0].u.codeConst.index == CONST_SRC_CODE_TRANSPOSE_WORLD_MATRIX);
|
||||
CHECK(pass.args[0].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[0].u.codeConst.rowCount == 4);
|
||||
|
||||
CHECK(pass.args[1].type == MTL_ARG_CODE_VERTEX_CONST);
|
||||
CHECK(pass.args[1].dest == 0);
|
||||
CHECK(pass.args[1].u.codeConst.index == CONST_SRC_CODE_TRANSPOSE_VIEW_PROJECTION_MATRIX);
|
||||
CHECK(pass.args[1].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[1].u.codeConst.rowCount == 4);
|
||||
}
|
||||
|
||||
SECTION("Can compile advanced technique")
|
||||
{
|
||||
const auto [inputName, inputData] = GENERATE(Catch::Generators::table<const char*, const char*>({
|
||||
{"auto-create args", R"TECHNIQUE(
|
||||
{
|
||||
stateMap "passthrough";
|
||||
|
||||
vertexShader 3.0 "advanced.hlsl"
|
||||
{
|
||||
}
|
||||
|
||||
pixelShader 3.0 "advanced.hlsl"
|
||||
{
|
||||
normalMapSampler = material.normalMap;
|
||||
colorMapSampler = material.colorMap;
|
||||
}
|
||||
|
||||
vertex.position = code.position;
|
||||
vertex.color[0] = code.color;
|
||||
vertex.texcoord[0] = code.texcoord[0];
|
||||
vertex.normal = code.normal;
|
||||
vertex.texcoord[2] = code.tangent;
|
||||
}
|
||||
)TECHNIQUE"},
|
||||
{"manual args", R"TECHNIQUE(
|
||||
{
|
||||
stateMap "passthrough";
|
||||
|
||||
vertexShader 3.0 "advanced.hlsl"
|
||||
{
|
||||
worldMatrix = constant.worldMatrix;
|
||||
baseLightingCoords = constant.baseLightingCoords;
|
||||
viewProjectionMatrix = constant.viewProjectionMatrix;
|
||||
fogConsts = constant.fogConsts;
|
||||
}
|
||||
|
||||
pixelShader 3.0 "advanced.hlsl"
|
||||
{
|
||||
attenuationSampler = sampler.attenuationSampler;
|
||||
normalMapSampler = material.normalMap;
|
||||
colorMapSampler = material.colorMap;
|
||||
modelLightingSampler = sampler.modelLightingSampler;
|
||||
fogColor = constant.fogColor;
|
||||
lightingLookupScale = constant.lightingLookupScale;
|
||||
lightPosition = constant.lightPosition;
|
||||
lightDiffuse = constant.lightDiffuse;
|
||||
lightSpotDir = constant.lightSpotDir;
|
||||
lightSpotFactors = constant.lightSpotFactors;
|
||||
}
|
||||
|
||||
vertex.position = code.position;
|
||||
vertex.color[0] = code.color;
|
||||
vertex.texcoord[0] = code.texcoord[0];
|
||||
vertex.normal = code.normal;
|
||||
vertex.texcoord[2] = code.tangent;
|
||||
}
|
||||
)TECHNIQUE"},
|
||||
}));
|
||||
|
||||
CAPTURE(inputName);
|
||||
searchPath.AddFileData("techniques/example_lit_spot.tech", inputData);
|
||||
|
||||
GivenVertexShaderFile("advanced.hlsl", searchPath);
|
||||
GivenPixelShaderFile("advanced.hlsl", searchPath);
|
||||
|
||||
auto result = loader->CreateSubAsset("example_lit_spot", context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* assetInfo = reinterpret_cast<XAssetInfo<MaterialTechnique>*>(result.GetAssetInfo());
|
||||
const auto* technique = assetInfo->Asset();
|
||||
|
||||
CHECK(technique->name == "example_lit_spot"s);
|
||||
|
||||
CHECK(technique->flags == 0x10);
|
||||
|
||||
REQUIRE(technique->passCount == 1);
|
||||
auto& pass = technique->passArray[0];
|
||||
CHECK(pass.customSamplerFlags == 0);
|
||||
|
||||
REQUIRE(pass.vertexShader);
|
||||
CHECK(pass.vertexShader->name == "advanced.hlsl"s);
|
||||
REQUIRE(pass.pixelShader);
|
||||
CHECK(pass.pixelShader->name == "advanced.hlsl"s);
|
||||
|
||||
REQUIRE(pass.vertexDecl);
|
||||
auto& vertexDecl = *pass.vertexDecl;
|
||||
CHECK(vertexDecl.hasOptionalSource == false);
|
||||
REQUIRE(vertexDecl.streamCount == 5);
|
||||
CHECK(vertexDecl.routing.data[0].source == STREAM_SRC_POSITION);
|
||||
CHECK(vertexDecl.routing.data[0].dest == STREAM_DST_POSITION);
|
||||
CHECK(vertexDecl.routing.data[1].source == STREAM_SRC_COLOR);
|
||||
CHECK(vertexDecl.routing.data[1].dest == STREAM_DST_COLOR_0);
|
||||
CHECK(vertexDecl.routing.data[2].source == STREAM_SRC_TEXCOORD_0);
|
||||
CHECK(vertexDecl.routing.data[2].dest == STREAM_DST_TEXCOORD_0);
|
||||
CHECK(vertexDecl.routing.data[3].source == STREAM_SRC_NORMAL);
|
||||
CHECK(vertexDecl.routing.data[3].dest == STREAM_DST_NORMAL);
|
||||
CHECK(vertexDecl.routing.data[4].source == STREAM_SRC_TANGENT);
|
||||
CHECK(vertexDecl.routing.data[4].dest == STREAM_DST_TEXCOORD_2);
|
||||
|
||||
REQUIRE(pass.perPrimArgCount == 2);
|
||||
REQUIRE(pass.perObjArgCount == 2);
|
||||
REQUIRE(pass.stableArgCount == 10);
|
||||
|
||||
CHECK(pass.args[0].type == MTL_ARG_CODE_VERTEX_CONST);
|
||||
CHECK(pass.args[0].dest == 4);
|
||||
CHECK(pass.args[0].u.codeConst.index == CONST_SRC_CODE_TRANSPOSE_WORLD_MATRIX);
|
||||
CHECK(pass.args[0].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[0].u.codeConst.rowCount == 4);
|
||||
|
||||
CHECK(pass.args[1].type == MTL_ARG_CODE_VERTEX_CONST);
|
||||
CHECK(pass.args[1].dest == 8);
|
||||
CHECK(pass.args[1].u.codeConst.index == CONST_SRC_CODE_BASE_LIGHTING_COORDS);
|
||||
CHECK(pass.args[1].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[1].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[2].type == MTL_ARG_CODE_VERTEX_CONST);
|
||||
CHECK(pass.args[2].dest == 0);
|
||||
CHECK(pass.args[2].u.codeConst.index == CONST_SRC_CODE_TRANSPOSE_VIEW_PROJECTION_MATRIX);
|
||||
CHECK(pass.args[2].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[2].u.codeConst.rowCount == 4);
|
||||
|
||||
CHECK(pass.args[3].type == MTL_ARG_CODE_PIXEL_SAMPLER);
|
||||
CHECK(pass.args[3].dest == 6);
|
||||
CHECK(pass.args[3].u.codeSampler == TEXTURE_SRC_CODE_LIGHT_ATTENUATION);
|
||||
|
||||
CHECK(pass.args[4].type == MTL_ARG_MATERIAL_PIXEL_SAMPLER);
|
||||
CHECK(pass.args[4].dest == 5);
|
||||
CHECK(pass.args[4].u.nameHash == 0x59D30D0F);
|
||||
|
||||
CHECK(pass.args[5].type == MTL_ARG_MATERIAL_PIXEL_SAMPLER);
|
||||
CHECK(pass.args[5].dest == 0);
|
||||
CHECK(pass.args[5].u.nameHash == 0xA0AB1041);
|
||||
|
||||
CHECK(pass.args[6].type == MTL_ARG_CODE_VERTEX_CONST);
|
||||
CHECK(pass.args[6].dest == 21);
|
||||
CHECK(pass.args[6].u.codeConst.index == CONST_SRC_CODE_FOG);
|
||||
CHECK(pass.args[6].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[6].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[7].type == MTL_ARG_CODE_PIXEL_SAMPLER);
|
||||
CHECK(pass.args[7].dest == 4);
|
||||
CHECK(pass.args[7].u.codeSampler == TEXTURE_SRC_CODE_MODEL_LIGHTING);
|
||||
|
||||
CHECK(pass.args[8].type == MTL_ARG_CODE_PIXEL_CONST);
|
||||
CHECK(pass.args[8].dest == 0);
|
||||
CHECK(pass.args[8].u.codeConst.index == CONST_SRC_CODE_FOG_COLOR);
|
||||
CHECK(pass.args[8].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[8].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[9].type == MTL_ARG_CODE_PIXEL_CONST);
|
||||
CHECK(pass.args[9].dest == 5);
|
||||
CHECK(pass.args[9].u.codeConst.index == CONST_SRC_CODE_LIGHTING_LOOKUP_SCALE);
|
||||
CHECK(pass.args[9].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[9].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[10].type == MTL_ARG_CODE_PIXEL_CONST);
|
||||
CHECK(pass.args[10].dest == 6);
|
||||
CHECK(pass.args[10].u.codeConst.index == CONST_SRC_CODE_LIGHT_POSITION);
|
||||
CHECK(pass.args[10].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[10].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[11].type == MTL_ARG_CODE_PIXEL_CONST);
|
||||
CHECK(pass.args[11].dest == 7);
|
||||
CHECK(pass.args[11].u.codeConst.index == CONST_SRC_CODE_LIGHT_DIFFUSE);
|
||||
CHECK(pass.args[11].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[11].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[12].type == MTL_ARG_CODE_PIXEL_CONST);
|
||||
CHECK(pass.args[12].dest == 8);
|
||||
CHECK(pass.args[12].u.codeConst.index == CONST_SRC_CODE_LIGHT_SPOTDIR);
|
||||
CHECK(pass.args[12].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[12].u.codeConst.rowCount == 1);
|
||||
|
||||
CHECK(pass.args[13].type == MTL_ARG_CODE_PIXEL_CONST);
|
||||
CHECK(pass.args[13].dest == 9);
|
||||
CHECK(pass.args[13].u.codeConst.index == CONST_SRC_CODE_LIGHT_SPOTFACTORS);
|
||||
CHECK(pass.args[13].u.codeConst.firstRow == 0);
|
||||
CHECK(pass.args[13].u.codeConst.rowCount == 1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
#include "Game/IW3/Techset/TechsetCompilerIW3.h"
|
||||
|
||||
#include "Game/IW3/IW3.h"
|
||||
#include "SearchPath/MockSearchPath.h"
|
||||
#include "Techset/TechsetCommon.h"
|
||||
#include "Utils/TestMemoryManager.h"
|
||||
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
#include <catch2/generators/catch_generators.hpp>
|
||||
#include <catch2/matchers/catch_matchers_floating_point.hpp>
|
||||
#include <memory>
|
||||
|
||||
using namespace IW3;
|
||||
using namespace std::string_literals;
|
||||
|
||||
namespace
|
||||
{
|
||||
MaterialTechnique* GivenTechnique(const std::string& name, AssetCreationContext& context, MemoryManager& memory)
|
||||
{
|
||||
auto* technique = memory.Alloc<MaterialTechnique>();
|
||||
technique->name = memory.Dup(name.c_str());
|
||||
|
||||
context.AddSubAsset<SubAssetTechnique>(name, technique);
|
||||
|
||||
return technique;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
TEST_CASE("TechsetCompilerIW3", "[techset][iw3][compiler]")
|
||||
{
|
||||
Zone zone("test", 0, GameId::IW3, GamePlatform::PC);
|
||||
AssetCreatorCollection creators(zone);
|
||||
IgnoredAssetLookup ignoredAssets;
|
||||
AssetCreationContext context(zone, &creators, &ignoredAssets);
|
||||
MockSearchPath searchPath;
|
||||
TestMemoryManager memory;
|
||||
const auto sut = techset::CreateTechsetCompilerIW3(memory, searchPath);
|
||||
|
||||
SECTION("Sets correct worldVertFormat")
|
||||
{
|
||||
const auto [techsetName, expectedWorldVertFormat] = GENERATE(Catch::Generators::table<const char*, MaterialWorldVertexFormat>({
|
||||
{"default", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
{"effect_zeqqz943", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
{"lit_r0c0_t1c1n1", MTL_WORLDVERT_TEX_2_NRM_1},
|
||||
{"lit_r0c0n0x0_b1c1n1s1v1", MTL_WORLDVERT_TEX_2_NRM_2},
|
||||
{"lit_r0c0n0x0_b1c1n1s1v1_b2c2n2x2", MTL_WORLDVERT_TEX_3_NRM_3},
|
||||
{"lit_sm_b0c0_b1c1_b2c2", MTL_WORLDVERT_TEX_3_NRM_1},
|
||||
{"lit_sm_b0c0_b1c1n1x1_b2c2n2v2", MTL_WORLDVERT_TEX_3_NRM_2},
|
||||
{"lit_sm_r0c0_b1c1_b2c2_b3c3", MTL_WORLDVERT_TEX_4_NRM_1},
|
||||
{"lit_sm_r0c0n0_b1c1_b2c2n2v2_m3c3", MTL_WORLDVERT_TEX_4_NRM_2},
|
||||
{"lit_sm_r0c0n0_b1c1n1s1", MTL_WORLDVERT_TEX_2_NRM_2},
|
||||
{"lit_sm_r0c0n0s0_b1c1n1s1_b2c2n2", MTL_WORLDVERT_TEX_3_NRM_3},
|
||||
{"lit_sm_r0c0n0x0_b1c1_b2c2n2s2", MTL_WORLDVERT_TEX_3_NRM_2},
|
||||
{"lit_sm_r0c0n0x0_b1c1n1_b2c2n2s2v2", MTL_WORLDVERT_TEX_3_NRM_3},
|
||||
{"lit_sm_r0c0n0x0_b1c1s1v1_m2c2_m3c3", MTL_WORLDVERT_TEX_4_NRM_1},
|
||||
{"lit_sm_r0c0n0x0_b1c1v1_b2c2n2s2_m3c3", MTL_WORLDVERT_TEX_4_NRM_2},
|
||||
{"lit_sm_r0c0s0_b1c1n1s1_m2c2", MTL_WORLDVERT_TEX_3_NRM_1},
|
||||
{"lit_sm_r0c0x0_b1c1", MTL_WORLDVERT_TEX_2_NRM_1},
|
||||
{"lit_sm_r0c0x0_b1c1n1s1_b2c2n2s2", MTL_WORLDVERT_TEX_3_NRM_2},
|
||||
{"lit_sm_r0c0x0_m1c1_m2c2_m3c3", MTL_WORLDVERT_TEX_4_NRM_1},
|
||||
{"lit_sm_t0c0n0_b1c1n1v1", MTL_WORLDVERT_TEX_2_NRM_2},
|
||||
{"lit_sm_t0c0n0s0_b1c1n1_b2c2n2s2v2", MTL_WORLDVERT_TEX_3_NRM_3},
|
||||
{"mc_lit_sm_r0c0d0_2213939z", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
{"wpc_lit_sm_b0c0s0_3f3q946z", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
{"wpc_lit_sm_r0c0n0s0o0_qj92q1f8", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
{"wpc_sw4_3d_burning_embers_nuketown_74j6971w", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
{"wpc_unlitdecalblend_add_j26wq580", MTL_WORLDVERT_TEX_1_NRM_1},
|
||||
}));
|
||||
|
||||
CAPTURE(techsetName);
|
||||
searchPath.AddFileData(techset::GetFileNameForTechsetName(techsetName), "");
|
||||
|
||||
const auto result = sut->CreateAsset(techsetName, context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* techset = static_cast<MaterialTechniqueSet*>(result.GetAssetInfo()->m_ptr);
|
||||
CHECK(techset->worldVertFormat == expectedWorldVertFormat);
|
||||
}
|
||||
|
||||
SECTION("Can parse simple techset")
|
||||
{
|
||||
searchPath.AddFileData(techset::GetFileNameForTechsetName("simple"), R"TECHSET(
|
||||
"depth prepass":
|
||||
example_zprepass;
|
||||
|
||||
"lit spot":
|
||||
example_lit_spot;
|
||||
)TECHSET");
|
||||
|
||||
auto* exampleZPrepass = GivenTechnique("example_zprepass", context, memory);
|
||||
auto* exampleLit = GivenTechnique("example_lit_spot", context, memory);
|
||||
|
||||
const auto result = sut->CreateAsset("simple", context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* techset = static_cast<MaterialTechniqueSet*>(result.GetAssetInfo()->m_ptr);
|
||||
CHECK(techset->name == "simple"s);
|
||||
CHECK(techset->worldVertFormat == MTL_WORLDVERT_TEX_1_NRM_1);
|
||||
|
||||
size_t techniqueCount = 0;
|
||||
for (auto* technique : techset->techniques)
|
||||
{
|
||||
if (technique)
|
||||
techniqueCount++;
|
||||
}
|
||||
|
||||
CHECK(techniqueCount == 2);
|
||||
CHECK(techset->techniques[TECHNIQUE_DEPTH_PREPASS] == exampleZPrepass);
|
||||
CHECK(techset->techniques[TECHNIQUE_LIT_SPOT] == exampleLit);
|
||||
}
|
||||
|
||||
SECTION("Can parse techset with same technique used multiple times")
|
||||
{
|
||||
searchPath.AddFileData(techset::GetFileNameForTechsetName("simple"), R"TECHSET(
|
||||
"depth prepass":
|
||||
"build shadowmap depth":
|
||||
example_zprepass;
|
||||
|
||||
"lit":
|
||||
"lit sun":
|
||||
"lit instanced omni shadow":
|
||||
example_lit_spot;
|
||||
)TECHSET");
|
||||
|
||||
auto* exampleZPrepass = GivenTechnique("example_zprepass", context, memory);
|
||||
auto* exampleLitOmni = GivenTechnique("example_lit_spot", context, memory);
|
||||
|
||||
const auto result = sut->CreateAsset("simple", context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* techset = static_cast<MaterialTechniqueSet*>(result.GetAssetInfo()->m_ptr);
|
||||
CHECK(techset->name == "simple"s);
|
||||
CHECK(techset->worldVertFormat == MTL_WORLDVERT_TEX_1_NRM_1);
|
||||
|
||||
size_t techniqueCount = 0;
|
||||
for (auto* technique : techset->techniques)
|
||||
{
|
||||
if (technique)
|
||||
techniqueCount++;
|
||||
}
|
||||
|
||||
CHECK(techniqueCount == 5);
|
||||
CHECK(techset->techniques[TECHNIQUE_DEPTH_PREPASS] == exampleZPrepass);
|
||||
CHECK(techset->techniques[TECHNIQUE_BUILD_SHADOWMAP_DEPTH] == exampleZPrepass);
|
||||
CHECK(techset->techniques[TECHNIQUE_LIT] == exampleLitOmni);
|
||||
CHECK(techset->techniques[TECHNIQUE_LIT_SUN] == exampleLitOmni);
|
||||
CHECK(techset->techniques[TECHNIQUE_LIT_INSTANCED_OMNI_SHADOW] == exampleLitOmni);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "Game/IW3/Techset/VertexDeclCompilerIW3.h"
|
||||
|
||||
#include "Game/IW3/IW3.h"
|
||||
#include "Utils/MemoryManager.h"
|
||||
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
|
||||
using namespace IW3;
|
||||
using namespace Catch;
|
||||
using namespace std::literals;
|
||||
|
||||
TEST_CASE("VertexDeclCompilerIW3", "[iw3][techset][compiler]")
|
||||
{
|
||||
Zone zone("MockZone", 0, GameId::IW3, GamePlatform::PC);
|
||||
zone.Register();
|
||||
|
||||
MemoryManager memory;
|
||||
AssetCreatorCollection creatorCollection(zone);
|
||||
IgnoredAssetLookup ignoredAssetLookup;
|
||||
AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup);
|
||||
|
||||
auto loader = techset::CreateVertexDeclCompilerIW3(memory);
|
||||
|
||||
SECTION("Can create simple vertex decl")
|
||||
{
|
||||
auto result = loader->CreateSubAsset("pp", context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* assetInfo = reinterpret_cast<XAssetInfo<MaterialVertexDeclaration>*>(result.GetAssetInfo());
|
||||
const auto* decl = assetInfo->Asset();
|
||||
|
||||
CHECK(decl->hasOptionalSource == false);
|
||||
|
||||
REQUIRE(decl->streamCount == 1);
|
||||
CHECK(decl->routing.data[0].source == STREAM_SRC_POSITION);
|
||||
CHECK(decl->routing.data[0].dest == STREAM_DST_POSITION);
|
||||
}
|
||||
|
||||
SECTION("Can create advanced vertex decl")
|
||||
{
|
||||
auto result = loader->CreateSubAsset("pt6cc1tt7t1t1n1n", context);
|
||||
REQUIRE(result.HasBeenSuccessful());
|
||||
|
||||
const auto* assetInfo = reinterpret_cast<XAssetInfo<MaterialVertexDeclaration>*>(result.GetAssetInfo());
|
||||
const auto* decl = assetInfo->Asset();
|
||||
|
||||
CHECK(decl->hasOptionalSource == true);
|
||||
|
||||
REQUIRE(decl->streamCount == 5);
|
||||
CHECK(decl->routing.data[0].source == STREAM_SRC_POSITION);
|
||||
CHECK(decl->routing.data[0].dest == STREAM_DST_TEXCOORD_6);
|
||||
CHECK(decl->routing.data[1].source == STREAM_SRC_COLOR);
|
||||
CHECK(decl->routing.data[1].dest == STREAM_DST_COLOR_1);
|
||||
CHECK(decl->routing.data[2].source == STREAM_SRC_TANGENT);
|
||||
CHECK(decl->routing.data[2].dest == STREAM_DST_TEXCOORD_7);
|
||||
CHECK(decl->routing.data[3].source == STREAM_SRC_TEXCOORD_1);
|
||||
CHECK(decl->routing.data[3].dest == STREAM_DST_TEXCOORD_1);
|
||||
CHECK(decl->routing.data[4].source == STREAM_SRC_NORMAL_TRANSFORM_1);
|
||||
CHECK(decl->routing.data[4].dest == STREAM_DST_NORMAL);
|
||||
}
|
||||
}
|
||||
BIN
test/ObjCompilingTests/Game/IW3/Techset/ps_advanced.hlsl.cso
Normal file
BIN
test/ObjCompilingTests/Game/IW3/Techset/ps_advanced.hlsl.cso
Normal file
Binary file not shown.
BIN
test/ObjCompilingTests/Game/IW3/Techset/ps_simple.hlsl.cso
Normal file
BIN
test/ObjCompilingTests/Game/IW3/Techset/ps_simple.hlsl.cso
Normal file
Binary file not shown.
BIN
test/ObjCompilingTests/Game/IW3/Techset/vs_advanced.hlsl.cso
Normal file
BIN
test/ObjCompilingTests/Game/IW3/Techset/vs_advanced.hlsl.cso
Normal file
Binary file not shown.
BIN
test/ObjCompilingTests/Game/IW3/Techset/vs_simple.hlsl.cso
Normal file
BIN
test/ObjCompilingTests/Game/IW3/Techset/vs_simple.hlsl.cso
Normal file
Binary file not shown.
Reference in New Issue
Block a user