Skip to content

Commit 5c29fef

Browse files
committed
added frame rate synch
1 parent 2d27972 commit 5c29fef

File tree

12 files changed

+55
-76
lines changed

12 files changed

+55
-76
lines changed

source/Core/FrameRecorder/Core/Editor/RecorderSettingsEditor.cs renamed to source/Core/FrameRecorder/Core/Editor/RecorderEditor.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace UnityEditor.FrameRecorder
55
{
6-
public abstract class RecorderSettingsEditor : Editor
6+
public abstract class RecorderEditor : Editor
77
{
88
protected SerializedProperty m_Inputs;
99
SerializedProperty m_Verbose;
@@ -14,6 +14,7 @@ public abstract class RecorderSettingsEditor : Editor
1414
SerializedProperty m_EndFrame;
1515
SerializedProperty m_StartTime;
1616
SerializedProperty m_EndTime;
17+
SerializedProperty m_SynchFrameRate;
1718

1819
protected virtual void OnEnable()
1920
{
@@ -29,6 +30,7 @@ protected virtual void OnEnable()
2930
m_EndFrame = pf.Find(x => x.m_EndFrame);
3031
m_StartTime = pf.Find(x => x.m_StartTime);
3132
m_EndTime = pf.Find(x => x.m_EndTime);
33+
m_SynchFrameRate = pf.Find(x => x.m_SynchFrameRate);
3234
}
3335
}
3436

@@ -137,12 +139,13 @@ protected virtual void OnEncodingGui()
137139

138140
protected virtual void OnTimeGui()
139141
{
140-
141142
EditorGUILayout.PropertyField(m_FrameRateMode, new GUIContent("Frame rate mode"));
142-
++EditorGUI.indentLevel;
143-
var label = m_FrameRateMode.intValue == (int) FrameRateMode.Constant ? "Frame rate" : "Max frame rate";
143+
var label = m_FrameRateMode.intValue == (int) FrameRateMode.Constant ? "Target fps" : "Max fps";
144144
EditorGUILayout.PropertyField(m_FrameRate, new GUIContent(label));
145-
--EditorGUI.indentLevel;
145+
if (m_FrameRateMode.intValue == (int)FrameRateMode.Constant)
146+
{
147+
EditorGUILayout.PropertyField(m_SynchFrameRate, new GUIContent("Sync. framerate"));
148+
}
146149
}
147150

148151
protected virtual void OnBounds()

source/Core/FrameRecorder/Core/Editor/RecorderWindow.cs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ enum EState
1414
Recording
1515
}
1616

17-
RecorderSettingsEditor m_SettingsEditor;
17+
RecorderEditor m_Editor;
1818
EState m_State = EState.Idle;
1919

2020
RecorderSelector m_recorderSelector;
@@ -49,10 +49,10 @@ public void OnGUI()
4949
m_LastRepaint = DateTime.Now;
5050

5151
// Bug? work arround: on Stop play, Enable is not called.
52-
if (m_SettingsEditor != null && m_SettingsEditor.target == null)
52+
if (m_Editor != null && m_Editor.target == null)
5353
{
54-
UnityHelpers.Destroy(m_SettingsEditor);
55-
m_SettingsEditor = null;
54+
UnityHelpers.Destroy(m_Editor);
55+
m_Editor = null;
5656
m_recorderSelector = null;
5757
}
5858

@@ -84,13 +84,13 @@ public void OnGUI()
8484
using (new EditorGUI.DisabledScope(EditorApplication.isPlaying))
8585
m_recorderSelector.OnGui();
8686

87-
if (m_SettingsEditor != null)
87+
if (m_Editor != null)
8888
{
89-
m_SettingsEditor.showBounds = true;
89+
m_Editor.showBounds = true;
9090
using (new EditorGUI.DisabledScope(EditorApplication.isPlaying))
9191
{
9292
EditorGUILayout.Separator();
93-
m_SettingsEditor.OnInspectorGUI();
93+
m_Editor.OnInspectorGUI();
9494
EditorGUILayout.Separator();
9595
}
9696
RecordButtonOnGui();
@@ -100,20 +100,20 @@ public void OnGUI()
100100
public void OnDestroy()
101101
{
102102
StopRecording();
103-
UnityHelpers.Destroy(m_SettingsEditor);
104-
m_SettingsEditor = null;
103+
UnityHelpers.Destroy(m_Editor);
104+
m_Editor = null;
105105
}
106106

107107
void RecordButtonOnGui()
108108
{
109-
if (m_SettingsEditor == null || m_SettingsEditor.target == null)
109+
if (m_Editor == null || m_Editor.target == null)
110110
return;
111111

112112
switch (m_State)
113113
{
114114
case EState.Idle:
115115
{
116-
using (new EditorGUI.DisabledScope(!m_SettingsEditor.isValid))
116+
using (new EditorGUI.DisabledScope(!m_Editor.isValid))
117117
{
118118
if (GUILayout.Button("Start Recording"))
119119
StartRecording();
@@ -129,7 +129,7 @@ void RecordButtonOnGui()
129129

130130
case EState.Recording:
131131
{
132-
var recorderGO = FrameRecorderGOControler.FindRecorder((RecorderSettings)m_SettingsEditor.target);
132+
var recorderGO = FrameRecorderGOControler.FindRecorder((RecorderSettings)m_Editor.target);
133133
if (recorderGO == null)
134134
{
135135
GUILayout.Button("Start Recording"); // just to keep the ui system happy.
@@ -207,7 +207,7 @@ void DelayedStartRecording()
207207

208208
void StartRecording(bool autoExitPlayMode)
209209
{
210-
var settings = (RecorderSettings)m_SettingsEditor.target;
210+
var settings = (RecorderSettings)m_Editor.target;
211211
var go = FrameRecorderGOControler.HookupRecorder();
212212
var session = new RecordingSession()
213213
{
@@ -227,9 +227,9 @@ void StartRecording(bool autoExitPlayMode)
227227

228228
void StopRecording()
229229
{
230-
if (m_SettingsEditor != null)
230+
if (m_Editor != null)
231231
{
232-
var settings = (RecorderSettings)m_SettingsEditor.target;
232+
var settings = (RecorderSettings)m_Editor.target;
233233
if (settings != null)
234234
{
235235
var recorderGO = FrameRecorderGOControler.FindRecorder(settings);
@@ -243,10 +243,10 @@ void StopRecording()
243243

244244
public void OnRecorderSelected()
245245
{
246-
if (m_SettingsEditor != null)
246+
if (m_Editor != null)
247247
{
248-
UnityHelpers.Destroy(m_SettingsEditor);
249-
m_SettingsEditor = null;
248+
UnityHelpers.Destroy(m_Editor);
249+
m_Editor = null;
250250
}
251251

252252
if (m_recorderSelector.selectedRecorder == null)
@@ -260,7 +260,7 @@ public void OnRecorderSelected()
260260

261261
if( m_WindowSettingsAsset.m_Settings == null )
262262
m_WindowSettingsAsset.m_Settings = RecordersInventory.GenerateNewSettingsAsset(m_WindowSettingsAsset, m_recorderSelector.selectedRecorder );
263-
m_SettingsEditor = Editor.CreateEditor( m_WindowSettingsAsset.m_Settings ) as RecorderSettingsEditor;
263+
m_Editor = Editor.CreateEditor( m_WindowSettingsAsset.m_Settings ) as RecorderEditor;
264264
AssetDatabase.SaveAssets();
265265

266266
}

source/Core/FrameRecorder/Core/Editor/Timeline/RecorderClipEditor.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace UnityEditor.FrameRecorder.Timeline
77
[CustomEditor(typeof(FrameRecorderClip), true)]
88
public class RecorderClipEditor : Editor
99
{
10-
RecorderSettingsEditor m_SettingsEditor;
10+
RecorderEditor m_Editor;
1111
TimelineAsset m_Timeline;
1212
RecorderSelector m_recorderSelector;
1313

@@ -22,10 +22,10 @@ public override void OnInspectorGUI()
2222
return;
2323

2424
// Bug? work arround: on Stop play, Enable is not called.
25-
if (m_SettingsEditor != null && m_SettingsEditor.target == null)
25+
if (m_Editor != null && m_Editor.target == null)
2626
{
27-
UnityHelpers.Destroy(m_SettingsEditor);
28-
m_SettingsEditor = null;
27+
UnityHelpers.Destroy(m_Editor);
28+
m_Editor = null;
2929
m_recorderSelector = null;
3030
}
3131

@@ -37,9 +37,9 @@ public override void OnInspectorGUI()
3737

3838
m_recorderSelector.OnGui();
3939

40-
if (m_SettingsEditor != null)
40+
if (m_Editor != null)
4141
{
42-
m_SettingsEditor.showBounds = false;
42+
m_Editor.showBounds = false;
4343
m_Timeline = FindTimelineAsset();
4444

4545
PushTimelineIntoRecorder();
@@ -48,7 +48,7 @@ public override void OnInspectorGUI()
4848
{
4949
EditorGUILayout.Separator();
5050

51-
m_SettingsEditor.OnInspectorGUI();
51+
m_Editor.OnInspectorGUI();
5252

5353
EditorGUILayout.Separator();
5454

@@ -63,10 +63,10 @@ public void OnRecorderSelected()
6363
{
6464
var clip = this.target as FrameRecorderClip;
6565

66-
if (m_SettingsEditor != null)
66+
if (m_Editor != null)
6767
{
68-
UnityHelpers.Destroy(m_SettingsEditor);
69-
m_SettingsEditor = null;
68+
UnityHelpers.Destroy(m_Editor);
69+
m_Editor = null;
7070
}
7171

7272
if (m_recorderSelector.selectedRecorder == null)
@@ -80,7 +80,7 @@ public void OnRecorderSelected()
8080

8181
if(clip.m_Settings == null)
8282
clip.m_Settings = RecordersInventory.GenerateNewSettingsAsset(clip, m_recorderSelector.selectedRecorder );
83-
m_SettingsEditor = Editor.CreateEditor(clip.m_Settings) as RecorderSettingsEditor;
83+
m_Editor = Editor.CreateEditor(clip.m_Settings) as RecorderEditor;
8484
AssetDatabase.SaveAssets();
8585
}
8686

@@ -105,7 +105,7 @@ void PushTimelineIntoRecorder()
105105
if (m_Timeline == null)
106106
return;
107107

108-
var settings = m_SettingsEditor.target as RecorderSettings;
108+
var settings = m_Editor.target as RecorderSettings;
109109
settings.m_DurationMode = DurationMode.Manual;
110110

111111
// Time
@@ -117,7 +117,7 @@ void PushRecorderIntoTimeline()
117117
if (m_Timeline == null)
118118
return;
119119

120-
var settings = m_SettingsEditor.target as RecorderSettings;
120+
var settings = m_Editor.target as RecorderSettings;
121121
settings.m_DurationMode = DurationMode.Manual;
122122

123123
// Time

source/Core/FrameRecorder/Core/Engine/RecorderSettings.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ public abstract class RecorderSettings : ScriptableObject
3232
[Range(1,10)]
3333
public int m_CaptureEveryNthFrame = 1;
3434
public FrameRateMode m_FrameRateMode = FrameRateMode.Constant;
35-
public double m_FrameRate = 24.0;
35+
[Range(1,120)]
36+
public double m_FrameRate = 30.0;
3637
public int m_StartFrame;
3738
public int m_EndFrame = 10;
3839
public float m_StartTime = 0.0f;
3940
public float m_EndTime = 1.0f;
4041
public DurationMode m_DurationMode;
4142
public bool m_Verbose = false;
43+
public bool m_SynchFrameRate = true;
4244

4345
public RecorderInputSetting[] m_SourceSettings = new RecorderInputSetting[0];
4446

source/Core/FrameRecorder/Core/Engine/RecordingSession.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class RecordingSession : IDisposable
1111
public int m_FrameIndex; // count starts at 0.
1212
public double m_CurrentFrameStartTS;
1313
public double m_RecordingStartTS;
14+
int m_InitialFrame = 0;
1415

1516
public RecorderSettings settings { get { return m_Recorder.settings; } }
1617
public bool recording { get { return m_Recorder.recording; } }
@@ -19,6 +20,7 @@ public bool BeginRecording()
1920
{
2021
if (!m_Recorder.BeginRecording(this))
2122
return false;
23+
m_InitialFrame = Time.renderedFrameCount;
2224
m_Recorder.SignalSourcesOfStage(ERecordingSessionStage.BeginRecording, this);
2325
return true;
2426
}
@@ -38,6 +40,14 @@ public void RecordFrame()
3840
m_Recorder.recordedFramesCount++;
3941
}
4042
m_Recorder.SignalSourcesOfStage(ERecordingSessionStage.FrameDone, this);
43+
44+
// Note: This is not great when multiple recorders are simultaneously active...
45+
if (m_Recorder.settings.m_FrameRateMode == FrameRateMode.Constant && m_Recorder.settings.m_SynchFrameRate )
46+
{
47+
float wt =(float) (1.0f / m_Recorder.settings.m_FrameRate) * (Time.renderedFrameCount - m_InitialFrame);
48+
while (Time.realtimeSinceStartup - m_InitialFrame < wt)
49+
System.Threading.Thread.Sleep(1);
50+
}
4151
}
4252

4353
public void PrepareNewFrame()

source/Core/FrameRecorder/Inputs/Adam/Editor/AdamBeautySourceEditor.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ protected void OnEnable()
3333

3434
public override void OnInspectorGUI()
3535
{
36-
++EditorGUI.indentLevel;
37-
3836
using (var check = new EditorGUI.ChangeCheckScope())
3937
{
4038
if (m_MaskedSourceNames == null)
@@ -79,7 +77,6 @@ public override void OnInspectorGUI()
7977
if (m_FinalSize.intValue > renderSize.intValue)
8078
renderSize.intValue = m_FinalSize.intValue;
8179

82-
--EditorGUI.indentLevel;
8380
serializedObject.ApplyModifiedProperties();
8481
}
8582
}

source/Core/FrameRecorder/Inputs/CBRenderTexture/Editor/CBRenderTextureInputSettingsEditor.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ protected void OnEnable()
2828

2929
public override void OnInspectorGUI()
3030
{
31-
++EditorGUI.indentLevel;
32-
3331
using (var check = new EditorGUI.ChangeCheckScope())
3432
{
3533
if (m_MaskedSourceNames == null)
@@ -68,7 +66,6 @@ public override void OnInspectorGUI()
6866
}
6967
}
7068

71-
--EditorGUI.indentLevel;
7269
serializedObject.ApplyModifiedProperties();
7370
}
7471
}

source/Core/FrameRecorder/Recorders/PNG/Editor/PNGRecorderEditor.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace UnityEditor.FrameRecorder
77
{
88
[CustomEditor(typeof(PNGRecorderSettings))]
9-
public class PNGRecorderEditor : RecorderSettingsEditor
9+
public class PNGRecorderEditor : RecorderEditor
1010
{
1111
SerializedProperty m_DestinationPath;
1212
SerializedProperty m_BaseFileName;
@@ -42,10 +42,8 @@ protected override void OnInputGui()
4242
{
4343
var input = m_Inputs.GetArrayElementAtIndex(0).objectReferenceValue;
4444

45-
EditorGUI.indentLevel++;
4645
var index = input.GetType() == typeof(CBRenderTextureInputSettings) ? 0 : 1;
4746
var newIndex = EditorGUILayout.Popup("Image Generator", index, m_Candidates);
48-
EditorGUI.indentLevel--;
4947

5048
if (index != newIndex)
5149
{

source/FrameCapturer/Recorders/Editor/RecorderEditorBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace UTJ.FrameCapturer.Recorders
66
{
7-
public class RecorderEditorBase : RecorderSettingsEditor
7+
public class RecorderEditorBase : RecorderEditor
88
{
99
public string m_BaseFileName;
1010
public string m_DestinationPath;

source/FrameCapturer/Recorders/FrameCaptureInputA.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

source/FrameCapturer/Recorders/FrameCaptureInputA.cs.meta

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)