hkVersionRegistry.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_SERIALIZE2_VERSION_REGISTRY_H
  9. #define HK_SERIALIZE2_VERSION_REGISTRY_H
  10. #include <Common/Base/Reflection/hkClass.h>
  11. #include <Common/Base/Reflection/Registry/hkDynamicClassNameRegistry.h>
  12. class hkBindingClassNameRegistry;
  13. class hkStaticClassNameRegistry;
  14. class hkObjectUpdateTracker;
  15. template <typename T> class hkArray;
  16. template <typename T> class hkStringMap;
  17. /// Manages conversion between sdk versions.
  18. /// Note that the registry has no concept of version numbers being greater
  19. /// or less than one another. It just knows that it may call a function
  20. /// to convert between two string identifiers.
  21. class hkVersionRegistry : public hkReferencedObject, public hkSingleton<hkVersionRegistry>
  22. {
  23. public:
  24. /// Signature of the generic version functions.
  25. typedef void (HK_CALL *VersionFunc)(hkVariant& obj, hkVariant& newObj, hkObjectUpdateTracker& tracker);
  26. /// Specifies how to handle class signatures.
  27. enum SignatureFlags
  28. {
  29. AUTO_SIGNATURE = 0xffffffff
  30. };
  31. /// Specifies how the versioning should be handled.
  32. enum VersionFlags
  33. {
  34. /// The object is neither copied, nor defaults applied.
  35. VERSION_MANUAL = 1<<1,
  36. /// The object can be updated in place and has defaults applied.
  37. VERSION_INPLACE = 1<<2,
  38. /// The object is copied and defaults applied.
  39. VERSION_COPY = 1<<3,
  40. /// The object is to be removed and all references to it nullified.
  41. VERSION_REMOVED = 1<<4,
  42. /// The object contains a variant.
  43. VERSION_VARIANT = 1<<5,
  44. /// The object contains a homogeneous array.
  45. VERSION_HOMOGENEOUSARRAY = 1<<6
  46. };
  47. struct ClassRename
  48. {
  49. const char* oldName;
  50. const char* newName;
  51. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, ClassRename );
  52. };
  53. /// Describes the versioning changes for a single type.
  54. struct ClassAction
  55. {
  56. /// Signature before updating.
  57. hkUint32 oldSignature;
  58. /// Signature after updating.
  59. hkUint32 newSignature;
  60. /// How should the type be versioned.
  61. int /*VersionFlags*/ versionFlags;
  62. /// The class name as it appears in the old version.
  63. const char* oldClassName;
  64. /// Custom function to call or HK_NULL.
  65. VersionFunc versionFunc;
  66. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, ClassAction );
  67. };
  68. struct UpdateDescription
  69. {
  70. UpdateDescription(const ClassRename* renames, const ClassAction* actions, const hkClassNameRegistry* staticNewClassRegistry = HK_NULL) :
  71. m_renames(renames), m_actions(actions), m_newClassRegistry(staticNewClassRegistry), m_next(HK_NULL)
  72. {
  73. }
  74. /// Find the update action for specified class.
  75. //const ClassAction* findActionForClass( const hkClass& classIn ) const;
  76. /// Null or null-terminated list of renames.
  77. const ClassRename* m_renames;
  78. /// Null or null terminated list of actions 
  79. const ClassAction* m_actions;
  80. /// New versions of classes.
  81. const hkClassNameRegistry* m_newClassRegistry;
  82. /// Null or null terminated list (stack order) of update descriptions
  83. UpdateDescription* m_next;
  84. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, UpdateDescription );
  85. };
  86. /// Signature of an update function.
  87. typedef hkResult (HK_CALL* UpdateFunction)(
  88. hkArray<hkVariant>& loadedObjects,
  89. hkObjectUpdateTracker& tracker );
  90. /// Single entry to update between specified versions.
  91. struct Updater
  92. {
  93. const char* fromVersion;
  94. const char* toVersion;
  95. UpdateDescription* desc;
  96. UpdateFunction optionalCustomFunction;
  97. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, hkVersionRegistry::Updater );
  98. };
  99. hkVersionRegistry();
  100. ///
  101. ~hkVersionRegistry();
  102. /// Add an updater to the registry.
  103. /// Usually updaters are compiled in via StaticLinkedUpdaters, but
  104. /// dynamically loaded updaters may use this method.
  105. void registerUpdater( const Updater* updater );
  106. /// Find the sequence of updaters to convert between given versions.
  107. /// If there is a path between fromVersion and toVersion write the sequence
  108. /// of updaters needed into pathOut and return HK_SUCCESS.
  109. /// If no such path exists, return HK_FAILURE.
  110. hkResult getVersionPath( const char* fromVersion, const char* toVersion, hkArray<const Updater*>& pathOut ) const;
  111. const hkClassNameRegistry* getClassNameRegistry( const char* versionString ) const;
  112. hkResult registerStaticClassRegistry(const hkStaticClassNameRegistry& staticReg);
  113. hkResult registerUpdateDescription(UpdateDescription& updateDescription, const char* fromVersion, const char* toVersion);
  114. public:
  115. /// Available updaters.
  116. hkArray<const Updater*> m_updaters;
  117. /// List of updaters available at compile time - SEE DETAILS BELOW.
  118. /// NB Link errors (e.g. LNK2001 under .NET) for this array probably mean you 
  119. /// have not yet registered the updaters via eg sdk/include/common/Common/Compat/hkCompatVersions.h using the HK_COMPAT_FILE macro -
  120. /// See the demo/demos/*Classes.cpp files for examples, (e.g. demo/demos/PhysicsClasses.cpp for Physics-Only customers).
  121. static const Updater* StaticLinkedUpdaters[];
  122. /// List of versions and corresponding classes available at compile time - SEE DETAILS BELOW.
  123. /// NB Link errors (e.g. LNK2001 under .NET) for this array probably mean you 
  124. /// have not yet registered the classes via eg sdk/include/common/Common/Compat/hkCompatVersions.h using the HK_COMPAT_FILE macro -
  125. /// See the demo/demos/*Classes.cpp files for examples, (e.g. demo/demos/PhysicsClasses.cpp for Physics-Only customers).
  126. static const hkStaticClassNameRegistry* StaticLinkedClassRegistries[];
  127. public:
  128. hkDynamicClassNameRegistry* getDynamicClassNameRegistry( const char* versionString ) const;
  129. private:
  130. mutable hkStringMap<hkDynamicClassNameRegistry*> m_versionToClassNameRegistryMap;
  131. };
  132. class ValidatedClassNameRegistry : public hkDynamicClassNameRegistry
  133. {
  134. public:
  135. typedef hkResult (HK_CALL *ClassRegistryCallbackFunc)(hkDynamicClassNameRegistry& classRegistry, const hkClass& klass, void* userData);
  136. static hkResult HK_CALL processClass(hkDynamicClassNameRegistry& classRegistry, const hkClass& classToProcess, void* userData);
  137. ValidatedClassNameRegistry(const hkClassNameRegistry* classRegistry);
  138. /// Register a class possibly under a different name.
  139. /// If name is null, the class name is used.
  140. /// The name is not copied and must be valid for the lifetime
  141. /// of this object.
  142. virtual void registerClass( const hkClass* klass, const char* name);
  143. private:
  144. hkResult validateClassRegistry(const hkClass& klass, hkStringMap<hkBool32>& doneClassesInOut, ClassRegistryCallbackFunc callbackFunc, void* userData);
  145. };
  146. #endif // HK_SERIALIZE2_VERSION_REGISTRY_H
  147. /*
  148. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  149. * Confidential Information of Havok.  (C) Copyright 1999-2009
  150. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  151. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  152. * rights, and intellectual property rights in the Havok software remain in
  153. * Havok and/or its suppliers.
  154. * Use of this software for evaluation purposes is subject to and indicates
  155. * acceptance of the End User licence Agreement for this product. A copy of
  156. * the license is included with this software and is also available at www.havok.com/tryhavok.
  157. */