using UnityEditor.Rendering.Analytics;
using static UnityEngine.Rendering.RenderGraphModule.RenderGraph;
namespace UnityEngine.Rendering.RenderGraphModule
{
internal sealed class RenderGraphEditorRemoteDebugSession : RenderGraphDebugSession
{
public override bool isActive => false;
DebugMessageHandler m_DebugMessageHandler = ScriptableObject.CreateInstance<DebugMessageHandler>();
public RenderGraphEditorRemoteDebugSession() : base()
{
m_DebugMessageHandler.Register(OnMessageFromPlayer);
// In the case of auto-connect profiler option, the player doesn't receive the OnEditorConnected callback.
// Therefore send an explicit activation message to ensure the player becomes aware of the editor.
m_DebugMessageHandler.Send(DebugMessageHandler.MessageType.Activate);
}
public override void Dispose()
{
base.Dispose();
m_DebugMessageHandler.UnregisterAll();
CoreUtils.Destroy(m_DebugMessageHandler);
}
void OnMessageFromPlayer(DebugMessageHandler.MessageType messageType, DebugMessageHandler.IPayload payload)
{
if (messageType == DebugMessageHandler.MessageType.Activate)
{
// In the event that the player starts after the editor, it will request activation from the editor.
m_DebugMessageHandler.Send(DebugMessageHandler.MessageType.Activate);
}
else if (messageType == DebugMessageHandler.MessageType.DebugData)
{
var debugDataPayload = payload as DebugMessageHandler.DebugDataPayload;
if (!debugDataPayload.isCompatible)
{
string errorStr = "<Incompatible version>";
RegisterAndUpdateDebugData(errorStr, EntityId.None, errorStr, null);
}
else
{
RegisterAndUpdateDebugData(
debugDataPayload.graphName,
debugDataPayload.executionId,
debugDataPayload.debugData.executionName,
debugDataPayload.debugData);
}
}
else if (messageType == DebugMessageHandler.MessageType.AnalyticsData)
{
if (payload is DebugMessageHandler.AnalyticsPayload { isCompatible: true } analyticsPayload)
{
RenderGraphViewerSessionCreatedAnalytic.Send(RenderGraphViewerSessionCreatedAnalytic.SessionType.Remote, analyticsPayload);
}
}
}
void RegisterAndUpdateDebugData(string graphName, EntityId executionId, string executionName, DebugData debugData)
{
RegisterGraph(graphName);
RegisterExecution(graphName, executionId, debugData.executionName);
SetDebugData(graphName, executionId, debugData);
}
}
}