Merge branch 'development' into cmake/SPEC-2513_w4244
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> # Conflicts: # Code/Framework/Crcfix/crcfix.cpp
This commit is contained in:
@@ -32,9 +32,6 @@
|
||||
#include <AzToolsFramework/API/EditorLevelNotificationBus.h>
|
||||
#include <AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h>
|
||||
|
||||
// CryCommon
|
||||
#include <CryCommon/IAudioSystem.h>
|
||||
|
||||
// Editor
|
||||
#include "Settings.h"
|
||||
|
||||
@@ -60,6 +57,7 @@
|
||||
#include <Atom/RPI.Public/ViewportContextBus.h>
|
||||
|
||||
// LmbrCentral
|
||||
#include <LmbrCentral/Audio/AudioSystemComponentBus.h>
|
||||
#include <LmbrCentral/Rendering/EditorLightComponentBus.h> // for LmbrCentral::EditorLightComponentRequestBus
|
||||
|
||||
//#define PROFILE_LOADING_WITH_VTUNE
|
||||
@@ -269,20 +267,7 @@ void CCryEditDoc::DeleteContents()
|
||||
CErrorReportDialog::Clear();
|
||||
|
||||
// Unload level specific audio binary data.
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_UNLOAD_AFCM_DATA_BY_SCOPE> oAMData(Audio::eADS_LEVEL_SPECIFIC);
|
||||
Audio::SAudioRequest oAudioRequestData;
|
||||
oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING);
|
||||
oAudioRequestData.pData = &oAMData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
// Now unload level specific audio config data.
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_CLEAR_CONTROLS_DATA> oAMData2(Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData2;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_CLEAR_PRELOADS_DATA> oAMData3(Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData3;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequestBus::Events::LevelUnloadAudio);
|
||||
|
||||
GetIEditor()->Notify(eNotify_OnSceneClosed);
|
||||
CrySystemEventBus::Broadcast(&CrySystemEventBus::Events::OnCryEditorSceneClosed);
|
||||
@@ -413,32 +398,11 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename)
|
||||
#ifdef PROFILE_LOADING_WITH_VTUNE
|
||||
VTResume();
|
||||
#endif
|
||||
// Parse level specific config data.
|
||||
const char* controlsPath = nullptr;
|
||||
Audio::AudioSystemRequestBus::BroadcastResult(controlsPath, &Audio::AudioSystemRequestBus::Events::GetControlsPath);
|
||||
QString sAudioLevelPath(controlsPath);
|
||||
sAudioLevelPath += "levels/";
|
||||
AZStd::string const sLevelNameOnly = PathUtil::GetFileName(fileName.toUtf8().data());
|
||||
sAudioLevelPath += sLevelNameOnly.c_str();
|
||||
QByteArray path = sAudioLevelPath.toUtf8();
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PARSE_CONTROLS_DATA> oAMData(path, Audio::eADS_LEVEL_SPECIFIC);
|
||||
Audio::SAudioRequest oAudioRequestData;
|
||||
oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING); // Needs to be blocking so data is available for next preloading request!
|
||||
oAudioRequestData.pData = &oAMData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PARSE_PRELOADS_DATA> oAMData2(path, Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData2;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::TAudioPreloadRequestID nPreloadRequestID = INVALID_AUDIO_PRELOAD_REQUEST_ID;
|
||||
Audio::AudioSystemRequestBus::BroadcastResult(nPreloadRequestID, &Audio::AudioSystemRequestBus::Events::GetAudioPreloadRequestID, sLevelNameOnly.c_str());
|
||||
if (nPreloadRequestID != INVALID_AUDIO_PRELOAD_REQUEST_ID)
|
||||
{
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PRELOAD_SINGLE_REQUEST> oAMData3(nPreloadRequestID);
|
||||
oAudioRequestData.pData = &oAMData3;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
}
|
||||
// Load level-specific audio data.
|
||||
AZStd::string levelFileName{ fileName.toUtf8().constData() };
|
||||
AZStd::to_lower(levelFileName.begin(), levelFileName.end());
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(
|
||||
&LmbrCentral::AudioSystemComponentRequestBus::Events::LevelLoadAudio, AZStd::string_view{ levelFileName });
|
||||
|
||||
{
|
||||
CAutoLogTime logtime("Game Engine level load");
|
||||
|
||||
@@ -77,7 +77,7 @@ namespace UnitTest
|
||||
class ViewportManipulatorControllerFixture : public AllocatorsTestFixture
|
||||
{
|
||||
public:
|
||||
static const AzFramework::ViewportId TestViewportId = AzFramework::ViewportId(0);
|
||||
static const AzFramework::ViewportId TestViewportId;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
@@ -108,6 +108,8 @@ namespace UnitTest
|
||||
AZStd::unique_ptr<AzToolsFramework::QtEventToAzInputMapper> m_inputChannelMapper;
|
||||
};
|
||||
|
||||
const AzFramework::ViewportId ViewportManipulatorControllerFixture::TestViewportId = AzFramework::ViewportId(0);
|
||||
|
||||
TEST_F(ViewportManipulatorControllerFixture, An_event_is_not_propagated_to_the_viewport_when_a_manipulator_handles_it_first)
|
||||
{
|
||||
// forward input events to our controller list
|
||||
|
||||
@@ -97,6 +97,7 @@ AZ_POP_DISABLE_WARNING
|
||||
#include "ActionManager.h"
|
||||
|
||||
#include <ImGuiBus.h>
|
||||
#include <LmbrCentral/Audio/AudioSystemComponentBus.h>
|
||||
|
||||
using namespace AZ;
|
||||
using namespace AzQtComponents;
|
||||
@@ -1474,25 +1475,22 @@ int MainWindow::ViewPaneVersion() const
|
||||
|
||||
void MainWindow::OnStopAllSounds()
|
||||
{
|
||||
Audio::SAudioRequest oStopAllSoundsRequest;
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_STOP_ALL_SOUNDS> oStopAllSoundsRequestData;
|
||||
oStopAllSoundsRequest.pData = &oStopAllSoundsRequestData;
|
||||
|
||||
CryLogAlways("<Audio> Executed \"Stop All Sounds\" command.");
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequest, oStopAllSoundsRequest);
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalStopAllSounds);
|
||||
}
|
||||
|
||||
void MainWindow::OnRefreshAudioSystem()
|
||||
{
|
||||
QString sLevelName = GetIEditor()->GetGameEngine()->GetLevelName();
|
||||
AZStd::string levelName;
|
||||
AzToolsFramework::EditorRequestBus::BroadcastResult(levelName, &AzToolsFramework::EditorRequestBus::Events::GetLevelName);
|
||||
AZStd::to_lower(levelName.begin(), levelName.end());
|
||||
|
||||
if (QString::compare(sLevelName, "Untitled", Qt::CaseInsensitive) == 0)
|
||||
if (levelName == "untitled")
|
||||
{
|
||||
// Rather pass nullptr to indicate that no level is loaded!
|
||||
sLevelName = QString();
|
||||
levelName.clear();
|
||||
}
|
||||
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::RefreshAudioSystem, sLevelName.toUtf8().data());
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(
|
||||
&LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalRefreshAudio, AZStd::string_view{ levelName });
|
||||
}
|
||||
|
||||
void MainWindow::SaveLayout()
|
||||
|
||||
@@ -43,6 +43,8 @@
|
||||
#include <AzCore/Casting/numeric_cast.h>
|
||||
#include <AzToolsFramework/Viewport/ViewportMessages.h>
|
||||
|
||||
#include <LmbrCentral/Audio/AudioSystemComponentBus.h>
|
||||
|
||||
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
||||
#include "ui_ViewportTitleDlg.h"
|
||||
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
||||
@@ -119,17 +121,20 @@ CViewportTitleDlg::CViewportTitleDlg(QWidget* pParent)
|
||||
LoadCustomPresets("AspectRatioPresets", "AspectRatioPreset", m_customAspectRatioPresets);
|
||||
LoadCustomPresets("ResPresets", "ResPreset", m_customResPresets);
|
||||
|
||||
// audio request setup
|
||||
m_oMuteAudioRequest.pData = &m_oMuteAudioRequestData;
|
||||
m_oUnmuteAudioRequest.pData = &m_oUnmuteAudioRequestData;
|
||||
|
||||
SetupCameraDropdownMenu();
|
||||
SetupResolutionDropdownMenu();
|
||||
SetupViewportInformationMenu();
|
||||
SetupHelpersButton();
|
||||
SetupOverflowMenu();
|
||||
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequest, gSettings.bMuteAudio ? m_oMuteAudioRequest : m_oUnmuteAudioRequest);
|
||||
if (gSettings.bMuteAudio)
|
||||
{
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalMuteAudio);
|
||||
}
|
||||
else
|
||||
{
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalUnmuteAudio);
|
||||
}
|
||||
|
||||
connect(this, &CViewportTitleDlg::ActionTriggered, MainWindow::instance()->GetActionManager(), &ActionManager::ActionTriggered);
|
||||
|
||||
@@ -877,25 +882,33 @@ void CViewportTitleDlg::OnBnClickedGotoPosition()
|
||||
void CViewportTitleDlg::OnBnClickedMuteAudio()
|
||||
{
|
||||
gSettings.bMuteAudio = !gSettings.bMuteAudio;
|
||||
|
||||
Audio::AudioSystemRequestBus::Broadcast(
|
||||
&Audio::AudioSystemRequestBus::Events::PushRequest, gSettings.bMuteAudio ? m_oMuteAudioRequest : m_oUnmuteAudioRequest);
|
||||
if (gSettings.bMuteAudio)
|
||||
{
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalMuteAudio);
|
||||
}
|
||||
else
|
||||
{
|
||||
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalUnmuteAudio);
|
||||
}
|
||||
|
||||
UpdateMuteActionText();
|
||||
}
|
||||
|
||||
void CViewportTitleDlg::UpdateMuteActionText()
|
||||
{
|
||||
if (!Audio::AudioSystemRequestBus::HasHandlers())
|
||||
{
|
||||
m_audioMuteAction->setEnabled(false);
|
||||
m_audioMuteAction->setText(tr("Mute Audio: Enable Audio Gem"));
|
||||
}
|
||||
else
|
||||
bool audioSystemConnected = false;
|
||||
LmbrCentral::AudioSystemComponentRequestBus::BroadcastResult(
|
||||
audioSystemConnected, &LmbrCentral::AudioSystemComponentRequestBus::Events::IsAudioSystemInitialized);
|
||||
if (audioSystemConnected)
|
||||
{
|
||||
m_audioMuteAction->setEnabled(true);
|
||||
m_audioMuteAction->setText(gSettings.bMuteAudio ? tr("Un-mute Audio") : tr("Mute Audio"));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_audioMuteAction->setEnabled(false);
|
||||
m_audioMuteAction->setText(tr("Mute Audio: Enable Audio Gem"));
|
||||
}
|
||||
}
|
||||
|
||||
void CViewportTitleDlg::OnHMDInitialized()
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/Component/Component.h>
|
||||
|
||||
#include <IAudioSystem.h>
|
||||
|
||||
#include <functional>
|
||||
#include <QSharedPointer>
|
||||
#include <QWidgetAction>
|
||||
@@ -178,12 +176,6 @@ protected:
|
||||
QWidgetAction* m_gridSizeActionWidget = nullptr;
|
||||
QWidgetAction* m_angleSizeActionWidget = nullptr;
|
||||
|
||||
Audio::SAudioRequest m_oMuteAudioRequest;
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_MUTE_ALL> m_oMuteAudioRequestData;
|
||||
Audio::SAudioRequest m_oUnmuteAudioRequest;
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_UNMUTE_ALL> m_oUnmuteAudioRequestData;
|
||||
|
||||
|
||||
QScopedPointer<Ui::ViewportTitleDlg> m_ui;
|
||||
};
|
||||
|
||||
|
||||
@@ -366,7 +366,7 @@ bool SpinBoxWatcher::filterSpinBoxEvents(QAbstractSpinBox* spinBox, QEvent* even
|
||||
{
|
||||
// To prevent the event being turned into a focus event, be sure to install an
|
||||
// AzQtComponents::GlobalEventFilter on your QApplication instance.
|
||||
event->ignore();
|
||||
event->accept();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+10
@@ -15,6 +15,7 @@
|
||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabLoaderInterface.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabSystemComponentInterface.h>
|
||||
#include <Prefab/PrefabDomUtils.h>
|
||||
|
||||
namespace AzToolsFramework
|
||||
{
|
||||
@@ -81,6 +82,15 @@ namespace AzToolsFramework
|
||||
result.Combine(resultInstances);
|
||||
}
|
||||
|
||||
PrefabDomUtils::LinkIdMetadata* subPathLinkId = context.GetMetadata().Find<PrefabDomUtils::LinkIdMetadata>();
|
||||
if (subPathLinkId)
|
||||
{
|
||||
AZ::ScopedContextPath subPathSource(context, "m_linkId");
|
||||
|
||||
result = ContinueStoringToJsonObjectField(
|
||||
outputValue, "LinkId", &(instance->m_linkId), &InvalidLinkId, azrtti_typeid<decltype(instance->m_linkId)>(), context);
|
||||
}
|
||||
|
||||
return context.Report(result,
|
||||
result.GetProcessing() == JSR::Processing::Completed ? "Successfully stored Instance information for Prefab." :
|
||||
"Failed to store Instance information for Prefab.");
|
||||
|
||||
@@ -88,6 +88,11 @@ namespace AzToolsFramework
|
||||
settings.m_keepDefaults = true;
|
||||
}
|
||||
|
||||
if ((flags & StoreFlags::StoreLinkIds) != StoreFlags::None)
|
||||
{
|
||||
settings.m_metadata.Create<LinkIdMetadata>();
|
||||
}
|
||||
|
||||
AZStd::string scratchBuffer;
|
||||
auto issueReportingCallback = [&scratchBuffer]
|
||||
(AZStd::string_view message, AZ::JsonSerializationResult::ResultCode result,
|
||||
|
||||
@@ -45,7 +45,11 @@ namespace AzToolsFramework
|
||||
|
||||
//! By default an instance will be stored with default values. In cases where we want to store less json without defaults
|
||||
//! such as saving to disk, this flag will control that behavior.
|
||||
StripDefaultValues = 1 << 0
|
||||
StripDefaultValues = 1 << 0,
|
||||
|
||||
//! We do not save linkIds to file. However when loading a level we want to temporarily save
|
||||
//! linkIds to instance dom so any nested prefabs will have linkIds correctly set.
|
||||
StoreLinkIds = 1 << 1
|
||||
};
|
||||
AZ_DEFINE_ENUM_BITWISE_OPERATORS(StoreFlags);
|
||||
|
||||
@@ -150,6 +154,14 @@ namespace AzToolsFramework
|
||||
[[maybe_unused]] const AZStd::string_view printMessage,
|
||||
[[maybe_unused]] const AzToolsFramework::Prefab::PrefabDomValue& prefabDomValue);
|
||||
|
||||
//! An empty struct for passing to JsonSerializerSettings.m_metadata that is consumed by InstanceSerializer::Store.
|
||||
//! If present in metadata, linkIds will be stored to instance dom.
|
||||
struct LinkIdMetadata
|
||||
{
|
||||
AZ_RTTI(LinkIdMetadata, "{8FF7D299-14E3-41D4-90C5-393A240FAE7C}");
|
||||
|
||||
virtual ~LinkIdMetadata() {}
|
||||
};
|
||||
} // namespace PrefabDomUtils
|
||||
} // namespace Prefab
|
||||
} // namespace AzToolsFramework
|
||||
|
||||
@@ -300,7 +300,7 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
PrefabDom storedPrefabDom(&loadedTemplateDom->get().GetAllocator());
|
||||
if (!PrefabDomUtils::StoreInstanceInPrefabDom(loadedPrefabInstance, storedPrefabDom))
|
||||
if (!PrefabDomUtils::StoreInstanceInPrefabDom(loadedPrefabInstance, storedPrefabDom, PrefabDomUtils::StoreFlags::StoreLinkIds))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace AzToolsFramework
|
||||
m_prefabUndoCache.Destroy();
|
||||
}
|
||||
|
||||
PrefabOperationResult PrefabPublicHandler::CreatePrefabInMemory(const AZStd::vector<AZ::EntityId>& entityIds, AZ::IO::PathView filePath)
|
||||
PrefabOperationResult PrefabPublicHandler::CreatePrefabInMemory(const EntityIdList& entityIds, AZ::IO::PathView filePath)
|
||||
{
|
||||
EntityList inputEntityList, topLevelEntities;
|
||||
AZ::EntityId commonRootEntityId;
|
||||
@@ -264,7 +264,7 @@ namespace AzToolsFramework
|
||||
return AZ::Success();
|
||||
}
|
||||
|
||||
PrefabOperationResult PrefabPublicHandler::CreatePrefabInDisk(const AZStd::vector<AZ::EntityId>& entityIds, AZ::IO::PathView filePath)
|
||||
PrefabOperationResult PrefabPublicHandler::CreatePrefabInDisk(const EntityIdList& entityIds, AZ::IO::PathView filePath)
|
||||
{
|
||||
auto result = CreatePrefabInMemory(entityIds, filePath);
|
||||
if (result.IsSuccess())
|
||||
|
||||
@@ -43,9 +43,9 @@ namespace AzToolsFramework
|
||||
|
||||
// PrefabPublicInterface...
|
||||
PrefabOperationResult CreatePrefabInDisk(
|
||||
const AZStd::vector<AZ::EntityId>& entityIds, AZ::IO::PathView filePath) override;
|
||||
const EntityIdList& entityIds, AZ::IO::PathView filePath) override;
|
||||
PrefabOperationResult CreatePrefabInMemory(
|
||||
const AZStd::vector<AZ::EntityId>& entityIds, AZ::IO::PathView filePath) override;
|
||||
const EntityIdList& entityIds, AZ::IO::PathView filePath) override;
|
||||
InstantiatePrefabResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override;
|
||||
PrefabOperationResult SavePrefab(AZ::IO::Path filePath) override;
|
||||
PrefabEntityResult CreateEntity(AZ::EntityId parentId, const AZ::Vector3& position) override;
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace AzToolsFramework
|
||||
* @return An outcome object; on failure, it comes with an error message detailing the cause of the error.
|
||||
*/
|
||||
virtual PrefabOperationResult CreatePrefabInDisk(
|
||||
const AZStd::vector<AZ::EntityId>& entityIds, AZ::IO::PathView filePath) = 0;
|
||||
const EntityIdList& entityIds, AZ::IO::PathView filePath) = 0;
|
||||
|
||||
/**
|
||||
* Create a prefab out of the entities provided, at the path provided, and keep it in memory.
|
||||
@@ -57,7 +57,7 @@ namespace AzToolsFramework
|
||||
* @return An outcome object; on failure, it comes with an error message detailing the cause of the error.
|
||||
*/
|
||||
virtual PrefabOperationResult CreatePrefabInMemory(
|
||||
const AZStd::vector<AZ::EntityId>& entityIds, AZ::IO::PathView filePath) = 0;
|
||||
const EntityIdList& entityIds, AZ::IO::PathView filePath) = 0;
|
||||
|
||||
/**
|
||||
* Instantiate a prefab from a prefab file.
|
||||
|
||||
@@ -11,13 +11,20 @@
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/EBus/EBus.h>
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <AzCore/Outcome/Outcome.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <AzCore/std/string/string_view.h>
|
||||
|
||||
namespace AzToolsFramework
|
||||
{
|
||||
using EntityIdList = AZStd::vector<AZ::EntityId>;
|
||||
|
||||
namespace Prefab
|
||||
{
|
||||
using PrefabOperationResult = AZ::Outcome<void, AZStd::string>;
|
||||
using InstantiatePrefabResult = AZ::Outcome<AZ::EntityId, AZStd::string>;
|
||||
|
||||
/**
|
||||
* The primary purpose of this bus is to facilitate writing automated tests for prefabs.
|
||||
* It calls PrefabPublicInterface internally to talk to the prefab system.
|
||||
@@ -40,14 +47,25 @@ namespace AzToolsFramework
|
||||
/**
|
||||
* Create a prefab out of the entities provided, at the path provided, and keep it in memory.
|
||||
* Automatically detects descendants of entities, and discerns between entities and child instances.
|
||||
* Return whether the creation succeeded or not.
|
||||
*/
|
||||
virtual bool CreatePrefabInMemory(
|
||||
const AZStd::vector<AZ::EntityId>& entityIds, AZStd::string_view filePath) = 0;
|
||||
virtual PrefabOperationResult CreatePrefabInMemory(
|
||||
const EntityIdList& entityIds, AZStd::string_view filePath) = 0;
|
||||
|
||||
/**
|
||||
* Instantiate a prefab from a prefab file.
|
||||
* Return the container entity id of the prefab instantiated if instantiation succeeded.
|
||||
*/
|
||||
virtual AZ::EntityId InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) = 0;
|
||||
virtual InstantiatePrefabResult InstantiatePrefab(
|
||||
AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) = 0;
|
||||
|
||||
/**
|
||||
* Deletes all entities and their descendants from the owning instance. Bails if the entities don't
|
||||
* all belong to the same instance.
|
||||
* Return whether the deletion succeeded or not.
|
||||
*/
|
||||
virtual PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) = 0;
|
||||
|
||||
};
|
||||
|
||||
using PrefabPublicRequestBus = AZ::EBus<PrefabPublicRequests>;
|
||||
|
||||
+11
-26
@@ -25,6 +25,7 @@ namespace AzToolsFramework
|
||||
->Attribute(AZ::Script::Attributes::Module, "prefab")
|
||||
->Event("CreatePrefabInMemory", &PrefabPublicRequests::CreatePrefabInMemory)
|
||||
->Event("InstantiatePrefab", &PrefabPublicRequests::InstantiatePrefab)
|
||||
->Event("DeleteEntitiesAndAllDescendantsInInstance", &PrefabPublicRequests::DeleteEntitiesAndAllDescendantsInInstance)
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -44,36 +45,20 @@ namespace AzToolsFramework
|
||||
m_prefabPublicInterface = nullptr;
|
||||
}
|
||||
|
||||
bool PrefabPublicRequestHandler::CreatePrefabInMemory(const AZStd::vector<AZ::EntityId>& entityIds, AZStd::string_view filePath)
|
||||
PrefabOperationResult PrefabPublicRequestHandler::CreatePrefabInMemory(const EntityIdList& entityIds, AZStd::string_view filePath)
|
||||
{
|
||||
auto createPrefabOutcome = m_prefabPublicInterface->CreatePrefabInMemory(entityIds, filePath);
|
||||
if (!createPrefabOutcome.IsSuccess())
|
||||
{
|
||||
AZ_Error("CreatePrefabInMemory", false,
|
||||
"Failed to create Prefab on file path '%.*s'. Error message: %s.",
|
||||
AZ_STRING_ARG(filePath),
|
||||
createPrefabOutcome.GetError().c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return m_prefabPublicInterface->CreatePrefabInMemory(entityIds, filePath);
|
||||
}
|
||||
|
||||
AZ::EntityId PrefabPublicRequestHandler::InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position)
|
||||
InstantiatePrefabResult PrefabPublicRequestHandler::InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position)
|
||||
{
|
||||
auto instantiatePrefabOutcome = m_prefabPublicInterface->InstantiatePrefab(filePath, parent, position);
|
||||
if (!instantiatePrefabOutcome.IsSuccess())
|
||||
{
|
||||
AZ_Error("InstantiatePrefab", false,
|
||||
"Failed to instantiate Prefab on file path '%.*s'. Error message: %s.",
|
||||
AZ_STRING_ARG(filePath),
|
||||
instantiatePrefabOutcome.GetError().c_str());
|
||||
|
||||
return AZ::EntityId();
|
||||
}
|
||||
|
||||
return instantiatePrefabOutcome.GetValue();
|
||||
return m_prefabPublicInterface->InstantiatePrefab(filePath, parent, position);
|
||||
}
|
||||
|
||||
PrefabOperationResult PrefabPublicRequestHandler::DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds)
|
||||
{
|
||||
return m_prefabPublicInterface->DeleteEntitiesAndAllDescendantsInInstance(entityIds);
|
||||
}
|
||||
|
||||
} // namespace Prefab
|
||||
} // namespace AzToolsFramework
|
||||
|
||||
+3
-2
@@ -31,8 +31,9 @@ namespace AzToolsFramework
|
||||
void Connect();
|
||||
void Disconnect();
|
||||
|
||||
bool CreatePrefabInMemory(const AZStd::vector<AZ::EntityId>& entityIds, AZStd::string_view filePath) override;
|
||||
AZ::EntityId InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override;
|
||||
PrefabOperationResult CreatePrefabInMemory(const EntityIdList& entityIds, AZStd::string_view filePath) override;
|
||||
InstantiatePrefabResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override;
|
||||
PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) override;
|
||||
|
||||
private:
|
||||
PrefabPublicInterface* m_prefabPublicInterface = nullptr;
|
||||
|
||||
@@ -15,6 +15,5 @@ add_subdirectory(AzTest)
|
||||
add_subdirectory(AzToolsFramework)
|
||||
add_subdirectory(AzManipulatorTestFramework)
|
||||
add_subdirectory(AzNetworking)
|
||||
add_subdirectory(Crcfix)
|
||||
add_subdirectory(GFxFramework)
|
||||
add_subdirectory(GridMate)
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#
|
||||
|
||||
if (NOT PAL_TRAIT_BUILD_HOST_TOOLS)
|
||||
return()
|
||||
endif()
|
||||
|
||||
include(Platform/${PAL_PLATFORM_NAME}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
|
||||
if (NOT PAL_TRAIT_BUILD_CRCFIX)
|
||||
return()
|
||||
endif()
|
||||
|
||||
ly_add_target(
|
||||
NAME Crcfix EXECUTABLE
|
||||
NAMESPACE AZ
|
||||
FILES_CMAKE
|
||||
crcfix_files.cmake
|
||||
BUILD_DEPENDENCIES
|
||||
PRIVATE
|
||||
AZ::AzCore
|
||||
)
|
||||
|
||||
ly_add_source_properties(
|
||||
SOURCES crcfix.cpp
|
||||
PROPERTY COMPILE_DEFINITIONS
|
||||
VALUES _CRT_SECURE_NO_WARNINGS
|
||||
)
|
||||
@@ -1,9 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#
|
||||
|
||||
set(PAL_TRAIT_BUILD_CRCFIX FALSE)
|
||||
@@ -1,9 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#
|
||||
|
||||
set(PAL_TRAIT_BUILD_CRCFIX FALSE)
|
||||
@@ -1,9 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#
|
||||
|
||||
set(PAL_TRAIT_BUILD_CRCFIX TRUE)
|
||||
@@ -1,538 +0,0 @@
|
||||
/*
|
||||
* 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/PlatformIncl.h>
|
||||
#include <AzCore/Math/Crc.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <AzCore/Memory/SystemAllocator.h>
|
||||
#include <AzCore/Memory/AllocationRecords.h>
|
||||
#include <AzCore/std/chrono/chrono.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <io.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
int g_totalFixTimeMs = 0;
|
||||
int g_longestFixTimeMs = 0;
|
||||
|
||||
class Filename
|
||||
{
|
||||
wchar_t fullpath[MAX_PATH];
|
||||
wchar_t drive[_MAX_DRIVE];
|
||||
wchar_t dir[_MAX_DIR];
|
||||
wchar_t fname[_MAX_FNAME];
|
||||
wchar_t ext[_MAX_EXT];
|
||||
|
||||
public:
|
||||
Filename()
|
||||
{
|
||||
fullpath[0] = drive[0] = dir[0] = fname[0] = ext[0] = 0;
|
||||
}
|
||||
|
||||
Filename(const AZStd::wstring& filename)
|
||||
{
|
||||
_wsplitpath(filename.c_str(), drive, dir, fname, ext);
|
||||
wcscpy(fullpath, filename.c_str());
|
||||
}
|
||||
|
||||
void SetExt(const wchar_t* pExt) { wcscpy(ext, pExt); _wmakepath(fullpath, drive, dir, fname, pExt); }
|
||||
const wchar_t* GetFullPath() const { return fullpath; }
|
||||
bool Exists() const { return _waccess(fullpath, 0) == 0; }
|
||||
bool IsReadOnly() const { return _waccess(fullpath, 6) == -1; }
|
||||
bool SetReadOnly() const { return _wchmod(fullpath, _S_IREAD) == 0; }
|
||||
bool SetWritable() const { return _wchmod(fullpath, _S_IREAD | _S_IWRITE) == 0; }
|
||||
bool Delete() const { return _wremove(fullpath) == 0; }
|
||||
bool Rename(const wchar_t* fn2) const{ return MoveFileEx(fullpath, fn2, MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING) == 0; }
|
||||
bool Copy(const wchar_t* dest) const { return ::CopyFile(fullpath, dest, FALSE) == TRUE; }
|
||||
};
|
||||
|
||||
class CRCfix
|
||||
{
|
||||
int lastchar;
|
||||
int linenum;
|
||||
|
||||
public:
|
||||
void SkipToEOL(FILE* infile);
|
||||
char* GetToken(FILE* infile, FILE* outfile);
|
||||
void GetPreviousCRC(char* token, FILE* infile);
|
||||
int Fix(Filename srce);
|
||||
};
|
||||
|
||||
void FixFiles(const AZStd::wstring& dir, const AZStd::wstring& files, FILETIME* pLastRun, bool verbose, int& nFound, int& nProcessed, int& nFixed, int& nFailed)
|
||||
{
|
||||
CRCfix fixer;
|
||||
WIN32_FIND_DATA wfd;
|
||||
HANDLE hFind;
|
||||
hFind = FindFirstFile((dir + files).c_str(), &wfd);
|
||||
if (hFind != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
do
|
||||
{
|
||||
if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
|
||||
{
|
||||
if (verbose)
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "\tProcessing %ls ...", wfd.cFileName);
|
||||
}
|
||||
nFound++;
|
||||
|
||||
int n = 0;
|
||||
if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == 0 && (!pLastRun || CompareFileTime(pLastRun, &wfd.ftLastWriteTime) <= 0))
|
||||
{
|
||||
n = fixer.Fix(Filename(dir + L"\\" + wfd.cFileName));
|
||||
nProcessed++;
|
||||
}
|
||||
if (n < 0)
|
||||
{
|
||||
nFailed++;
|
||||
if (verbose)
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "Failed\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (verbose)
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", n > 0 ? "Done\n" : (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0 ? "ReadOnly\n" : "Unchanged\n");
|
||||
}
|
||||
nFixed += n;
|
||||
}
|
||||
}
|
||||
} while (FindNextFile(hFind, &wfd));
|
||||
}
|
||||
FindClose(hFind);
|
||||
}
|
||||
|
||||
void FixDirectories(const AZStd::wstring& dirs, const AZStd::wstring& files, FILETIME* pLastRun, bool verbose, int& nFound, int& nProcessed, int& nFixed, int& nFailed)
|
||||
{
|
||||
if (verbose)
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "Processing %ls ...\n", dirs.c_str());
|
||||
}
|
||||
|
||||
// do files
|
||||
FixFiles(dirs, files, pLastRun, verbose, nFound, nProcessed, nFixed, nFailed);
|
||||
|
||||
// do folders
|
||||
WIN32_FIND_DATA wfd;
|
||||
HANDLE hFind;
|
||||
hFind = FindFirstFile((dirs + L"\\*").c_str(), &wfd);
|
||||
if (hFind != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
do
|
||||
{
|
||||
if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
if (wfd.cFileName[0] == '.')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
FixDirectories(AZStd::wstring(dirs + L"\\" + wfd.cFileName), files, pLastRun, verbose, nFound, nProcessed, nFixed, nFailed);
|
||||
}
|
||||
} while (FindNextFile(hFind, &wfd));
|
||||
}
|
||||
FindClose(hFind);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
AZStd::chrono::system_clock::time_point startTime = AZStd::chrono::system_clock::now();
|
||||
|
||||
AZ::SystemAllocator::Descriptor desc;
|
||||
//desc.m_stackRecordLevels = 15;
|
||||
AZ::AllocatorInstance<AZ::SystemAllocator>::Create(desc);
|
||||
//if (AZ::AllocatorInstance<AZ::SystemAllocator>::Get().GetRecords()) {
|
||||
// AZ::AllocatorInstance<AZ::SystemAllocator>::Get().GetRecords()->SetMode(AZ::Debug::AllocationRecords::RECORD_FULL);
|
||||
//}
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "Usage:\n crcfix [-v(erbose)] [-log:logfile] {path[\\*][\\*.*]}\n");
|
||||
AZ_TracePrintf("CrcFix", "\n Ex:\n crcfix -v -log:timestamp.log src\\*\\*.cpp src\\*\\*.h ..\\scripts\\*.*\n\n");
|
||||
}
|
||||
|
||||
char root[MAX_PATH];
|
||||
AZ::Utils::GetExecutableDirectory(root, MAX_PATH);
|
||||
|
||||
AZStd::vector<AZStd::wstring> entries;
|
||||
|
||||
AZStd::wstring logfilename;
|
||||
FILETIME lastRun;
|
||||
FILETIME* pLastRun = NULL;
|
||||
|
||||
bool verbose = false;
|
||||
|
||||
for (int iArg = 1; iArg < argc; ++iArg)
|
||||
{
|
||||
const char* pArg = argv[iArg];
|
||||
if (!pArg)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
AZStd::wstring pArgW;
|
||||
AZStd::to_wstring(pArgW, pArg);
|
||||
if (_strnicmp(pArg, "-log:", 5) == 0)
|
||||
{
|
||||
logfilename.assign(pArgW.begin() + 5, pArgW.end());
|
||||
HANDLE hFile = CreateFile(logfilename.data(), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
|
||||
if (hFile != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
pLastRun = &lastRun;
|
||||
GetFileTime(hFile, NULL, NULL, pLastRun);
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
}
|
||||
else if (_stricmp(pArg, "-v") == 0)
|
||||
{
|
||||
verbose = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
entries.emplace_back(AZStd::move(pArgW));
|
||||
}
|
||||
}
|
||||
|
||||
// for each entry from the command line...
|
||||
int nFound = 0;
|
||||
int nProcessed = 0;
|
||||
int nFixed = 0;
|
||||
int nFailed = 0;
|
||||
for (AZStd::vector<AZStd::wstring>::const_iterator iEntry = entries.begin(); iEntry != entries.end(); ++iEntry)
|
||||
{
|
||||
AZStd::wstring entry = (iEntry->at(0) == L'\\' || iEntry->find(L":") != iEntry->npos) ? *iEntry : AZStd::wstring(root) + L"\\" + *iEntry;
|
||||
AZStd::wstring::size_type split = entry.find(L"*\\");
|
||||
bool doSubdirs = split != entry.npos;
|
||||
if (doSubdirs)
|
||||
{
|
||||
FixDirectories(entry.substr(0, split), entry.substr(split + 1), pLastRun, verbose, nFound, nProcessed, nFixed, nFailed);
|
||||
}
|
||||
else
|
||||
{
|
||||
split = entry.rfind(L"\\");
|
||||
if (split == entry.npos)
|
||||
{
|
||||
split = 0;
|
||||
}
|
||||
FixFiles(entry.substr(0, split), entry.substr(split), pLastRun, verbose, nFound, nProcessed, nFixed, nFailed);
|
||||
}
|
||||
}
|
||||
|
||||
// update timestamp
|
||||
if (!logfilename.empty())
|
||||
{
|
||||
HANDLE hFile = CreateFile(logfilename.data(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
|
||||
GetSystemTimeAsFileTime(&lastRun);
|
||||
SetFileTime(hFile, NULL, NULL, &lastRun);
|
||||
char log[1024];
|
||||
DWORD oCount;
|
||||
|
||||
sprintf(log, "Batches processed: %zu\n\tFiles found: %d\n\tFiles processed: %d\n\tFiles fixed: %d\n\tFiles failed: %d\n", entries.size(), nFound, nProcessed, nFixed, nFailed);
|
||||
WriteFile(hFile, log, static_cast<DWORD>(strlen(log)), &oCount, NULL);
|
||||
|
||||
AZStd::chrono::system_clock::time_point endTime = AZStd::chrono::system_clock::now();
|
||||
sprintf(log, "Total running time: %.2f secs.\n\tTotal processing time: %.2f secs.\n\tLongest processing time: %.2f secs.\n", (float)AZStd::chrono::milliseconds(endTime - startTime).count() / 1000.f, (float)g_totalFixTimeMs / 1000.f, (float)g_longestFixTimeMs / 1000.f);
|
||||
WriteFile(hFile, log, static_cast<DWORD>(strlen(log)), &oCount, NULL);
|
||||
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
}
|
||||
|
||||
AZ::AllocatorInstance<AZ::SystemAllocator>::Destroy();
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CRCfix
|
||||
//-----------------------------------------------------------------------------
|
||||
void CRCfix::SkipToEOL(FILE* infile)
|
||||
{
|
||||
int c;
|
||||
for (c = lastchar; c != EOF && c != '\n'; c = fgetc(infile))
|
||||
{
|
||||
;
|
||||
}
|
||||
lastchar = fgetc(infile);
|
||||
linenum++;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
char* CRCfix::GetToken(FILE* infile, FILE* outfile)
|
||||
{
|
||||
static char token[512];
|
||||
bool commentline = false;
|
||||
bool commentblock = false;
|
||||
bool doublequote = false;
|
||||
bool singlequote = false;
|
||||
int i = 0;
|
||||
int c;
|
||||
|
||||
if (lastchar == EOF)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (c = lastchar; c != EOF; c = fgetc(infile))
|
||||
{
|
||||
if (!commentline && !commentblock && !doublequote && !singlequote)
|
||||
{
|
||||
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '#' || c == '_')
|
||||
{
|
||||
token[i++] = static_cast<char>(c);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (i)
|
||||
{
|
||||
lastchar = c;
|
||||
token[i] = 0;
|
||||
i = 0;
|
||||
return token;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commentline)
|
||||
{
|
||||
if (c == '\n')
|
||||
{
|
||||
commentline = false;
|
||||
}
|
||||
}
|
||||
else if (commentblock)
|
||||
{
|
||||
while (c == '*')
|
||||
{
|
||||
c = fgetc(infile);
|
||||
if (c == '/')
|
||||
{
|
||||
commentblock = false;
|
||||
}
|
||||
fputc('*', outfile);
|
||||
}
|
||||
}
|
||||
|
||||
if (!commentline && !commentblock)
|
||||
{
|
||||
if (c == '"' && !singlequote)
|
||||
{
|
||||
doublequote = !doublequote;
|
||||
}
|
||||
else if (c == '\'' && !doublequote)
|
||||
{
|
||||
singlequote = !singlequote;
|
||||
}
|
||||
else if (!singlequote && !doublequote)
|
||||
{
|
||||
if (c == '/')
|
||||
{
|
||||
c = fgetc(infile);
|
||||
if (c == '/')
|
||||
{
|
||||
commentline = true;
|
||||
}
|
||||
else if (c == '*')
|
||||
{
|
||||
commentblock = true;
|
||||
}
|
||||
if (c == '\'')
|
||||
{
|
||||
singlequote = true;
|
||||
}
|
||||
else if (c == '"')
|
||||
{
|
||||
doublequote = true;
|
||||
}
|
||||
fputc('/', outfile);
|
||||
}
|
||||
}
|
||||
else if (c == '\\')
|
||||
{
|
||||
fputc(c, outfile);
|
||||
c = fgetc(infile);
|
||||
}
|
||||
}
|
||||
fputc(c, outfile);
|
||||
if (c == '\n')
|
||||
{
|
||||
linenum++;
|
||||
}
|
||||
}
|
||||
lastchar = c;
|
||||
token[i] = 0;
|
||||
return i ? token : NULL;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void CRCfix::GetPreviousCRC(char* token, FILE* infile)
|
||||
{
|
||||
int c;
|
||||
while ((c = fgetc(infile)) != ')')
|
||||
{
|
||||
*token++ = static_cast<char>(c);
|
||||
}
|
||||
*token = 0;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
int CRCfix::Fix(Filename srce)
|
||||
{
|
||||
AZStd::chrono::system_clock::time_point startTime = AZStd::chrono::system_clock::now();
|
||||
|
||||
bool changed = false;
|
||||
Filename dest(srce);
|
||||
dest.SetExt(L"xxx");
|
||||
|
||||
linenum = 0;
|
||||
|
||||
FILE* infile = _wfopen(srce.GetFullPath(), L"r");
|
||||
FILE* outfile = _wfopen(dest.GetFullPath(), L"w");
|
||||
|
||||
if (!infile || !outfile)
|
||||
{
|
||||
if (infile)
|
||||
{
|
||||
fclose(infile);
|
||||
infile = nullptr;
|
||||
}
|
||||
|
||||
if (outfile)
|
||||
{
|
||||
fclose(outfile);
|
||||
outfile = nullptr;
|
||||
}
|
||||
|
||||
int dt = static_cast<int>(AZStd::chrono::milliseconds(AZStd::chrono::system_clock::now() - startTime).count());
|
||||
g_totalFixTimeMs += dt;
|
||||
if (dt > g_longestFixTimeMs)
|
||||
{
|
||||
g_longestFixTimeMs = dt;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
lastchar = fgetc(infile);
|
||||
|
||||
while (char* token = GetToken(infile, outfile))
|
||||
{
|
||||
bool got = false;
|
||||
|
||||
if (strcmp(token, "AZ_CRC") == 0 && lastchar == '(')
|
||||
{
|
||||
size_t i = strlen(token);
|
||||
token[i++] = static_cast<char>(lastchar);
|
||||
int c = fgetc(infile);
|
||||
|
||||
if (c == '"')
|
||||
{
|
||||
size_t j = i + 1;
|
||||
|
||||
do
|
||||
{
|
||||
token[i++] = static_cast<char>(c);
|
||||
c = fgetc(infile);
|
||||
} while (c != '"');
|
||||
|
||||
token[i++] = static_cast<char>(c);
|
||||
c = fgetc(infile);
|
||||
|
||||
int oldcrc = 0, newcrc;
|
||||
|
||||
if (c == ',')
|
||||
{
|
||||
GetPreviousCRC(token + i, infile);
|
||||
sscanf(token + i, "%i", &oldcrc);
|
||||
c = ')';
|
||||
}
|
||||
|
||||
if (c == ')')
|
||||
{
|
||||
token[i] = 0;
|
||||
c = fgetc(infile);
|
||||
got = true;
|
||||
newcrc = AZ::Crc32(token + j, i - j - 1, true);
|
||||
fprintf(outfile, "%s, 0x%08x)", token, newcrc);
|
||||
if (newcrc != oldcrc)
|
||||
{
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
lastchar = c;
|
||||
token[i] = 0;
|
||||
}
|
||||
if (!got)
|
||||
{
|
||||
fwrite(token, 1, strlen(token), outfile);
|
||||
}
|
||||
}
|
||||
fclose(infile);
|
||||
fclose(outfile);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
Filename backup(srce);
|
||||
backup.SetExt(L"crcfix_old");
|
||||
|
||||
if (backup.Exists())
|
||||
{
|
||||
backup.SetWritable();
|
||||
[[maybe_unused]] bool deleted = backup.Delete();
|
||||
AZ_Assert(deleted, "failed to delete");
|
||||
}
|
||||
|
||||
if (!srce.Copy(backup.GetFullPath()))
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "Failed to copy %ls to %ls\n", srce, backup);
|
||||
|
||||
int dt = static_cast<int>(AZStd::chrono::milliseconds(AZStd::chrono::system_clock::now() - startTime).count());
|
||||
g_totalFixTimeMs += dt;
|
||||
if (dt > g_longestFixTimeMs)
|
||||
{
|
||||
g_longestFixTimeMs = dt;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!dest.Rename(srce.GetFullPath()))
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "Failed to rename %ls to %ls\n", dest, srce);
|
||||
|
||||
int dt = static_cast<int>(AZStd::chrono::milliseconds(AZStd::chrono::system_clock::now() - startTime).count());
|
||||
g_totalFixTimeMs += dt;
|
||||
if (dt > g_longestFixTimeMs)
|
||||
{
|
||||
g_longestFixTimeMs = dt;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!backup.Delete())
|
||||
{
|
||||
AZ_TracePrintf("CrcFix", "Failed to delete %ls\n", backup);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dest.Delete();
|
||||
}
|
||||
|
||||
|
||||
int dt = static_cast<int>(AZStd::chrono::milliseconds(AZStd::chrono::system_clock::now() - startTime).count());
|
||||
g_totalFixTimeMs += dt;
|
||||
if (dt > g_longestFixTimeMs)
|
||||
{
|
||||
g_longestFixTimeMs = dt;
|
||||
}
|
||||
|
||||
return changed ? 1 : 0;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -1,11 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#
|
||||
|
||||
set(FILES crcfix_files.cmake
|
||||
crcfix.cpp
|
||||
)
|
||||
@@ -246,7 +246,6 @@ struct IView
|
||||
virtual void SetScale(const float scale) = 0;
|
||||
virtual void SetZoomedScale(const float scale) = 0;
|
||||
virtual void SetActive(const bool bActive) = 0;
|
||||
virtual void UpdateAudioListener(const Matrix34& rMatrix) = 0;
|
||||
};
|
||||
|
||||
struct IViewSystemListener
|
||||
@@ -295,8 +294,6 @@ struct IViewSystem
|
||||
|
||||
virtual bool IsPlayingCutScene() const = 0;
|
||||
|
||||
virtual void UpdateSoundListeners() = 0;
|
||||
|
||||
virtual void SetDeferredViewSystemUpdate(bool const bDeferred) = 0;
|
||||
virtual bool UseDeferredViewSystemUpdate() const = 0;
|
||||
virtual void SetControlAudioListeners(bool const bActive) = 0;
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
|
||||
#include "CrySystem_precompiled.h"
|
||||
#include "LevelSystem.h"
|
||||
#include <IAudioSystem.h>
|
||||
#include "IMovieSystem.h"
|
||||
#include <ILocalizationManager.h>
|
||||
#include "CryPath.h"
|
||||
@@ -630,41 +629,6 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName)
|
||||
pSpamDelay->Set(0.0f);
|
||||
}
|
||||
|
||||
// Parse level specific config data.
|
||||
AZStd::string const sLevelNameOnly(PathUtil::GetFileName(levelName));
|
||||
|
||||
if (!sLevelNameOnly.empty())
|
||||
{
|
||||
const char* controlsPath = nullptr;
|
||||
Audio::AudioSystemRequestBus::BroadcastResult(controlsPath, &Audio::AudioSystemRequestBus::Events::GetControlsPath);
|
||||
if (controlsPath)
|
||||
{
|
||||
AZStd::string sAudioLevelPath(controlsPath);
|
||||
sAudioLevelPath.append("levels/");
|
||||
sAudioLevelPath += sLevelNameOnly;
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PARSE_CONTROLS_DATA> oAMData(sAudioLevelPath.c_str(), Audio::eADS_LEVEL_SPECIFIC);
|
||||
Audio::SAudioRequest oAudioRequestData;
|
||||
oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING); // Needs to be blocking so data is available for next preloading request!
|
||||
oAudioRequestData.pData = &oAMData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PARSE_PRELOADS_DATA> oAMData2(sAudioLevelPath.c_str(), Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData2;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::TAudioPreloadRequestID nPreloadRequestID = INVALID_AUDIO_PRELOAD_REQUEST_ID;
|
||||
|
||||
Audio::AudioSystemRequestBus::BroadcastResult(nPreloadRequestID, &Audio::AudioSystemRequestBus::Events::GetAudioPreloadRequestID, sLevelNameOnly.c_str());
|
||||
if (nPreloadRequestID != INVALID_AUDIO_PRELOAD_REQUEST_ID)
|
||||
{
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PRELOAD_SINGLE_REQUEST> requestData(nPreloadRequestID, true);
|
||||
oAudioRequestData.pData = &requestData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
AZStd::string missionXml("Mission_");
|
||||
missionXml += pLevelInfo->m_defaultGameTypeName;
|
||||
@@ -926,22 +890,6 @@ void CLevelSystem::UnloadLevel()
|
||||
gEnv->pMovieSystem->RemoveAllSequences();
|
||||
}
|
||||
|
||||
// Unload level specific audio binary data.
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_UNLOAD_AFCM_DATA_BY_SCOPE> oAMData(Audio::eADS_LEVEL_SPECIFIC);
|
||||
Audio::SAudioRequest oAudioRequestData;
|
||||
oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING);
|
||||
oAudioRequestData.pData = &oAMData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
// Now unload level specific audio config data.
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_CLEAR_CONTROLS_DATA> oAMData2(Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData2;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_CLEAR_PRELOADS_DATA> oAMData3(Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData3;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
OnUnloadComplete(m_lastLevelName.c_str());
|
||||
|
||||
// -- kenzo: this will close all pack files for this level
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
#include "CrySystem_precompiled.h"
|
||||
#include "SpawnableLevelSystem.h"
|
||||
#include <IAudioSystem.h>
|
||||
#include "IMovieSystem.h"
|
||||
|
||||
#include <LoadScreenBus.h>
|
||||
@@ -280,47 +279,6 @@ namespace LegacyLevelSystem
|
||||
pSpamDelay->Set(0.0f);
|
||||
}
|
||||
|
||||
// Parse level specific config data.
|
||||
AZStd::string const sLevelNameOnly(PathUtil::GetFileName(levelName));
|
||||
|
||||
if (!sLevelNameOnly.empty())
|
||||
{
|
||||
const char* controlsPath = nullptr;
|
||||
Audio::AudioSystemRequestBus::BroadcastResult(controlsPath, &Audio::AudioSystemRequestBus::Events::GetControlsPath);
|
||||
if (controlsPath)
|
||||
{
|
||||
AZStd::string sAudioLevelPath(controlsPath);
|
||||
sAudioLevelPath.append("levels/");
|
||||
sAudioLevelPath += sLevelNameOnly;
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PARSE_CONTROLS_DATA> oAMData(
|
||||
sAudioLevelPath.c_str(), Audio::eADS_LEVEL_SPECIFIC);
|
||||
Audio::SAudioRequest oAudioRequestData;
|
||||
oAudioRequestData.nFlags =
|
||||
(Audio::eARF_PRIORITY_HIGH |
|
||||
Audio::eARF_EXECUTE_BLOCKING); // Needs to be blocking so data is available for next preloading request!
|
||||
oAudioRequestData.pData = &oAMData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PARSE_PRELOADS_DATA> oAMData2(
|
||||
sAudioLevelPath.c_str(), Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData2;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::TAudioPreloadRequestID nPreloadRequestID = INVALID_AUDIO_PRELOAD_REQUEST_ID;
|
||||
|
||||
Audio::AudioSystemRequestBus::BroadcastResult(
|
||||
nPreloadRequestID, &Audio::AudioSystemRequestBus::Events::GetAudioPreloadRequestID, sLevelNameOnly.c_str());
|
||||
if (nPreloadRequestID != INVALID_AUDIO_PRELOAD_REQUEST_ID)
|
||||
{
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_PRELOAD_SINGLE_REQUEST> requestData(nPreloadRequestID, true);
|
||||
oAudioRequestData.pData = &requestData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
AZ::Data::Asset<AzFramework::Spawnable> rootSpawnable(
|
||||
rootSpawnableAssetId, azrtti_typeid<AzFramework::Spawnable>(), levelName);
|
||||
|
||||
@@ -565,22 +523,6 @@ namespace LegacyLevelSystem
|
||||
gEnv->pMovieSystem->RemoveAllSequences();
|
||||
}
|
||||
|
||||
// Unload level specific audio binary data.
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_UNLOAD_AFCM_DATA_BY_SCOPE> oAMData(Audio::eADS_LEVEL_SPECIFIC);
|
||||
Audio::SAudioRequest oAudioRequestData;
|
||||
oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING);
|
||||
oAudioRequestData.pData = &oAMData;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
// Now unload level specific audio config data.
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_CLEAR_CONTROLS_DATA> oAMData2(Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData2;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
Audio::SAudioManagerRequestData<Audio::eAMRT_CLEAR_PRELOADS_DATA> oAMData3(Audio::eADS_LEVEL_SPECIFIC);
|
||||
oAudioRequestData.pData = &oAMData3;
|
||||
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
|
||||
|
||||
OnUnloadComplete(m_lastLevelName.c_str());
|
||||
|
||||
AzFramework::RootSpawnableInterface::Get()->ReleaseRootSpawnable();
|
||||
|
||||
@@ -892,24 +892,6 @@ bool CSystem::UpdatePreTickBus(int updateFlags, int nPauseMode)
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//update sound system Part 1 if in Editor / in Game Mode Viewsystem updates the Listeners
|
||||
if (!m_env.IsEditorGameMode())
|
||||
{
|
||||
if ((updateFlags & ESYSUPDATE_EDITOR) != 0 && !bNoUpdate && nPauseMode != 1)
|
||||
{
|
||||
// updating the Listener Position in a first separate step.
|
||||
// Updating all views here is a bit of a workaround, since we need
|
||||
// to ensure that sound listeners owned by inactive views are also
|
||||
// marked as inactive. Ideally that should happen when exiting game mode.
|
||||
if (GetIViewSystem())
|
||||
{
|
||||
FRAME_PROFILER("SysUpdate:UpdateSoundListeners", this, PROFILE_SYSTEM);
|
||||
GetIViewSystem()->UpdateSoundListeners();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Use UI timer for CryMovie, because it should not be affected by pausing game time
|
||||
const float fMovieFrameTime = m_Time.GetFrameTime(ITimer::ETIMER_UI);
|
||||
|
||||
|
||||
@@ -115,12 +115,6 @@ void DebugCamera::Update()
|
||||
|
||||
m_view = Matrix33(Ang3(DEG2RAD(m_cameraPitch), 0.0f, DEG2RAD(m_cameraYaw)));
|
||||
UpdatePosition(m_moveInput);
|
||||
|
||||
// update the listener of the active view
|
||||
if (IView* view = gEnv->pSystem->GetIViewSystem()->GetActiveView())
|
||||
{
|
||||
view->UpdateAudioListener(Matrix34(m_view, m_position));
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -553,11 +553,6 @@ void CView::PostSerialize()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CView::UpdateAudioListener([[maybe_unused]] Matrix34 const& rMatrix)
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CView::SetActive([[maybe_unused]] bool const bActive)
|
||||
{
|
||||
|
||||
@@ -110,7 +110,6 @@ public:
|
||||
void PostSerialize() override;
|
||||
CCamera& GetCamera() override { return m_camera; }
|
||||
const CCamera& GetCamera() const override { return m_camera; }
|
||||
void UpdateAudioListener(const Matrix34& rMatrix) override;
|
||||
|
||||
void GetMemoryUsage(ICrySizer* s) const;
|
||||
|
||||
|
||||
@@ -200,11 +200,6 @@ void CViewSystem::Update(float frameTime)
|
||||
if (bIsActive)
|
||||
{
|
||||
CCamera& rCamera = pView->GetCamera();
|
||||
if (!s_debugCamera || !s_debugCamera->IsEnabled())
|
||||
{
|
||||
pView->UpdateAudioListener(rCamera.GetMatrix());
|
||||
}
|
||||
|
||||
if (const SViewParams* currentParams = pView->GetCurrentParams())
|
||||
{
|
||||
SViewParams copyCurrentParams = *currentParams;
|
||||
@@ -554,12 +549,6 @@ void CViewSystem::SetOverrideCameraRotation(bool bOverride, Quat rotation)
|
||||
m_overridenCameraRotation = rotation;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CViewSystem::UpdateSoundListeners()
|
||||
{
|
||||
AZ_ErrorOnce("CryLegacy", false, "CryLegacy view system no longer available (CViewSystem::UpdateSoundListeners)");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
void CViewSystem::OnLoadingStart([[maybe_unused]] const char* levelName)
|
||||
{
|
||||
|
||||
@@ -65,8 +65,6 @@ public:
|
||||
{
|
||||
return m_cutsceneCount > 0;
|
||||
}
|
||||
virtual void UpdateSoundListeners();
|
||||
|
||||
virtual void SetDeferredViewSystemUpdate(bool const bDeferred){ m_useDeferredViewSystemUpdate = bDeferred; }
|
||||
virtual bool UseDeferredViewSystemUpdate() const { return m_useDeferredViewSystemUpdate; }
|
||||
virtual void SetControlAudioListeners(bool const bActive);
|
||||
|
||||
@@ -9,6 +9,15 @@
|
||||
#include "DebugOutput.h"
|
||||
#include <AzCore/std/optional.h>
|
||||
|
||||
#include <AzCore/IO/SystemFile.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Views/PairIterator.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Views/SceneGraphDownwardsIterator.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/IGraphObject.h>
|
||||
#include <SceneAPI/SceneCore/Events/ExportProductList.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
namespace AZ::SceneAPI::Utilities
|
||||
{
|
||||
void DebugOutput::Write(const char* name, const char* data)
|
||||
@@ -118,4 +127,63 @@ namespace AZ::SceneAPI::Utilities
|
||||
{
|
||||
return m_output;
|
||||
}
|
||||
|
||||
void WriteAndLog(AZ::IO::SystemFile& dbgFile, const char* strToWrite)
|
||||
{
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::LogWindow, "%s", strToWrite);
|
||||
dbgFile.Write(strToWrite, strlen(strToWrite));
|
||||
dbgFile.Write("\n", strlen("\n"));
|
||||
}
|
||||
|
||||
void DebugOutput::BuildDebugSceneGraph(const char* outputFolder, AZ::SceneAPI::Events::ExportProductList& productList, const AZStd::shared_ptr<AZ::SceneAPI::Containers::Scene>& scene, AZStd::string productName)
|
||||
{
|
||||
const int debugSceneGraphVersion = 1;
|
||||
AZStd::string debugSceneFile;
|
||||
|
||||
AzFramework::StringFunc::Path::ConstructFull(outputFolder, productName.c_str(), debugSceneFile);
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::LogWindow, "outputFolder %s, name %s.\n", outputFolder, productName.c_str());
|
||||
|
||||
AZ::IO::SystemFile dbgFile;
|
||||
if (dbgFile.Open(debugSceneFile.c_str(), AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY))
|
||||
{
|
||||
WriteAndLog(dbgFile, AZStd::string::format("ProductName: %s", productName.c_str()).c_str());
|
||||
WriteAndLog(dbgFile, AZStd::string::format("debugSceneGraphVersion: %d", debugSceneGraphVersion).c_str());
|
||||
WriteAndLog(dbgFile, scene->GetName().c_str());
|
||||
|
||||
const AZ::SceneAPI::Containers::SceneGraph& sceneGraph = scene->GetGraph();
|
||||
auto names = sceneGraph.GetNameStorage();
|
||||
auto content = sceneGraph.GetContentStorage();
|
||||
auto pairView = AZ::SceneAPI::Containers::Views::MakePairView(names, content);
|
||||
auto view = AZ::SceneAPI::Containers::Views::MakeSceneGraphDownwardsView<
|
||||
AZ::SceneAPI::Containers::Views::BreadthFirst>(
|
||||
sceneGraph, sceneGraph.GetRoot(), pairView.cbegin(), true);
|
||||
|
||||
for (auto&& viewIt : view)
|
||||
{
|
||||
if (viewIt.second == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
AZ::SceneAPI::DataTypes::IGraphObject* graphObject = const_cast<AZ::SceneAPI::DataTypes::IGraphObject*>(viewIt.second.get());
|
||||
|
||||
WriteAndLog(dbgFile, AZStd::string::format("Node Name: %s", viewIt.first.GetName()).c_str());
|
||||
WriteAndLog(dbgFile, AZStd::string::format("Node Path: %s", viewIt.first.GetPath()).c_str());
|
||||
WriteAndLog(dbgFile, AZStd::string::format("Node Type: %s", graphObject->RTTI_GetTypeName()).c_str());
|
||||
|
||||
AZ::SceneAPI::Utilities::DebugOutput debugOutput;
|
||||
viewIt.second->GetDebugOutput(debugOutput);
|
||||
|
||||
if (!debugOutput.GetOutput().empty())
|
||||
{
|
||||
WriteAndLog(dbgFile, debugOutput.GetOutput().c_str());
|
||||
}
|
||||
}
|
||||
dbgFile.Close();
|
||||
|
||||
static const AZ::Data::AssetType dbgSceneGraphAssetType("{07F289D1-4DC7-4C40-94B4-0A53BBCB9F0B}");
|
||||
productList.AddProduct(productName, AZ::Uuid::CreateName(productName.c_str()), dbgSceneGraphAssetType,
|
||||
AZStd::nullopt, AZStd::nullopt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,22 @@
|
||||
#include <AzCore/std/optional.h>
|
||||
#include <cinttypes>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace Containers
|
||||
{
|
||||
class Scene;
|
||||
}
|
||||
namespace Events
|
||||
{
|
||||
struct ExportProduct;
|
||||
class ExportProductList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace AZ::SceneAPI::Utilities
|
||||
{
|
||||
class DebugOutput
|
||||
@@ -42,6 +58,8 @@ namespace AZ::SceneAPI::Utilities
|
||||
|
||||
SCENE_CORE_API const AZStd::string& GetOutput() const;
|
||||
|
||||
SCENE_CORE_API static void BuildDebugSceneGraph(const char* outputFolder, AZ::SceneAPI::Events::ExportProductList& productList, const AZStd::shared_ptr<AZ::SceneAPI::Containers::Scene>& scene, AZStd::string productName);
|
||||
|
||||
protected:
|
||||
AZStd::string m_output;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user