hkBinaryPackfileReader.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_BINARY_PACKFILE_READER_H
  9. #define HK_BINARY_PACKFILE_READER_H
  10. #include <Common/Serialize/Packfile/hkPackfileReader.h>
  11. class hkStreamReader;
  12. class hkPackfileHeader;
  13. class hkPackfileSectionHeader;
  14. class hkTypeInfoRegistry;
  15. class hkPackfileObjectUpdateTracker;
  16. typedef hkPackfileObjectUpdateTracker hkBinaryPackfileUpdateTracker;
  17. /// Reads a memory image packfile.
  18. /// Note that unlike the hkBinaryPackfileWriter which can export
  19. /// from any platform to any platform, this class does minimal
  20. /// processing and can only read files which have been written
  21. /// for the host platform.
  22. class hkBinaryPackfileReader : public hkPackfileReader
  23. {
  24. public:
  25. /// Create an uninitialized reader.
  26. hkBinaryPackfileReader();
  27. /// Cleans up any allocated memory.
  28. ~hkBinaryPackfileReader();
  29. /// Load the entire file, fixes up all pointers.
  30. /// Use a new packfile reader for each loadEntireFile call.
  31. virtual hkResult loadEntireFile( hkStreamReader* reader );
  32. /// Load from a preallocated memory chunk.
  33. /// Given a binary packfile that is already in
  34. /// memory, set all the header and section pointers
  35. /// inplace and fixup all the pointers.
  36. /// This method does not do any memory allocation and the
  37. /// user must ensure that "data" remains valid for the lifetime
  38. /// of the packfile.
  39. /// Use a new packfile reader for each loadEntireFileInplace call.
  40. virtual hkResult loadEntireFileInplace( void* data, int dataSize );
  41. /// Implements hkPackfileReader::getContentsWithRegistry().
  42. /// For packfiles with metadata, all hkClass pointers are replaced
  43. /// with corresponding hkClass from hkBuiltinTypeRegistry.
  44. virtual void* getContentsWithRegistry( const char* className, const hkTypeInfoRegistry* finish );
  45. // Inherited from hkPackfileReader
  46. virtual const char* getContentsClassName() const;
  47. /// Implements hkPackfileReader::getPackfileData().
  48. /// For packfiles with metadata, all hkClass pointers are replaced
  49. /// with corresponding hkClass from hkBuiltinTypeRegistry.
  50. virtual hkPackfileData* getPackfileData() const;
  51. // Inherited from hkPackfileReader
  52. virtual hkArray<hkVariant>& getLoadedObjects() const;
  53. // Inherited from hkPackfileReader
  54. virtual hkVariant getTopLevelObject() const;
  55. // Inherited from hkPackfileReader
  56. virtual hkObjectUpdateTracker& getUpdateTracker() const;
  57. public:
  58. //
  59. // Special load/save methods for more control
  60. //
  61. /// Load the file header only.
  62. /// If dst is null, memory is allocated internally.
  63. hkResult loadFileHeader(hkStreamReader* reader, hkPackfileHeader* dst = HK_NULL);
  64. /// Return a reference to the header.
  65. /// Must have called loadHeader() or loadEntireFile() first.
  66. const hkPackfileHeader& getFileHeader() const;
  67. /// Get the number of sections in this file.
  68. /// Must have called loadHeader() or loadEntireFile() first.
  69. int getNumSections() const;
  70. /// Read the section headers into dst.
  71. /// Assumes the stream is in the correct position.
  72. /// If dst is null, memory is allocated internally.
  73. /// The dst should be big enough to hold header.m_numSections sections.
  74. hkResult loadSectionHeadersNoSeek(hkStreamReader* reader, hkPackfileSectionHeader* dst = HK_NULL);
  75. /// Return a reference to the i'th section.
  76. /// Must have called loadSectionHeader() or loadEntireFile() first.
  77. hkPackfileSectionHeader& getSectionHeader(int idx) const;
  78. /// Read a single section.
  79. /// A user buffer for the data may be supplied. The required size is given
  80. /// by getSectionHeader(sectionIndex).m_endOffset. If dst is null, memory
  81. /// is allocated internally.
  82. /// You should call fixupGlobalReferences() after  you are finished
  83. /// loading and unloading. Also if you use imports or exports in this section,
  84. /// you will need to update the resource manager.
  85. /// Note: loading and unloading sections will have undefined results
  86. /// after the packfile contents have been versioned. 
  87. hkResult loadSection(hkStreamReader* reader, int sectionIndex, void* buf = HK_NULL);
  88. /// Throw away inter data associated with this section
  89. /// You should call fixupGlobalReferences() after  you are finished
  90. /// loading and unloading. Also if you use imports or exports in this section,
  91. /// you will need to update the resource manager.
  92. /// Note: loading and unloading sections will have undefined results
  93. /// after the packfile contents have been versioned.
  94. hkResult unloadSection(int sectionIndex);
  95. /// Fixup pointers between objects in loaded sections.
  96. /// Nullifies any pointers to data which has been unloaded. Sets up
  97. /// pointers to sections which have been loaded.
  98. hkResult fixupGlobalReferences();
  99. /// Fixup object virtual tables.
  100. hkResult finishLoadedObjects( const hkTypeInfoRegistry& finish );
  101. /// See loadSection.
  102. /// This is a special case of loadSection() when the stream is already at
  103. /// the correct offset, as happens when called from loadEntireFile().
  104. /// No error checking is done because the reader may not implement tell().
  105. hkResult loadSectionNoSeek(hkStreamReader* reader, int sectionIndex, void* buf = HK_NULL);
  106. protected:
  107. /// Convert a section tag to a section index.
  108. virtual int getSectionIndex( SectionTag sectionTag ) const;
  109. /// Get data by physical index.
  110. /// Returns null if section is not loaded.
  111. virtual void* getSectionDataByIndex( int sectionIndex, int offset=0 ) const;
  112. void* getOriginalContents() const;
  113. const char* getOriginalContentsClassName() const;
  114. const hkClassNameRegistry* getClassNameRegistry() const;
  115. struct PackfileObject
  116. {
  117. void* object;
  118. int section;
  119. int offset;
  120. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, hkBinaryPackfileReader::PackfileObject );
  121. };
  122. void findClassLocations( hkArray<PackfileObject>& objectsOut ) const;
  123. /// Replace all hkClass packfile pointers with hkClass
  124. /// pointers from provided registry.
  125. void useClassesFromRegistry(const hkClassNameRegistry& registry) const;
  126. private:
  127. class BinaryPackfileData : public hkPackfileData
  128. {
  129. public:
  130. BinaryPackfileData() {}
  131. void freeSection(void* p);
  132. void untrackAndDestructObject( void* o );
  133. };
  134. // Our allocations
  135. BinaryPackfileData* m_packfileData;
  136. // The overall header or null if not read yet.
  137. hkPackfileHeader* m_header;
  138. // Array of section headers. See m_header->m_numSections.
  139. hkPackfileSectionHeader* m_sections;
  140. // Pointers to sectiondata.
  141. hkInplaceArray<void*,16> m_sectionData;
  142. // Offset of packfile from start of stream.
  143. int m_streamOffset;
  144. // Lazily create this array from index.
  145. mutable hkArray<hkVariant>* m_loadedObjects;
  146. // Lazily create the tracker if needed.
  147. mutable hkBinaryPackfileUpdateTracker* m_tracker;
  148. //
  149. mutable hkArray<hkClass*> m_classes;
  150. };
  151. #endif // HK_BINARY_PACKFILE_READER_H
  152. /*
  153. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  154. * Confidential Information of Havok.  (C) Copyright 1999-2009
  155. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  156. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  157. * rights, and intellectual property rights in the Havok software remain in
  158. * Havok and/or its suppliers.
  159. * Use of this software for evaluation purposes is subject to and indicates
  160. * acceptance of the End User licence Agreement for this product. A copy of
  161. * the license is included with this software and is also available at www.havok.com/tryhavok.
  162. */