BsTechnique.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsIReflectable.h"
  6. #include "BsCoreObject.h"
  7. namespace BansheeEngine
  8. {
  9. /** @addtogroup Implementation
  10. * @{
  11. */
  12. /**
  13. * Technique represents a specific implementation of a shader. Contains a number of passes that will be executed when
  14. * rendering objects using this technique.
  15. *
  16. * @note
  17. * Normally you want to have a separate technique for every render system and renderer your application supports.
  18. * For example, if you are supporting DirectX11 and OpenGL you will want to have two techniques, one using HLSL based
  19. * GPU programs, other using GLSL. Those techniques should try to mirror each others end results.
  20. */
  21. class BS_CORE_EXPORT TechniqueBase
  22. {
  23. public:
  24. TechniqueBase(const StringID& renderAPI, const StringID& renderer);
  25. virtual ~TechniqueBase() { }
  26. /** Checks if this technique is supported based on current render and other systems. */
  27. bool isSupported() const;
  28. /** Checks if the technique has the specified tag. */
  29. bool hasTag(const StringID& tag);
  30. protected:
  31. StringID mRenderAPI;
  32. StringID mRenderer;
  33. };
  34. template<bool Core> struct TPassType { };
  35. template<> struct TPassType < false > { typedef Pass Type; };
  36. template<> struct TPassType < true > { typedef PassCore Type; };
  37. template<bool Core> struct TTechniqueType {};
  38. template<> struct TTechniqueType < false > { typedef Technique Type; };
  39. template<> struct TTechniqueType < true > { typedef TechniqueCore Type; };
  40. /**
  41. * @copydoc TechniqueBase
  42. *
  43. * @note Templated version that is used for implementing both sim and core versions of Technique.
  44. */
  45. template<bool Core>
  46. class BS_CORE_EXPORT TTechnique : public TechniqueBase
  47. {
  48. public:
  49. typedef typename TPassType<Core>::Type PassType;
  50. TTechnique();
  51. TTechnique(const StringID& renderAPI, const StringID& renderer, const Vector<SPtr<PassType>>& passes);
  52. virtual ~TTechnique() { }
  53. /** Returns a pass with the specified index. */
  54. SPtr<PassType> getPass(UINT32 idx) const;
  55. /** Returns total number of passes. */
  56. UINT32 getNumPasses() const { return (UINT32)mPasses.size(); }
  57. protected:
  58. Vector<SPtr<PassType>> mPasses;
  59. };
  60. /** @} */
  61. /** @addtogroup Material-Internal
  62. * @{
  63. */
  64. /**
  65. * @copydoc TechniqueBase
  66. *
  67. * @note Core thread.
  68. */
  69. class BS_CORE_EXPORT TechniqueCore : public CoreObjectCore, public TTechnique<true>
  70. {
  71. public:
  72. TechniqueCore(const StringID& renderAPI, const StringID& renderer, const Vector<SPtr<PassCore>>& passes);
  73. /** Creates a new technique. */
  74. static SPtr<TechniqueCore> create(const StringID& renderAPI, const StringID& renderer, const Vector<SPtr<PassCore>>& passes);
  75. };
  76. /** @} */
  77. /** @addtogroup Material
  78. * @{
  79. */
  80. /**
  81. * @copydoc TechniqueBase
  82. *
  83. * @note Sim thread.
  84. */
  85. class BS_CORE_EXPORT Technique : public IReflectable, public CoreObject, public TTechnique<false>
  86. {
  87. public:
  88. Technique(const StringID& renderAPI, const StringID& renderer, const Vector<SPtr<Pass>>& passes);
  89. /** Retrieves an implementation of a technique usable only from the core thread. */
  90. SPtr<TechniqueCore> getCore() const;
  91. /** Creates a new technique. */
  92. static SPtr<Technique> create(const StringID& renderAPI, const StringID& renderer, const Vector<SPtr<Pass>>& passes);
  93. protected:
  94. /** @copydoc CoreObject::createCore */
  95. SPtr<CoreObjectCore> createCore() const override;
  96. /** @copydoc CoreObject::getCoreDependencies */
  97. void getCoreDependencies(Vector<CoreObject*>& dependencies) override;
  98. /** Creates a new technique but doesn't initialize it. */
  99. static SPtr<Technique> createEmpty();
  100. private:
  101. /************************************************************************/
  102. /* RTTI */
  103. /************************************************************************/
  104. /** Serialization only constructor. */
  105. Technique();
  106. public:
  107. friend class TechniqueRTTI;
  108. static RTTITypeBase* getRTTIStatic();
  109. virtual RTTITypeBase* getRTTI() const override;
  110. };
  111. /** @} */
  112. }