Files
EVEngine/test/editor_gizmo_preview.cpp
西风逍遥游andCursor 24502babef Nest satellite packages under their host modules.
Keep CMake module names and trim switches, but stop flattening editing/editor and runtime bridges as top-level src/modules directories. Parent scans skip nested facets so runtime-3d can drop authoring by directory leaf.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 17:56:12 +08:00

60 lines
2.9 KiB
C++

#include "editor/gizmo/editing/DomainGizmoPreview.h"
#include "audio/editing/AudioTarget.h"
#include "graphics/lighting/editing/LightingTarget.h"
#include "physics/editing/PhysicsTarget.h"
#include "zeroerr/assert.h"
#include "zeroerr/unittest.h"
using namespace eve::domain_gizmo_editing;
using namespace eve::editing;
namespace {
SelectionSnapshot selection(const char* target) {
SelectionSnapshot result;
result.items.push_back({SelectionDomain::Custom, TargetId(target), StableId("self"), "object"});
return result;
}
void set(IPropertyProvider& provider, IDomainOperationTarget& target,
const SelectionSnapshot& selected, const char* path, EditorValue value) {
auto operation = provider.makeSet(selected, PropertyPath(path), value, PropertySetMode::Absolute);
REQUIRE(operation.ok()); CHECK(target.applyDomainOperation(operation.value()).ok());
}
}
TEST_CASE("editor.gizmo.builds_physics_audio_and_light_overlays") {
EditorGizmoPreviewBuilder builder;
PhysicsColliderTarget collider("shape", 3);
set(collider, collider, selection("shape"), "shape.kind", "capsule");
set(collider, collider, selection("shape"), "shape.radius", 0.75);
set(collider, collider, selection("shape"), "shape.capsule-height", 2.0);
auto colliderGizmo = builder.collider(collider);
CHECK_EQ(static_cast<int>(colliderGizmo.status), static_cast<int>(EditorStatus::Applied));
REQUIRE_EQ(colliderGizmo.primitives.size(), 1U); CHECK_EQ(colliderGizmo.primitives[0].kind, "wire-capsule");
PhysicsJointTarget joint("hinge");
set(joint, joint, selection("hinge"), "body.a", "body-a");
set(joint, joint, selection("hinge"), "body.b", "body-b");
auto jointGizmo = builder.joint(joint, [](const std::string& body) {
return eve::editing::applied<std::array<double, 3>>(
body == "body-a" ? std::array<double, 3>{0.0, 0.0, 0.0}
: std::array<double, 3>{2.0, 0.0, 0.0});
});
CHECK_EQ(static_cast<int>(jointGizmo.status), static_cast<int>(EditorStatus::Applied));
CHECK_EQ(jointGizmo.primitives.size(), 4U); CHECK_EQ(jointGizmo.primitives[2].length, 2.0);
AudioSourceTarget audio("speaker");
set(audio, audio, selection("speaker"), "spatial.reference-distance", 2.0);
set(audio, audio, selection("speaker"), "spatial.maximum-distance", 12.0);
auto audioGizmo = builder.audioSource(audio);
CHECK_EQ(static_cast<int>(audioGizmo.status), static_cast<int>(EditorStatus::Applied));
CHECK_EQ(audioGizmo.primitives.size(), 3U); CHECK_EQ(audioGizmo.primitives[1].radius, 12.0);
Light3DDocumentTarget light("sun");
set(light, light, selection("sun"), "light.type", "dir");
auto lightGizmo = builder.light(light);
CHECK_EQ(static_cast<int>(lightGizmo.status), static_cast<int>(EditorStatus::Applied));
REQUIRE_EQ(lightGizmo.primitives.size(), 1U); CHECK_EQ(lightGizmo.primitives[0].kind, "arrow");
}