!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / CryEngine / CrySchematyc2 / Lib.cpp
blob6b0de0a657aefa183453ce38f87172026693fcf8
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
4 #include "Lib.h"
6 #include <CrySerialization/BlackBox.h>
7 #include <CrySerialization/IArchiveHost.h>
8 #include <CrySerialization/STL.h>
9 #include <CrySchematyc2/ILibRegistry.h>
10 #include <CrySchematyc2/LibUtils.h>
11 #include <CrySchematyc2/Deprecated/IGlobalFunction.h>
12 #include <CrySchematyc2/Env/IEnvRegistry.h>
13 #include <CrySchematyc2/Utils/StringUtils.h>
14 #include <CrySchematyc2/Serialization/Resources/IResourceCollectorArchive.h>
15 #include "CVars.h"
17 SERIALIZATION_ENUM_BEGIN_NESTED2(Schematyc2, CLibClassProperties, EInternalOverridePolicy, "Schematyc Library Class Property Override Policy")
18 SERIALIZATION_ENUM(Schematyc2::CLibClassProperties::EInternalOverridePolicy::UseDefault, "UseDefault", "Default")
19 SERIALIZATION_ENUM(Schematyc2::CLibClassProperties::EInternalOverridePolicy::OverrideDefault, "OverrideDefault", "Override")
20 SERIALIZATION_ENUM_END()
22 namespace Schematyc2
24 const size_t CLibFunction::MIN_CAPACITY = 512;
25 const size_t CLibFunction::GROWTH_FACTOR = 8;
27 struct SComponentInstanceSortRef
29 inline SComponentInstanceSortRef(size_t _iComponentInstance)
30 : iComponentInstance(_iComponentInstance)
31 , priority(0)
34 size_t iComponentInstance;
35 int32 priority;
36 TSizeTVector dependencies;
39 typedef std::vector<SComponentInstanceSortRef> TComponentInstanceSortRefVector;
41 struct SComponentInstanceSortPredicate
43 inline bool operator () (const SComponentInstanceSortRef& lhs, const SComponentInstanceSortRef& rhs) const
45 if (lhs.priority != rhs.priority)
47 return lhs.priority > rhs.priority;
49 return lhs.iComponentInstance < rhs.iComponentInstance;
53 //////////////////////////////////////////////////////////////////////////
54 CLibAbstractInterfaceFunction::CLibAbstractInterfaceFunction(const SGUID& guid, const char* szName)
55 : m_guid(guid)
56 , m_name(szName)
59 //////////////////////////////////////////////////////////////////////////
60 SGUID CLibAbstractInterfaceFunction::GetGUID() const
62 return m_guid;
65 //////////////////////////////////////////////////////////////////////////
66 const char* CLibAbstractInterfaceFunction::GetName() const
68 return m_name.c_str();
71 //////////////////////////////////////////////////////////////////////////
72 TVariantConstArray CLibAbstractInterfaceFunction::GetVariantInputs() const
74 return m_variantInputs;
77 //////////////////////////////////////////////////////////////////////////
78 TVariantConstArray CLibAbstractInterfaceFunction::GetVariantOutputs() const
80 return m_variantOutputs;
83 //////////////////////////////////////////////////////////////////////////
84 void CLibAbstractInterfaceFunction::AddInput(const IAny& value)
86 CVariantVectorOutputArchive archive(m_variantInputs);
87 archive(value, "", "");
90 //////////////////////////////////////////////////////////////////////////
91 void CLibAbstractInterfaceFunction::AddOutput(const IAny& value)
93 CVariantVectorOutputArchive archive(m_variantOutputs);
94 archive(value, "", "");
97 //////////////////////////////////////////////////////////////////////////
98 CLibAbstractInterface::CLibAbstractInterface(const SGUID& guid, const char* szName)
99 : m_guid(guid)
100 , m_name(szName)
103 //////////////////////////////////////////////////////////////////////////
104 SGUID CLibAbstractInterface::GetGUID() const
106 return m_guid;
109 //////////////////////////////////////////////////////////////////////////
110 const char* CLibAbstractInterface::GetName() const
112 return m_name.c_str();
115 //////////////////////////////////////////////////////////////////////////
116 CLibStateMachine::CLibStateMachine(const SGUID& guid, const char* szName, const EStateMachineLifetime lifetime, const EStateMachineNetAuthority netType)
117 : m_guid(guid)
118 , m_name(szName)
119 , m_lifetime(lifetime)
120 , m_netAuthority(netType)
121 , m_iPartner(INVALID_INDEX)
124 //////////////////////////////////////////////////////////////////////////
125 SGUID CLibStateMachine::GetGUID() const
127 return m_guid;
130 //////////////////////////////////////////////////////////////////////////
131 const char* CLibStateMachine::GetName() const
133 return m_name.c_str();
136 //////////////////////////////////////////////////////////////////////////
137 EStateMachineLifetime CLibStateMachine::GetLifetime() const
139 return m_lifetime;
142 Schematyc2::EStateMachineNetAuthority CLibStateMachine::GetNetAuthority() const
144 return m_netAuthority;
147 //////////////////////////////////////////////////////////////////////////
148 size_t CLibStateMachine::GetPartner() const
150 return m_iPartner;
153 //////////////////////////////////////////////////////////////////////////
154 size_t CLibStateMachine::GetListenerCount() const
156 return m_listeners.size();
159 //////////////////////////////////////////////////////////////////////////
160 size_t CLibStateMachine::GetListener(size_t iListener) const
162 return iListener < m_listeners.size() ? m_listeners[iListener] : INVALID_INDEX;
165 //////////////////////////////////////////////////////////////////////////
166 size_t CLibStateMachine::GetVariableCount() const
168 return m_variables.size();
171 //////////////////////////////////////////////////////////////////////////
172 size_t CLibStateMachine::GetVariable(const size_t iVariable) const
174 return iVariable < m_variables.size() ? m_variables[iVariable] : INVALID_INDEX;
177 //////////////////////////////////////////////////////////////////////////
178 size_t CLibStateMachine::GetContainerCount() const
180 return m_containers.size();
183 //////////////////////////////////////////////////////////////////////////
184 size_t CLibStateMachine::GetContainer(const size_t iContainer) const
186 return iContainer < m_containers.size() ? m_containers[iContainer] : INVALID_INDEX;
189 //////////////////////////////////////////////////////////////////////////
190 void CLibStateMachine::SetBeginFunction(const LibFunctionId& functionId)
192 m_beginFunctionId = functionId;
195 //////////////////////////////////////////////////////////////////////////
196 LibFunctionId CLibStateMachine::GetBeginFunction() const
198 return m_beginFunctionId;
201 //////////////////////////////////////////////////////////////////////////
202 void CLibStateMachine::SetPartner(size_t iPartner)
204 m_iPartner = iPartner;
207 //////////////////////////////////////////////////////////////////////////
208 void CLibStateMachine::AddListener(size_t iListener)
210 m_listeners.push_back(iListener);
213 //////////////////////////////////////////////////////////////////////////
214 void CLibStateMachine::AddVariable(const size_t iVariable)
216 m_variables.push_back(iVariable);
219 //////////////////////////////////////////////////////////////////////////
220 void CLibStateMachine::AddContainer(const size_t iContainer)
222 m_containers.push_back(iContainer);
225 //////////////////////////////////////////////////////////////////////////
226 void CLibStateMachine::CompactMemory()
228 m_listeners.shrink_to_fit();
229 m_variables.shrink_to_fit();
230 m_containers.shrink_to_fit();
234 //////////////////////////////////////////////////////////////////////////
235 CLibState::CLibState(const SGUID& guid, const char* szName)
236 : m_guid(guid)
237 , m_name(szName)
238 , m_iParent(INVALID_INDEX)
239 , m_iPartner(INVALID_INDEX)
240 , m_iStateMachine(INVALID_INDEX)
243 //////////////////////////////////////////////////////////////////////////
244 SGUID CLibState::GetGUID() const
246 return m_guid;
249 //////////////////////////////////////////////////////////////////////////
250 const char* CLibState::GetName() const
252 return m_name.c_str();
255 //////////////////////////////////////////////////////////////////////////
256 size_t CLibState::GetParent() const
258 return m_iParent;
261 //////////////////////////////////////////////////////////////////////////
262 size_t CLibState::GetPartner() const
264 return m_iPartner;
267 //////////////////////////////////////////////////////////////////////////
268 size_t CLibState::GetStateMachine() const
270 return m_iStateMachine;
273 //////////////////////////////////////////////////////////////////////////
274 size_t CLibState::GetVariableCount() const
276 return m_variables.size();
279 //////////////////////////////////////////////////////////////////////////
280 size_t CLibState::GetVariable(size_t iVariable) const
282 return iVariable < m_variables.size() ? m_variables[iVariable] : INVALID_INDEX;
285 //////////////////////////////////////////////////////////////////////////
286 size_t CLibState::GetContainerCount() const
288 return m_containers.size();
291 //////////////////////////////////////////////////////////////////////////
292 size_t CLibState::GetContainer(size_t iContainer) const
294 return iContainer < m_containers.size() ? m_containers[iContainer] : INVALID_INDEX;
297 //////////////////////////////////////////////////////////////////////////
298 size_t CLibState::GetTimerCount() const
300 return m_timers.size();
303 //////////////////////////////////////////////////////////////////////////
304 size_t CLibState::GetTimer(size_t iTimer) const
306 return iTimer < m_timers.size() ? m_timers[iTimer] : INVALID_INDEX;
309 //////////////////////////////////////////////////////////////////////////
310 size_t CLibState::GetActionInstanceCount() const
312 return m_actionInstances.size();
315 //////////////////////////////////////////////////////////////////////////
316 size_t CLibState::GetActionInstance(size_t iActionInstance) const
318 return iActionInstance < m_actionInstances.size() ? m_actionInstances[iActionInstance] : INVALID_INDEX;
321 //////////////////////////////////////////////////////////////////////////
322 size_t CLibState::GetConstructorCount() const
324 return m_constructors.size();
327 //////////////////////////////////////////////////////////////////////////
328 size_t CLibState::GetConstructor(size_t iConstructor) const
330 return iConstructor < m_constructors.size() ? m_constructors[iConstructor] : INVALID_INDEX;
333 //////////////////////////////////////////////////////////////////////////
334 size_t CLibState::GetDestructorCount() const
336 return m_destructors.size();
339 //////////////////////////////////////////////////////////////////////////
340 size_t CLibState::GetDestructor(size_t iDestructor) const
342 return iDestructor < m_destructors.size() ? m_destructors[iDestructor] : INVALID_INDEX;
345 //////////////////////////////////////////////////////////////////////////
346 size_t CLibState::GetSignalReceiverCount() const
348 return m_signalReceivers.size();
351 //////////////////////////////////////////////////////////////////////////
352 size_t CLibState::GetSignalReceiver(size_t iSignalReceiver) const
354 return iSignalReceiver < m_signalReceivers.size() ? m_signalReceivers[iSignalReceiver] : INVALID_INDEX;
357 ////////////////////////////////////////a//////////////////////////////////
358 size_t CLibState::GetTransitionCount() const
360 return m_transitions.size();
363 //////////////////////////////////////////////////////////////////////////
364 size_t CLibState::GetTransition(size_t iTransition) const
366 return iTransition < m_transitions.size() ? m_transitions[iTransition] : INVALID_INDEX;
369 //////////////////////////////////////////////////////////////////////////
370 void CLibState::SetParent(size_t iParent)
372 m_iParent = iParent;
375 //////////////////////////////////////////////////////////////////////////
376 void CLibState::SetPartner(size_t iPartner)
378 m_iPartner = iPartner;
381 //////////////////////////////////////////////////////////////////////////
382 void CLibState::SetStateMachine(size_t iStateMachine)
384 m_iStateMachine = iStateMachine;
387 //////////////////////////////////////////////////////////////////////////
388 void CLibState::AddVariable(size_t iVariable)
390 m_variables.push_back(iVariable);
393 //////////////////////////////////////////////////////////////////////////
394 void CLibState::AddContainer(size_t iContainer)
396 m_containers.push_back(iContainer);
399 //////////////////////////////////////////////////////////////////////////
400 void CLibState::AddTimer(size_t iTimer)
402 m_timers.push_back(iTimer);
405 //////////////////////////////////////////////////////////////////////////
406 void CLibState::AddActionInstance(size_t iActionInstance)
408 m_actionInstances.push_back(iActionInstance);
411 //////////////////////////////////////////////////////////////////////////
412 void CLibState::AddConstructor(size_t iConstructor)
414 m_constructors.push_back(iConstructor);
417 //////////////////////////////////////////////////////////////////////////
418 void CLibState::AddDestructor(size_t iDestructor)
420 m_destructors.push_back(iDestructor);
423 //////////////////////////////////////////////////////////////////////////
424 void CLibState::AddSignalReceiver(size_t iSignalReceiver)
426 m_signalReceivers.push_back(iSignalReceiver);
429 //////////////////////////////////////////////////////////////////////////
430 void CLibState::AddTransition(size_t iTransition)
432 m_transitions.push_back(iTransition);
435 //////////////////////////////////////////////////////////////////////////
436 void CLibState::CompactMemory()
438 m_variables.shrink_to_fit();
439 m_containers.shrink_to_fit();
440 m_timers.shrink_to_fit();
441 m_actionInstances.shrink_to_fit();
442 m_constructors.shrink_to_fit();
443 m_destructors.shrink_to_fit();
444 m_signalReceivers.shrink_to_fit();
445 m_transitions.shrink_to_fit();
448 //////////////////////////////////////////////////////////////////////////
449 CLibVariable::CLibVariable(const SGUID& guid, const char* szName, EOverridePolicy overridePolicy, const IAny& value, size_t variantPos, size_t variantCount, ELibVariableFlags flags)
450 : m_guid(guid)
451 , m_name(szName)
452 , m_overridePolicy(overridePolicy)
453 , m_pValue(value.Clone())
454 , m_variantPos(variantPos)
455 , m_variantCount(variantCount)
456 , m_flags(flags)
459 //////////////////////////////////////////////////////////////////////////
460 SGUID CLibVariable::GetGUID() const
462 return m_guid;
465 //////////////////////////////////////////////////////////////////////////
466 const char* CLibVariable::GetName() const
468 return m_name.c_str();
471 //////////////////////////////////////////////////////////////////////////
472 EOverridePolicy CLibVariable::GetOverridePolicy() const
474 return m_overridePolicy;
477 //////////////////////////////////////////////////////////////////////////
478 IAnyConstPtr CLibVariable::GetValue() const
480 return m_pValue;
483 //////////////////////////////////////////////////////////////////////////
484 size_t CLibVariable::GetVariantPos() const
486 return m_variantPos;
489 //////////////////////////////////////////////////////////////////////////
490 size_t CLibVariable::GetVariantCount() const
492 return m_variantCount;
495 //////////////////////////////////////////////////////////////////////////
496 ELibVariableFlags CLibVariable::GetFlags() const
498 return m_flags;
501 //////////////////////////////////////////////////////////////////////////
502 void CLibVariable::SetOverridePolicy(EOverridePolicy overridePolicy)
504 m_overridePolicy = overridePolicy;
507 //////////////////////////////////////////////////////////////////////////
508 CLibContainer::CLibContainer(const SGUID& guid, const char* name, const SGUID& typeGUID)
509 : m_guid(guid)
510 , m_name(name)
511 , m_typeGUID(typeGUID)
514 //////////////////////////////////////////////////////////////////////////
515 SGUID CLibContainer::GetGUID() const
517 return m_guid;
520 //////////////////////////////////////////////////////////////////////////
521 const char* CLibContainer::GetName() const
523 return m_name.c_str();
526 //////////////////////////////////////////////////////////////////////////
527 SGUID CLibContainer::GetTypeGUID() const
529 return m_typeGUID;
532 //////////////////////////////////////////////////////////////////////////
533 CLibTimer::CLibTimer(const SGUID& guid, const char* szName, const STimerParams& params)
534 : m_guid(guid)
535 , m_name(szName)
536 , m_params(params)
539 //////////////////////////////////////////////////////////////////////////
540 SGUID CLibTimer::GetGUID() const
542 return m_guid;
545 //////////////////////////////////////////////////////////////////////////
546 const char* CLibTimer::GetName() const
548 return m_name.c_str();
551 //////////////////////////////////////////////////////////////////////////
552 const STimerParams& CLibTimer::GetParams() const
554 return m_params;
557 //////////////////////////////////////////////////////////////////////////
558 CLibAbstractInterfaceImplementation::CLibAbstractInterfaceImplementation(const SGUID& guid, const char* name, const SGUID& interfaceGUID)
559 : m_guid(guid)
560 , m_name(name)
561 , m_interfaceGUID(interfaceGUID)
564 //////////////////////////////////////////////////////////////////////////
565 SGUID CLibAbstractInterfaceImplementation::GetGUID() const
567 return m_guid;
570 //////////////////////////////////////////////////////////////////////////
571 const char* CLibAbstractInterfaceImplementation::GetName() const
573 return m_name.c_str();
576 //////////////////////////////////////////////////////////////////////////
577 SGUID CLibAbstractInterfaceImplementation::GetInterfaceGUID() const
579 return m_interfaceGUID;
582 //////////////////////////////////////////////////////////////////////////
583 size_t CLibAbstractInterfaceImplementation::GetFunctionCount() const
585 return m_functions.size();
588 //////////////////////////////////////////////////////////////////////////
589 SGUID CLibAbstractInterfaceImplementation::GetFunctionGUID(size_t iFunction) const
591 return iFunction < m_functions.size() ? m_functions[iFunction].guid : SGUID();
594 //////////////////////////////////////////////////////////////////////////
595 LibFunctionId CLibAbstractInterfaceImplementation::GetFunctionId(size_t iFunction) const
597 return iFunction < m_functions.size() ? m_functions[iFunction].functionId : LibFunctionId();
600 //////////////////////////////////////////////////////////////////////////
601 void CLibAbstractInterfaceImplementation::AddFunction(const SGUID& guid, const LibFunctionId& functionId)
603 m_functions.push_back(SFunction(guid, functionId));
606 //////////////////////////////////////////////////////////////////////////
607 CLibAbstractInterfaceImplementation::SFunction::SFunction(const SGUID& _guid, const LibFunctionId& _functionId)
608 : guid(_guid)
609 , functionId(_functionId)
612 //////////////////////////////////////////////////////////////////////////
613 CLibComponentInstance::CLibComponentInstance(const SGUID& guid, const char* szName, const SGUID& componentGUID, const IPropertiesConstPtr& pProperties, uint32 propertyFunctionIdx, uint32 parentIdx)
614 : m_guid(guid)
615 , m_name(szName)
616 , m_componentGUID(componentGUID)
617 , m_pProperties(pProperties)
618 , m_propertyFunctionIdx(propertyFunctionIdx)
619 , m_parentIdx(parentIdx)
622 //////////////////////////////////////////////////////////////////////////
623 SGUID CLibComponentInstance::GetGUID() const
625 return m_guid;
628 //////////////////////////////////////////////////////////////////////////
629 const char* CLibComponentInstance::GetName() const
631 return m_name.c_str();
634 //////////////////////////////////////////////////////////////////////////
635 SGUID CLibComponentInstance::GetComponentGUID() const
637 return m_componentGUID;
640 //////////////////////////////////////////////////////////////////////////
641 IPropertiesConstPtr CLibComponentInstance::GetProperties() const
643 return m_pProperties;
646 //////////////////////////////////////////////////////////////////////////
647 uint32 CLibComponentInstance::GetPropertyFunctionIdx() const
649 return m_propertyFunctionIdx;
652 //////////////////////////////////////////////////////////////////////////
653 uint32 CLibComponentInstance::GetParentIdx() const
655 return m_parentIdx;
658 //////////////////////////////////////////////////////////////////////////
659 CLibActionInstance::CLibActionInstance(const SGUID& guid, const char* name, const SGUID& actionGUID, size_t iComponentInstance, const IPropertiesPtr& pProperties)
660 : m_guid(guid)
661 , m_name(name)
662 , m_actionGUID(actionGUID)
663 , m_iComponentInstance(iComponentInstance)
664 , m_pProperties(pProperties)
667 //////////////////////////////////////////////////////////////////////////
668 SGUID CLibActionInstance::GetGUID() const
670 return m_guid;
673 //////////////////////////////////////////////////////////////////////////
674 const char* CLibActionInstance::GetName() const
676 return m_name.c_str();
679 //////////////////////////////////////////////////////////////////////////
680 SGUID CLibActionInstance::GetActionGUID() const
682 return m_actionGUID;
685 //////////////////////////////////////////////////////////////////////////
686 size_t CLibActionInstance::GetComponentInstance() const
688 return m_iComponentInstance;
691 //////////////////////////////////////////////////////////////////////////
692 IPropertiesConstPtr CLibActionInstance::GetProperties() const
694 return m_pProperties;
697 //////////////////////////////////////////////////////////////////////////
698 CLibConstructor::CLibConstructor(const SGUID& guid, const LibFunctionId& functionId)
699 : m_guid(guid)
700 , m_functionId(functionId)
703 //////////////////////////////////////////////////////////////////////////
704 SGUID CLibConstructor::GetGUID() const
706 return m_guid;
709 //////////////////////////////////////////////////////////////////////////
710 LibFunctionId CLibConstructor::GetFunctionId() const
712 return m_functionId;
715 //////////////////////////////////////////////////////////////////////////
716 CLibDestructor::CLibDestructor(const SGUID& guid, const LibFunctionId& functionId)
717 : m_guid(guid)
718 , m_functionId(functionId)
721 //////////////////////////////////////////////////////////////////////////
722 SGUID CLibDestructor::GetGUID() const
724 return m_guid;
727 //////////////////////////////////////////////////////////////////////////
728 LibFunctionId CLibDestructor::GetFunctionId() const
730 return m_functionId;
733 //////////////////////////////////////////////////////////////////////////
734 CLibSignalReceiver::CLibSignalReceiver(const SGUID& guid, const SGUID& contextGUID, const LibFunctionId& functionId)
735 : m_guid(guid)
736 , m_contextGUID(contextGUID)
737 , m_functionId(functionId)
740 //////////////////////////////////////////////////////////////////////////
741 SGUID CLibSignalReceiver::GetGUID() const
743 return m_guid;
746 //////////////////////////////////////////////////////////////////////////
747 SGUID CLibSignalReceiver::GetContextGUID() const
749 return m_contextGUID;
752 //////////////////////////////////////////////////////////////////////////
753 LibFunctionId CLibSignalReceiver::GetFunctionId() const
755 return m_functionId;
758 //////////////////////////////////////////////////////////////////////////
759 CLibTransition::CLibTransition(const SGUID& guid, const SGUID& contextGUID, const LibFunctionId& functionId)
760 : m_guid(guid)
761 , m_contextGUID(contextGUID)
762 , m_functionId(functionId)
765 //////////////////////////////////////////////////////////////////////////
766 SGUID CLibTransition::GetGUID() const
768 return m_guid;
771 //////////////////////////////////////////////////////////////////////////
772 SGUID CLibTransition::GetContextGUID() const
774 return m_contextGUID;
777 //////////////////////////////////////////////////////////////////////////
778 LibFunctionId CLibTransition::GetFunctionId() const
780 return m_functionId;
783 //////////////////////////////////////////////////////////////////////////
784 CLibFunction::CLibFunction()
785 : m_capacity(0)
786 , m_size(0)
787 , m_lastOpPos(INVALID_INDEX)
788 , m_pBegin(NULL)
789 , m_executionFilter(EGraphExecutionFilter::Always)
792 //////////////////////////////////////////////////////////////////////////
793 CLibFunction::~CLibFunction()
795 Release();
798 //////////////////////////////////////////////////////////////////////////
799 SGUID CLibFunction::GetGUID() const
801 return m_guid;
804 //////////////////////////////////////////////////////////////////////////
805 SGUID CLibFunction::GetClassGUID() const
807 return m_classGUID;
810 //////////////////////////////////////////////////////////////////////////
811 void CLibFunction::SetName(const char* name)
813 m_name = name;
816 //////////////////////////////////////////////////////////////////////////
817 const char* CLibFunction::GetName() const
819 return m_name.c_str();
822 //////////////////////////////////////////////////////////////////////////
823 void CLibFunction::SetScope(const char* scope)
825 m_scope = scope;
828 //////////////////////////////////////////////////////////////////////////
829 const char* CLibFunction::GetScope() const
831 return m_scope.c_str();
834 //////////////////////////////////////////////////////////////////////////
835 void CLibFunction::SetFileName(const char* fileName)
837 m_fileName = fileName;
840 //////////////////////////////////////////////////////////////////////////
841 const char* CLibFunction::GetFileName() const
843 return m_fileName.c_str();
846 //////////////////////////////////////////////////////////////////////////
847 void CLibFunction::SetAuthor(const char* author)
849 m_author = author;
852 //////////////////////////////////////////////////////////////////////////
853 const char* CLibFunction::GetAuthor() const
855 return m_author.c_str();
858 //////////////////////////////////////////////////////////////////////////
859 void CLibFunction::SetDescription(const char* szDescription)
861 m_textDesc = szDescription;
864 //////////////////////////////////////////////////////////////////////////
865 const char* CLibFunction::GetDescription() const
867 return m_textDesc.c_str();
870 //////////////////////////////////////////////////////////////////////////
871 void CLibFunction::AddInput(const char* name, const char* textDesc, const IAny& value)
873 m_inputs.push_back(SParam(name, textDesc));
874 CVariantVectorOutputArchive archive(m_variantInputs);
875 archive(const_cast<IAny&>(value), "", "");
878 //////////////////////////////////////////////////////////////////////////
879 size_t CLibFunction::GetInputCount() const
881 return m_inputs.size();
884 //////////////////////////////////////////////////////////////////////////
885 const char* CLibFunction::GetInputName(size_t iInput) const
887 return iInput < m_inputs.size() ? m_inputs[iInput].name.c_str() : "";
890 //////////////////////////////////////////////////////////////////////////
891 const char* CLibFunction::GetInputTextDesc(size_t iInput) const
893 return iInput < m_inputs.size() ? m_inputs[iInput].textDesc.c_str() : "";
896 //////////////////////////////////////////////////////////////////////////
897 TVariantConstArray CLibFunction::GetVariantInputs() const
899 return m_variantInputs;
902 //////////////////////////////////////////////////////////////////////////
903 void CLibFunction::AddOutput(const char* name, const char* textDesc, const IAny& value)
905 m_outputs.push_back(SParam(name, textDesc));
906 CVariantVectorOutputArchive archive(m_variantOutputs);
907 archive(const_cast<IAny&>(value), "", "");
910 //////////////////////////////////////////////////////////////////////////
911 size_t CLibFunction::GetOutputCount() const
913 return m_outputs.size();
916 //////////////////////////////////////////////////////////////////////////
917 const char* CLibFunction::GetOutputName(size_t iOutput) const
919 return iOutput < m_outputs.size() ? m_outputs[iOutput].name.c_str() : "";
922 //////////////////////////////////////////////////////////////////////////
923 const char* CLibFunction::GetOutputTextDesc(size_t iOutput) const
925 return iOutput < m_outputs.size() ? m_outputs[iOutput].textDesc.c_str() : "";
928 //////////////////////////////////////////////////////////////////////////
929 TVariantConstArray CLibFunction::GetVariantOutputs() const
931 return m_variantOutputs;
934 //////////////////////////////////////////////////////////////////////////
935 TVariantConstArray CLibFunction::GetVariantConsts() const
937 return m_variantConsts;
940 //////////////////////////////////////////////////////////////////////////
941 GlobalFunctionConstTable CLibFunction::GetGlobalFunctionTable() const
943 return m_globalFunctionTable;
946 //////////////////////////////////////////////////////////////////////////
947 ComponentMemberFunctionConstTable CLibFunction::GetComponentMemberFunctionTable() const
949 return m_componentMemberFunctionTable;
952 //////////////////////////////////////////////////////////////////////////
953 ActionMemberFunctionConstTable CLibFunction::GetActionMemberFunctionTable() const
955 return m_actionMemberFunctionTable;
958 //////////////////////////////////////////////////////////////////////////
959 size_t CLibFunction::GetSize() const
961 return m_size;
964 //////////////////////////////////////////////////////////////////////////
965 const SVMOp* CLibFunction::GetOp(size_t pos) const
967 CRY_ASSERT(pos < m_size);
968 return pos < m_size ? reinterpret_cast<const SVMOp*>(m_pBegin + pos) : NULL;
971 //////////////////////////////////////////////////////////////////////////
972 void CLibFunction::SetGUID(const SGUID& guid)
974 m_guid = guid;
977 //////////////////////////////////////////////////////////////////////////
978 void CLibFunction::SetClassGUID(const SGUID& classGUID)
980 m_classGUID = classGUID;
983 //////////////////////////////////////////////////////////////////////////
984 size_t CLibFunction::AddConstValue(const CVariant& value)
986 TVariantVector::iterator iBeginConst = m_variantConsts.begin();
987 TVariantVector::iterator iEndConst = m_variantConsts.end();
988 TVariantVector::iterator iConst = std::find(iBeginConst, iEndConst, value);
989 if(iConst != iEndConst)
991 return iConst - iBeginConst;
993 else
995 m_variantConsts.push_back(value);
996 return m_variantConsts.size() - 1;
1000 //////////////////////////////////////////////////////////////////////////
1001 size_t CLibFunction::AddGlobalFunction(const IGlobalFunctionConstPtr& pGlobalFunction)
1003 GlobalFunctionTable::iterator iBeginGlobalFunction = m_globalFunctionTable.begin();
1004 GlobalFunctionTable::iterator iEndGlobalFunction = m_globalFunctionTable.end();
1005 GlobalFunctionTable::iterator iGlobalFunction = std::find(iBeginGlobalFunction, iEndGlobalFunction, pGlobalFunction);
1006 if(iGlobalFunction != iEndGlobalFunction)
1008 return iGlobalFunction - iBeginGlobalFunction;
1010 else
1012 m_globalFunctionTable.push_back(pGlobalFunction);
1013 return m_globalFunctionTable.size() - 1;
1017 //////////////////////////////////////////////////////////////////////////
1018 size_t CLibFunction::AddComponentMemberFunction(const IComponentMemberFunctionConstPtr& pComponentMemberFunction)
1020 ComponentMemberFunctionTable::iterator iBeginComponentMemberFunction = m_componentMemberFunctionTable.begin();
1021 ComponentMemberFunctionTable::iterator iEndComponentMemberFunction = m_componentMemberFunctionTable.end();
1022 ComponentMemberFunctionTable::iterator iComponentMemberFunction = std::find(iBeginComponentMemberFunction, iEndComponentMemberFunction, pComponentMemberFunction);
1023 if(iComponentMemberFunction != iEndComponentMemberFunction)
1025 return iComponentMemberFunction - iBeginComponentMemberFunction;
1027 else
1029 m_componentMemberFunctionTable.push_back(pComponentMemberFunction);
1030 return m_componentMemberFunctionTable.size() - 1;
1034 //////////////////////////////////////////////////////////////////////////
1035 size_t CLibFunction::AddActionMemberFunction(const IActionMemberFunctionConstPtr& pActionMemberFunction)
1037 ActionMemberFunctionTable::iterator iBeginActionMemberFunction = m_actionMemberFunctionTable.begin();
1038 ActionMemberFunctionTable::iterator iEndActionMemberFunction = m_actionMemberFunctionTable.end();
1039 ActionMemberFunctionTable::iterator iActionMemberFunction = std::find(iBeginActionMemberFunction, iEndActionMemberFunction, pActionMemberFunction);
1040 if(iActionMemberFunction != iEndActionMemberFunction)
1042 return iActionMemberFunction - iBeginActionMemberFunction;
1044 else
1046 m_actionMemberFunctionTable.push_back(pActionMemberFunction);
1047 return m_actionMemberFunctionTable.size() - 1;
1051 //////////////////////////////////////////////////////////////////////////
1052 void CLibFunction::SetGraphExecutionFilter(EGraphExecutionFilter filter)
1054 m_executionFilter = filter;
1057 void CLibFunction::AddDebugOperationSymbolNode(size_t pos, const SGUID& guid)
1059 if (!guid.cryGUID.IsNull())
1061 DebugSymbolTable::iterator result = m_debugSymbolTable.find(pos);
1063 if (result == m_debugSymbolTable.end())
1065 m_debugSymbolTable.emplace(pos, SDebugSymbol(guid, "", ILibFunction::SDebugSymbol::EDebugSymbolType::Node));
1067 else
1069 if (result->second.type == ILibFunction::SDebugSymbol::EDebugSymbolType::Input)
1071 result->second.type = ILibFunction::SDebugSymbol::EDebugSymbolType::NodeAndInput;
1073 else
1075 CRY_ASSERT(result == m_debugSymbolTable.end(), "[Schematyc Debugger] Trying to add a debug symbol (Node) already registred.");
1081 void CLibFunction::AddDebugOperationSymbolInput(size_t pos, const SGUID& guid, const char* input)
1083 if (!guid.cryGUID.IsNull())
1085 DebugSymbolTable::const_iterator result = m_debugSymbolTable.find(pos);
1087 if (result == m_debugSymbolTable.end())
1089 m_debugSymbolTable.emplace(pos, SDebugSymbol(guid, input, ILibFunction::SDebugSymbol::EDebugSymbolType::Input));
1092 CRY_ASSERT(result == m_debugSymbolTable.end(), "[Schematyc Debugger] Trying to add a debug symbol (Input) already registered.");
1096 const Schematyc2::ILibFunction::SDebugSymbol* CLibFunction::GetDebugOperationSymbol(size_t pos) const
1098 DebugSymbolTable::const_iterator result = m_debugSymbolTable.find(pos);
1099 if (result != m_debugSymbolTable.end())
1101 return &result->second;
1104 return nullptr;
1107 size_t CLibFunction::GetDebugOperationsSize() const
1109 return m_debugSymbolTable.size();
1112 void CLibFunction::ClearDebugOperationSymbols()
1114 m_debugSymbolTable.clear();
1117 //////////////////////////////////////////////////////////////////////////
1118 bool CLibFunction::IsGraphExecutionAllowed() const
1120 switch (m_executionFilter)
1122 case EGraphExecutionFilter::Always:
1123 return true;
1125 case EGraphExecutionFilter::DevModeOrLoggingEnabled:
1126 return gEnv->pSystem->IsDevMode() || CVars::sc2_LogToFile != 0;
1128 case EGraphExecutionFilter::DevModeOnly:
1129 return gEnv->pSystem->IsDevMode();
1131 default:
1132 CRY_ASSERT(false, "Wrong execution filter value in schematyc function.");
1134 return false;
1137 //////////////////////////////////////////////////////////////////////////
1138 size_t CLibFunction::AddOp(const SVMOp& op)
1140 if (op.size > (m_capacity - m_size))
1142 const size_t capacity = /*std::*/max(m_capacity * GROWTH_FACTOR, /*std::*/max(op.size, MIN_CAPACITY));
1143 if (uint8* pBegin = static_cast<uint8*>(realloc(m_pBegin, capacity)))
1145 m_capacity = capacity;
1146 m_pBegin = pBegin;
1148 else
1150 SCHEMATYC2_COMPILER_FATAL_ERROR("Unable to add operation");
1153 memcpy(m_pBegin + m_size, &op, op.size);
1154 m_lastOpPos = m_size;
1155 m_size += op.size;
1156 return m_lastOpPos;
1159 //////////////////////////////////////////////////////////////////////////
1160 SVMOp* CLibFunction::GetOp(size_t pos)
1162 CRY_ASSERT(pos < m_size);
1163 return pos < m_size ? reinterpret_cast<SVMOp*>(m_pBegin + pos) : NULL;
1166 //////////////////////////////////////////////////////////////////////////
1167 SVMOp* CLibFunction::GetLastOp()
1169 return m_lastOpPos != INVALID_INDEX ? GetOp(m_lastOpPos) : NULL;
1172 //////////////////////////////////////////////////////////////////////////
1173 void CLibFunction::Release()
1175 if(m_pBegin)
1177 free(m_pBegin);
1179 m_capacity = 0;
1180 m_size = 0;
1181 m_lastOpPos = INVALID_INDEX;
1182 m_pBegin = NULL;
1184 ClearDebugOperationSymbols();
1187 //////////////////////////////////////////////////////////////////////////
1188 void CLibFunction::CompactMemory()
1190 if (m_size < m_capacity)
1192 if (uint8* pBegin = static_cast<uint8*>(realloc(m_pBegin, m_size)))
1194 m_pBegin = pBegin;
1195 m_capacity = m_size;
1199 m_inputs.shrink_to_fit();
1200 m_variantInputs.shrink_to_fit();
1201 m_outputs.shrink_to_fit();
1202 m_variantOutputs.shrink_to_fit();
1203 m_variantConsts.shrink_to_fit();
1204 m_globalFunctionTable.shrink_to_fit();
1205 m_componentMemberFunctionTable.shrink_to_fit();
1206 m_actionMemberFunctionTable.shrink_to_fit();
1209 //////////////////////////////////////////////////////////////////////////
1210 CLibFunction::SParam::SParam(const char* _name, const char* _textDesc)
1211 : name(_name)
1212 , textDesc(_textDesc)
1215 //////////////////////////////////////////////////////////////////////////
1216 CLibClassProperties::SProperty::SProperty()
1217 : overridePolicy(EInternalOverridePolicy::UseDefault)
1220 //////////////////////////////////////////////////////////////////////////
1221 CLibClassProperties::SProperty::SProperty(const char* _szLabel, const IAnyPtr& _pValue, EInternalOverridePolicy _overridePolicy)
1222 : label(_szLabel)
1223 , pValue(_pValue)
1224 , overridePolicy(_overridePolicy)
1227 //////////////////////////////////////////////////////////////////////////
1228 CLibClassProperties::SProperty::SProperty(const SProperty& rhs)
1229 : label(rhs.label)
1230 , pValue(rhs.pValue->Clone())
1231 , overridePolicy(rhs.overridePolicy)
1234 //////////////////////////////////////////////////////////////////////////
1235 void CLibClassProperties::SProperty::Serialize(Serialization::IArchive& archive)
1237 const bool isPrecaching = archive.caps(Schematyc2::IResourceCollectorArchive::ArchiveCaps);
1238 if(archive.isEdit() || isPrecaching)
1240 archive(overridePolicy, "overridePolicy", "Override");
1241 if(overridePolicy == EInternalOverridePolicy::OverrideDefault)
1243 archive(*pValue, "value", "Value");
1246 else
1248 archive(*pValue, "value");
1249 archive(overridePolicy, "overridePolicy");
1253 //////////////////////////////////////////////////////////////////////////
1254 CLibClassProperties::CLibClassProperties(const LibVariables& variables)
1256 for(const CLibVariable& variable : variables)
1258 if(variable.GetOverridePolicy() != EOverridePolicy::Finalize)
1260 if((variable.GetFlags() & ELibVariableFlags::ClassProperty) != 0)
1262 IAnyConstPtr pVariableValue = variable.GetValue();
1263 if(pVariableValue)
1265 m_properties.insert(Properties::value_type(variable.GetGUID(), SProperty(variable.GetName(), pVariableValue->Clone(), EInternalOverridePolicy::UseDefault)));
1272 //////////////////////////////////////////////////////////////////////////
1273 CLibClassProperties::CLibClassProperties(const CLibClassProperties& rhs)
1274 : m_properties(rhs.m_properties)
1277 //////////////////////////////////////////////////////////////////////////
1278 ILibClassPropertiesPtr CLibClassProperties::Clone() const
1280 return std::make_shared<CLibClassProperties>(*this);
1283 //////////////////////////////////////////////////////////////////////////
1284 void CLibClassProperties::Serialize(Serialization::IArchive& archive)
1286 if(archive.isEdit())
1288 PropertiesByLabel propertiesByLabel;
1289 for(Properties::value_type& property : m_properties)
1291 propertiesByLabel.insert(PropertiesByLabel::value_type(property.second.label.c_str(), property.second));
1293 for(PropertiesByLabel::value_type& property : propertiesByLabel)
1295 archive(property.second, property.first, property.first);
1298 else if(archive.isInput() && !archive.caps(Serialization::IArchive::BINARY)) // Check for binary archive because binary archives do not currently support black box serialization.
1300 typedef std::map<SGUID, Serialization::SBlackBox> BlackBoxProperties;
1302 BlackBoxProperties blackBoxProperties;
1303 archive(blackBoxProperties, "properties");
1304 for(BlackBoxProperties::value_type& blackBoxProperty : blackBoxProperties)
1306 Properties::iterator itProperty = m_properties.find(blackBoxProperty.first);
1307 if(itProperty != m_properties.end())
1309 Serialization::LoadBlackBox(itProperty->second, blackBoxProperty.second);
1313 else
1315 archive(m_properties, "properties");
1319 //////////////////////////////////////////////////////////////////////////
1320 IAnyConstPtr CLibClassProperties::GetProperty(const SGUID& guid) const
1322 Properties::const_iterator itProperty = m_properties.find(guid);
1323 if((itProperty != m_properties.end()))
1325 if(itProperty->second.overridePolicy == EInternalOverridePolicy::OverrideDefault)
1327 return itProperty->second.pValue;
1330 return IAnyConstPtr();
1333 //////////////////////////////////////////////////////////////////////////
1334 void CLibClassProperties::VisitProperties(const LibClassPropertyVisitor& visitor) const
1336 SCHEMATYC2_SYSTEM_ASSERT(visitor);
1337 if(visitor)
1339 for(const Properties::value_type& property : m_properties)
1341 visitor(property.first, property.second.label.c_str(), property.second.pValue);
1346 //////////////////////////////////////////////////////////////////////////
1347 void CLibClassProperties::OverrideProperty(const SGUID& guid, const IAny& value)
1349 Properties::iterator itProperty = m_properties.find(guid);
1350 if((itProperty != m_properties.end()))
1352 SProperty& property = itProperty->second;
1353 if(property.pValue)
1355 *property.pValue = value;
1356 property.overridePolicy = EInternalOverridePolicy::OverrideDefault;
1361 //////////////////////////////////////////////////////////////////////////
1362 CLibClass::CLibClass(const ILib& lib, const SGUID& guid, const char* szName, const SGUID& foundationGUID, const IPropertiesConstPtr& pFoundationProperties)
1363 : m_lib(lib)
1364 , m_guid(guid)
1365 , m_name(szName)
1366 , m_foundationGUID(foundationGUID)
1367 , m_pFoundationProperties(pFoundationProperties ? pFoundationProperties->Clone() : IPropertiesPtr())
1368 , m_nextFunctionId(1)
1371 //////////////////////////////////////////////////////////////////////////
1372 const ILib& CLibClass::GetLib() const
1374 return m_lib;
1377 //////////////////////////////////////////////////////////////////////////
1378 SGUID CLibClass::GetGUID() const
1380 return m_guid;
1383 //////////////////////////////////////////////////////////////////////////
1384 const char* CLibClass::GetName() const
1386 return m_name.c_str();
1389 //////////////////////////////////////////////////////////////////////////
1390 SGUID CLibClass::GetFoundationGUID() const
1392 return m_foundationGUID;
1395 //////////////////////////////////////////////////////////////////////////
1396 IPropertiesConstPtr CLibClass::GetFoundationProperties() const
1398 return m_pFoundationProperties;
1401 //////////////////////////////////////////////////////////////////////////
1402 ILibClassPropertiesPtr CLibClass::CreateProperties() const
1404 return std::make_shared<CLibClassProperties>(m_variables);
1407 //////////////////////////////////////////////////////////////////////////
1408 size_t CLibClass::GetStateMachineCount() const
1410 return m_stateMachines.size();
1413 //////////////////////////////////////////////////////////////////////////
1414 const ILibStateMachine* CLibClass::GetStateMachine(size_t iStateMachine) const
1416 return iStateMachine < m_stateMachines.size() ? &m_stateMachines[iStateMachine] : NULL;
1419 //////////////////////////////////////////////////////////////////////////
1420 size_t CLibClass::GetStateCount() const
1422 return m_states.size();
1425 //////////////////////////////////////////////////////////////////////////
1426 const ILibState* CLibClass::GetState(size_t iState) const
1428 return iState < m_states.size() ? &m_states[iState] : NULL;
1431 //////////////////////////////////////////////////////////////////////////
1432 size_t CLibClass::GetVariableCount() const
1434 return m_variables.size();
1437 //////////////////////////////////////////////////////////////////////////
1438 const ILibVariable* CLibClass::GetVariable(size_t iVariable) const
1440 return iVariable < m_variables.size() ? &m_variables[iVariable] : NULL;
1443 //////////////////////////////////////////////////////////////////////////
1444 TVariantConstArray CLibClass::GetVariants() const
1446 return m_variants;
1449 //////////////////////////////////////////////////////////////////////////
1450 size_t CLibClass::GetContainerCount() const
1452 return m_containers.size();
1455 //////////////////////////////////////////////////////////////////////////
1456 const ILibContainer* CLibClass::GetContainer(size_t iContainer) const
1458 return iContainer < m_containers.size() ? &m_containers[iContainer] : NULL;
1461 //////////////////////////////////////////////////////////////////////////
1462 size_t CLibClass::GetTimerCount() const
1464 return m_timers.size();
1467 //////////////////////////////////////////////////////////////////////////
1468 const ILibTimer* CLibClass::GetTimer(size_t iTimer) const
1470 return iTimer < m_timers.size() ? &m_timers[iTimer] : NULL;
1473 //////////////////////////////////////////////////////////////////////////
1474 size_t CLibClass::GetPersistentTimerCount() const
1476 return m_persistentTimers.size();
1479 //////////////////////////////////////////////////////////////////////////
1480 size_t CLibClass::GetPersistentTimer(size_t iPersistentTimer) const
1482 return iPersistentTimer < m_persistentTimers.size() ? m_persistentTimers[iPersistentTimer] : INVALID_INDEX;
1485 //////////////////////////////////////////////////////////////////////////
1486 size_t CLibClass::GetAbstractInterfaceImplementationCount() const
1488 return m_abstractInterfaceImplementations.size();
1491 //////////////////////////////////////////////////////////////////////////
1492 const ILibAbstractInterfaceImplementation* CLibClass::GetAbstractInterfaceImplementation(size_t iAbstractInterfaceImplementation) const
1494 return iAbstractInterfaceImplementation < m_abstractInterfaceImplementations.size() ? &m_abstractInterfaceImplementations[iAbstractInterfaceImplementation] : NULL;
1497 //////////////////////////////////////////////////////////////////////////
1498 size_t CLibClass::GetComponentInstanceCount() const
1500 return m_componentInstances.size();
1503 //////////////////////////////////////////////////////////////////////////
1504 const ILibComponentInstance* CLibClass::GetComponentInstance(size_t iComponentInstance) const
1506 return iComponentInstance < m_componentInstances.size() ? &m_componentInstances[iComponentInstance] : NULL;
1509 //////////////////////////////////////////////////////////////////////////
1510 size_t CLibClass::GetActionInstanceCount() const
1512 return m_actionInstances.size();
1515 //////////////////////////////////////////////////////////////////////////
1516 const ILibActionInstance* CLibClass::GetActionInstance(size_t iActionInstance) const
1518 return iActionInstance < m_actionInstances.size() ? &m_actionInstances[iActionInstance] : NULL;
1521 //////////////////////////////////////////////////////////////////////////
1522 size_t CLibClass::GetPersistentActionInstanceCount() const
1524 return m_persistentActionInstances.size();
1527 //////////////////////////////////////////////////////////////////////////
1528 size_t CLibClass::GetPersistentActionInstance(size_t iPersistentActionInstance) const
1530 return iPersistentActionInstance < m_persistentActionInstances.size() ? m_persistentActionInstances[iPersistentActionInstance] : INVALID_INDEX;
1533 //////////////////////////////////////////////////////////////////////////
1534 size_t CLibClass::GetConstructorCount() const
1536 return m_constructors.size();
1539 //////////////////////////////////////////////////////////////////////////
1540 const ILibConstructor* CLibClass::GetConstructor(size_t iConstructor) const
1542 return iConstructor < m_constructors.size() ? &m_constructors[iConstructor] : NULL;
1545 //////////////////////////////////////////////////////////////////////////
1546 size_t CLibClass::GetPersistentConstructorCount() const
1548 return m_persistentConstructors.size();
1551 //////////////////////////////////////////////////////////////////////////
1552 size_t CLibClass::GetPersistentConstructor(size_t iPersistentConstructor) const
1554 return iPersistentConstructor < m_persistentConstructors.size() ? m_persistentConstructors[iPersistentConstructor] : INVALID_INDEX;
1557 //////////////////////////////////////////////////////////////////////////
1558 size_t CLibClass::GetDestructorCount() const
1560 return m_destructors.size();
1563 //////////////////////////////////////////////////////////////////////////
1564 const ILibDestructor* CLibClass::GetDestructor(size_t iDestructor) const
1566 return iDestructor < m_destructors.size() ? &m_destructors[iDestructor] : NULL;
1569 //////////////////////////////////////////////////////////////////////////
1570 size_t CLibClass::GetPersistentDestructorCount() const
1572 return m_persistentDestructors.size();
1575 //////////////////////////////////////////////////////////////////////////
1576 size_t CLibClass::GetPersistentDestructor(size_t iPersistentDestructor) const
1578 return iPersistentDestructor < m_persistentDestructors.size() ? m_persistentDestructors[iPersistentDestructor] : INVALID_INDEX;
1581 //////////////////////////////////////////////////////////////////////////
1582 size_t CLibClass::GetSignalReceiverCount() const
1584 return m_signalReceivers.size();
1587 //////////////////////////////////////////////////////////////////////////
1588 const ILibSignalReceiver* CLibClass::GetSignalReceiver(size_t iSignalReceiver) const
1590 return iSignalReceiver < m_signalReceivers.size() ? &m_signalReceivers[iSignalReceiver] : NULL;
1593 //////////////////////////////////////////////////////////////////////////
1594 size_t CLibClass::GetPersistentSignalReceiverCount() const
1596 return m_persistentSignalReceivers.size();
1599 //////////////////////////////////////////////////////////////////////////
1600 size_t CLibClass::GetPersistentSignalReceiver(size_t iPersistentSignalReceiver) const
1602 return iPersistentSignalReceiver < m_persistentSignalReceivers.size() ? m_persistentSignalReceivers[iPersistentSignalReceiver] : INVALID_INDEX;
1605 //////////////////////////////////////////////////////////////////////////
1606 size_t CLibClass::GetTransitionCount() const
1608 return m_transitions.size();
1611 //////////////////////////////////////////////////////////////////////////
1612 const ILibTransition* CLibClass::GetTransition(size_t iTransition) const
1614 return iTransition < m_transitions.size() ? &m_transitions[iTransition] : NULL;
1617 //////////////////////////////////////////////////////////////////////////
1618 LibFunctionId CLibClass::GetFunctionId(const SGUID& guid) const
1620 TFunctionIdByGUIDMap::const_iterator iFunctionId = m_functionIdsByGUID.find(guid);
1621 return iFunctionId != m_functionIdsByGUID.end() ? iFunctionId->second : LibFunctionId::s_invalid;
1624 //////////////////////////////////////////////////////////////////////////
1625 const ILibFunction* CLibClass::GetFunction(const LibFunctionId& functionId) const
1627 TFunctionMap::const_iterator iFunction = m_functions.find(functionId);
1628 return iFunction != m_functions.end() ? &iFunction->second.function : NULL;
1631 const SGUID CLibClass::GetFunctionGUID(const LibFunctionId& functionId) const
1633 TFunctionMap::const_iterator iFunction = m_functions.find(functionId);
1634 return iFunction != m_functions.end() ? iFunction->second.function.GetGUID() : SGUID();
1637 //////////////////////////////////////////////////////////////////////////
1638 const CRuntimeFunction* CLibClass::GetFunction_New(uint32 functionIdx) const
1640 return functionIdx < m_functions_New.size() ? m_functions_New[functionIdx].get() : nullptr;
1643 //////////////////////////////////////////////////////////////////////////
1644 void CLibClass::PreviewGraphFunctions(const SGUID& graphGUID, const StringStreamOutCallback& stringStreamOutCallback) const
1646 for(TFunctionMap::const_iterator iFunction = m_functions.begin(), iEndFunction = m_functions.end(); iFunction != iEndFunction; ++ iFunction)
1648 const SFunction& function = iFunction->second;
1649 if(function.function.GetGUID() == graphGUID)
1651 PreviewFunction(function.function, stringStreamOutCallback);
1656 //////////////////////////////////////////////////////////////////////////
1657 size_t CLibClass::AddStateMachine(const SGUID& guid, const char* name, EStateMachineLifetime lifetime, EStateMachineNetAuthority netType)
1659 m_stateMachines.push_back(CLibStateMachine(guid, name, lifetime, netType));
1660 return m_stateMachines.size() - 1;
1663 //////////////////////////////////////////////////////////////////////////
1664 CLibStateMachine* CLibClass::GetStateMachine(size_t iStateMachine)
1666 return iStateMachine < m_stateMachines.size() ? &m_stateMachines[iStateMachine] : nullptr;
1669 //////////////////////////////////////////////////////////////////////////
1670 size_t CLibClass::AddState(const SGUID& guid, const char* name)
1672 m_states.push_back(CLibState(guid, name));
1673 return m_states.size() - 1;
1676 //////////////////////////////////////////////////////////////////////////
1677 CLibState* CLibClass::GetState(size_t iState)
1679 return iState < m_states.size() ? &m_states[iState] : nullptr;
1682 //////////////////////////////////////////////////////////////////////////
1683 size_t CLibClass::AddVariable(const SGUID& guid, const char* szName, EOverridePolicy overridePolicy, const IAny& value, size_t variantPos, size_t variantCount, ELibVariableFlags flags)
1685 m_variables.push_back(CLibVariable(guid, szName, overridePolicy, value, variantPos, variantCount, flags));
1686 return m_variables.size() - 1;
1689 //////////////////////////////////////////////////////////////////////////
1690 CLibVariable* CLibClass::GetVariable(size_t iVariable)
1692 return iVariable < m_variables.size() ? &m_variables[iVariable] : nullptr;
1695 //////////////////////////////////////////////////////////////////////////
1696 size_t CLibClass::AddContainer(const SGUID& guid, const char* szName, const SGUID& typeGUID)
1698 m_containers.push_back(CLibContainer(guid, szName, typeGUID));
1699 return m_containers.size() - 1;
1702 //////////////////////////////////////////////////////////////////////////
1703 CLibContainer* CLibClass::GetContainer(size_t iContainer)
1705 return iContainer < m_containers.size() ? &m_containers[iContainer] : nullptr;
1708 //////////////////////////////////////////////////////////////////////////
1709 TVariantVector& CLibClass::GetVariants()
1711 return m_variants;
1714 //////////////////////////////////////////////////////////////////////////
1715 size_t CLibClass::AddTimer(const SGUID& guid, const char* szName, const STimerParams& params)
1717 m_timers.push_back(CLibTimer(guid, szName, params));
1718 return m_timers.size() - 1;
1721 //////////////////////////////////////////////////////////////////////////
1722 size_t CLibClass::AddPersistentTimer(const SGUID& guid, const char* szName, const STimerParams& params)
1724 m_persistentTimers.push_back(m_timers.size());
1725 return AddTimer(guid, szName, params);
1728 //////////////////////////////////////////////////////////////////////////
1729 CLibTimer* CLibClass::GetTimer(size_t iTimer)
1731 return iTimer < m_timers.size() ? &m_timers[iTimer] : nullptr;
1734 //////////////////////////////////////////////////////////////////////////
1735 size_t CLibClass::AddAbstractInterfaceImplementation(const SGUID& guid, const char* szName, const SGUID& interfaceGUID)
1737 m_abstractInterfaceImplementations.push_back(CLibAbstractInterfaceImplementation(guid, szName, interfaceGUID));
1738 return m_abstractInterfaceImplementations.size() - 1;
1741 //////////////////////////////////////////////////////////////////////////
1742 CLibAbstractInterfaceImplementation* CLibClass::GetAbstractInterfaceImplementation(size_t iAbstractInterfaceImplementation)
1744 return iAbstractInterfaceImplementation < m_abstractInterfaceImplementations.size() ? &m_abstractInterfaceImplementations[iAbstractInterfaceImplementation] : NULL;
1747 //////////////////////////////////////////////////////////////////////////
1748 size_t CLibClass::AddComponentInstance(const SGUID& guid, const char* szName, const SGUID& componentGUID, const IPropertiesPtr& pProperties, uint32 propertyFunctionIdx, uint32 parentIdx)
1750 m_componentInstances.push_back(CLibComponentInstance(guid, szName, componentGUID, pProperties, propertyFunctionIdx, parentIdx));
1751 return m_componentInstances.size() - 1;
1754 //////////////////////////////////////////////////////////////////////////
1755 CLibComponentInstance* CLibClass::GetComponentInstance(size_t iComponentInstance)
1757 return iComponentInstance < m_componentInstances.size() ? &m_componentInstances[iComponentInstance] : NULL;
1760 //////////////////////////////////////////////////////////////////////////
1761 void CLibClass::SortComponentInstances()
1763 IEnvRegistry& envRegistry = gEnv->pSchematyc2->GetEnvRegistry();
1764 const size_t componentInstanceCount = m_componentInstances.size();
1765 TComponentInstanceSortRefVector componentInstanceSortRefs;
1766 componentInstanceSortRefs.reserve(componentInstanceCount);
1767 for(size_t iComponentInstance = 0; iComponentInstance < componentInstanceCount; ++ iComponentInstance)
1769 const CLibComponentInstance& componentInstance = m_componentInstances[iComponentInstance];
1770 IComponentFactoryConstPtr pComponentFactory = envRegistry.GetComponentFactory(componentInstance.GetComponentGUID());
1771 CRY_ASSERT(pComponentFactory);
1772 if(pComponentFactory)
1774 componentInstanceSortRefs.push_back(SComponentInstanceSortRef(iComponentInstance));
1776 SComponentInstanceSortRef& componentInstanceSortRef = componentInstanceSortRefs.back();
1777 const size_t componentDependencyCount = pComponentFactory->GetDependencyCount();
1778 componentInstanceSortRef.dependencies.reserve(componentDependencyCount);
1779 for(size_t iComponentDependency = 0; iComponentDependency < componentDependencyCount; ++ iComponentDependency)
1781 const SGUID componentDependencyGUID = pComponentFactory->GetDependencyGUID(iComponentDependency);
1782 for(size_t iOtherComponentInstance = 0; iOtherComponentInstance < componentInstanceCount; ++ iOtherComponentInstance)
1784 if(m_componentInstances[iOtherComponentInstance].GetComponentGUID() == componentDependencyGUID)
1786 componentInstanceSortRef.dependencies.push_back(iOtherComponentInstance);
1787 break;
1794 bool resolveDependencies;
1797 resolveDependencies = false;
1798 for(size_t iComponentInstance = 0; iComponentInstance < componentInstanceCount; ++ iComponentInstance)
1800 SComponentInstanceSortRef& componentInstanceSortRef = componentInstanceSortRefs[iComponentInstance];
1801 for(TSizeTVector::const_iterator iComponentDependency = componentInstanceSortRef.dependencies.begin(), iEndComponentDependency = componentInstanceSortRef.dependencies.end(); iComponentDependency != iEndComponentDependency; ++ iComponentDependency)
1803 SComponentInstanceSortRef& otherComponentInstanceSortRef = componentInstanceSortRefs[*iComponentDependency];
1804 if(otherComponentInstanceSortRef.priority <= componentInstanceSortRef.priority)
1806 otherComponentInstanceSortRef.priority = componentInstanceSortRef.priority + 1;
1807 resolveDependencies = true;
1811 } while(resolveDependencies);
1812 std::sort(componentInstanceSortRefs.begin(), componentInstanceSortRefs.end(), SComponentInstanceSortPredicate());
1814 TComponentInstanceVector componentInstances;
1815 componentInstances.reserve(componentInstanceCount);
1816 for(size_t iComponentInstance = 0; iComponentInstance < componentInstanceCount; ++ iComponentInstance)
1818 componentInstances.push_back(m_componentInstances[componentInstanceSortRefs[iComponentInstance].iComponentInstance]);
1820 std::swap(componentInstances, m_componentInstances);
1823 //////////////////////////////////////////////////////////////////////////
1824 void CLibClass::ValidateSingletonComponentInstances() const
1826 IEnvRegistry& envRegistry = gEnv->pSchematyc2->GetEnvRegistry();
1828 const size_t componentInstanceCount = m_componentInstances.size();
1830 VectorMap<SGUID, SGUID> singletons;
1831 singletons.reserve(componentInstanceCount);
1833 for (size_t iComponentInstance = 0; iComponentInstance < componentInstanceCount; ++iComponentInstance)
1835 const CLibComponentInstance& componentInstance = m_componentInstances[iComponentInstance];
1836 const SGUID componentGuid = componentInstance.GetComponentGUID();
1837 IComponentFactoryConstPtr pComponentFactory = envRegistry.GetComponentFactory(componentGuid);
1838 if ((pComponentFactory->GetFlags() & EComponentFlags::Singleton) != 0)
1840 const SGUID instanceGuid = componentInstance.GetGUID();
1841 auto iter = singletons.find(componentGuid);
1842 if (singletons.find(componentGuid) == singletons.end())
1844 singletons[componentGuid] = instanceGuid;
1846 else
1848 stack_string guid1, guid2, guid3;
1849 SCHEMATYC2_COMPILER_ERROR("Singleton component %s '%s' instance %s is repeated several time. First instance %s",
1850 StringUtils::SysGUIDToString(componentGuid.sysGUID, guid1),
1851 componentInstance.GetName(),
1852 StringUtils::SysGUIDToString(instanceGuid.sysGUID, guid2),
1853 StringUtils::SysGUIDToString(iter->second.sysGUID, guid3));
1859 //////////////////////////////////////////////////////////////////////////
1860 size_t CLibClass::AddActionInstance(const SGUID& guid, const char* name, const SGUID& actionGUID, size_t iComponentInstance, const IPropertiesPtr& pProperties)
1862 m_actionInstances.push_back(CLibActionInstance(guid, name, actionGUID, iComponentInstance, pProperties));
1863 return m_actionInstances.size() - 1;
1866 //////////////////////////////////////////////////////////////////////////
1867 size_t CLibClass::AddPersistentActionInstance(const SGUID& guid, const char* name, const SGUID& actionGUID, size_t iComponentInstance, const IPropertiesPtr& pProperties)
1869 m_persistentActionInstances.push_back(m_actionInstances.size());
1870 return AddActionInstance(guid, name, actionGUID, iComponentInstance, pProperties);
1873 //////////////////////////////////////////////////////////////////////////
1874 CLibActionInstance* CLibClass::GetActionInstance(size_t iActionInstance)
1876 return iActionInstance < m_actionInstances.size() ? &m_actionInstances[iActionInstance] : NULL;
1879 //////////////////////////////////////////////////////////////////////////
1880 size_t CLibClass::AddConstructor(const SGUID& guid, const LibFunctionId& functionId)
1882 m_constructors.push_back(CLibConstructor(guid, functionId));
1883 return m_constructors.size() - 1;
1886 //////////////////////////////////////////////////////////////////////////
1887 size_t CLibClass::AddPersistentConstructor(const SGUID& guid, const LibFunctionId& functionId)
1889 m_persistentConstructors.push_back(m_constructors.size());
1890 return AddConstructor(guid, functionId);
1893 //////////////////////////////////////////////////////////////////////////
1894 CLibConstructor* CLibClass::GetConstructor(size_t iConstructor)
1896 return iConstructor < m_constructors.size() ? &m_constructors[iConstructor] : NULL;
1899 //////////////////////////////////////////////////////////////////////////
1900 size_t CLibClass::AddDestructor(const SGUID& guid, const LibFunctionId& functionId)
1902 m_destructors.push_back(CLibDestructor(guid, functionId));
1903 return m_destructors.size() - 1;
1906 //////////////////////////////////////////////////////////////////////////
1907 size_t CLibClass::AddPersistentDestructor(const SGUID& guid, const LibFunctionId& functionId)
1909 m_persistentDestructors.push_back(m_destructors.size());
1910 return AddDestructor(guid, functionId);
1913 //////////////////////////////////////////////////////////////////////////
1914 CLibDestructor* CLibClass::GetDestructor(size_t iDestructor)
1916 return iDestructor < m_destructors.size() ? &m_destructors[iDestructor] : NULL;
1919 //////////////////////////////////////////////////////////////////////////
1920 size_t CLibClass::AddSignalReceiver(const SGUID& guid, const SGUID& contextGUID, const LibFunctionId& functionId)
1922 m_signalReceivers.push_back(CLibSignalReceiver(guid, contextGUID, functionId));
1923 return m_signalReceivers.size() - 1;
1926 //////////////////////////////////////////////////////////////////////////
1927 size_t CLibClass::AddPersistentSignalReceiver(const SGUID& guid, const SGUID& contextGUID, const LibFunctionId& functionId)
1929 m_persistentSignalReceivers.push_back(m_signalReceivers.size());
1930 return AddSignalReceiver(guid, contextGUID, functionId);
1933 //////////////////////////////////////////////////////////////////////////
1934 CLibSignalReceiver* CLibClass::GetSignalReceiver(size_t iSignalReceiver)
1936 return iSignalReceiver < m_signalReceivers.size() ? &m_signalReceivers[iSignalReceiver] : NULL;
1939 //////////////////////////////////////////////////////////////////////////
1940 size_t CLibClass::AddTransition(const SGUID& guid, const SGUID& contextGUID, const LibFunctionId& functionId)
1942 m_transitions.push_back(CLibTransition(guid, contextGUID, functionId));
1943 return m_transitions.size() - 1;
1946 //////////////////////////////////////////////////////////////////////////
1947 CLibTransition* CLibClass::GetTransition(size_t iTransition)
1949 return iTransition < m_transitions.size() ? &m_transitions[iTransition] : NULL;
1952 //////////////////////////////////////////////////////////////////////////
1953 LibFunctionId CLibClass::AddFunction(const SGUID& graphGUID)
1955 LibFunctionId functionId = m_nextFunctionId ++;
1956 m_functions.insert(TFunctionMap::value_type(functionId, SFunction(graphGUID)));
1957 return functionId;
1960 //////////////////////////////////////////////////////////////////////////
1961 CLibFunction* CLibClass::GetFunction(const LibFunctionId& functionId)
1963 TFunctionMap::iterator iFunction = m_functions.find(functionId);
1964 return iFunction != m_functions.end() ? &iFunction->second.function : NULL;
1967 //////////////////////////////////////////////////////////////////////////
1968 uint32 CLibClass::AddFunction_New(const SGUID& guid)
1970 const uint32 functionIdx = m_functions_New.size();
1971 CRuntimeFunctionPtr pFunction = std::make_shared<CRuntimeFunction>(guid);
1972 m_functions_New.push_back(pFunction);
1973 return functionIdx;
1976 //////////////////////////////////////////////////////////////////////////
1977 CRuntimeFunction* CLibClass::GetFunction_New(uint32 functionIdx)
1979 return functionIdx < m_functions_New.size() ? m_functions_New[functionIdx].get() : nullptr;
1982 //////////////////////////////////////////////////////////////////////////
1983 bool CLibClass::BindFunctionToGUID(const LibFunctionId& functionId, const SGUID& guid)
1985 return m_functionIdsByGUID.insert(TFunctionIdByGUIDMap::value_type(guid, functionId)).second;
1988 //////////////////////////////////////////////////////////////////////////
1989 void CLibClass::CompactMemory()
1991 for (TFunctionMap::value_type& functionPair : m_functions)
1993 functionPair.second.function.CompactMemory();
1996 m_stateMachines.shrink_to_fit();
1997 for (CLibStateMachine& stateMachine : m_stateMachines)
1999 stateMachine.CompactMemory();
2002 m_states.shrink_to_fit();
2003 for (CLibState& state : m_states)
2005 state.CompactMemory();
2008 m_variables.shrink_to_fit();
2009 m_containers.shrink_to_fit();
2010 m_variants.shrink_to_fit();
2011 m_timers.shrink_to_fit();
2012 m_persistentTimers.shrink_to_fit();
2013 m_abstractInterfaceImplementations.shrink_to_fit();
2014 m_componentInstances.shrink_to_fit();
2015 m_actionInstances.shrink_to_fit();
2016 m_persistentActionInstances.shrink_to_fit();
2017 m_constructors.shrink_to_fit();
2018 m_persistentConstructors.shrink_to_fit();
2019 m_destructors.shrink_to_fit();
2020 m_persistentDestructors.shrink_to_fit();
2021 m_signalReceivers.shrink_to_fit();
2022 m_persistentSignalReceivers.shrink_to_fit();
2023 m_transitions.shrink_to_fit();
2024 m_functions_New.shrink_to_fit();
2025 for (CRuntimeFunctionPtr& pFunction : m_functions_New)
2027 pFunction->CompactMemory();
2030 m_resourcesToPrecache.shrink_to_fit();
2033 //////////////////////////////////////////////////////////////////////////
2034 void CLibClass::AddPrecacheResource(IAnyConstPtr resource)
2036 m_resourcesToPrecache.emplace_back(resource);
2039 //////////////////////////////////////////////////////////////////////////
2040 size_t CLibClass::GetPrecacheResourceCount() const
2042 return m_resourcesToPrecache.size();
2045 //////////////////////////////////////////////////////////////////////////
2046 IAnyConstPtr CLibClass::GetPrecacheResource(size_t ressourceIdx) const
2048 return ressourceIdx < m_resourcesToPrecache.size() ? m_resourcesToPrecache[ressourceIdx] : nullptr;
2051 //////////////////////////////////////////////////////////////////////////
2052 CLibClass::SFunction::SFunction(const SGUID& _graphGUID)
2054 function.SetGUID(_graphGUID);
2057 //////////////////////////////////////////////////////////////////////////
2058 void CLibClass::PreviewFunction(const CLibFunction& function, StringStreamOutCallback stringStreamOutCallback) const
2060 stringStreamOutCallback("function ");
2061 stringStreamOutCallback(function.GetName());
2062 if(function.GetSize() > 0)
2064 stringStreamOutCallback("\n\n");
2065 for(size_t functionPos = 0, size = function.GetSize(); functionPos < size; )
2067 const SVMOp* pOp = function.GetOp(functionPos);
2069 size_t pos = static_cast<size_t>(reinterpret_cast<const uint8*>(pOp) - reinterpret_cast<const uint8*>(function.GetOp(0)));
2070 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2071 stringStreamOutCallback(StringUtils::SizeTToString(pos, stringBuffer));
2073 switch(pOp->opCode)
2075 case SVMOp::PUSH:
2077 const SVMPushOp* pPushOp = static_cast<const SVMPushOp*>(pOp);
2078 const CVariant& value = function.GetVariantConsts()[pPushOp->iConstValue];
2079 const bool valueIsString = (value.GetTypeId() == CVariant::STRING) || (value.GetTypeId() == CVariant::POOL_STRING);
2080 stack_string stringBuffer;
2081 StringUtils::VariantToString(value, stringBuffer);
2082 stringStreamOutCallback("\tPUSH ");
2083 if(valueIsString == true)
2085 stringStreamOutCallback("\"");
2087 stringStreamOutCallback(stringBuffer.c_str());
2088 if(valueIsString == true)
2090 stringStreamOutCallback("\"");
2092 stringStreamOutCallback("\n");
2093 break;
2095 case SVMOp::SET:
2097 const SVMSetOp* pSetOp = static_cast<const SVMSetOp*>(pOp);
2098 const CVariant& value = function.GetVariantConsts()[pSetOp->iConstValue];
2099 const bool valueIsString = (value.GetTypeId() == CVariant::STRING) || (value.GetTypeId() == CVariant::POOL_STRING);
2100 stack_string stringBuffer;
2101 StringUtils::SizeTToString(pSetOp->pos, stringBuffer);
2102 stringStreamOutCallback("\tSET ");
2103 stringStreamOutCallback(stringBuffer.c_str());
2104 stringStreamOutCallback(" ");
2105 StringUtils::VariantToString(value, stringBuffer);
2106 if(valueIsString == true)
2108 stringStreamOutCallback("\"");
2110 stringStreamOutCallback(stringBuffer.c_str());
2111 if(valueIsString == true)
2113 stringStreamOutCallback("\"");
2115 stringStreamOutCallback("\n");
2116 break;
2118 case SVMOp::COPY:
2120 const size_t srcPos = static_cast<const SVMCopyOp*>(pOp)->srcPos;
2121 const size_t dstPos = static_cast<const SVMCopyOp*>(pOp)->dstPos;
2122 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2123 stringStreamOutCallback("\tCOPY ");
2124 if(srcPos == INVALID_INDEX)
2126 stringStreamOutCallback("TOP");
2128 else
2130 stringStreamOutCallback(StringUtils::SizeTToString(srcPos, stringBuffer));
2132 stringStreamOutCallback(" ");
2133 if(dstPos == INVALID_INDEX)
2135 stringStreamOutCallback("TOP");
2137 else
2139 stringStreamOutCallback(StringUtils::SizeTToString(dstPos, stringBuffer));
2141 stringStreamOutCallback("\n");
2142 break;
2144 case SVMOp::POP:
2146 const SVMPopOp* pPopOp = static_cast<const SVMPopOp*>(pOp);
2147 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2148 stringStreamOutCallback("\tPOP ");
2149 stringStreamOutCallback(StringUtils::SizeTToString(pPopOp->count, stringBuffer));
2150 stringStreamOutCallback("\n");
2151 break;
2153 case SVMOp::COLLAPSE:
2155 const SVMCollapseOp* pCollapseOp = static_cast<const SVMCollapseOp*>(pOp);
2156 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2157 stringStreamOutCallback("\tCOLLAPSE ");
2158 stringStreamOutCallback(StringUtils::SizeTToString(pCollapseOp->pos, stringBuffer));
2159 stringStreamOutCallback("\n");
2160 break;
2162 case SVMOp::LOAD:
2164 const SVMLoadOp* pLoadOp = static_cast<const SVMLoadOp*>(pOp);
2165 const char* variableName = "?";
2166 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2167 for(size_t iVariable = 0, variableCount = GetVariableCount(); iVariable < variableCount; ++ iVariable)
2169 const ILibVariable& variable = *GetVariable(iVariable);
2170 if(variable.GetVariantPos() == pLoadOp->pos)
2172 variableName = variable.GetName();
2173 break;
2176 stringStreamOutCallback("\tLOAD ");
2177 stringStreamOutCallback(variableName);
2178 stringStreamOutCallback(" ");
2179 stringStreamOutCallback(StringUtils::SizeTToString(pLoadOp->count, stringBuffer));
2180 stringStreamOutCallback("\n");
2181 break;
2183 case SVMOp::STORE:
2185 const SVMStoreOp* pStoreOp = static_cast<const SVMStoreOp*>(pOp);
2186 const char* variableName = "?";
2187 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2188 for(size_t iVariable = 0, variableCount = GetVariableCount(); iVariable < variableCount; ++ iVariable)
2190 const ILibVariable& variable = *GetVariable(iVariable);
2191 if(variable.GetVariantPos() == pStoreOp->pos)
2193 variableName = variable.GetName();
2194 break;
2197 stringStreamOutCallback("\tSTORE ");
2198 stringStreamOutCallback(variableName);
2199 stringStreamOutCallback(" ");
2200 stringStreamOutCallback(StringUtils::SizeTToString(pStoreOp->count, stringBuffer));
2201 stringStreamOutCallback("\n");
2202 break;
2204 case SVMOp::CONTAINER_ADD:
2206 const SVMContainerAddOp* pContainerAddOp = static_cast<const SVMContainerAddOp*>(pOp);
2207 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2208 stringStreamOutCallback("\tCONTAINER_ADD ");
2209 stringStreamOutCallback(GetContainer(pContainerAddOp->iContainer)->GetName());
2210 stringStreamOutCallback(" ");
2211 stringStreamOutCallback(StringUtils::SizeTToString(pContainerAddOp->count, stringBuffer));
2212 stringStreamOutCallback("\n");
2213 break;
2215 case SVMOp::CONTAINER_REMOVE_BY_INDEX:
2217 const SVMContainerRemoveByIndexOp* pContainerRemoveByIndexOp = static_cast<const SVMContainerRemoveByIndexOp*>(pOp);
2218 stringStreamOutCallback("\tCONTAINER_REMOVE_BY_INDEX ");
2219 stringStreamOutCallback(GetContainer(pContainerRemoveByIndexOp->iContainer)->GetName());
2220 stringStreamOutCallback("\n");
2221 break;
2223 case SVMOp::CONTAINER_REMOVE_BY_VALUE:
2225 const SVMContainerRemoveByValueOp* pContainerRemoveByValueOp = static_cast<const SVMContainerRemoveByValueOp*>(pOp);
2226 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2227 stringStreamOutCallback("\tCONTAINER_REMOVE_BY_VALUE ");
2228 stringStreamOutCallback(GetContainer(pContainerRemoveByValueOp->iContainer)->GetName());
2229 stringStreamOutCallback(" ");
2230 stringStreamOutCallback(StringUtils::SizeTToString(pContainerRemoveByValueOp->count, stringBuffer));
2231 stringStreamOutCallback("\n");
2232 break;
2234 case SVMOp::CONTAINER_CLEAR:
2236 const SVMContainerClearOp* pContainerClearOp = static_cast<const SVMContainerClearOp*>(pOp);
2237 stringStreamOutCallback("\tCONTAINER_CLEAR ");
2238 stringStreamOutCallback(GetContainer(pContainerClearOp->iContainer)->GetName());
2239 stringStreamOutCallback("\n");
2240 break;
2242 case SVMOp::CONTAINER_SIZE:
2244 const SVMContainerSizeOp* pContainerSizeOp = static_cast<const SVMContainerSizeOp*>(pOp);
2245 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2246 stringStreamOutCallback("\tCONTAINER_SIZE ");
2247 stringStreamOutCallback(GetContainer(pContainerSizeOp->iContainer)->GetName());
2248 stringStreamOutCallback(" ");
2249 stringStreamOutCallback(StringUtils::SizeTToString(pContainerSizeOp->divisor, stringBuffer));
2250 stringStreamOutCallback("\n");
2251 break;
2253 case SVMOp::CONTAINER_GET:
2255 const SVMContainerGetOp* pContainerGetOp = static_cast<const SVMContainerGetOp*>(pOp);
2256 stringStreamOutCallback("\tCONTAINER_GET ");
2257 stringStreamOutCallback(GetContainer(pContainerGetOp->iContainer)->GetName());
2258 stringStreamOutCallback("\n");
2259 break;
2261 case SVMOp::CONTAINER_SET:
2263 const SVMContainerSetOp* pContainerSetOp = static_cast<const SVMContainerSetOp*>(pOp);
2264 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2265 stringStreamOutCallback("\tCONTAINER_SET ");
2266 stringStreamOutCallback(GetContainer(pContainerSetOp->iContainer)->GetName());
2267 stringStreamOutCallback(" ");
2268 stringStreamOutCallback(StringUtils::SizeTToString(pContainerSetOp->count, stringBuffer));
2269 stringStreamOutCallback("\n");
2270 break;
2272 case SVMOp::CONTAINER_FIND_BY_VALUE:
2274 const SVMContainerFindByValueOp* pContainerFindByValueOp = static_cast<const SVMContainerFindByValueOp*>(pOp);
2275 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2276 stringStreamOutCallback("\tCONTAINER_FIND_BY_VALUE ");
2277 stringStreamOutCallback(GetContainer(pContainerFindByValueOp->iContainer)->GetName());
2278 stringStreamOutCallback(" ");
2279 stringStreamOutCallback(StringUtils::SizeTToString(pContainerFindByValueOp->count, stringBuffer));
2280 stringStreamOutCallback("\n");
2281 break;
2283 case SVMOp::COMPARE:
2285 const SVMCompareOp* pCompareOp = static_cast<const SVMCompareOp*>(pOp);
2286 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2287 stringStreamOutCallback("\tCOMPARE ");
2288 stringStreamOutCallback(StringUtils::SizeTToString(pCompareOp->lhsPos, stringBuffer));
2289 stringStreamOutCallback(" ");
2290 stringStreamOutCallback(StringUtils::SizeTToString(pCompareOp->rhsPos, stringBuffer));
2291 stringStreamOutCallback(" ");
2292 stringStreamOutCallback(StringUtils::SizeTToString(pCompareOp->count, stringBuffer));
2293 stringStreamOutCallback("\n");
2294 break;
2296 case SVMOp::INCREMENT_INT32:
2298 const SVMIncrementInt32Op* pIncrementInt32Op = static_cast<const SVMIncrementInt32Op*>(pOp);
2299 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2300 stringStreamOutCallback("\tINCREMENT_INT32 ");
2301 stringStreamOutCallback(StringUtils::SizeTToString(pIncrementInt32Op->pos, stringBuffer));
2302 stringStreamOutCallback("\n");
2303 break;
2305 case SVMOp::LESS_THAN_INT32:
2307 const SVMLessThanInt32Op* pLessThanInt32Op = static_cast<const SVMLessThanInt32Op*>(pOp);
2308 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2309 stringStreamOutCallback("\tLESS_THAN_INT32 ");
2310 stringStreamOutCallback(StringUtils::SizeTToString(pLessThanInt32Op->lhsPos, stringBuffer));
2311 stringStreamOutCallback(" ");
2312 stringStreamOutCallback(StringUtils::SizeTToString(pLessThanInt32Op->rhsPos, stringBuffer));
2313 stringStreamOutCallback("\n");
2314 break;
2316 case SVMOp::GREATER_THAN_INT32:
2318 const SVMGreaterThanInt32Op* pGreaterThanInt32Op = static_cast<const SVMGreaterThanInt32Op*>(pOp);
2319 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2320 stringStreamOutCallback("\tGREATER_THAN_INT32 ");
2321 stringStreamOutCallback(StringUtils::SizeTToString(pGreaterThanInt32Op->lhsPos, stringBuffer));
2322 stringStreamOutCallback(" ");
2323 stringStreamOutCallback(StringUtils::SizeTToString(pGreaterThanInt32Op->rhsPos, stringBuffer));
2324 stringStreamOutCallback("\n");
2325 break;
2327 case SVMOp::BRANCH:
2329 const size_t pos = static_cast<const SVMBranchOp*>(pOp)->pos;
2330 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2331 stringStreamOutCallback("\tBRANCH ");
2332 stringStreamOutCallback(StringUtils::SizeTToString(pos, stringBuffer));
2333 stringStreamOutCallback("\n");
2334 break;
2336 case SVMOp::BRANCH_IF_ZERO:
2338 const size_t pos = static_cast<const SVMBranchIfZeroOp*>(pOp)->pos;
2339 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2340 stringStreamOutCallback("\tBRANCH_IF_ZERO ");
2341 stringStreamOutCallback(StringUtils::SizeTToString(pos, stringBuffer));
2342 stringStreamOutCallback("\n");
2343 break;
2345 case SVMOp::BRANCH_IF_NOT_ZERO:
2347 const size_t pos = static_cast<const SVMBranchIfNotZeroOp*>(pOp)->pos;
2348 char stringBuffer[StringUtils::s_sizeTStringBufferSize] = "";
2349 stringStreamOutCallback("\tBRANCH_IF_NOT_ZERO ");
2350 stringStreamOutCallback(StringUtils::SizeTToString(pos, stringBuffer));
2351 stringStreamOutCallback("\n");
2352 break;
2354 case SVMOp::GET_OBJECT:
2356 stringStreamOutCallback("\tGET_OBJECT\n");
2357 break;
2359 case SVMOp::START_TIMER:
2361 // #SchematycTODO : Can we get to the timer's name from here?
2362 char guidString[StringUtils::s_guidStringBufferSize] = "";
2363 StringUtils::SysGUIDToString(static_cast<const SVMStartTimerOp*>(pOp)->guid.sysGUID, guidString);
2364 stringStreamOutCallback("\tSTART_TIMER ");
2365 stringStreamOutCallback(guidString);
2366 stringStreamOutCallback("\n");
2367 break;
2369 case SVMOp::STOP_TIMER:
2371 // #SchematycTODO : Can we get to the timer's name from here?
2372 char guidString[StringUtils::s_guidStringBufferSize] = "";
2373 StringUtils::SysGUIDToString(static_cast<const SVMStopTimerOp*>(pOp)->guid.sysGUID, guidString);
2374 stringStreamOutCallback("\tSTOP_TIMER ");
2375 stringStreamOutCallback(guidString);
2376 stringStreamOutCallback("\n");
2377 break;
2379 case SVMOp::SEND_SIGNAL:
2381 const SVMSendSignalOp* pSendSignalOp = static_cast<const SVMSendSignalOp*>(pOp);
2382 stringStreamOutCallback("\tSEND_SIGNAL ");
2383 if(ISignalConstPtr pSignal = gEnv->pSchematyc2->GetLibRegistry().GetSignal(pSendSignalOp->guid))
2385 stringStreamOutCallback(pSignal->GetName());
2386 stringStreamOutCallback("\n");
2388 else
2390 stringStreamOutCallback("?\n");
2392 break;
2394 case SVMOp::BROADCAST_SIGNAL:
2396 const SVMBroadcastSignalOp* pBroadcastSignalOp = static_cast<const SVMBroadcastSignalOp*>(pOp);
2397 stringStreamOutCallback("\tBROADCAST_SIGNAL ");
2398 if(ISignalConstPtr pSignal = gEnv->pSchematyc2->GetLibRegistry().GetSignal(pBroadcastSignalOp->guid))
2400 stringStreamOutCallback(pSignal->GetName());
2401 stringStreamOutCallback("\n");
2403 else
2405 stringStreamOutCallback("?\n");
2407 break;
2409 case SVMOp::CALL_GLOBAL_FUNCTION:
2411 const SVMCallGlobalFunctionOp* pCallGlobalFunctionOp = static_cast<const SVMCallGlobalFunctionOp*>(pOp);
2412 IGlobalFunctionConstPtr pFunction = function.GetGlobalFunctionTable()[pCallGlobalFunctionOp->iGlobalFunction];
2413 stringStreamOutCallback("\tCALL_GLOBAL_FUNCTION ");
2414 stringStreamOutCallback(pFunction->GetName());
2415 stringStreamOutCallback("\n");
2416 break;
2418 case SVMOp::CALL_ENV_ABSTRACT_INTERFACE_FUNCTION:
2420 const SVMCallEnvAbstractInterfaceFunctionOp* pCallEnvAbstractInterfaceFunctionOp = static_cast<const SVMCallEnvAbstractInterfaceFunctionOp*>(pOp);
2421 stringStreamOutCallback("\tCALL_ENV_ABSTRACT_INTERFACE_FUNCTION ");
2422 if(IAbstractInterfaceConstPtr pAbstractInterface = gEnv->pSchematyc2->GetEnvRegistry().GetAbstractInterface(pCallEnvAbstractInterfaceFunctionOp->abstractInterfaceGUID))
2424 stringStreamOutCallback(pAbstractInterface->GetName());
2426 else
2428 stringStreamOutCallback("?");
2430 stringStreamOutCallback(" ");
2431 if(IAbstractInterfaceFunctionConstPtr pFunction = gEnv->pSchematyc2->GetEnvRegistry().GetAbstractInterfaceFunction(pCallEnvAbstractInterfaceFunctionOp->functionGUID))
2433 stringStreamOutCallback(pFunction->GetName());
2435 else
2437 stringStreamOutCallback("?");
2439 stringStreamOutCallback("\n");
2440 break;
2442 case SVMOp::CALL_LIB_ABSTRACT_INTERFACE_FUNCTION:
2444 const SVMCallLibAbstractInterfaceFunctionOp* pCallLibAbstractInterfaceFunctionOp = static_cast<const SVMCallLibAbstractInterfaceFunctionOp*>(pOp);
2445 stringStreamOutCallback("\tCALL_LIB_ABSTRACT_INTERFACE_FUNCTION ");
2446 if(ILibAbstractInterfaceConstPtr pAbstractInterface = gEnv->pSchematyc2->GetLibRegistry().GetAbstractInterface(pCallLibAbstractInterfaceFunctionOp->abstractInterfaceGUID))
2448 stringStreamOutCallback(pAbstractInterface->GetName());
2450 else
2452 stringStreamOutCallback("?");
2454 stringStreamOutCallback(" ");
2455 if(ILibAbstractInterfaceFunctionConstPtr pFunction = gEnv->pSchematyc2->GetLibRegistry().GetAbstractInterfaceFunction(pCallLibAbstractInterfaceFunctionOp->functionGUID))
2457 stringStreamOutCallback(pFunction->GetName());
2459 else
2461 stringStreamOutCallback("?");
2463 stringStreamOutCallback("\n");
2464 break;
2466 case SVMOp::CALL_COMPONENT_MEMBER_FUNCTION:
2468 const SVMCallComponentMemberFunctionOp* pCallComponentMemberFunctionOp = static_cast<const SVMCallComponentMemberFunctionOp*>(pOp);
2469 IComponentMemberFunctionConstPtr pFunction = function.GetComponentMemberFunctionTable()[pCallComponentMemberFunctionOp->iComponentMemberFunction];
2470 stringStreamOutCallback("\tCALL_COMPONENT_MEMBER_FUNCTION ");
2471 stringStreamOutCallback(pFunction->GetName());
2472 stringStreamOutCallback("\n");
2473 break;
2475 case SVMOp::CALL_ACTION_MEMBER_FUNCTION:
2477 const SVMCallActionMemberFunctionOp* pCallActionMemberFunctionOp = static_cast<const SVMCallActionMemberFunctionOp*>(pOp);
2478 IActionMemberFunctionConstPtr pFunction = function.GetActionMemberFunctionTable()[pCallActionMemberFunctionOp->iActionMemberFunction];
2479 stringStreamOutCallback("\tCALL_ACTION_MEMBER_FUNCTION ");
2480 stringStreamOutCallback(pFunction->GetName());
2481 stringStreamOutCallback("\n");
2482 break;
2484 case SVMOp::CALL_LIB_FUNCTION:
2486 stringStreamOutCallback("\tCALL_LIB_FUNCTION ");
2487 const SVMCallLibFunctionOp* pCallLibFunctionOp = static_cast<const SVMCallLibFunctionOp*>(pOp);
2488 if(const ILibFunction* pFunction = GetFunction(pCallLibFunctionOp->functionId))
2490 stringStreamOutCallback(pFunction->GetName());
2491 stringStreamOutCallback("\n");
2493 else
2495 stringStreamOutCallback("?\n");
2497 break;
2499 case SVMOp::RETURN:
2501 stringStreamOutCallback("\tRETURN\n");
2502 break;
2505 functionPos += pOp->size;
2507 stringStreamOutCallback("\nend\n\n");
2511 //////////////////////////////////////////////////////////////////////////
2512 CLib::CLib(const char* name)
2513 : m_name(name)
2516 //////////////////////////////////////////////////////////////////////////
2517 const char* CLib::GetName() const
2519 return m_name.c_str();
2522 //////////////////////////////////////////////////////////////////////////
2523 ISignalConstPtr CLib::GetSignal(const SGUID& guid) const
2525 TSignalMap::const_iterator iSignal = m_signals.find(guid);
2526 return iSignal != m_signals.end() ? iSignal->second : ISignalConstPtr();
2529 //////////////////////////////////////////////////////////////////////////
2530 void CLib::VisitSignals(const LibSignalVisitor& visitor)
2532 CRY_ASSERT(visitor);
2533 if(visitor)
2535 for(TSignalMap::iterator iSignal = m_signals.begin(), iEndSignal = m_signals.end(); iSignal != iEndSignal; ++ iSignal)
2537 if(visitor(iSignal->second) != EVisitStatus::Continue)
2539 return;
2545 //////////////////////////////////////////////////////////////////////////
2546 ILibAbstractInterfaceConstPtr CLib::GetAbstractInterface(const SGUID& guid) const
2548 TAbstractInterfaceMap::const_iterator iAbstractInterface = m_abstractInterfaces.find(guid);
2549 return iAbstractInterface != m_abstractInterfaces.end() ? iAbstractInterface->second : ILibAbstractInterfaceConstPtr();
2552 //////////////////////////////////////////////////////////////////////////
2553 void CLib::VisitAbstractInterfaces(const ILibAbstractInterfaceVisitor& visitor)
2555 CRY_ASSERT(visitor);
2556 if(visitor)
2558 for(TAbstractInterfaceMap::iterator iAbstractInterface = m_abstractInterfaces.begin(), iEndAbstractInterface = m_abstractInterfaces.end(); iAbstractInterface != iEndAbstractInterface; ++ iAbstractInterface)
2560 if(visitor(iAbstractInterface->second) != EVisitStatus::Continue)
2562 return;
2568 //////////////////////////////////////////////////////////////////////////
2569 ILibAbstractInterfaceFunctionConstPtr CLib::GetAbstractInterfaceFunction(const SGUID& guid) const
2571 TAbstractInterfaceFunctionMap::const_iterator iAbstractInterfaceFunction = m_abstractInterfaceFunctions.find(guid);
2572 return iAbstractInterfaceFunction != m_abstractInterfaceFunctions.end() ? iAbstractInterfaceFunction->second : ILibAbstractInterfaceFunctionConstPtr();
2575 //////////////////////////////////////////////////////////////////////////
2576 void CLib::VisitAbstractInterfaceFunctions(const ILibAbstractInterfaceFunctionVisitor& visitor)
2578 CRY_ASSERT(visitor);
2579 if(visitor)
2581 for(TAbstractInterfaceFunctionMap::iterator iAbstractInterfaceFunction = m_abstractInterfaceFunctions.begin(), iEndAbstractInterfaceFunction = m_abstractInterfaceFunctions.end(); iAbstractInterfaceFunction != iEndAbstractInterfaceFunction; ++ iAbstractInterfaceFunction)
2583 if(visitor(iAbstractInterfaceFunction->second) != EVisitStatus::Continue)
2585 return;
2591 //////////////////////////////////////////////////////////////////////////
2592 ILibClassConstPtr CLib::GetClass(const SGUID& guid) const
2594 TClassMap::const_iterator iClass = m_classes.find(guid);
2595 return iClass != m_classes.end() ? iClass->second : ILibClassConstPtr();
2598 //////////////////////////////////////////////////////////////////////////
2599 void CLib::VisitClasses(const ILibClassVisitor& visitor) const
2601 CRY_ASSERT(visitor);
2602 if(visitor)
2604 for(TClassMap::const_iterator iClass = m_classes.begin(), iEndClass = m_classes.end(); iClass != iEndClass; ++ iClass)
2606 if(visitor(iClass->second) != EVisitStatus::Continue)
2608 return;
2614 //////////////////////////////////////////////////////////////////////////
2615 void CLib::PreviewGraphFunctions(const SGUID& graphGUID, const StringStreamOutCallback& stringStreamOutCallback) const
2617 for(TClassMap::const_iterator iClass = m_classes.begin(), iEndClass = m_classes.end(); iClass != iEndClass; ++ iClass)
2619 iClass->second->PreviewGraphFunctions(graphGUID, stringStreamOutCallback);
2623 //////////////////////////////////////////////////////////////////////////
2624 CSignalPtr CLib::AddSignal(const SGUID& guid, const SGUID& senderGUID, const char* name)
2626 if(GetSignal(guid) == NULL)
2628 CSignalPtr pSignal(new CSignal(guid, senderGUID, name));
2629 m_signals.insert(TSignalMap::value_type(guid, pSignal));
2630 return pSignal;
2632 return CSignalPtr();
2635 //////////////////////////////////////////////////////////////////////////
2636 CSignalPtr CLib::GetSignal(const SGUID& guid)
2638 TSignalMap::iterator iSignal = m_signals.find(guid);
2639 return iSignal != m_signals.end() ? iSignal->second : CSignalPtr();
2642 //////////////////////////////////////////////////////////////////////////
2643 CLibAbstractInterfacePtr CLib::AddAbstractInterface(const SGUID& guid, const char* name)
2645 if(!GetAbstractInterface(guid))
2647 CLibAbstractInterfacePtr pAbstractInterface(new CLibAbstractInterface(guid, name));
2648 m_abstractInterfaces.insert(TAbstractInterfaceMap::value_type(guid, pAbstractInterface));
2649 return pAbstractInterface;
2651 return CLibAbstractInterfacePtr();
2654 //////////////////////////////////////////////////////////////////////////
2655 CLibAbstractInterfacePtr CLib::GetAbstractInterface(const SGUID& guid)
2657 TAbstractInterfaceMap::iterator iAbstractInterface = m_abstractInterfaces.find(guid);
2658 return iAbstractInterface != m_abstractInterfaces.end() ? iAbstractInterface->second : CLibAbstractInterfacePtr();
2661 //////////////////////////////////////////////////////////////////////////
2662 CLibAbstractInterfaceFunctionPtr CLib::AddAbstractInterfaceFunction(const SGUID& guid, const char* name)
2664 if(!GetAbstractInterfaceFunction(guid))
2666 CLibAbstractInterfaceFunctionPtr pAbstractInterfaceFunction(new CLibAbstractInterfaceFunction(guid, name));
2667 m_abstractInterfaceFunctions.insert(TAbstractInterfaceFunctionMap::value_type(guid, pAbstractInterfaceFunction));
2668 return pAbstractInterfaceFunction;
2670 return CLibAbstractInterfaceFunctionPtr();
2673 //////////////////////////////////////////////////////////////////////////
2674 CLibAbstractInterfaceFunctionPtr CLib::GetAbstractInterfaceFunction(const SGUID& guid)
2676 TAbstractInterfaceFunctionMap::iterator iAbstractInterfaceFunction = m_abstractInterfaceFunctions.find(guid);
2677 return iAbstractInterfaceFunction != m_abstractInterfaceFunctions.end() ? iAbstractInterfaceFunction->second : CLibAbstractInterfaceFunctionPtr();
2680 //////////////////////////////////////////////////////////////////////////
2681 CLibClassPtr CLib::AddClass(const SGUID& guid, const char* name, const SGUID& foundationGUID, const IPropertiesConstPtr& pFoundationProperties)
2683 if(!GetClass(guid))
2685 CLibClassPtr pClass(new CLibClass(*this, guid, name, foundationGUID, pFoundationProperties));
2686 m_classes.insert(TClassMap::value_type(guid, pClass));
2687 return pClass;
2689 return CLibClassPtr();
2692 //////////////////////////////////////////////////////////////////////////
2693 CLibClassPtr CLib::GetClass(const SGUID& guid)
2695 TClassMap::iterator iClass = m_classes.find(guid);
2696 return iClass != m_classes.end() ? iClass->second : CLibClassPtr();
2699 //////////////////////////////////////////////////////////////////////////
2700 void CLib::CompactMemory()
2702 for (TClassMap::value_type& classPair : m_classes)
2704 classPair.second->CompactMemory();