Common.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <anki/util/Allocator.h>
  7. #include <anki/util/DArray.h>
  8. #include <anki/util/String.h>
  9. #include <anki/util/Ptr.h>
  10. #include <anki/gr/Enums.h>
  11. namespace anki
  12. {
  13. // Forward
  14. class GrManager;
  15. class ResourceManager;
  16. class ResourceFilesystem;
  17. template<typename Type>
  18. class ResourcePointer;
  19. /// @addtogroup resource
  20. /// @{
  21. /// @name Constants
  22. /// @{
  23. const U MAX_LODS = 3;
  24. const U MAX_INSTANCES = 64;
  25. /// The number of instance groups. Eg First group is 1 instance, 2nd group 2
  26. /// instances, 3rd is 4 instances. The expression is:
  27. /// @code log2(MAX_INSTANCES) + 1 @endcode but since Clang doesn't like log2 in
  28. /// constant expressions use an alternative way.
  29. const U MAX_INSTANCE_GROUPS = __builtin_popcount(MAX_INSTANCES - 1) + 1;
  30. /// @}
  31. /// Deleter for ResourcePtr.
  32. template<typename T>
  33. class ResourcePtrDeleter
  34. {
  35. public:
  36. void operator()(T* ptr)
  37. {
  38. ptr->getManager().unregisterResource(ptr);
  39. auto alloc = ptr->getAllocator();
  40. alloc.deleteInstance(ptr);
  41. }
  42. };
  43. /// Smart pointer for resources.
  44. template<typename T>
  45. using ResourcePtr = IntrusivePtr<T, ResourcePtrDeleter<T>>;
  46. // NOTE: Add resources in 3 places
  47. #define ANKI_FORWARD(rsrc_, name_) \
  48. class rsrc_; \
  49. using name_ = ResourcePtr<rsrc_>;
  50. ANKI_FORWARD(Animation, AnimationResourcePtr)
  51. ANKI_FORWARD(TextureResource, TextureResourcePtr)
  52. ANKI_FORWARD(ShaderResource, ShaderResourcePtr)
  53. ANKI_FORWARD(Material, MaterialResourcePtr)
  54. ANKI_FORWARD(Mesh, MeshResourcePtr)
  55. ANKI_FORWARD(Skeleton, SkeletonResourcePtr)
  56. ANKI_FORWARD(ParticleEmitterResource, ParticleEmitterResourcePtr)
  57. ANKI_FORWARD(Model, ModelResourcePtr)
  58. ANKI_FORWARD(Script, ScriptResourcePtr)
  59. ANKI_FORWARD(DummyRsrc, DummyResourcePtr)
  60. ANKI_FORWARD(CollisionResource, CollisionResourcePtr)
  61. ANKI_FORWARD(GenericResource, GenericResourcePtr)
  62. #undef ANKI_FORWARD
  63. template<typename T>
  64. using ResourceAllocator = HeapAllocator<T>;
  65. template<typename T>
  66. using TempResourceAllocator = StackAllocator<T>;
  67. /// An alias that denotes a ResourceFilesystem path.
  68. using ResourceFilename = CString;
  69. /// Given a shader type return the appropriate file extension.
  70. ANKI_USE_RESULT const CString& shaderTypeToFileExtension(ShaderType type);
  71. /// Given a filename return the shader type.
  72. ANKI_USE_RESULT Error fileExtensionToShaderType(
  73. const CString& filename, ShaderType& type);
  74. /// @}
  75. } // end namespace anki