feat(scripting): add mesh component script wrappers
This commit is contained in:
@@ -66,6 +66,19 @@ TEST(MeshFilterComponent_Test, SerializeAndDeserializePreservesPath) {
|
||||
delete mesh;
|
||||
}
|
||||
|
||||
TEST(MeshFilterComponent_Test, SetMeshPathPreservesPathWithoutLoadedResource) {
|
||||
MeshFilterComponent component;
|
||||
|
||||
component.SetMeshPath("Meshes/runtime.mesh");
|
||||
|
||||
EXPECT_EQ(component.GetMeshPath(), "Meshes/runtime.mesh");
|
||||
EXPECT_EQ(component.GetMesh(), nullptr);
|
||||
|
||||
component.SetMeshPath("");
|
||||
EXPECT_EQ(component.GetMeshPath(), "");
|
||||
EXPECT_EQ(component.GetMesh(), nullptr);
|
||||
}
|
||||
|
||||
TEST(MeshRendererComponent_Test, SetMaterialsKeepsSlotsAndFlags) {
|
||||
GameObject gameObject("RendererHolder");
|
||||
auto* component = gameObject.AddComponent<MeshRendererComponent>();
|
||||
@@ -122,4 +135,20 @@ TEST(MeshRendererComponent_Test, SerializeAndDeserializePreservesMaterialPathsAn
|
||||
delete material1;
|
||||
}
|
||||
|
||||
TEST(MeshRendererComponent_Test, SetMaterialPathPreservesPathWithoutLoadedResource) {
|
||||
MeshRendererComponent component;
|
||||
|
||||
component.SetMaterialPath(1, "Materials/runtime.mat");
|
||||
|
||||
ASSERT_EQ(component.GetMaterialCount(), 2u);
|
||||
EXPECT_EQ(component.GetMaterial(0), nullptr);
|
||||
EXPECT_EQ(component.GetMaterial(1), nullptr);
|
||||
EXPECT_EQ(component.GetMaterialPath(0), "");
|
||||
EXPECT_EQ(component.GetMaterialPath(1), "Materials/runtime.mat");
|
||||
|
||||
component.SetMaterialPath(1, "");
|
||||
EXPECT_EQ(component.GetMaterialPath(1), "");
|
||||
EXPECT_EQ(component.GetMaterial(1), nullptr);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <XCEngine/Components/CameraComponent.h>
|
||||
#include <XCEngine/Components/LightComponent.h>
|
||||
#include <XCEngine/Components/MeshFilterComponent.h>
|
||||
#include <XCEngine/Components/MeshRendererComponent.h>
|
||||
#include <XCEngine/Core/Math/Vector3.h>
|
||||
#include <XCEngine/Core/Math/Vector4.h>
|
||||
#include <XCEngine/Scene/Scene.h>
|
||||
@@ -315,6 +317,82 @@ TEST_F(MonoScriptRuntimeTest, ManagedBuiltInComponentWrappersReadAndWriteCameraA
|
||||
EXPECT_TRUE(light->GetCastsShadows());
|
||||
}
|
||||
|
||||
TEST_F(MonoScriptRuntimeTest, ManagedMeshComponentWrappersReadAndWritePathsAndFlags) {
|
||||
Scene* runtimeScene = CreateScene("MonoRuntimeScene");
|
||||
GameObject* host = runtimeScene->CreateGameObject("Host");
|
||||
MeshFilterComponent* meshFilter = host->AddComponent<MeshFilterComponent>();
|
||||
MeshRendererComponent* meshRenderer = host->AddComponent<MeshRendererComponent>();
|
||||
ScriptComponent* component = AddScript(host, "Gameplay", "MeshComponentProbe");
|
||||
|
||||
meshFilter->SetMeshPath("Meshes/initial.mesh");
|
||||
meshRenderer->SetMaterialPath(0, "Materials/initial.mat");
|
||||
meshRenderer->SetCastShadows(true);
|
||||
meshRenderer->SetReceiveShadows(false);
|
||||
meshRenderer->SetRenderLayer(7);
|
||||
|
||||
engine->OnRuntimeStart(runtimeScene);
|
||||
engine->OnUpdate(0.016f);
|
||||
|
||||
bool hasMeshFilter = false;
|
||||
bool hasMeshRenderer = false;
|
||||
bool meshFilterLookupSucceeded = false;
|
||||
bool meshRendererLookupSucceeded = false;
|
||||
std::string observedInitialMeshPath;
|
||||
std::string observedUpdatedMeshPath;
|
||||
int32_t observedInitialMaterialCount = 0;
|
||||
std::string observedInitialMaterial0Path;
|
||||
bool observedInitialCastShadows = false;
|
||||
bool observedInitialReceiveShadows = true;
|
||||
int32_t observedInitialRenderLayer = 0;
|
||||
int32_t observedUpdatedMaterialCount = 0;
|
||||
std::string observedUpdatedMaterial1Path;
|
||||
bool observedUpdatedCastShadows = true;
|
||||
bool observedUpdatedReceiveShadows = false;
|
||||
int32_t observedUpdatedRenderLayer = 0;
|
||||
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "HasMeshFilter", hasMeshFilter));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "HasMeshRenderer", hasMeshRenderer));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "MeshFilterLookupSucceeded", meshFilterLookupSucceeded));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "MeshRendererLookupSucceeded", meshRendererLookupSucceeded));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialMeshPath", observedInitialMeshPath));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedMeshPath", observedUpdatedMeshPath));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialMaterialCount", observedInitialMaterialCount));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialMaterial0Path", observedInitialMaterial0Path));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialCastShadows", observedInitialCastShadows));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialReceiveShadows", observedInitialReceiveShadows));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialRenderLayer", observedInitialRenderLayer));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedMaterialCount", observedUpdatedMaterialCount));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedMaterial1Path", observedUpdatedMaterial1Path));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedCastShadows", observedUpdatedCastShadows));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedReceiveShadows", observedUpdatedReceiveShadows));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedRenderLayer", observedUpdatedRenderLayer));
|
||||
|
||||
EXPECT_TRUE(hasMeshFilter);
|
||||
EXPECT_TRUE(hasMeshRenderer);
|
||||
EXPECT_TRUE(meshFilterLookupSucceeded);
|
||||
EXPECT_TRUE(meshRendererLookupSucceeded);
|
||||
EXPECT_EQ(observedInitialMeshPath, "Meshes/initial.mesh");
|
||||
EXPECT_EQ(observedUpdatedMeshPath, "Meshes/runtime_override.mesh");
|
||||
EXPECT_EQ(observedInitialMaterialCount, 1);
|
||||
EXPECT_EQ(observedInitialMaterial0Path, "Materials/initial.mat");
|
||||
EXPECT_TRUE(observedInitialCastShadows);
|
||||
EXPECT_FALSE(observedInitialReceiveShadows);
|
||||
EXPECT_EQ(observedInitialRenderLayer, 7);
|
||||
EXPECT_EQ(observedUpdatedMaterialCount, 2);
|
||||
EXPECT_EQ(observedUpdatedMaterial1Path, "Materials/runtime_override.mat");
|
||||
EXPECT_FALSE(observedUpdatedCastShadows);
|
||||
EXPECT_TRUE(observedUpdatedReceiveShadows);
|
||||
EXPECT_EQ(observedUpdatedRenderLayer, 11);
|
||||
|
||||
EXPECT_EQ(meshFilter->GetMeshPath(), "Meshes/runtime_override.mesh");
|
||||
ASSERT_EQ(meshRenderer->GetMaterialCount(), 2u);
|
||||
EXPECT_EQ(meshRenderer->GetMaterialPath(0), "Materials/initial.mat");
|
||||
EXPECT_EQ(meshRenderer->GetMaterialPath(1), "Materials/runtime_override.mat");
|
||||
EXPECT_FALSE(meshRenderer->GetCastShadows());
|
||||
EXPECT_TRUE(meshRenderer->GetReceiveShadows());
|
||||
EXPECT_EQ(meshRenderer->GetRenderLayer(), 11u);
|
||||
}
|
||||
|
||||
TEST_F(MonoScriptRuntimeTest, TransformHierarchyApiExposesParentChildAndReparenting) {
|
||||
Scene* runtimeScene = CreateScene("MonoRuntimeScene");
|
||||
GameObject* root = runtimeScene->CreateGameObject("Root");
|
||||
|
||||
Reference in New Issue
Block a user