OpenSceneGraph/examples/osgpbuffer/RenderToTextureStage.cpp
2003-07-15 07:53:25 +00:00

81 lines
2.1 KiB
C++

#include <cassert>
//#include <osgDB/ReadFile>
#include "RenderToTextureStage.h"
//using namespace osg;
//using namespace osgUtil;
// register a RenderToTextureStage prototype with the RenderBin prototype list.
//RegisterRenderBinProxy<RenderToTextureStage> s_registerRenderToTextureStageProxy;
MyRenderToTextureStage::MyRenderToTextureStage()
{
_pbuffer = 0L;
}
MyRenderToTextureStage::~MyRenderToTextureStage()
{
}
void MyRenderToTextureStage::reset()
{
RenderStage::reset();
}
void MyRenderToTextureStage::draw(osg::State& state, osgUtil::RenderLeaf*& previous)
{
if (_pbuffer && _texture.valid())
{
// Create pbuffer texture
const unsigned int contextID = state.getContextID();
osg::Texture::TextureObject* textureObject = _texture->getTextureObject(contextID);
if (textureObject == 0)
{
// Create dynamic texture, subload callback required.
_texture->apply(state);
}
HDC hdc = ::wglGetCurrentDC();
HGLRC hglrc = ::wglGetCurrentContext();
// Release pbuffer from "render to texture".
_pbuffer->releaseTexImage();
// Make the p-buffer's context current.
_pbuffer->makeCurrent();
// Render in p-buffer.
RenderStage::draw(state,previous);
// restore window's context as current.
if (!::wglMakeCurrent(hdc, hglrc))
{
assert(0);
}
if (true /*_isRenderTextureSupported*/)
{
// transfer contents of p-buffer to texture
_pbuffer->bindTexImage(textureObject->_id);
}
else
{
// TODO:
// _pbuffer->copyTexImage(state);
}
}
else
{
RenderStage::draw(state,previous);
// now copy the rendered image to attached texture.
if (_texture.valid())
_texture->copyTexImage2D(state,_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height());
if (_image.valid())
_image->readPixels(_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height(),GL_RGBA,GL_UNSIGNED_BYTE);
}
}