1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
6 #include <CryCore/Platform/platform_impl.inl>
8 #include <CryExtension/CryCreateClassInstance.h>
9 #include <CrySchematyc2/EnvTypeDesc.h>
10 #include <CrySchematyc2/Serialization/SerializationEnums.inl>
11 #include <CrySchematyc2/Serialization/SerializationUtils.h>
14 #include "DomainContext.h"
15 #include "Serialization/SerializationContext.h"
16 #include "Serialization/ValidatorArchive.h"
17 #include "Serialization/Resources/GameResourceList.h"
18 #include "Serialization/Resources/ResourceCollectorArchive.h"
19 #include "Services/Log.h"
20 #include "UnitTests/UnitTestRegistrar.h"
22 #include "BaseEnv/BaseEnv_BaseEnv.h"
28 // #SchematycTODO : Pass settings from game to framework during initialization?
29 static const char* OLD_SCRIPT_SUB_FOLDER
= "docs";
30 static const char* OLD_SCRIPT_EXTENSION
= "xml";
31 static const char* g_szScriptsFolder
= "scripts";
32 //static const char* g_szScriptExtension = "ssf";
33 static const char* g_szSettingsFolder
= "settings";
34 static const char* g_szSettingsExtension
= "xml";
36 static const SGUID BOOL_TYPE_GUID
= "03211ee1-b8d3-42a5-bfdc-296fc535fe43";
37 static const SGUID INT32_TYPE_GUID
= "8bd755fd-ed92-42e8-a488-79e7f1051b1a";
38 static const SGUID UINT32_TYPE_GUID
= "db4b8137-5150-4246-b193-d8d509bec2d4";
39 static const SGUID FLOAT_TYPE_GUID
= "03d99d5a-cf2c-4f8a-8489-7da5b515c202";
40 static const SGUID STRING_TYPE_GUID
= "02b79308-c51c-4841-99ec-c887577217a7";
41 static const SGUID OBJECT_ID_TYPE_GUID
= "95b8918e-9e65-4b6c-9c48-8899754f9d3c";
42 static const SGUID ENTITY_ID_TYPE_GUID
= "00782e22-3188-4538-b4f2-8749b8a9dc48";
43 static const SGUID VEC2_TYPE_GUID
= "6c607bf5-76d7-45d0-9b34-9d81a13c3c89";
44 static const SGUID VEC3_TYPE_GUID
= "e01bd066-2a42-493d-bc43-436b233833d8";
45 static const SGUID ANG3_TYPE_GUID
= "5aafd383-4b89-4249-91d3-0e42f3a094a5";
46 static const SGUID QROTATION_TYPE_GUID
= "991960c1-3b34-45cc-ac3c-f3f0e55ed7ef";
47 static const SGUID CHARACTER_FILE_NAME_TYPE_GUID
= "cb3189c1-92de-4851-b26a-22894ec039b0";
48 static const SGUID GEOMETRY_FILE_NAME_TYPE_GUID
= "bd6f2953-1127-4cdd-bfe7-79f98c97058c";
49 static const SGUID PARTICLE_EFFECT_NAME_TYPE_GUID
= "a6f326e7-d3d3-428a-92c9-97185f003bec";
50 static const SGUID SOUND_NAME_TYPE_GUID
= "328e6265-5d53-4d87-8fdd-8b7c0176299a";
51 static const SGUID DIALOG_NAME_TYPE_GUID
= "839adde8-cc62-4636-9f26-16dd4236855f";
52 static const SGUID FORCE_FEEDBACK_ID_TYPE_GUID
= "40dce92c-9532-4c02-8752-4afac04331ef";
54 static void OnLogToFileChange(ICVar
* pCVar
)
56 static_cast<CFramework
*>(gEnv
->pSchematyc2
)->RefreshLogFileConfiguration();
59 static void OnLogFileStreamsChange(ICVar
* pCVar
)
61 static_cast<CFramework
*>(gEnv
->pSchematyc2
)->RefreshLogFileStreams();
64 static void OnLogFileMessageTypesChange(ICVar
* pCVar
)
66 static_cast<CFramework
*>(gEnv
->pSchematyc2
)->RefreshLogFileMessageTypes();
71 CFramework::CFramework()
72 : m_updateRelevanceContext(nullptr, 0, 0.f
, 0.f
)
76 CFramework::~CFramework()
78 Schematyc2::CVars::Unregister();
80 // TODO: Currently set to null in CSystem::UnloadSchematyc() funcion. Remove it there as soon as we have fixed internal Schematyc shutdown order.
81 //gEnv->pSchematyc2 = nullptr;
85 bool CFramework::Initialize(SSystemGlobalEnvironment
& env
, const SSystemInitParams
& initParams
)
87 env
.pSchematyc2
= this;
89 Schematyc2::CVars::Register();
90 // Initialise log and create output file.
93 stack_string logFileName
;
94 const int applicationInstance
= gEnv
->pSystem
->GetApplicationInstance();
95 if(applicationInstance
)
97 logFileName
.Format("schematyc_legacy(%d).log", applicationInstance
);
101 logFileName
= "schematyc_legacy.log";
103 m_pLogFileOutput
= m_log
.CreateFileOutput(logFileName
.c_str());
104 SCHEMATYC2_SYSTEM_ASSERT(m_pLogFileOutput
);
105 CVars::sc2_LogToFile
->AddOnChange(OnLogToFileChange
);
106 RefreshLogFileStreams();
107 CVars::sc2_LogFileStreams
->AddOnChange(OnLogFileStreamsChange
);
108 RefreshLogFileMessageTypes();
109 CVars::sc2_LogFileMessageTypes
->AddOnChange(OnLogFileMessageTypesChange
);
111 SCHEMATYC2_SYSTEM_COMMENT("Initializing Schematyc framework");
112 // Refresh environment.
115 if(CVars::sc2_RunUnitTests
)
117 CUnitTestRegistrar::RunUnitTests();
120 m_pBaseEnv
.reset(new SchematycBaseEnv::CBaseEnv());
125 //////////////////////////////////////////////////////////////////////////
126 void CFramework::SetGUIDGenerator(const GUIDGenerator
& guidGenerator
)
128 m_guidGenerator
= guidGenerator
;
131 //////////////////////////////////////////////////////////////////////////
132 SGUID
CFramework::CreateGUID() const
134 return m_guidGenerator
? m_guidGenerator() : SGUID();
137 //////////////////////////////////////////////////////////////////////////
138 IStringPool
& CFramework::GetStringPool()
143 //////////////////////////////////////////////////////////////////////////
144 IEnvRegistry
& CFramework::GetEnvRegistry()
146 return m_envRegistry
;
149 SchematycBaseEnv::IBaseEnv
& CFramework::GetBaseEnv()
151 return *m_pBaseEnv
.get();
154 //////////////////////////////////////////////////////////////////////////
155 ILibRegistry
& CFramework::GetLibRegistry()
157 return m_libRegistry
;
160 //////////////////////////////////////////////////////////////////////////
161 const char* CFramework::GetFileFormat() const
163 return CVars::GetStringSafe(CVars::sc2_FileFormat
);
166 //////////////////////////////////////////////////////////////////////////
167 const char* CFramework::GetRootFolder() const
169 return CVars::GetStringSafe(CVars::sc2_RootFolder
);
172 //////////////////////////////////////////////////////////////////////////
173 const char* CFramework::GetOldScriptsFolder() const
175 m_oldScriptsFolder
= GetRootFolder();
176 m_oldScriptsFolder
.append("/");
177 m_oldScriptsFolder
.append(OLD_SCRIPT_SUB_FOLDER
);
178 return m_oldScriptsFolder
.c_str();
181 //////////////////////////////////////////////////////////////////////////
182 const char* CFramework::GetOldScriptExtension() const
184 return OLD_SCRIPT_EXTENSION
;
187 //////////////////////////////////////////////////////////////////////////
188 const char* CFramework::GetScriptsFolder() const
190 m_scriptsFolder
= GetRootFolder();
191 m_scriptsFolder
.append("/");
192 m_scriptsFolder
.append(g_szScriptsFolder
);
193 return m_scriptsFolder
.c_str();
196 //////////////////////////////////////////////////////////////////////////
197 const char* CFramework::GetSettingsFolder() const
199 m_settingsFolder
= GetRootFolder();
200 m_settingsFolder
.append("/");
201 m_settingsFolder
.append(g_szSettingsFolder
);
202 return m_settingsFolder
.c_str();
205 //////////////////////////////////////////////////////////////////////////
206 const char* CFramework::GetSettingsExtension() const
208 return g_szSettingsExtension
;
211 //////////////////////////////////////////////////////////////////////////
212 bool CFramework::IsExperimentalFeatureEnabled(const char* szFeatureName
) const
214 return CryStringUtils::stristr(CVars::GetStringSafe(CVars::sc2_ExperimentalFeatures
), szFeatureName
) != nullptr;
217 //////////////////////////////////////////////////////////////////////////
218 IScriptRegistry
& CFramework::GetScriptRegistry()
220 return m_scriptRegistry
;
223 //////////////////////////////////////////////////////////////////////////
224 ICompiler
& CFramework::GetCompiler()
229 //////////////////////////////////////////////////////////////////////////
230 IObjectManager
& CFramework::GetObjectManager()
232 return m_objectManager
;
235 //////////////////////////////////////////////////////////////////////////
236 ILog
& CFramework::GetLog()
241 //////////////////////////////////////////////////////////////////////////
242 ILogRecorder
& CFramework::GetLogRecorder()
244 return m_logRecorder
;
247 //////////////////////////////////////////////////////////////////////////
248 IUpdateScheduler
& CFramework::GetUpdateScheduler()
250 return m_updateScheduler
;
253 //////////////////////////////////////////////////////////////////////////
254 ITimerSystem
& CFramework::GetTimerSystem()
256 return m_timerSystem
;
259 //////////////////////////////////////////////////////////////////////////
260 ISerializationContextPtr
CFramework::CreateSerializationContext(const SSerializationContextParams
& params
) const
262 return ISerializationContextPtr(std::make_shared
<CSerializationContext
>(params
));
265 //////////////////////////////////////////////////////////////////////////
266 IDomainContextPtr
CFramework::CreateDomainContext(const SDomainContextScope
& scope
) const
268 return IDomainContextPtr(std::make_shared
<CDomainContext
>(scope
));
271 //////////////////////////////////////////////////////////////////////////
272 IValidatorArchivePtr
CFramework::CreateValidatorArchive(const SValidatorArchiveParams
& params
) const
274 return IValidatorArchivePtr(std::make_shared
<CValidatorArchive
>(params
));
277 //////////////////////////////////////////////////////////////////////////
278 IGameResourceListPtr
CFramework::CreateGameResoucreList() const
280 return IGameResourceListPtr(std::make_shared
<CGameResourceList
>());
283 //////////////////////////////////////////////////////////////////////////
284 IResourceCollectorArchivePtr
CFramework::CreateResourceCollectorArchive(IGameResourceListPtr pResourceList
) const
286 return IResourceCollectorArchivePtr(std::make_shared
<CResourceCollectorArchive
>(pResourceList
));
289 //////////////////////////////////////////////////////////////////////////
290 void CFramework::RefreshLogFileSettings()
292 RefreshLogFileConfiguration();
293 RefreshLogFileStreams();
294 RefreshLogFileMessageTypes();
297 //////////////////////////////////////////////////////////////////////////
298 void CFramework::RefreshEnv()
301 m_libRegistry
.Clear();
302 m_envRegistry
.Clear();
303 // Register core types.
304 // #SchematycTODO : Move some/most of these to base env!
305 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(BOOL_TYPE_GUID
, "Bool", "Boolean", bool(), EEnvTypeFlags::None
));
306 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(INT32_TYPE_GUID
, "Int32", "Signed 32bit integer", int32(), EEnvTypeFlags::Switchable
));
307 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(UINT32_TYPE_GUID
, "UInt32", "Unsigned 32bit integer", uint32(), EEnvTypeFlags::Switchable
));
308 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(FLOAT_TYPE_GUID
, "Float", "32bit floating point number", float(), EEnvTypeFlags::None
));
309 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(STRING_TYPE_GUID
, "String", "String", CPoolString(), EEnvTypeFlags::Switchable
));
310 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(OBJECT_ID_TYPE_GUID
, "ObjectId", "Object id", ObjectId(), EEnvTypeFlags::None
));
311 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(ENTITY_ID_TYPE_GUID
, "EntityId", "Entity id", ExplicitEntityId::s_invalid
, EEnvTypeFlags::None
));
312 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(VEC2_TYPE_GUID
, "Vector2", "2d vector", Vec2(ZERO
), EEnvTypeFlags::None
));
313 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(VEC3_TYPE_GUID
, "Vector3", "3d vector", Vec3(ZERO
), EEnvTypeFlags::None
));
314 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(ANG3_TYPE_GUID
, "Angle3", "3d euler angle", Ang3(ZERO
), EEnvTypeFlags::None
));
315 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(QROTATION_TYPE_GUID
, "QRotation", "Quaternion rotation", QRotation(), EEnvTypeFlags::None
));
316 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(CHARACTER_FILE_NAME_TYPE_GUID
, "CharacterFileName", "Character file name", SCharacterFileName(), EEnvTypeFlags::None
));
317 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(GEOMETRY_FILE_NAME_TYPE_GUID
, "GeometryFileName", "Geometry file name", SGeometryFileName(), EEnvTypeFlags::None
));
318 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(PARTICLE_EFFECT_NAME_TYPE_GUID
, "ParticleEffectName", "Particle effect name", SParticleEffectName(), EEnvTypeFlags::None
));
319 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(SOUND_NAME_TYPE_GUID
, "SoundName", "Sound name", SSoundName(), EEnvTypeFlags::None
));
320 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(DIALOG_NAME_TYPE_GUID
, "DialogName", "Dialog name", SDialogName(), EEnvTypeFlags::None
));
321 m_envRegistry
.RegisterTypeDesc(MakeEnvTypeDescShared(FORCE_FEEDBACK_ID_TYPE_GUID
, "ForceFeedbackId", "Force feedback id", SForceFeedbackId(), EEnvTypeFlags::None
));
322 // Send signal to refresh environment.
323 m_signals
.envRefresh
.Send();
326 //////////////////////////////////////////////////////////////////////////
327 SFrameworkSignals
& CFramework::Signals()
332 //////////////////////////////////////////////////////////////////////////
333 void CFramework::PrePhysicsUpdate()
335 MEMSTAT_FUNCTION_CONTEXT(EMemStatContextType::Other
);
336 m_pBaseEnv
->PrePhysicsUpdate();
339 //////////////////////////////////////////////////////////////////////////
340 void CFramework::Update()
342 MEMSTAT_FUNCTION_CONTEXT(EMemStatContextType::Other
);
343 m_pBaseEnv
->Update(&m_updateRelevanceContext
);
346 //////////////////////////////////////////////////////////////////////////
347 void CFramework::RefreshLogFileConfiguration()
349 if (m_pLogFileOutput
)
351 int sc_LogToFile
= CVars::sc2_LogToFile
->GetIVal();
352 m_pLogFileOutput
->ConfigureFileOutput(sc_LogToFile
== 1, sc_LogToFile
== 2);
356 //////////////////////////////////////////////////////////////////////////
357 void CFramework::RefreshLogFileStreams()
361 m_pLogFileOutput
->ClearStreams();
363 stack_string logFileStreams
= CVars::GetStringSafe(CVars::sc2_LogFileStreams
);
364 const size_t length
= logFileStreams
.length();
368 stack_string token
= logFileStreams
.Tokenize(" ", pos
);
369 const LogStreamId logStreamId
= gEnv
->pSchematyc2
->GetLog().GetStreamId(token
.c_str());
370 if(logStreamId
!= LogStreamId::s_invalid
)
372 m_pLogFileOutput
->EnableStream(logStreamId
);
375 while (pos
< length
);
379 //////////////////////////////////////////////////////////////////////////
380 void CFramework::RefreshLogFileMessageTypes()
384 m_pLogFileOutput
->ClearMessageTypes();
386 stack_string logFileMessageTypes
= CVars::GetStringSafe(CVars::sc2_LogFileMessageTypes
);
387 const size_t length
= logFileMessageTypes
.length();
391 stack_string token
= logFileMessageTypes
.Tokenize(" ", pos
);
392 const ELogMessageType logMessageType
= gEnv
->pSchematyc2
->GetLog().GetMessageType(token
.c_str());
393 if(logMessageType
!= ELogMessageType::Invalid
)
395 m_pLogFileOutput
->EnableMessageType(logMessageType
);
398 while (pos
< length
);
402 CRYREGISTER_SINGLETON_CLASS(CFramework
)