!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / CryEngine / CrySchematyc2 / Framework.cpp
blobcbda5afeaa12118d3a71eb07ddaa49c6cbb58858
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
4 #include "Framework.h"
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>
13 #include "CVars.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"
24 namespace Schematyc2
26 namespace
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;
82 // ~TODO
85 bool CFramework::Initialize(SSystemGlobalEnvironment& env, const SSystemInitParams& initParams)
87 env.pSchematyc2 = this;
89 Schematyc2::CVars::Register();
90 // Initialise log and create output file.
91 m_log.Init();
93 stack_string logFileName;
94 const int applicationInstance = gEnv->pSystem->GetApplicationInstance();
95 if(applicationInstance)
97 logFileName.Format("schematyc_legacy(%d).log", applicationInstance);
99 else
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.
113 RefreshEnv();
114 // Run unit tests.
115 if(CVars::sc2_RunUnitTests)
117 CUnitTestRegistrar::RunUnitTests();
120 m_pBaseEnv.reset(new SchematycBaseEnv::CBaseEnv());
122 return true;
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()
140 return m_stringPool;
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()
226 return m_compiler;
229 //////////////////////////////////////////////////////////////////////////
230 IObjectManager& CFramework::GetObjectManager()
232 return m_objectManager;
235 //////////////////////////////////////////////////////////////////////////
236 ILog& CFramework::GetLog()
238 return m_log;
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()
300 // Clear registries.
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()
329 return m_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()
359 if(m_pLogFileOutput)
361 m_pLogFileOutput->ClearStreams();
363 stack_string logFileStreams = CVars::GetStringSafe(CVars::sc2_LogFileStreams);
364 const size_t length = logFileStreams.length();
365 int pos = 0;
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()
382 if(m_pLogFileOutput)
384 m_pLogFileOutput->ClearMessageTypes();
386 stack_string logFileMessageTypes = CVars::GetStringSafe(CVars::sc2_LogFileMessageTypes);
387 const size_t length = logFileMessageTypes.length();
388 int pos = 0;
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)