#include <GPUCVTexture/TextureRenderBuffer.h>
#include <GPUCVTexture/DataDsc_GLTex.h>
#if _GPUCV_DEBUG_MEMORY_LEAK
#include "SugoiTools/debug_new.h"
#endif
#define BUFFER_OFFSET(i) ((char *)NULL + (i)) //for PBO
//#define _RENDER_BUFFER_DEBUG_VERBOSE
#ifdef _RENDER_BUFFER_DEBUG_VERBOSE
#define __Fct_RB_START(FctName){\
printf("->%s Start\n", FctName);\
}
#define __Fct_RB_STOP(FctName){\
printf("->%s Stop\n", FctName);\
}
#else
#define __Fct_RB_START(FctName)
#define __Fct_RB_STOP(FctName)
#endif
TextureRenderBuffer * TextureRenderBuffer::MainRenderer = NULL;
//=================================================
TextureRenderBuffer::TextureRenderBuffer(bool verbose/*=false*/)
:m_textID(NULL)
,m_textureGrp(NULL)
{
}
//=================================================
TextureRenderBuffer::~TextureRenderBuffer()
{
}
//=================================================
/*virtual*/
TextureRenderBuffer::RENDER_OBJ_TYPE
TextureRenderBuffer::GetType()
{return m_type;}
//=================================================
void TextureRenderBuffer::SetValues(DataDsc_GLTex * _tex)
{
if(_tex)
SetValues(_tex, _tex->_GetWidth(), _tex->_GetHeight());
else
SetValues(NULL, 0, 0);
}
//=================================================
void TextureRenderBuffer::SetValues(DataDsc_GLTex * _tex,int _width, int _height)
{
m_textID =_tex;
if(_tex)
{
m_width = _width;
m_height = _height;
//DataDsc_GLTex * GLtex = _tex->GetDataDsc<DataDsc_GLTex>();
SG_Assert(MainGPU()->m_glExtension.CheckAttachmentFormat(_tex->_GetInternalPixelFormat(), _tex->_GetColorAttachment()),
"Color attachment mismatch with texture internal format");
}
else
{
m_width = 0;
m_height = 0;
}
}
//=================================================
/*virtual*/
void TextureRenderBuffer::GetResult(DataDsc_GLTex * _tex)
{
SetValues(_tex);
GetResult();
}
//=================================================
/*virtual*/
bool TextureRenderBuffer::InitRenderBuff()
{//nothing to to...
return true;
}
//=================================================
/*virtual */
void TextureRenderBuffer::SetContext (DataDsc_GLTex * _tex)
{
SG_Assert(_tex, "No DataContainer");
SetContext(_tex, _tex->_GetWidth(), _tex->_GetHeight());
}
//=================================================
void TextureRenderBuffer::SetContext (DataDsc_GLTex * _tex, int _width, int _height)
{
SG_Assert(_tex, "No DataContainer");
SetValues(_tex, _width, _height);
}
//=================================================
/*virtual*/
int TextureRenderBuffer::SetContext(TextureGrp * _grp, int _width, int _height)
{
SG_Assert(0,"TextureRenderBuffer::SetContext() not supported yet by default TextureRenderBuffer.");
return 0;
}
//=================================================
/*virtual*/
void TextureRenderBuffer::UnSetContext ()
{
m_textID=NULL;
m_textureGrp=NULL;
SetValues(NULL);
}
//=================================================
/*virtual*/
void TextureRenderBuffer::Force(DataDsc_GLTex * _tex)
{
SG_Assert(_tex, "No DataContainer");
Force(_tex, _tex->_GetWidth(), _tex->_GetHeight());
}
//=================================================
void TextureRenderBuffer::Force(DataDsc_GLTex * _tex, int _width, int _height)
{
SG_Assert(_tex, "No DataContainer");
SetValues(_tex, _width, _height);
}
//=================================================
int TextureRenderBuffer::Force(TextureGrp * _grp)
{
SG_Assert(_grp, "No texture group");
DataDsc_GLTex * DDGLTex= _grp->operator [](0)->GetDataDsc<DataDsc_GLTex>();
Force(_grp, DDGLTex->_GetWidth(),DDGLTex->_GetHeight());
SG_Assert(0,"TextureRenderBuffer::Force() not supported yet by default TextureRenderBuffer.");
return 0;
}
//=================================================
int TextureRenderBuffer::Force(TextureGrp * _grp, int _width, int _height)
{
SG_Assert(0,"TextureRenderBuffer::Force() not supported yet by default TextureRenderBuffer.");
return 0;
}
//=================================================
/*virtual*/
void TextureRenderBuffer::UnForce(void)
{
m_textID=NULL;
m_textureGrp=NULL;
SetValues(0);
}
//=================================================
/*virtual*/
int TextureRenderBuffer::IsForced(void)
{
if (m_textID)
return true;
else
return false;
}
//=================================================
/*virtual*/
void TextureRenderBuffer::GetResult(void)
{
_GPUCV_GL_ERROR_TEST();
//DataDsc_GLTex * GLtex = m_textID->GetDataDsc<DataDsc_GLTex>();
glCopyTexImage2D(m_textID->_GetTexType(),
0,
m_textID->GetPixelFormat(),
0, 0,
m_textID->_GetWidth(),
m_textID->_GetHeight(),
0);
_GPUCV_GL_ERROR_TEST();
}
//=================================================
/*virtual*/
GPUCV_TEXT_TYPE TextureRenderBuffer::SelectInternalTexture(RENDER_INTERNAL_OBJ _InternTextID)
{
GPUCV_WARNING("TextureRenderBuffer::SelectInternalTexture()=> Fct not supported");
return NULL;
}
//=================================================
/*static*/
TextureRenderBuffer *
TextureRenderBuffer::GetMainRenderer()
{return MainRenderer;}
//=================================================
/*static*/
TextureRenderBuffer *
TextureRenderBuffer::SetMainRenderer(TextureRenderBuffer * _Renderer)
{return MainRenderer = _Renderer;}
//=================================================
void TextureRenderBuffer::PushAttribs()
{
getGLContext()->PushAttribs();
}
//=================================================
void TextureRenderBuffer::PopAttribs()
{
getGLContext()->PopAttribs();
}
//=================================================
bool TextureRenderBuffer::IsTextureBinded(DataDsc_GLTex* _tex)
{
if(m_textID)
if(_tex == m_textID)
return true;
if(m_textureGrp)
if(m_textureGrp->IsTextureInGroup(_tex->GetParent()))
return true;
return false;
}
//=================================================
#if _GPUCV_DEBUG_MEMORY_LEAK
#include "SugoiTools/debug_new_off.h"
#endif
|