2121#include < Atom/RHI/Factory.h>
2222
2323#include < AzCore/Component/Entity.h>
24+ #include < AzCore/Settings/SettingsRegistryScriptUtils.h>
2425#include < AzCore/Script/ScriptContext.h>
2526#include < AzCore/Script/ScriptSystemBus.h>
2627#include < AzCore/Script/ScriptAsset.h>
@@ -966,7 +967,8 @@ namespace AtomSampleViewer
966967
967968 s_instance->m_executingScripts .insert (scriptAsset.GetId ());
968969
969- if (!s_instance->m_scriptContext ->Execute (scriptAsset->GetScriptBuffer ().data (), scriptFilePath.c_str (), scriptAsset->GetScriptBuffer ().size ()))
970+ auto & scriptData = scriptAsset->m_data ;
971+ if (!s_instance->m_scriptContext ->Execute (scriptData.GetScriptBuffer ().data (), scriptFilePath.c_str (), scriptData.GetScriptBuffer ().size ()))
970972 {
971973 // Push an error operation on the back of the queue instead of reporting it immediately so it doesn't get lost
972974 // in front of a bunch of queued m_scriptOperations.
@@ -1057,6 +1059,7 @@ namespace AtomSampleViewer
10571059 void ScriptManager::ReflectScriptContext (AZ::BehaviorContext* behaviorContext)
10581060 {
10591061 AZ::MathReflect (behaviorContext);
1062+ AZ::SettingsRegistryScriptUtils::ReflectSettingsRegistryToBehaviorContext (*behaviorContext);
10601063
10611064 // Utilities...
10621065 behaviorContext->Method (" RunScript" , &Script_RunScript);
@@ -1086,6 +1089,7 @@ namespace AtomSampleViewer
10861089 behaviorContext->Method (" ShowTool" , &Script_ShowTool);
10871090
10881091 // Screenshots...
1092+ behaviorContext->Method (" SetTestEnvPath" , &Script_SetTestEnvPath);
10891093 behaviorContext->Method (" SelectImageComparisonToleranceLevel" , &Script_SelectImageComparisonToleranceLevel);
10901094 behaviorContext->Method (" CaptureScreenshot" , &Script_CaptureScreenshot);
10911095 behaviorContext->Method (" CaptureScreenshotWithImGui" , &Script_CaptureScreenshotWithImGui);
@@ -1140,14 +1144,16 @@ namespace AtomSampleViewer
11401144 s_instance->m_scriptOperations .push (AZStd::move (func));
11411145 }
11421146
1143- void ScriptManager::Script_Print (const AZStd::string& message)
1147+ void ScriptManager::Script_Print (const AZStd::string& message [[maybe_unused]] )
11441148 {
1149+ #ifndef RELEASE // AZ_TracePrintf is a no-op in release builds
11451150 auto func = [message]()
11461151 {
11471152 AZ_TracePrintf (" Automation" , " Script: %s\n " , message.c_str ());
11481153 };
11491154
11501155 s_instance->m_scriptOperations .push (AZStd::move (func));
1156+ #endif
11511157 }
11521158
11531159 AZStd::string ScriptManager::Script_ResolvePath (const AZStd::string& path)
@@ -1370,7 +1376,7 @@ namespace AtomSampleViewer
13701376 {
13711377 auto operation = [command]()
13721378 {
1373- AzFramework::ConsoleRequestBus::Broadcast (&AzFramework::ConsoleRequests::ExecuteConsoleCommand, command.c_str ());
1379+ AZ::Interface<AZ::IConsole>:: Get ()-> PerformCommand ( command.c_str ());
13741380 };
13751381
13761382 s_instance->m_scriptOperations .push (AZStd::move (operation));
@@ -1400,9 +1406,8 @@ namespace AtomSampleViewer
14001406 s_instance->m_scriptOperations .push (AZStd::move (operation));
14011407 }
14021408
1403- bool ScriptManager::PrepareForScreenCapture (const AZStd::string& path)
1409+ bool ScriptManager::PrepareForScreenCapture (const AZStd::string& path, const AZStd::string& envPath )
14041410 {
1405-
14061411 if (!Utils::IsFileUnderFolder (Utils::ResolvePath (path), ScreenshotPaths::GetScreenshotsFolder (true )))
14071412 {
14081413 // The main reason we require screenshots to be in a specific folder is to ensure we don't delete or replace some other important file.
@@ -1420,7 +1425,7 @@ namespace AtomSampleViewer
14201425 return false ;
14211426 }
14221427
1423- s_instance->m_scriptReporter .AddScreenshotTest (path);
1428+ s_instance->m_scriptReporter .AddScreenshotTest (path, envPath );
14241429
14251430 s_instance->m_isCapturePending = true ;
14261431 s_instance->AZ ::Render::FrameCaptureNotificationBus::Handler::BusConnect ();
@@ -1429,6 +1434,11 @@ namespace AtomSampleViewer
14291434 return true ;
14301435 }
14311436
1437+ void ScriptManager::Script_SetTestEnvPath (const AZStd::string& envPath)
1438+ {
1439+ s_instance->m_envPath = envPath;
1440+ }
1441+
14321442 void ScriptManager::Script_SelectImageComparisonToleranceLevel (const AZStd::string& presetName)
14331443 {
14341444 auto operation = [presetName]()
@@ -1446,9 +1456,15 @@ namespace AtomSampleViewer
14461456 auto operation = [filePath]()
14471457 {
14481458 // Note this will pause the script until the capture is complete
1449- if (PrepareForScreenCapture (filePath))
1459+ if (PrepareForScreenCapture (filePath, s_instance-> m_envPath ))
14501460 {
1451- AZ::Render::FrameCaptureRequestBus::Broadcast (&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
1461+ AZ_Assert (s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, " Attempting to start a capture while one is in progress" );
1462+ uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
1463+ AZ::Render::FrameCaptureRequestBus::BroadcastResult (frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
1464+ if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
1465+ {
1466+ s_instance->m_frameCaptureId = frameCaptureId;
1467+ }
14521468 }
14531469 };
14541470
@@ -1473,9 +1489,15 @@ namespace AtomSampleViewer
14731489 auto operation = [filePath]()
14741490 {
14751491 // Note this will pause the script until the capture is complete
1476- if (PrepareForScreenCapture (filePath))
1492+ if (PrepareForScreenCapture (filePath, s_instance-> m_envPath ))
14771493 {
1478- AZ::Render::FrameCaptureRequestBus::Broadcast (&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
1494+ AZ_Assert (s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, " Attempting to start a capture while one is in progress" );
1495+ uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
1496+ AZ::Render::FrameCaptureRequestBus::BroadcastResult (frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
1497+ if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
1498+ {
1499+ s_instance->m_frameCaptureId = frameCaptureId;
1500+ }
14791501 }
14801502 };
14811503
@@ -1497,9 +1519,15 @@ namespace AtomSampleViewer
14971519 auto operation = [filePath]()
14981520 {
14991521 // Note this will pause the script until the capture is complete
1500- if (PrepareForScreenCapture (filePath))
1522+ if (PrepareForScreenCapture (filePath, s_instance-> m_envPath ))
15011523 {
1502- AZ::Render::FrameCaptureRequestBus::Broadcast (&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshotWithPreview, filePath);
1524+ AZ_Assert (s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, " Attempting to start a capture while one is in progress" );
1525+ uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
1526+ AZ::Render::FrameCaptureRequestBus::BroadcastResult (frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshotWithPreview, filePath);
1527+ if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
1528+ {
1529+ s_instance->m_frameCaptureId = frameCaptureId;
1530+ }
15031531 }
15041532 };
15051533
@@ -1588,9 +1616,15 @@ namespace AtomSampleViewer
15881616 auto operation = [passHierarchy, slot, outputFilePath, readbackOption]()
15891617 {
15901618 // Note this will pause the script until the capture is complete
1591- if (PrepareForScreenCapture (outputFilePath))
1619+ if (PrepareForScreenCapture (outputFilePath, s_instance-> m_envPath ))
15921620 {
1593- AZ::Render::FrameCaptureRequestBus::Broadcast (&AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachment, passHierarchy, slot, outputFilePath, readbackOption);
1621+ AZ_Assert (s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, " Attempting to start a capture while one is in progress" );
1622+ uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
1623+ AZ::Render::FrameCaptureRequestBus::BroadcastResult (frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachment, passHierarchy, slot, outputFilePath, readbackOption);
1624+ if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
1625+ {
1626+ s_instance->m_frameCaptureId = frameCaptureId;
1627+ }
15941628 }
15951629 };
15961630
@@ -1601,9 +1635,15 @@ namespace AtomSampleViewer
16011635 });
16021636 }
16031637
1604- void ScriptManager::OnCaptureFinished (AZ::Render::FrameCaptureResult result, const AZStd::string &info)
1638+ void ScriptManager::OnCaptureFinished (uint32_t frameCaptureId, AZ::Render::FrameCaptureResult result, const AZStd::string &info)
16051639 {
1640+ // ignore captures that are not triggered by the script manager
1641+ if (m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId || frameCaptureId != m_frameCaptureId)
1642+ {
1643+ return ;
1644+ }
16061645 m_isCapturePending = false ;
1646+ m_frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
16071647 AZ::Render::FrameCaptureNotificationBus::Handler::BusDisconnect ();
16081648 ResumeScript ();
16091649
0 commit comments