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

其他游戏

开发平台:

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_PACKFILE_READER_H
  9. #define HK_PACKFILE_READER_H
  10. #include <Common/Serialize/Packfile/hkPackfileData.h>
  11. class hkStreamReader;
  12. class hkObjectUpdateTracker;
  13. class hkClassNameRegistry;
  14. class hkTypeInfoRegistry;
  15. template <typename T> class hkStringMap;
  16. template <typename K, typename V> class hkPointerMultiMap;
  17. /// Base interface to read in a packed file.
  18. /// Reading is done two steps - first the file is read
  19. /// and reconstructed in memory (loadEntireFile). Secondly
  20. /// versioning, pointer fixups and finishing functions
  21. /// are run (getContents).
  22. class hkPackfileReader : public hkReferencedObject
  23. {
  24. public:
  25. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE);
  26. hkPackfileReader();
  27. ~hkPackfileReader();
  28. /// Simple interface. Load the entire file, fixes up all pointers.
  29. /// This method internally allocates memory for storing the packfile.
  30. /// hkBinaryPackfileReader has finer grained loading operations, and
  31. /// also a method which allows loading with no memory allocations.
  32. /// hkXmlPackfile reader needs class descriptions to load the objects.
  33. /// We look for class descriptions in two places : first the file itself
  34. /// and secondly in the hkBuiltinTypeRegistry. See also
  35. /// hkXmlPackfileReader::loadEntireFileWithRegistry.
  36. virtual hkResult loadEntireFile( hkStreamReader* reader ) = 0;
  37. /// Get the top level object in the file.
  38. /// This function assumes that the packfile version matches the in-memory
  39. /// version. You may use hkVersionUtil if this is not the case. See the
  40. /// serialization section of the manual for more details.
  41. /// Usually you will use getContents instead of this function.
  42. /// If the packfile contents type do not match the expected class type
  43. /// this method will return HK_NULL. You may pass HK_NULL as the expected
  44. /// class to disable this check.
  45. /// Some objects will require a finishing step. i.e. to initialize
  46. /// members which have not been serialized or to initialize vtables.
  47. /// If "finish" is not HK_NULL, apply these finishing steps.
  48. virtual void* getContentsWithRegistry( const char* expectedClassName, const hkTypeInfoRegistry* finish ) = 0;
  49. /// Get the top level object in the file.
  50. /// Calls getContentsWithRegistry with the finish registry from hkBuiltinTypeRegistry.
  51. virtual void* getContents( const char* expectedClassName );
  52. /// Get the class name of contents, if available.
  53. virtual const char* getContentsClassName() const = 0;
  54. //
  55. // Versioning access functions.
  56. //
  57. /// Get all objects in the packfile.
  58. /// Used by the versioning code. Note that if a packfile has been
  59. /// stripped of metadata, then this array may be empty.
  60. virtual hkArray<hkVariant>& getLoadedObjects() const = 0;
  61. /// Get top level object in the packfile.
  62. /// Used by the versioning code.
  63. virtual hkVariant getTopLevelObject() const = 0;
  64. /// Get a tracker which knows about the internal structure of the packfile.
  65. virtual hkObjectUpdateTracker& getUpdateTracker() const = 0;
  66. /// Get a string representing the current version of objects within the file.
  67. /// E.g. "Havok-4.1.0". 
  68. virtual const char* getContentsVersion() const;
  69. /// Label the packfile as containing the given version.
  70. virtual void setContentsVersion(const char* version );
  71. //
  72. // Utility
  73. //
  74. /// The format of a packfile.
  75. enum FormatType
  76. {
  77. /// read or open error.
  78. FORMAT_ERROR,
  79. /// readable but not recognised.
  80. FORMAT_UNKNOWN,
  81. /// binary packfile
  82. FORMAT_BINARY,
  83. /// xml packfile
  84. FORMAT_XML,
  85. };
  86. /// Detect the type of a packfile stream.
  87. static hkEnum<FormatType,hkInt32> HK_CALL detectFormat( hkStreamReader* reader );
  88. public:
  89. /// Get a handle to memory allocations made during loading.
  90. /// You can add a reference to this, and delete the pack file reader after loading.
  91. /// Removing your reference will deallocate any loaded data.
  92. /// IMPORTANT: Make sure that the pack file content is versioned before you call this function.
  93. virtual hkPackfileData* getPackfileData() const = 0;
  94. // compatibility
  95. typedef hkPackfileData AllocatedData;
  96. AllocatedData* getAllocatedData() const { return getPackfileData(); }
  97. /// Return true if the sdk version matches the packfile version.
  98. hkBool32 isVersionUpToDate() const;
  99. void warnIfNotUpToDate() const;
  100. public:
  101. ///
  102. typedef const char* SectionTag;
  103. typedef hkPointerMap<const hkClass*, hkInt32> UpdateFlagFromClassMap;
  104. mutable UpdateFlagFromClassMap m_updateFlagFromClass;
  105. // Current contents version.
  106. char* m_contentsVersion;
  107. ///
  108. static void HK_CALL updateMetaDataInplace( hkClass* classInOut, int fileVersion, const char* contentsVersion, UpdateFlagFromClassMap& updateFlagFromClass );
  109. };
  110. #endif // HK_PACKFILE_READER_H
  111. /*
  112. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  113. * Confidential Information of Havok.  (C) Copyright 1999-2009
  114. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  115. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  116. * rights, and intellectual property rights in the Havok software remain in
  117. * Havok and/or its suppliers.
  118. * Use of this software for evaluation purposes is subject to and indicates
  119. * acceptance of the End User licence Agreement for this product. A copy of
  120. * the license is included with this software and is also available at www.havok.com/tryhavok.
  121. */