1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		12/2009
5 */
6 
7 #include "MyGUI_OpenGLRTTexture.h"
8 #include "MyGUI_OpenGLRenderManager.h"
9 #include "MyGUI_OpenGLDiagnostic.h"
10 
11 #include "GL/glew.h"
12 
13 namespace MyGUI
14 {
15 
OpenGLRTTexture(unsigned int _texture)16 	OpenGLRTTexture::OpenGLRTTexture(unsigned int _texture) :
17 		mTextureID(_texture),
18 		mWidth(0),
19 		mHeight(0),
20 		mFBOID(0),
21 		mRBOID(0)
22 	{
23 		int miplevel = 0;
24 		glBindTexture(GL_TEXTURE_2D, mTextureID);
25 		glGetTexLevelParameteriv(GL_TEXTURE_2D, miplevel, GL_TEXTURE_WIDTH, &mWidth);
26 		glGetTexLevelParameteriv(GL_TEXTURE_2D, miplevel, GL_TEXTURE_HEIGHT, &mHeight);
27 		glBindTexture(GL_TEXTURE_2D, 0);
28 
29 		mRenderTargetInfo.maximumDepth = 1.0f;
30 		mRenderTargetInfo.hOffset = 0;
31 		mRenderTargetInfo.vOffset = 0;
32 		mRenderTargetInfo.aspectCoef = float(mHeight) / float(mWidth);
33 		mRenderTargetInfo.pixScaleX = 1.0f / float(mWidth);
34 		mRenderTargetInfo.pixScaleY = 1.0f / float(mHeight);
35 
36 		// create a framebuffer object, you need to delete them when program exits.
37 		glGenFramebuffersEXT(1, &mFBOID);
38 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBOID);
39 
40 		// create a renderbuffer object to store depth info
41 		// NOTE: A depth renderable image should be attached the FBO for depth test.
42 		// If we don't attach a depth renderable image to the FBO, then
43 		// the rendering output will be corrupted because of missing depth test.
44 		// If you also need stencil test for your rendering, then you must
45 		// attach additional image to the stencil attachement point, too.
46 		glGenRenderbuffersEXT(1, &mRBOID);
47 		glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mRBOID);
48 		glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, mWidth, mHeight);
49 		glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
50 
51 		// attach a texture to FBO color attachement point
52 		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTextureID, 0);
53 
54 		// attach a renderbuffer to depth attachment point
55 		glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mRBOID);
56 
57 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
58 	}
59 
~OpenGLRTTexture()60 	OpenGLRTTexture::~OpenGLRTTexture()
61 	{
62 		if (mFBOID != 0)
63 		{
64 			glDeleteFramebuffersEXT(1, &mFBOID);
65 			mFBOID = 0;
66 		}
67 		if (mRBOID != 0)
68 		{
69 			glDeleteRenderbuffersEXT(1, &mRBOID);
70 			mRBOID = 0;
71 		}
72 	}
73 
begin()74 	void OpenGLRTTexture::begin()
75 	{
76 		glPushAttrib(GL_VIEWPORT_BIT);
77 
78 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBOID);
79 
80 		glViewport(0, 0, mWidth, mHeight);
81 
82 		OpenGLRenderManager::getInstance().begin();
83 		glOrtho(-1, 1, 1, -1, -1, 1);
84 		glClear(GL_COLOR_BUFFER_BIT/* | GL_DEPTH_BUFFER_BIT*/);
85 	}
86 
end()87 	void OpenGLRTTexture::end()
88 	{
89 		OpenGLRenderManager::getInstance().end();
90 
91 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // unbind
92 
93 		glPopAttrib();
94 	}
95 
doRender(IVertexBuffer * _buffer,ITexture * _texture,size_t _count)96 	void OpenGLRTTexture::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count)
97 	{
98 		OpenGLRenderManager::getInstance().doRender(_buffer, _texture, _count);
99 	}
100 
101 } // namespace MyGUI
102