Formalize renderer material contracts and harden backpack import

This commit is contained in:
2026-04-08 04:27:21 +08:00
parent 7be3b2cc45
commit 6113ed92b0
18 changed files with 534 additions and 326 deletions

View File

@@ -9,6 +9,7 @@
#include <XCEngine/Components/GameObject.h>
#include <XCEngine/Components/MeshFilterComponent.h>
#include <XCEngine/Components/MeshRendererComponent.h>
#include <XCEngine/Core/Asset/ResourceManager.h>
#include <XCEngine/Core/Asset/IResource.h>
#include <XCEngine/Core/Math/Color.h>
#include <XCEngine/Core/Math/Quaternion.h>
@@ -19,10 +20,13 @@
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderSurface.h>
#include <XCEngine/Rendering/Execution/SceneRenderer.h>
#include <XCEngine/Rendering/Materials/RenderMaterialResolve.h>
#include <XCEngine/Resources/BuiltinResources.h>
#include <XCEngine/Resources/Material/Material.h>
#include <XCEngine/Resources/Mesh/Mesh.h>
#include <XCEngine/Resources/Mesh/MeshImportSettings.h>
#include <XCEngine/Resources/Mesh/MeshLoader.h>
#include <XCEngine/Resources/Shader/Shader.h>
#include <XCEngine/Resources/Texture/Texture.h>
#include <XCEngine/RHI/RHITexture.h>
#include <XCEngine/Scene/Scene.h>
@@ -66,6 +70,18 @@ std::filesystem::path ResolveRuntimePath(const char* relativePath) {
return GetExecutableDirectory() / relativePath;
}
void NormalizeBackpackTestMaterials(Mesh& mesh) {
for (Material* material : mesh.GetMaterials()) {
if (material == nullptr) {
continue;
}
MaterialRenderState renderState = material->GetRenderState();
renderState.cullMode = MaterialCullMode::None;
material->SetRenderState(renderState);
}
}
Mesh* CreateQuadMesh() {
auto* mesh = new Mesh();
IResource::ConstructParams params = {};
@@ -84,7 +100,7 @@ Mesh* CreateQuadMesh() {
vertices[3].position = Vector3(1.0f, 1.0f, 0.0f);
vertices[3].uv0 = Vector2(1.0f, 0.0f);
const uint32_t indices[6] = { 0, 1, 2, 2, 1, 3 };
const uint32_t indices[6] = { 0, 2, 1, 2, 3, 1 };
mesh->SetVertexData(
vertices,
sizeof(vertices),
@@ -137,7 +153,8 @@ Material* CreateQuadMaterial(Texture* texture) {
params.path = "Tests/Rendering/CameraStackQuad.material";
params.guid = ResourceGUID::Generate(params.path);
material->Initialize(params);
material->SetTexture("_BaseColorTexture", ResourceHandle<Texture>(texture));
material->SetShader(ResourceManager::Get().Load<Shader>(GetBuiltinForwardLitShaderPath()));
material->SetTexture("_MainTex", ResourceHandle<Texture>(texture));
return material;
}
@@ -189,6 +206,13 @@ void CameraStackSceneTest::SetUp() {
mQuadMesh = CreateQuadMesh();
mQuadTexture = CreateCheckerTexture();
mQuadMaterial = CreateQuadMaterial(mQuadTexture);
ASSERT_NE(mQuadMaterial, nullptr);
ASSERT_NE(mQuadMaterial->GetShader(), nullptr);
ASSERT_TRUE(mQuadMaterial->HasProperty("_BaseColor"));
ASSERT_TRUE(mQuadMaterial->HasProperty("_MainTex"));
ASSERT_EQ(mQuadMaterial->GetTexture("_MainTex").Get(), mQuadTexture);
ASSERT_EQ(ResolveBuiltinBaseColorTexture(mQuadMaterial), mQuadTexture);
ASSERT_TRUE(ResolveSchemaMaterialConstantPayload(mQuadMaterial).IsValid());
BuildScene();
TextureDesc depthDesc = {};
@@ -270,6 +294,14 @@ void CameraStackSceneTest::LoadBackpackMesh() {
ASSERT_TRUE(mBackpackMesh->IsValid());
ASSERT_GT(mBackpackMesh->GetVertexCount(), 0u);
ASSERT_GT(mBackpackMesh->GetSections().Size(), 0u);
ASSERT_GT(mBackpackMesh->GetMaterials().Size(), 0u);
NormalizeBackpackTestMaterials(*mBackpackMesh);
for (Material* material : mBackpackMesh->GetMaterials()) {
ASSERT_NE(material, nullptr);
ASSERT_NE(material->GetShader(), nullptr);
ASSERT_TRUE(ResolveSchemaMaterialConstantPayload(material).IsValid());
}
}
void CameraStackSceneTest::BuildScene() {