1 /*!
2 	@file
3 	@author		George Evmenov
4 	@date		07/2009
5 */
6 
7 #ifndef MYGUI_OPENGL3_RENDER_MANAGER_H_
8 #define MYGUI_OPENGL3_RENDER_MANAGER_H_
9 
10 #include "MyGUI_Prerequest.h"
11 #include "MyGUI_RenderFormat.h"
12 #include "MyGUI_IVertexBuffer.h"
13 #include "MyGUI_RenderManager.h"
14 #include "MyGUI_OpenGL3ImageLoader.h"
15 
16 namespace MyGUI
17 {
18 
19 	class OpenGL3RenderManager :
20 		public RenderManager,
21 		public IRenderTarget
22 	{
23 	public:
24 		OpenGL3RenderManager();
25 
26 		void initialise(OpenGL3ImageLoader* _loader = nullptr);
27 		void shutdown();
28 
29 		static OpenGL3RenderManager& getInstance();
30 		static OpenGL3RenderManager* getInstancePtr();
31 
32 		/** @see RenderManager::getViewSize */
33 		virtual const IntSize& getViewSize() const;
34 
35 		/** @see RenderManager::getVertexFormat */
36 		virtual VertexColourType getVertexFormat();
37 
38 		/** @see RenderManager::isFormatSupported */
39 		virtual bool isFormatSupported(PixelFormat _format, TextureUsage _usage);
40 
41 		/** @see RenderManager::createVertexBuffer */
42 		virtual IVertexBuffer* createVertexBuffer();
43 		/** @see RenderManager::destroyVertexBuffer */
44 		virtual void destroyVertexBuffer(IVertexBuffer* _buffer);
45 
46 		/** @see RenderManager::createTexture */
47 		virtual ITexture* createTexture(const std::string& _name);
48 		/** @see RenderManager::destroyTexture */
49 		virtual void destroyTexture(ITexture* _texture);
50 		/** @see RenderManager::getTexture */
51 		virtual ITexture* getTexture(const std::string& _name);
52 
53 
54 		/** @see IRenderTarget::begin */
55 		virtual void begin();
56 		/** @see IRenderTarget::end */
57 		virtual void end();
58 		/** @see IRenderTarget::doRender */
59 		virtual void doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count);
60 		/** @see IRenderTarget::getInfo */
61 		virtual const RenderTargetInfo& getInfo();
62 
63 		/** @see RenderManager::setViewSize */
64 		void setViewSize(int _width, int _height) override;
65 
66 		/* for use with RTT, flips Y coordinate when rendering */
67 		void doRenderRtt(IVertexBuffer* _buffer, ITexture* _texture, size_t _count);
68 
69 	/*internal:*/
70 		void drawOneFrame();
71 		bool isPixelBufferObjectSupported() const;
72     unsigned int createShaderProgram(void);
73 
74 	private:
75 		void destroyAllResources();
76 
77 	private:
78 		IntSize mViewSize;
79 		bool mUpdate;
80 		VertexColourType mVertexFormat;
81 		RenderTargetInfo mInfo;
82     unsigned int mProgramID;
83     unsigned int mReferenceCount; // for nested rendering
84     int mYScaleUniformLocation;
85 
86 		typedef std::map<std::string, ITexture*> MapTexture;
87 		MapTexture mTextures;
88 		OpenGL3ImageLoader* mImageLoader;
89 		bool mPboIsSupported;
90 
91 		bool mIsInitialise;
92   };
93 
94 } // namespace MyGUI
95 
96 #endif // MYGUI_OPENGL3_RENDER_MANAGER_H_
97