Fix incorrect icon rendering (#6454)
* fix incorrect icon rendering Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com> * add redundant parens Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com> * add tests for icon display fixes Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com> * update references to EditorVisibleEntityDataCache to EditorVisibleEntityDataCacheInterface Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com> * updates following review feedback and remaining updates for EditorVisibleEntityDataCacheInterface Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com>monroegm-disable-blank-issue-2
parent
f5fcab75d6
commit
dd0f21b460
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzToolsFramework/API/EditorViewportIconDisplayInterface.h>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
namespace UnitTest
|
||||
{
|
||||
class MockEditorViewportIconDisplayInterface : public AZ::Interface<AzToolsFramework::EditorViewportIconDisplayInterface>::Registrar
|
||||
{
|
||||
public:
|
||||
virtual ~MockEditorViewportIconDisplayInterface() = default;
|
||||
|
||||
//! AzToolsFramework::EditorViewportIconDisplayInterface overrides ...
|
||||
MOCK_METHOD1(DrawIcon, void(const DrawParameters&));
|
||||
MOCK_METHOD1(GetOrLoadIconForPath, IconId(AZStd::string_view path));
|
||||
MOCK_METHOD1(GetIconLoadStatus, IconLoadStatus(IconId icon));
|
||||
};
|
||||
} // namespace UnitTest
|
||||
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.h>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
namespace UnitTest
|
||||
{
|
||||
class MockEditorVisibleEntityDataCacheInterface : public AzToolsFramework::EditorVisibleEntityDataCacheInterface
|
||||
{
|
||||
using ComponentEntityAccentType = AzToolsFramework::Components::EditorSelectionAccentSystemComponent::ComponentEntityAccentType;
|
||||
|
||||
public:
|
||||
virtual ~MockEditorVisibleEntityDataCacheInterface() = default;
|
||||
|
||||
// AzToolsFramework::EditorVisibleEntityDataCacheInterface overrides ...
|
||||
MOCK_CONST_METHOD0(VisibleEntityDataCount, size_t());
|
||||
MOCK_CONST_METHOD1(GetVisibleEntityPosition, AZ::Vector3(size_t));
|
||||
MOCK_CONST_METHOD1(GetVisibleEntityTransform, const AZ::Transform&(size_t));
|
||||
MOCK_CONST_METHOD1(GetVisibleEntityId, AZ::EntityId(size_t));
|
||||
MOCK_CONST_METHOD1(GetVisibleEntityAccent, ComponentEntityAccentType(size_t));
|
||||
MOCK_CONST_METHOD1(IsVisibleEntityLocked, bool(size_t));
|
||||
MOCK_CONST_METHOD1(IsVisibleEntityVisible, bool(size_t));
|
||||
MOCK_CONST_METHOD1(IsVisibleEntitySelected, bool(size_t));
|
||||
MOCK_CONST_METHOD1(IsVisibleEntityIconHidden, bool(size_t));
|
||||
MOCK_CONST_METHOD1(IsVisibleEntityIndividuallySelectableInViewport, bool(size_t));
|
||||
MOCK_CONST_METHOD1(GetVisibleEntityIndexFromId, AZStd::optional<size_t>(AZ::EntityId entityId));
|
||||
};
|
||||
} // namespace UnitTest
|
||||
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzToolsFramework/FocusMode/FocusModeInterface.h>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
namespace UnitTest
|
||||
{
|
||||
class MockFocusModeInterface : public AZ::Interface<AzToolsFramework::FocusModeInterface>::Registrar
|
||||
{
|
||||
public:
|
||||
virtual ~MockFocusModeInterface() = default;
|
||||
|
||||
// AzToolsFramework::FocusModeInterface overrides ...
|
||||
MOCK_METHOD1(SetFocusRoot, void(AZ::EntityId entityId));
|
||||
MOCK_METHOD1(ClearFocusRoot, void(AzFramework::EntityContextId entityContextId));
|
||||
MOCK_METHOD1(GetFocusRoot, AZ::EntityId(AzFramework::EntityContextId entityContextId));
|
||||
MOCK_METHOD1(GetFocusedEntities, AzToolsFramework::EntityIdList(AzFramework::EntityContextId entityContextId));
|
||||
MOCK_CONST_METHOD1(IsInFocusSubTree, bool(AZ::EntityId entityId));
|
||||
};
|
||||
} // namespace UnitTest
|
||||
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzCore/UnitTest/TestTypes.h>
|
||||
#include <AzFramework/UnitTest/TestDebugDisplayRequests.h>
|
||||
#include <AzFramework/Viewport/CameraState.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
#include <AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h>
|
||||
#include <AzToolsFramework/UnitTest/Mocks/MockEditorViewportIconDisplayInterface.h>
|
||||
#include <AzToolsFramework/UnitTest/Mocks/MockEditorVisibleEntityDataCacheInterface.h>
|
||||
#include <AzToolsFramework/UnitTest/Mocks/MockFocusModeInterface.h>
|
||||
#include <AzToolsFramework/ViewportSelection/EditorHelpers.h>
|
||||
#include <AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.h>
|
||||
|
||||
namespace UnitTest
|
||||
{
|
||||
class EditorViewportIconFixture : public AllocatorsTestFixture
|
||||
{
|
||||
public:
|
||||
inline static constexpr AzFramework::ViewportId TestViewportId = 2468;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
AllocatorsTestFixture::SetUp();
|
||||
|
||||
m_focusModeMock = AZStd::make_unique<::testing::NiceMock<MockFocusModeInterface>>();
|
||||
m_editorViewportIconDisplayMock = AZStd::make_unique<::testing::NiceMock<MockEditorViewportIconDisplayInterface>>();
|
||||
m_entityVisibleEntityDataCacheMock = AZStd::make_unique<::testing::NiceMock<MockEditorVisibleEntityDataCacheInterface>>();
|
||||
m_editorHelpers = AZStd::make_unique<AzToolsFramework::EditorHelpers>(m_entityVisibleEntityDataCacheMock.get());
|
||||
m_viewportSettings = AZStd::make_unique<ViewportSettingsTestImpl>();
|
||||
|
||||
m_viewportSettings->Connect(TestViewportId);
|
||||
m_viewportSettings->m_helpersVisible = false;
|
||||
m_viewportSettings->m_iconsVisible = true;
|
||||
|
||||
m_cameraState = AzFramework::CreateDefaultCamera(AZ::Transform::CreateIdentity(), AZ::Vector2(1024.0f, 768.0f));
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::Return;
|
||||
ON_CALL(*m_entityVisibleEntityDataCacheMock, VisibleEntityDataCount()).WillByDefault(Return(1));
|
||||
ON_CALL(*m_entityVisibleEntityDataCacheMock, GetVisibleEntityId(_)).WillByDefault(Return(AZ::EntityId()));
|
||||
ON_CALL(*m_entityVisibleEntityDataCacheMock, IsVisibleEntityIconHidden(_)).WillByDefault(Return(false));
|
||||
ON_CALL(*m_entityVisibleEntityDataCacheMock, IsVisibleEntityVisible(_)).WillByDefault(Return(true));
|
||||
ON_CALL(*m_focusModeMock, IsInFocusSubTree(_)).WillByDefault(Return(true));
|
||||
}
|
||||
|
||||
void TearDown() override
|
||||
{
|
||||
m_viewportSettings->Disconnect();
|
||||
m_viewportSettings.reset();
|
||||
m_editorHelpers.reset();
|
||||
m_entityVisibleEntityDataCacheMock.reset();
|
||||
m_editorViewportIconDisplayMock.reset();
|
||||
m_focusModeMock.reset();
|
||||
|
||||
AllocatorsTestFixture::TearDown();
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<ViewportSettingsTestImpl> m_viewportSettings;
|
||||
AZStd::unique_ptr<AzToolsFramework::EditorHelpers> m_editorHelpers;
|
||||
AZStd::unique_ptr<::testing::NiceMock<MockFocusModeInterface>> m_focusModeMock;
|
||||
AZStd::unique_ptr<::testing::NiceMock<MockEditorVisibleEntityDataCacheInterface>> m_entityVisibleEntityDataCacheMock;
|
||||
AZStd::unique_ptr<::testing::NiceMock<MockEditorViewportIconDisplayInterface>> m_editorViewportIconDisplayMock;
|
||||
AzFramework::CameraState m_cameraState;
|
||||
};
|
||||
|
||||
TEST_F(EditorViewportIconFixture, ViewportIconsAreNotDisplayedWhenInBetweenCameraAndNearClipPlane)
|
||||
{
|
||||
NullDebugDisplayRequests nullDebugDisplayRequests;
|
||||
|
||||
const auto insideNearClip = m_cameraState.m_nearClip * 0.5f;
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::Return;
|
||||
// given
|
||||
// entity position (where icon will be drawn) is in between near clip plane and camera position
|
||||
ON_CALL(*m_entityVisibleEntityDataCacheMock, GetVisibleEntityPosition(_))
|
||||
.WillByDefault(Return(AZ::Vector3(0.0f, insideNearClip, 0.0f)));
|
||||
|
||||
EXPECT_CALL(*m_editorViewportIconDisplayMock, DrawIcon(_)).Times(0);
|
||||
|
||||
// when
|
||||
m_editorHelpers->DisplayHelpers(
|
||||
AzFramework::ViewportInfo{ TestViewportId }, m_cameraState, nullDebugDisplayRequests,
|
||||
[](AZ::EntityId)
|
||||
{
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(EditorViewportIconFixture, ViewportIconsAreNotDisplayedWhenBehindCamera)
|
||||
{
|
||||
NullDebugDisplayRequests nullDebugDisplayRequests;
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::Return;
|
||||
// given
|
||||
// entity position (where icon will be drawn) behind the camera position
|
||||
ON_CALL(*m_entityVisibleEntityDataCacheMock, GetVisibleEntityPosition(_)).WillByDefault(Return(AZ::Vector3(0.0f, -1.0f, 0.0f)));
|
||||
|
||||
EXPECT_CALL(*m_editorViewportIconDisplayMock, DrawIcon(_)).Times(0);
|
||||
|
||||
// when
|
||||
m_editorHelpers->DisplayHelpers(
|
||||
AzFramework::ViewportInfo{ TestViewportId }, m_cameraState, nullDebugDisplayRequests,
|
||||
[](AZ::EntityId)
|
||||
{
|
||||
return true;
|
||||
});
|
||||
}
|
||||
} // namespace UnitTest
|
||||
Loading…
Reference in New Issue