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

其他游戏

开发平台:

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_WRITER_H
  9. #define HK_PACKFILE_WRITER_H
  10. #include <Common/Base/Container/PointerMap/hkPointerMap.h>
  11. #include <Common/Base/Container/StringMap/hkStringMap.h>
  12. #include <Common/Serialize/Util/hkPointerMultiMap.h>
  13. #include <Common/Serialize/Util/hkStructureLayout.h>
  14. class hkClass;
  15. class hkClassEnum;
  16. class hkVtableClassRegistry;
  17. /// Write a reflected object and its references recursively.
  18. /// A packfile contains a single "contents" object and all objects
  19. /// pointed to from the contents object recursively. i.e. every object
  20. /// in the file is reachable from the contents object.
  21. /// The file is built in two passes. First all objects are traversed
  22. /// and a list of pending writes is created. You can intercept the
  23. /// object traversal with the AddObjectListener.
  24. /// When all object dependencies are resolved, the list is traversed
  25. /// again and the objects written.
  26. class hkPackfileWriter : public hkReferencedObject
  27. {
  28. public:
  29. /// Called when an object is about to be added to the pending writes.
  30. class AddObjectListener : public hkReferencedObject
  31. {
  32. public:
  33. typedef const void* ObjectPointer;
  34. typedef const hkClass* ClassPointer;
  35. /// Called when an object is about to be added.
  36. /// The implementation may modify objP, klassP
  37. /// to point to a different object/type if required.
  38. /// If opjP is set to NULL, the object is skipped.
  39. /// NOTE: if you change the object or class pointer, you
  40. /// must ensure that the object is valid until save() is
  41. /// called. Typically the listener holds a list these objects
  42. /// to be destroyed in its destructor.
  43. virtual void addObjectCallback( ObjectPointer& objP, ClassPointer& klassP ) = 0;
  44. };
  45. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE);
  46. hkPackfileWriter();
  47. ~hkPackfileWriter();
  48. /// Set the object "obj" as the contents of this file.
  49. /// When a pointer to a polymorphic type is encountered, the
  50. /// class registry is used to find the exact type. The registry
  51. /// may be null if there are no pointers to polymorphic types.
  52. /// If a type is encountered which is not in the registry, the
  53. /// pointer is saved as null and the object ignored.
  54. /// Packfile writers cannot be reused. Use a new packfile writer
  55. /// for each setContents call.
  56. virtual void setContentsWithRegistry(
  57. const void* object, const hkClass& klass,
  58. const hkVtableClassRegistry* registry,
  59. AddObjectListener* addListen=HK_NULL);
  60. /// Set the object "obj" as the contents of this file.
  61. /// Calls setContentsWithRegistry with the registry in hkBuiltinTypeRegistry.
  62. virtual void setContents(
  63. const void* object, const hkClass& klass,
  64. AddObjectListener* addListen=HK_NULL);
  65. /// Don't save "object", but generate an import instead.
  66. /// When "object" is referenced by this packfile but is created
  67. /// somewhere else, you can use this method to prevent the
  68. /// object being saved. At load time you can reconnect using
  69. /// the supplied id. See also hkPackfileData::getImportsExports()
  70. virtual void addImport( const void* object, const char* id );
  71. /// Make "object" visible outside this packfile.
  72. /// You can give objects identifiers which are accessible
  73. /// through hkPackfileData::getImportsExports().
  74. virtual void addExport( const void* object, const char* id );
  75. /// Options to fine tune writing.
  76. struct Options
  77. {
  78. Options()
  79. : m_userTag(0),
  80. m_writeMetaInfo(true),
  81. m_contentsVersion(HK_NULL)
  82. {
  83. }
  84. /// An optional tag for this file.
  85. /// You can use this tag to identify different types of file,
  86. /// examining only the file header.
  87. hkUint32 m_userTag;
  88. /// For binary writes. Defaults to the current host layout.
  89. hkStructureLayout m_layout;
  90. /// Whether or not to save the hkClass for each object.
  91. hkBool m_writeMetaInfo;
  92. /// Override the saved version string. Use with caution.
  93. const char* m_contentsVersion;
  94. private:
  95. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, hkPackfileWriter::Options );
  96. };
  97. /// Save the contents to the given stream with the given options.
  98. /// You may call save several times with different options after
  99. /// a single call to setContents.
  100. virtual hkResult save( hkStreamWriter* stream, const Options& options ) = 0;
  101. //
  102. // Section control
  103. //
  104. /// Section tags are short strings.
  105. typedef const char* SectionTag;
  106. /// The default section for normal object data.
  107. static SectionTag SECTION_TAG_DATA;
  108. /// The default section for hkClass instances.
  109. static SectionTag SECTION_TAG_TYPES;
  110. /// Add a section to the file.
  111. /// Sections are written in the order that they are
  112. /// added, so you can control the file layout with multiple
  113. /// calls to addSection.
  114. virtual void addSection(SectionTag sectionTag);
  115. /// If pointer is encountered, save it to section "sectionTag".
  116. /// See also setSectionForClass.
  117. virtual void setSectionForPointer( const void* ptr, SectionTag sectionTag );
  118. /// Save objects of type "k" to section "sectionTag".
  119. /// When choosing the section for an object, we first check for
  120. /// an explicit override (setSectionForPointer) then check for a
  121. /// match by type including parent types.
  122. virtual void setSectionForClass( const hkClass& k, SectionTag sectionTag );
  123. /// Write the current version into the given buffer.
  124. static void HK_CALL getCurrentVersion(char* buf, int bufLen);
  125. struct PendingWrite
  126. {
  127. const void* m_pointer; // data pointer.
  128. const hkClass* m_klass; // hkClass pointer or NULL for raw.
  129. const void* m_origPointer; // pointer before addObjectListener
  130. const hkClass* m_origClass; // class before addObjectListener
  131. int m_sectionIndex;
  132. int m_dataSize; // set for raw data only.
  133. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, hkPackfileWriter::PendingWrite );
  134. };
  135. protected:
  136. enum { INDEX_IGNORE = -1, INDEX_IMPORT = -2, INDEX_ERROR = -3 };
  137. hkUint32 findSectionFor( const void* obj, const hkClass& k, SectionTag tag );
  138. void addObject(          const void* obj, const hkClass& k, const hkVtableClassRegistry* classRegistry, AddObjectListener* addListener, SectionTag sectionTag);
  139. void addPendingWrite( const void* obj, const hkClass& k, const void* objo, const hkClass& ko, SectionTag sectionTag);
  140. int notDuplicateMetaData(const void* pointer, const hkClass* klass);
  141. hkUint32 sectionTagToIndex( SectionTag sectionTag );
  142. protected:
  143. hkArray<PendingWrite> m_pendingWrites;
  144. hkPointerMap<const void*, int> m_knownObjects; // address -> pending write index
  145. hkPointerMap<const void*, const char*> m_imports; // address -> symbol name
  146. hkPointerMap<const void*, const char*> m_exports; // address -> symbol name
  147. hkStringMap<const hkClass*> m_knownClasses; // name -> class pointer
  148. hkStringMap<const hkClassEnum*> m_knownEnums; // name -> enumpointer
  149. hkPointerMap<const void*, const void*> m_replacements; // original -> replacement
  150. hkArray<char*> m_knownSections;
  151. hkStringMap<int> m_sectionTagToIndex;
  152. hkArray<hkVariant> m_objectsWithUnregisteredClass;
  153. hkInt32 m_contentsPtrPWIndex; // index into the pending writes of the contents ptr
  154. hkInt32 m_contentsClassPWIndex;// index into the pending writes of the contents class
  155. int m_numDataInstances;
  156. int m_numClassInstances;
  157. hkPointerMap<const void*, hkUint32> m_sectionOverrideByPointer;
  158. hkStringMap<hkUint32> m_sectionOverrideByType;
  159. hkPointerMultiMap<const void*, int> m_pwIndexesFromReferencedPointer; // list of pending write indexes of pointers referenced by key, like a typological map
  160. };
  161. #endif // HK_PACKFILE_WRITER_H
  162. /*
  163. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  164. * Confidential Information of Havok.  (C) Copyright 1999-2009
  165. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  166. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  167. * rights, and intellectual property rights in the Havok software remain in
  168. * Havok and/or its suppliers.
  169. * Use of this software for evaluation purposes is subject to and indicates
  170. * acceptance of the End User licence Agreement for this product. A copy of
  171. * the license is included with this software and is also available at www.havok.com/tryhavok.
  172. */