29 private int m_defaultYear;
32 private int m_defaultMonth;
35 private int m_defaultDay;
38 private float m_defaultTimeOfTheDay;
41 private string m_defaultWeatherState;
45 private string m_cameraEntityName;
47 private string m_description;
49 [
Attribute(
"1",
UIWidgets.Slider,
"Wait time in the waypoint before taking screenshot",
"0 20 0.1")]
50 private float m_stepWaitTime;
51 [
Attribute(
"2",
UIWidgets.Slider,
"Wait time in the waypoint after preload",
"0 5 0.1")]
52 private float m_WaitTimeAfterPreload;
53 [
Attribute(
"1",
UIWidgets.Slider,
"Wait time for the screenshot to be made",
"0 20 0.1")]
54 private float m_screenshotWaitTime;
56 private float m_FPSLimit;
58 private bool m_summary;
65 private Screenshot_Waypoint m_waypoint;
66 private float m_timeFromScreenshot;
67 private string m_directory;
68 private bool m_initialized;
76 System.GetCLIParam(
"autotest-output-dir", m_directory);
78 if (m_directory.Length() == 0)
80 m_directory =
"$logs:" +
GetName();
89 float GetDefaultTimeOfTheDay()
91 return m_defaultTimeOfTheDay;
101 return m_defaultMonth;
109 string GetDefaultWeatherState()
111 return m_defaultWeatherState;
114 override void EOnInit(
IEntity owner)
117 m_waypoint = Screenshot_Waypoint.Cast(
GetChildren());
132 m_FPSWidget = TextWidget.Cast(
g_Game.
GetWorkspace().CreateWidgetInWorkspace(
WidgetType.TextWidgetTypeID, 16, 16, 512, 128,
WidgetFlags.VISIBLE,
new Color(0.0, 0.0, 0.0, 1.0), 1024));
133 m_FPSWidget.SetExactFontSize(64);
136 override void EOnFrame(
IEntity owner,
float timeSlice)
148 Print(
"No waypoints for next screenshot");
151 string summaryFilename =
string.Format(
"%1/%2", m_directory,
"summary.txt");
152 MakeSummaryFile(summaryFilename);
153 summaryFilename =
string.Format(
"%1/%2", m_directory,
"summary.csv");
154 MakeCSVSummaryFile(summaryFilename);
161 TransformCameraToWaypoint();
162 m_initialized =
true;
168 m_FPSWidget.SetColor(
new Color(1.0, 1.0, 1.0, 1.0));
169 m_FPSWidget.SetText(
"Preloading");
176 m_FPSWidget.SetColor(
new Color(1.0, 1.0, 1.0, 1.0));
177 m_FPSWidget.SetText(
"Waiting after preload...");
181 int fps = System.GetFPS();
182 m_FPSWidget.SetText(
"FPS " + fps);
183 if (fps < m_FPSLimit)
184 m_FPSWidget.SetColor(
new Color(1.0, 0.0, 0.0, 1.0));
186 m_FPSWidget.SetColor(
new Color(0.0, 1.0, 0.0, 1.0));
188 if (
m_timer > m_stepWaitTime && m_timeFromScreenshot == 0)
192 string screenshotFilename =
string.Format(
"%1/%2.bmp", m_directory, m_waypoint.GetName());
193 string metadataFilename = screenshotFilename +
".txt";
194 string summaryFilename =
string.Format(
"%1/%2", m_directory,
"summary_locations.csv");
198 FileIO.MakeDirectory(m_directory);
199 MakeLocationsCSVSummaryFile(summaryFilename);
200 MakeScreenshotMetafile(metadataFilename);
201 System.MakeScreenshot(screenshotFilename);
204 if (m_timeFromScreenshot == 0)
208 else if (m_timeFromScreenshot + m_screenshotWaitTime <
m_timeFromStart)
210 m_timeFromScreenshot = 0;
211 if(m_waypoint) m_waypoint.EOnExit();
212 m_waypoint = Screenshot_Waypoint.Cast(m_waypoint.GetSibling());
213 TransformCameraToWaypoint();
219 private void MakeSummaryFile(
string filename)
221 FileHandle descrFile = FileIO.OpenFile(filename,
FileMode.WRITE);
225 if (m_description.Length() > 0)
226 descrFile.WriteLine(
string.Format(
"%1", m_description));
230 descrFile.WriteLine(
string.Format(
"Resolution (px): %1x%2", sizeX, sizeY));
232 descrFile.WriteLine(
string.Format(
"Entering playmode time (s): %1",
g_Game.
GetLoadTime() / 1000));
234 descrFile.WriteLine(
string.Format(
"Load time (s): %1",
g_Game.
GetLoadTime() / 1000));
236 descrFile.WriteLine(
string.Format(
"Memory (MB): %1", System.MemoryAllocationKB() / 1024));
237 descrFile.WriteLine(
string.Format(
"Allocations: %1", System.MemoryAllocationCount()));
238 descrFile.WriteLine(
string.Format(
"Duration (s): %1",
m_timeFromStart));
240 Print(
"Summary file successfully saved into " + filename);
244 private void MakeCSVSummaryFile(
string filename)
246 FileHandle descrFile = FileIO.OpenFile(filename,
FileMode.WRITE);
253 descrFile.WriteLine(
"Resolution (px),Load time (s),Memory (MB),Allocations,Duration (s),Timestamp");
254 descrFile.WriteLine(
string.Format(
"%1x%2,%3,%4,%5,%6,%7",
257 System.MemoryAllocationKB() / 1024,
258 System.MemoryAllocationCount(),
260 GetCurrentTimestamp()
264 Print(
"Summary file successfully saved into " + filename);
268 private void MakeLocationsCSVSummaryFile(
string filename)
270 FileHandle descrFile;
272 if(!FileIO.FileExists(filename))
274 descrFile = FileIO.OpenFile(filename,
FileMode.WRITE);
278 descrFile.WriteLine(
"Scene name,FPS,Frame time (ms),Timestamp");
281 Print(
"Headers successfully saved into " + filename);
285 descrFile = FileIO.OpenFile(filename,
FileMode.APPEND);
289 descrFile.WriteLine(
string.Format(
"%1,%2,%3,%4",
290 m_waypoint.GetName(),
292 1000.0 * System.GetFrameTimeS(),
293 GetCurrentTimestamp()
297 Print(
"Scene data successfully saved into " + filename);
301 private string GetCurrentTimestamp()
303 int year, month, day;
304 System.GetYearMonthDay(year, month, day);
305 return string.Format(
"%1-%2-%3", year.ToString(4), month.ToString(2), day.ToString(2));
308 private void MakeScreenshotMetafile(
string filename)
310 FileHandle descrFile = FileIO.OpenFile(filename,
FileMode.WRITE);
312 vector
position = m_camera.GetOrigin();
313 vector orientation = m_camera.GetYawPitchRoll();
317 string description = m_waypoint.GetDescription();
318 if (description.Length() > 0)
319 descrFile.WriteLine(
string.Format(
"%1", description));
320 descrFile.WriteLine(
string.Format(
"FPS: %1", System.GetFPS()));
321 descrFile.WriteLine(
string.Format(
"Frame time (ms): %1", 1000.0 * System.GetFrameTimeS()));
323 descrFile.WriteLine(
string.Format(
"XYZ Rotation: [%1, %2, %3]", orientation[1], orientation[0], orientation[2]));
325 string link =
string.Format(
"enfusion://WorldEditor/%1;%2,%3,%4;%5,%6,%7",
g_Game.
GetWorldFile(),
position[0],
position[1],
position[2], orientation[1], orientation[0], orientation[2]);
326 float normalizedTime;
333 descrFile.WriteLine(
string.Format(
"Time: %1", normalizedTime));
334 descrFile.WriteLine(
string.Format(
"Date: %1/%2/%3", year, month, day));
335 link +=
string.Format(
",%1,%2,%3,%4", normalizedTime, year, month, day);
338 descrFile.WriteLine(
string.Format(
"<a href=\"%1\">Link to World Editor</a>", link));
341 Print(
"Screenshot metafile successfully saved into " + filename);
345 private void TransformCameraToWaypoint()
347 if (m_waypoint && m_camera)
350 m_waypoint.GetTransform(mat);
351 m_camera.SetTransform(mat);
352 m_waypoint.EOnEnter();
354 float cameraFarPlane =
GetWorld().GetCameraFarPlane(
GetWorld().GetCurrentCameraId());
360 protected bool GetTimeAndDate(out
float normTime, out
int year, out
int month, out
int day)
366 BaseWeatherManagerEntity weatherEntity = BaseWeatherManagerEntity.Cast(
WeatherManager.GetRegisteredWeatherManagerEntity(world));
370 normTime = weatherEntity.GetTimeOfTheDay() / 24.0;
371 year = weatherEntity.GetYear();
372 month = weatherEntity.GetMonth();
373 day = weatherEntity.GetDay();
388 BaseWeatherManagerEntity weatherEntity = BaseWeatherManagerEntity.Cast(
WeatherManager.GetRegisteredWeatherManagerEntity(world));
392 weatherEntity.SetDate(year, month, day,
true);
393 weatherEntity.SetTimeOfTheDay(timeOfTheDay24h);
407 BaseWeatherManagerEntity weatherEntity = BaseWeatherManagerEntity.Cast(
WeatherManager.GetRegisteredWeatherManagerEntity(world));
418 transManager.EnqueueStateTransition(node,
false);
419 transManager.RequestStateTransitionImmediately(node);
435 [
Attribute(
"", UIWidgets.EditBox,
"Waypoint description",
"")]
436 private string m_description;
438 [
Attribute(
"", UIWidgets.EditBox,
"Weather state",
"")]
439 private string m_weatherState;
441 [
Attribute(
"-1", UIWidgets.Slider,
"Time of the day",
"-1 24 0.01")]
442 private float m_timeOfTheDay;
444 [
Attribute(
"-1", UIWidgets.SpinBox,
"Year",
"")]
447 [
Attribute(
"-1", UIWidgets.SpinBox,
"Month",
"")]
450 [
Attribute(
"-1", UIWidgets.SpinBox,
"Day",
"")]
454 void Screenshot_Waypoint(IEntitySource src,
IEntity parent)
464 src.Get(
"angles",
angles);
471 Math3D.AnglesToMatrix(
rotation, mat);
481 void ~Screenshot_Waypoint()
489 event void EOnEnter()
491 Screenshot_Autotest parent = Screenshot_Autotest.Cast(
GetParent());
495 float time = parent.GetDefaultTimeOfTheDay();
496 int year = parent.GetDefaultYear();
497 int month = parent.GetDefaultMonth();
498 int day = parent.GetDefaultDay();
499 string state = parent.GetDefaultWeatherState();
501 if(m_timeOfTheDay >= 0)
503 time = m_timeOfTheDay;
506 if(m_year >= 1900 && m_year <= 2100)
510 if(m_month >= 1 && m_month <= 12)
514 if(m_day >= 1 && m_day <= 31)
519 if(m_weatherState.Length() > 0)
521 state = m_weatherState;
533 string GetDescription()
535 return m_description;