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

其他游戏

开发平台:

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 INC_COMMON_RESOURCE_HANDLE_H
  9. #define INC_COMMON_RESOURCE_HANDLE_H
  10. #include <Common/Base/Reflection/hkClass.h>
  11. #include <Common/Base/Reflection/hkClassMemberAccessor.h>
  12. #include <Common/Base/Container/StringMap/hkStringMap.h>
  13. extern const hkClass hkMemoryResourceHandleClass;
  14. extern const hkClass hkMemoryResourceContainerClass;
  15. class hkResourceContainer;
  16. class hkResourceMap;
  17. class hkResourceBase: public hkReferencedObject
  18. {
  19. public:
  20. HK_DECLARE_REFLECTION();
  21. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_EXPORT );
  22. //
  23. hkResourceBase(): hkReferencedObject(){;}
  24. // serializing constructor
  25. hkResourceBase(hkFinishLoadedObjectFlag flag): hkReferencedObject(flag) {}
  26. enum Type
  27. {
  28. TYPE_RESOURCE,
  29. TYPE_CONTAINER
  30. };
  31. /// return the type of this object
  32. virtual Type getType() const = 0;
  33. /// A buffer to store temporary names
  34. typedef char NameBuffer[32];
  35. /// Returns the name of the resource.
  36. /// If the name has to be created on the fly the supplied buffer will be used.
  37. virtual const char* getName(NameBuffer buffer) const = 0;
  38. };
  39. /// A virtual interface to a resource which is owned by the hkResourceContainer
  40. class hkResourceHandle: public hkResourceBase
  41. {
  42. public:
  43. HK_DECLARE_REFLECTION();
  44. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_EXPORT );
  45. virtual Type getType() const { return TYPE_RESOURCE; }
  46. /// An external link
  47. struct Link
  48. {
  49. Link() {}
  50. Link(void* object, const hkClassMember* member) : m_memberAccessor(object, member) {}
  51. const char* m_memberName;
  52. const char* m_externalId;
  53. hkClassMemberAccessor m_memberAccessor;
  54. };
  55. /// Set the name of the resource.
  56. /// A copy of the name will be stored.
  57. virtual void setName(const char* name) = 0;
  58. /// Returns a pointer to the object.
  59. virtual void* getObject() const = 0;
  60. /// Returns a pointer to the class.
  61. virtual const hkClass* getClass() const = 0;
  62. /// Set the object and class. If the object is of type hkReferencedObject, a reference will be added.
  63. virtual void setObject(void* object, const hkClass* klass) = 0;
  64. /// Adds a new external link, specified by the 'name' of the referencing object as well as the memberName.
  65. /// If the object uses nested structures, the memberName will look like:   xxx.yyy.zzz
  66. virtual void addExternalLink(const char* memberName, const char* m_externalId) = 0;
  67. /// removes an internal link
  68. virtual void removeExternalLink( const char* memberName ) = 0;
  69. /// Returns a list with all unresolved external links.
  70. virtual void getExternalLinks(hkArray<Link>& linksOut) = 0;
  71. /// Clears the list with all external links.
  72. virtual void clearExternalLinks() = 0;
  73. /// tryToResolveLinks
  74. virtual void tryToResolveLinks(hkResourceMap& map);
  75. protected:
  76. hkResourceHandle(hkFinishLoadedObjectFlag flag): hkResourceBase(flag) {}
  77. hkResourceHandle() {}
  78. virtual ~hkResourceHandle() {}
  79. };
  80. /// The owner of a resource handle
  81. class hkResourceContainer: public hkResourceBase
  82. {
  83. public:
  84. HK_DECLARE_REFLECTION();
  85. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_EXPORT );
  86. // hkResourceBase implementation
  87. virtual Type getType() const { return TYPE_RESOURCE; }
  88. /// Create an owned resource 
  89. virtual hkResourceHandle* createResource(const char* name, void* object, const hkClass* klass) = 0;
  90. /// Destroys a resource
  91. virtual void destroyResource( hkResourceHandle* handle ) = 0;
  92. /// Get number of resources
  93. virtual int getNumResources() = 0;
  94. /// Tries to find a named resource with given hkClass.
  95. /// It returns the first object after a prevObject, with a resourceName.
  96. ///   - If a prevObject is null then the search begins from the start of the container.
  97. ///   - If a resourceName is null than all objects will match and the method will return the first match.
  98. virtual hkResourceHandle* findResourceByName( const char* resourceName, const hkClass* klass = HK_NULL, const hkResourceHandle* prevObject = HK_NULL ) const = 0;
  99. /// Simple helper function to find a resource which is identified by a path (using '/' to split the path).
  100. //hkResourceHandle* findResourceRecursively( const char* resourcePath);
  101. /// Simple helper function to get all terminal resources
  102. void findAllResourceRecursively( hkArray<hkResourceHandle*>& resourcesOut );
  103. /// Simple helper function to get all terminal resources
  104. void findAllContainersRecursively( hkArray<hkResourceContainer*>& resourcesOut );
  105. void getPath( hkString& pathOut );
  106. /// Get my parent container if any
  107. virtual hkResourceContainer* getParent() = 0;
  108. /// Create child container, if the container already exists, simply return the existing one.
  109. virtual hkResourceContainer* createContainer(const char* path) = 0;
  110. /// Destroys a child container recursively
  111. virtual void destroyContainer( hkResourceContainer* container ) = 0;
  112. /// Get number of child containers
  113. virtual int getNumContainers() = 0;
  114. /// Tries to find a named container.
  115. /// It returns the first object after a prevContainer, with a containerName.
  116. ///   - If a prevContainer is null then the search begins from the start of the child containers.
  117. ///   - If a containerName is null then all objects will match and the method will return the first match.
  118. virtual hkResourceContainer* findContainerByName( const char* containerName, const hkResourceContainer* prevContainer = HK_NULL ) const = 0;
  119. /// move this container to a new parent
  120. virtual hkResult parentTo( hkResourceContainer* newParent ) = 0;
  121. //
  122. // Simple helper functions
  123. //
  124. /// helper function which tries to resolve external links
  125. virtual void tryToResolveLinks( hkResourceMap& resourceMap );
  126. template<typename T>
  127. T* findResource( const char* name, const hkClass* klass )
  128. {
  129. hkResourceHandle* handle = findResourceByName( name, klass );
  130. if (!handle)
  131. {
  132. return HK_NULL;
  133. }
  134. return reinterpret_cast<T*>(handle->getObject());
  135. }
  136. protected: 
  137. // Empty constructor
  138. hkResourceContainer(){}
  139. // Serializing constructor
  140. hkResourceContainer(hkFinishLoadedObjectFlag flag) : hkResourceBase(flag) {}
  141. };
  142. /// Simple class which allows for fast searching of object/classes
  143. class hkResourceMap
  144. {
  145. public:
  146. /// Tries to find a resource with matching name and hkClass
  147. /// to the first object after prevObject, with a name corresponding to 'objectName'.
  148. ///   - If prevObject is null then the search begins from the start of the container.
  149. ///   - If objectName is null than all objects will match.
  150. ///   = a klass is only used for extra debugging checks, it cannot be used for searching for a type!
  151. virtual void* findObjectByName( const char* objectName, const hkClass** klassOut = HK_NULL ) const = 0;
  152. protected:
  153. virtual ~hkResourceMap(){}
  154. hkResourceMap(){}
  155. };
  156. /// A simple Havok serializable version of a resource 
  157. class hkMemoryResourceHandle: public hkResourceHandle
  158. {
  159. //+vtable(true)
  160. public:
  161. HK_DECLARE_REFLECTION();
  162. /// Constructor
  163. hkMemoryResourceHandle();
  164. // Serializing Constructor
  165. hkMemoryResourceHandle( hkFinishLoadedObjectFlag flag);
  166. /// Destructor
  167. virtual ~hkMemoryResourceHandle();
  168. /// This structure stores information about an external link.
  169. struct ExternalLink 
  170. {
  171. public:
  172. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_EXPORT, hkMemoryResourceHandle::ExternalLink );
  173. HK_DECLARE_REFLECTION();
  174. /// The member name that stores the link to the external object.
  175. /// If the name will look like xxx.yyy.zzz
  176. const char* m_memberName;
  177. /// The 'name' of the linked object.
  178. const char* m_externalId;
  179. /// True if m_externalId has been allocated by the handle itself and has to be deallocated when clearing this link.
  180. hkBool m_externalIdIsAllocated;
  181. /// True if m_memberName has been allocated by the handle itself and has to be deallocated when clearing this link.
  182. hkBool m_memberNameIsAllocated;
  183. };
  184. const char* getName(NameBuffer buffer) const;
  185. /// Set the name of the resource.
  186. /// A copy of the name will be stored.
  187. void setName(const char* name);
  188. /// Returns a pointer to the object.
  189. void* getObject() const;
  190. /// Returns a pointer to the class.
  191. const hkClass* getClass() const;
  192. /// Set the object and class.
  193. void setObject(void* object, const hkClass* klass);
  194. void addExternalLink(const char* memberName, const char* m_externalId);
  195. /// removes an external link
  196. void removeExternalLink( const char* memberName );
  197. /// Returns a list with all unresolved external links.
  198. void getExternalLinks(hkArray<Link>& linksOut);
  199. /// Clears the list with all external links.
  200. void clearExternalLinks();
  201. protected:
  202. hkVariant   m_variant;
  203. // Set m_objectIsRerencedObject default to old behavior 
  204. hkBool m_objectIsRerencedObject; //+default(false) 
  205. hkBool      m_nameIsAllocated;
  206. const char* m_name;
  207. hkArray<struct hkMemoryResourceHandle::ExternalLink> m_references;
  208. };
  209. /// Simple Havok serializable version of a hkResourceContainer
  210. class hkMemoryResourceContainer : public hkResourceContainer
  211. {
  212. //+vtable(true)
  213. public:
  214. HK_DECLARE_REFLECTION();
  215. hkMemoryResourceContainer( const char* name = "");
  216. hkMemoryResourceContainer(hkFinishLoadedObjectFlag flag);
  217. virtual ~hkMemoryResourceContainer();
  218. const char* getName(NameBuffer buffer) const;
  219. hkResourceHandle* createResource(const char* name, void* object, const hkClass* klass);
  220. int getNumResources() { return m_resourceHandles.getSize(); }
  221. hkResourceHandle* findResourceByName( const char* objectName, const hkClass* klass = HK_NULL, const hkResourceHandle* prevObject = HK_NULL ) const;
  222. void destroyResource(hkResourceHandle* resourceHandle);
  223. virtual hkResourceContainer* getParent() { return m_parent; }
  224. virtual hkResourceContainer* createContainer(const char* name);
  225. virtual void destroyContainer( hkResourceContainer* container );
  226. virtual int getNumContainers();
  227. virtual hkResult parentTo( hkResourceContainer* newParent );
  228. virtual hkResourceContainer* findContainerByName( const char* containerName, const hkResourceContainer* prevContainer = HK_NULL ) const;
  229. protected:
  230. hkBool      m_nameIsAllocated;
  231. const char* m_name;
  232. hkMemoryResourceContainer* m_parent; //+serialized(false)
  233. hkArray<hkMemoryResourceHandle*> m_resourceHandles; 
  234. hkArray<hkMemoryResourceContainer*> m_children; 
  235. };
  236. /// A simple hash table to hkResourceHandles
  237. class hkContainerResourceMap: public hkResourceMap
  238. {
  239. public:
  240. hkContainerResourceMap( class hkResourceContainer* container );
  241. virtual void* findObjectByName( const char* objectName, const hkClass** klassOut = HK_NULL ) const;
  242. public:
  243. hkStringMap<hkResourceHandle*> m_resources;
  244. };
  245. #endif // INC_COMMON_RESOURCE_HANDLE_H
  246. /*
  247. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  248. * Confidential Information of Havok.  (C) Copyright 1999-2009
  249. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  250. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  251. * rights, and intellectual property rights in the Havok software remain in
  252. * Havok and/or its suppliers.
  253. * Use of this software for evaluation purposes is subject to and indicates
  254. * acceptance of the End User licence Agreement for this product. A copy of
  255. * the license is included with this software and is also available at www.havok.com/tryhavok.
  256. */