[3255] | 1 | #pragma once
|
---|
| 2 |
|
---|
| 3 | #include "pbuffer.h"
|
---|
| 4 |
|
---|
| 5 | // simple wrapper to encapsulate a pbuffer using render-to-texture and its associated texture object
|
---|
| 6 | // v1.1 - updated to work with multiple draw buffers
|
---|
| 7 |
|
---|
| 8 | class RenderTexture {
|
---|
| 9 | public:
|
---|
| 10 | RenderTexture(char *strMode, int iWidth, int iHeight, GLenum target) : m_target(target)
|
---|
| 11 | {
|
---|
| 12 | m_pbuffer = new PBuffer(strMode);
|
---|
| 13 | m_pbuffer->Initialize(iWidth, iHeight, false, true);
|
---|
| 14 |
|
---|
| 15 | for(int i=0; i<max_buffers; i++) {
|
---|
| 16 | m_tex[i] = 0;
|
---|
| 17 | }
|
---|
| 18 | };
|
---|
| 19 |
|
---|
| 20 | ~RenderTexture()
|
---|
| 21 | {
|
---|
| 22 | delete m_pbuffer;
|
---|
| 23 | for(int i=0; i<max_buffers; i++) {
|
---|
| 24 | if (m_tex[i]) {
|
---|
| 25 | glDeleteTextures(1, &m_tex[i]);
|
---|
| 26 | }
|
---|
| 27 | }
|
---|
| 28 | }
|
---|
| 29 |
|
---|
| 30 | void Activate() { m_pbuffer->Activate(); }
|
---|
| 31 | void Deactivate() { m_pbuffer->Deactivate(); }
|
---|
| 32 |
|
---|
| 33 | void Bind(int iBuffer=WGL_FRONT_LEFT_ARB)
|
---|
| 34 | {
|
---|
| 35 | int tex_no = iBuffer - WGL_FRONT_LEFT_ARB;
|
---|
| 36 | if (m_tex[tex_no] == 0) {
|
---|
| 37 | // lazily allocate texture objects on demand
|
---|
| 38 | CreateTexture(m_tex[tex_no]);
|
---|
| 39 | }
|
---|
| 40 | glBindTexture(m_target, m_tex[tex_no]);
|
---|
| 41 | m_pbuffer->Bind(iBuffer);
|
---|
| 42 | }
|
---|
| 43 |
|
---|
| 44 | void Release(int iBuffer=WGL_FRONT_LEFT_ARB) {
|
---|
| 45 | glBindTexture(m_target, m_tex[iBuffer - WGL_FRONT_LEFT_ARB]);
|
---|
| 46 | m_pbuffer->Release(iBuffer);
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | GLuint GetTextureHandler(int iBuffer=WGL_FRONT_LEFT_ARB){return m_tex[iBuffer - WGL_FRONT_LEFT_ARB];}
|
---|
| 50 |
|
---|
| 51 | inline int GetWidth() { return m_pbuffer->GetWidth(); }
|
---|
| 52 | inline int GetHeight() { return m_pbuffer->GetHeight(); }
|
---|
| 53 |
|
---|
| 54 | private:
|
---|
| 55 | void CreateTexture(GLuint &tex)
|
---|
| 56 | {
|
---|
| 57 | glGenTextures(1, &tex);
|
---|
| 58 | glBindTexture(m_target, tex);
|
---|
| 59 | glTexParameteri(m_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
---|
| 60 | glTexParameteri(m_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
---|
| 61 | glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
---|
| 62 | glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | const static int max_buffers = 14; // WGL_FRONT_LEFT_ARB - WGL_AUX9_ARB
|
---|
| 66 | PBuffer *m_pbuffer;
|
---|
| 67 | GLuint m_tex[max_buffers]; // texture for each buffer
|
---|
| 68 | GLenum m_target;
|
---|
| 69 | };
|
---|