1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "CrySchematyc2/Framework.h"
6 #if defined(WIN32) || defined(WIN64)
10 #include <CryExtension/CryCreateClassInstance.h>
11 #include <CrySchematyc2/SerializationUtils.h>
12 #include <CrySchematyc2/TypeDesc.h>
14 #include "CrySchematyc2/CVars.h"
15 #include "CrySchematyc2/Log.h"
17 #define SCHEMATYC_FRAMEWORK_CREATOR_CLASS_NAME "GameExtension_SchematycFrameworkCreator"
23 static const char* DOC_SUB_FOLDER
= "docs";
24 static const char* DOC_EXTENSION
= "xml";
25 static const char* SETTINGS_SUB_FOLDER
= "Settings";
26 static const char* SETTINGS_EXTENSION
= "xml";
28 static const SGUID BOOL_TYPE_GUID
= "03211ee1-b8d3-42a5-bfdc-296fc535fe43";
29 static const SGUID INT32_TYPE_GUID
= "8bd755fd-ed92-42e8-a488-79e7f1051b1a";
30 static const SGUID UINT32_TYPE_GUID
= "db4b8137-5150-4246-b193-d8d509bec2d4";
31 static const SGUID FLOAT_TYPE_GUID
= "03d99d5a-cf2c-4f8a-8489-7da5b515c202";
32 static const SGUID STRING_TYPE_GUID
= "02b79308-c51c-4841-99ec-c887577217a7";
33 static const SGUID OBJECT_ID_TYPE_GUID
= "95b8918e-9e65-4b6c-9c48-8899754f9d3c";
34 static const SGUID ENTITY_ID_TYPE_GUID
= "00782e22-3188-4538-b4f2-8749b8a9dc48";
35 static const SGUID VEC2_TYPE_GUID
= "6c607bf5-76d7-45d0-9b34-9d81a13c3c89";
36 static const SGUID VEC3_TYPE_GUID
= "e01bd066-2a42-493d-bc43-436b233833d8";
37 static const SGUID ANG3_TYPE_GUID
= "5aafd383-4b89-4249-91d3-0e42f3a094a5";
38 static const SGUID QROTATION_TYPE_GUID
= "991960c1-3b34-45cc-ac3c-f3f0e55ed7ef";
39 static const SGUID CHARACTER_FILE_NAME_TYPE_GUID
= "cb3189c1-92de-4851-b26a-22894ec039b0";
40 static const SGUID GEOMETRY_FILE_NAME_TYPE_GUID
= "bd6f2953-1127-4cdd-bfe7-79f98c97058c";
41 static const SGUID PARTICLE_EFFECT_NAME_TYPE_GUID
= "a6f326e7-d3d3-428a-92c9-97185f003bec";
42 static const SGUID SOUND_NAME_TYPE_GUID
= "328e6265-5d53-4d87-8fdd-8b7c0176299a";
43 static const SGUID DIALOG_NAME_TYPE_GUID
= "839adde8-cc62-4636-9f26-16dd4236855f";
44 static const SGUID FORCE_FEEDBACK_ID_TYPE_GUID
= "40dce92c-9532-4c02-8752-4afac04331ef";
46 class CSchematycFrameworkCreator
: public IGameFrameworkExtensionCreator
48 CRYINTERFACE_SIMPLE(IGameFrameworkExtensionCreator
)
50 CRYGENERATE_SINGLETONCLASS_GUID(CSchematycFrameworkCreator
, SCHEMATYC_FRAMEWORK_CREATOR_CLASS_NAME
, "0f296b01-ff3f-4f55-aa10-a724a89c73cd"_cry_guid
)
52 virtual ICryUnknown
* Create(IGameFramework
* pIGameFramework
) OVERRIDE
54 // Create Schematyc framework.
55 boost::shared_ptr
<CFramework
> pSchematycFramework
;
56 if(CryCreateClassInstance(SCHEMATYC_FRAMEWORK_CLASS_NAME
, pSchematycFramework
) == true)
58 // Register Schematyc with game framework
59 pIGameFramework
->RegisterExtension(pSchematycFramework
);
60 // Call GetSchematycFramework() to ensure registration was successful and cache the framework pointer locally.
61 GetSchematycFramework();
62 // Initialize Schematyc framework.
63 pSchematycFramework
->Init();
64 CryLogAlways("Schematyc framework initialized");
65 return pSchematycFramework
.get();
71 CSchematycFrameworkCreator::CSchematycFrameworkCreator() {}
73 CSchematycFrameworkCreator::~CSchematycFrameworkCreator() {}
75 CRYREGISTER_SINGLETON_CLASS(CSchematycFrameworkCreator
)
78 //////////////////////////////////////////////////////////////////////////
79 IFramework
* CreateFramework(IGameFramework
* pIGameFramework
)
81 IGameFrameworkExtensionCreatorPtr pCreator
;
82 if(CryCreateClassInstance(SCHEMATYC_FRAMEWORK_CREATOR_CLASS_NAME
, pCreator
) == true)
84 return cryinterface_cast
<IFramework
>(pCreator
->Create(pIGameFramework
));
89 //////////////////////////////////////////////////////////////////////////
90 CFramework::CFramework() {}
92 //////////////////////////////////////////////////////////////////////////
93 CFramework::~CFramework() {}
95 //////////////////////////////////////////////////////////////////////////
96 void CFramework::Init()
98 // Initialise framework.
99 Schematyc::CVars::Register();
101 SCHEMATYC_COMMENT("Initializing Schematyc framework");
102 // Refresh environment.
106 //////////////////////////////////////////////////////////////////////////
107 void CFramework::SetGUIDGenerator(const TGUIDGenerator
& guidGenerator
)
109 m_guidGenerator
= guidGenerator
;
112 //////////////////////////////////////////////////////////////////////////
113 SGUID
CFramework::CreateGUID() const
115 return m_guidGenerator
.Empty() == false ? m_guidGenerator() : SGUID();
118 //////////////////////////////////////////////////////////////////////////
119 IStringPool
& CFramework::GetStringPool()
124 //////////////////////////////////////////////////////////////////////////
125 IEnvRegistry
& CFramework::GetEnvRegistry()
127 return m_envRegistry
;
130 //////////////////////////////////////////////////////////////////////////
131 ILibRegistry
& CFramework::GetLibRegistry()
133 return m_libRegistry
;
136 //////////////////////////////////////////////////////////////////////////
137 const char* CFramework::GetRootFolder() const
139 return CVars::GetStringSafe(CVars::sc_RootFolder
);
142 //////////////////////////////////////////////////////////////////////////
143 const char* CFramework::GetDocFolder() const
145 m_docFolder
= GetRootFolder();
146 m_docFolder
.append("/");
147 m_docFolder
.append(DOC_SUB_FOLDER
);
148 return m_docFolder
.c_str();
151 //////////////////////////////////////////////////////////////////////////
152 const char* CFramework::GetDocExtension() const
154 return DOC_EXTENSION
;
157 //////////////////////////////////////////////////////////////////////////
158 const char* CFramework::GetSettingsFolder() const
160 m_settingsFolder
= GetRootFolder();
161 m_settingsFolder
.append("/");
162 m_settingsFolder
.append(SETTINGS_SUB_FOLDER
);
163 return m_settingsFolder
.c_str();
166 //////////////////////////////////////////////////////////////////////////
167 const char* CFramework::GetSettingsExtension() const
169 return SETTINGS_EXTENSION
;
172 //////////////////////////////////////////////////////////////////////////
173 IDocManager
& CFramework::GetDocManager()
178 //////////////////////////////////////////////////////////////////////////
179 ICompiler
& CFramework::GetCompiler()
184 //////////////////////////////////////////////////////////////////////////
185 IObjectManager
& CFramework::GetObjectManager()
187 return m_objectManager
;
190 //////////////////////////////////////////////////////////////////////////
191 ILog
& CFramework::GetLog()
196 //////////////////////////////////////////////////////////////////////////
197 IUpdateScheduler
& CFramework::GetUpdateScheduler()
199 return m_updateScheduler
;
202 //////////////////////////////////////////////////////////////////////////
203 ITimerSystem
& CFramework::GetTimerSystem()
205 return m_timerSystem
;
208 //////////////////////////////////////////////////////////////////////////
209 IFramework::IRefreshEnvSignal
& CFramework::GetRefreshEnvSignal()
211 return m_refreshEnvSignal
;
214 //////////////////////////////////////////////////////////////////////////
215 void CFramework::RefreshEnv()
218 m_libRegistry
.Clear();
219 m_envRegistry
.Clear();
220 // Register core types.
221 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(BOOL_TYPE_GUID
, "Bool", "Boolean", TypeCategory::PRIMITIVE
, bool()));
222 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(INT32_TYPE_GUID
, "Int32", "Signed 32bit integer", TypeCategory::PRIMITIVE
, int32()));
223 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(UINT32_TYPE_GUID
, "UInt32", "Unsigned 32bit integer", TypeCategory::PRIMITIVE
, uint32()));
224 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(FLOAT_TYPE_GUID
, "Float", "32bit floating point number", TypeCategory::PRIMITIVE
, float()));
225 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(STRING_TYPE_GUID
, "String", "String", TypeCategory::PRIMITIVE
, CPoolString()));
226 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(OBJECT_ID_TYPE_GUID
, "ObjectId", "Object id", TypeCategory::CLASS
, TObjectId()));
227 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(ENTITY_ID_TYPE_GUID
, "EntityId", "Entity id", TypeCategory::CLASS
, TEntityId()));
228 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(VEC2_TYPE_GUID
, "Vec2", "2d vector", TypeCategory::CLASS
, Vec2(ZERO
)));
229 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(VEC3_TYPE_GUID
, "Vec3", "3d vector", TypeCategory::CLASS
, Vec3(ZERO
)));
230 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(ANG3_TYPE_GUID
, "Ang3", "3d euler angle", TypeCategory::CLASS
, Ang3(ZERO
)));
231 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(QROTATION_TYPE_GUID
, "QRotation", "Quaternion rotation", TypeCategory::CLASS
, QRotation()));
232 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(CHARACTER_FILE_NAME_TYPE_GUID
, "CharacterFileName", "Character file name", TypeCategory::CLASS
, SCharacterFileName()));
233 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(GEOMETRY_FILE_NAME_TYPE_GUID
, "GeometryFileName", "Geometry file name", TypeCategory::CLASS
, SGeometryFileName()));
234 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(PARTICLE_EFFECT_NAME_TYPE_GUID
, "ParticleEffectName", "Particle effect name", TypeCategory::CLASS
, SParticleEffectName()));
235 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(SOUND_NAME_TYPE_GUID
, "SoundName", "Sound name", TypeCategory::CLASS
, SSoundName()));
236 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(DIALOG_NAME_TYPE_GUID
, "DialogName", "Dialog name", TypeCategory::CLASS
, SDialogName()));
237 m_envRegistry
.RegisterTypeDesc(MakeTypeDescShared(FORCE_FEEDBACK_ID_TYPE_GUID
, "ForceFeedbackId", "Force feedback id", TypeCategory::CLASS
, SForceFeedbackId()));
238 // Send signal to refresh environment.
239 m_refreshEnvSignal
.Send();
242 CRYREGISTER_CLASS(CFramework
)