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

其他游戏

开发平台:

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_SERIALIZE_PACKFILEOBJECTUPDATETRACKER_H
  9. #define HK_SERIALIZE_PACKFILEOBJECTUPDATETRACKER_H
  10. #include <Common/Serialize/Version/hkObjectUpdateTracker.h>
  11. #include <Common/Serialize/Util/hkPointerMultiMap.h>
  12. #include <Common/Serialize/Util/hkSerializeLog.h>
  13. #include <Common/Serialize/Packfile/hkPackfileData.h>
  14. /// A tracker which understands the layout of packfiles.
  15. class hkPackfileObjectUpdateTracker : public hkObjectUpdateTracker
  16. {
  17. public:
  18. hkPackfileObjectUpdateTracker( hkPackfileData* data )
  19. : m_packfileData(data), m_topLevelObject(HK_NULL)
  20. {
  21. m_packfileData->addReference();
  22. }
  23. ~hkPackfileObjectUpdateTracker()
  24. {
  25. m_packfileData->removeReference();
  26. }
  27. void setTopLevelObject( void* topLevel, const char* topClass )
  28. {
  29. HK_ASSERT(0x53409994, topLevel!= HK_NULL);
  30. HK_ASSERT(0x53409995, topClass != HK_NULL);
  31. HK_ASSERT(0x53409996, m_topLevelObject == HK_NULL);
  32. m_topLevelObject = topLevel;
  33. m_finish.insert( topLevel, topClass); //like addFinish(topLevel, topClass), without assert
  34. objectPointedBy(m_topLevelObject, &m_topLevelObject);
  35. }
  36. const char* getTopLevelClassName()
  37. {
  38. HK_ASSERT(0x22151a55, m_topLevelObject != HK_NULL );
  39. return m_finish.getWithDefault( m_topLevelObject, HK_NULL );
  40. }
  41. //
  42. // Memory
  43. //
  44. virtual void addAllocation(void* p)
  45. {
  46. m_packfileData->addAllocation(p);
  47. }
  48. virtual void addChunk(void* p, int n, HK_MEMORY_CLASS c)
  49. {
  50. m_packfileData->addChunk(p,n,c);
  51. }
  52. //
  53. // Pointers
  54. //
  55. void objectPointedBy( void* newObject, void* fromWhere )
  56. {
  57. HK_SERIALIZE_LOG(("TrackObjectPointedBy(obj=0x%p,loc=0x%p)n", newObject, fromWhere));
  58. void* oldObject = *static_cast<void**>(fromWhere);
  59. if (oldObject)
  60. {
  61. for( int i = m_pointers.getFirstIndex(oldObject);
  62. i != -1;
  63. i = m_pointers.getNextIndex(i) )
  64. {
  65. if( m_pointers.getValue(i) == fromWhere )
  66. {
  67. if( newObject == oldObject )
  68. {
  69. return;
  70. }
  71. m_pointers.removeByIndex(oldObject, i);
  72. break;
  73. }
  74. }
  75. }
  76. if( newObject )
  77. {
  78. m_pointers.insert( newObject, fromWhere );
  79. }
  80. *static_cast<void**>(fromWhere) = newObject;
  81. }
  82. virtual void replaceObject( void* oldObject, void* newObject, const hkClass* newClass )
  83. {
  84. HK_SERIALIZE_LOG(("TrackReplaceObject(oldObj=0x%p,newObj=0x%p,klassname="%s")n", oldObject, newObject, newClass ? newClass->getName() : ""));
  85. // replace pointers to old object with pointers to new one
  86. int index = m_pointers.getFirstIndex(oldObject);
  87. if( newObject )
  88. {
  89. m_pointers.m_indexMap.insert( newObject, index );
  90. }
  91. while( index != -1 )
  92. {
  93. void* ptrOldObject = m_pointers.getValue(index);
  94. HK_ASSERT(0x7fe24edd, *static_cast<void**>(ptrOldObject) == oldObject );
  95. *static_cast<void**>(ptrOldObject) = newObject;
  96. index = m_pointers.getNextIndex(index);
  97. }
  98. // keep exports valid
  99. for( int i = 0; i < m_packfileData->m_exports.getSize(); ++i )
  100. {
  101. if( m_packfileData->m_exports[i].data == oldObject)
  102. {
  103. m_packfileData->m_exports[i].data = newObject;
  104. }
  105. }
  106. // replace object in the finish list
  107. removeFinish(oldObject);
  108. if( newClass )
  109. {
  110. addFinish(newObject, newClass->getName());
  111. }
  112. }
  113. //
  114. // Finish
  115. //
  116. void addFinish( void* newObject, const char* className )
  117. {
  118. HK_ASSERT( 0x567037f2, m_finish.hasKey(newObject) == false );
  119. m_finish.insert( newObject, className );
  120. }
  121. void removeFinish( void* oldObject )
  122. {
  123. m_finish.remove(oldObject);
  124. }
  125. hkPackfileData* m_packfileData;
  126. hkPointerMultiMap<void*, void*> m_pointers;
  127. hkPointerMap<void*, const char*> m_finish;
  128. void* m_topLevelObject;
  129. };
  130. #endif //HK_SERIALIZE_PACKFILEOBJECTUPDATETRACKER_H
  131. /*
  132. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  133. * Confidential Information of Havok.  (C) Copyright 1999-2009
  134. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  135. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  136. * rights, and intellectual property rights in the Havok software remain in
  137. * Havok and/or its suppliers.
  138. * Use of this software for evaluation purposes is subject to and indicates
  139. * acceptance of the End User licence Agreement for this product. A copy of
  140. * the license is included with this software and is also available at www.havok.com/tryhavok.
  141. */