@ -24,46 +24,10 @@ namespace SceneUtil
RTTNode * mGroup ;
} ;
// RTT camera
class RTTCamera : public osg : : Camera
{
public :
RTTCamera ( )
{
setRenderOrder ( osg : : Camera : : PRE_RENDER , 1 ) ;
setClearMask ( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ) ;
setRenderTargetImplementation ( osg : : Camera : : FRAME_BUFFER_OBJECT ) ;
unsigned int rttSize = Settings : : Manager : : getInt ( " rtt size " , " Water " ) ;
setViewport ( 0 , 0 , rttSize , rttSize ) ;
mColorBuffer = new osg : : Texture2D ;
mColorBuffer - > setTextureSize ( rttSize , rttSize ) ;
mColorBuffer - > setWrap ( osg : : Texture : : WRAP_S , osg : : Texture : : CLAMP_TO_EDGE ) ;
mColorBuffer - > setWrap ( osg : : Texture : : WRAP_T , osg : : Texture : : CLAMP_TO_EDGE ) ;
mColorBuffer - > setInternalFormat ( GL_RGB ) ;
mColorBuffer - > setFilter ( osg : : Texture : : MIN_FILTER , osg : : Texture : : LINEAR ) ;
mColorBuffer - > setFilter ( osg : : Texture : : MAG_FILTER , osg : : Texture : : LINEAR ) ;
attach ( osg : : Camera : : COLOR_BUFFER , mColorBuffer ) ;
mDepthBuffer = new osg : : Texture2D ;
mDepthBuffer - > setTextureSize ( rttSize , rttSize ) ;
mDepthBuffer - > setSourceFormat ( GL_DEPTH_COMPONENT ) ;
mDepthBuffer - > setInternalFormat ( GL_DEPTH_COMPONENT24 ) ;
mDepthBuffer - > setWrap ( osg : : Texture : : WRAP_S , osg : : Texture : : CLAMP_TO_EDGE ) ;
mDepthBuffer - > setWrap ( osg : : Texture : : WRAP_T , osg : : Texture : : CLAMP_TO_EDGE ) ;
mDepthBuffer - > setSourceType ( GL_UNSIGNED_INT ) ;
mDepthBuffer - > setFilter ( osg : : Texture : : MIN_FILTER , osg : : Texture : : LINEAR ) ;
mDepthBuffer - > setFilter ( osg : : Texture : : MAG_FILTER , osg : : Texture : : LINEAR ) ;
attach ( osg : : Camera : : DEPTH_BUFFER , mDepthBuffer ) ;
}
osg : : ref_ptr < osg : : Texture2D > mColorBuffer ;
osg : : ref_ptr < osg : : Texture2D > mDepthBuffer ;
} ;
RTTNode : : RTTNode ( bool doPerViewMapping )
: mDoPerViewMapping ( doPerViewMapping )
RTTNode : : RTTNode ( uint32_t textureWidth , uint32_t textureHeight , bool doPerViewMapping )
: mTextureWidth ( textureWidth )
, mTextureHeight ( textureHeight )
, mDoPerViewMapping ( doPerViewMapping )
{
addCullCallback ( new CullCallback ( this ) ) ;
}
@ -79,14 +43,14 @@ namespace SceneUtil
vdd - > mCamera - > accept ( * cv ) ;
}
osg : : Texture 2D * RTTNode : : getColorTexture ( osgUtil : : CullVisitor * cv )
osg : : Texture * RTTNode : : getColorTexture ( osgUtil : : CullVisitor * cv )
{
return getViewDependentData ( cv ) - > mCamera - > mColorBuffer. get ( ) ;
return getViewDependentData ( cv ) - > mCamera - > getBufferAttachmentMap( ) [ osg : : Camera : : COLOR_BUFFER ] . _texture ;
}
osg : : Texture 2D * RTTNode : : getDepthTexture ( osgUtil : : CullVisitor * cv )
osg : : Texture * RTTNode : : getDepthTexture ( osgUtil : : CullVisitor * cv )
{
return getViewDependentData ( cv ) - > mCamera - > mDepthBuffer. get ( ) ;
return getViewDependentData ( cv ) - > mCamera - > getBufferAttachmentMap( ) [ osg : : Camera : : DEPTH_BUFFER ] . _texture ;
}
RTTNode : : ViewDependentData * RTTNode : : getViewDependentData ( osgUtil : : CullVisitor * cv )
@ -98,9 +62,43 @@ namespace SceneUtil
if ( mViewDependentDataMap . count ( cv ) = = 0 )
{
auto camera = new osg : : Camera ( ) ;
mViewDependentDataMap [ cv ] . reset ( new ViewDependentData ) ;
mViewDependentDataMap [ cv ] - > mCamera = new RTTCamera ( ) ;
mViewDependentDataMap [ cv ] - > mCamera = camera ;
camera - > setRenderOrder ( osg : : Camera : : PRE_RENDER ) ;
camera - > setClearMask ( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ) ;
camera - > setRenderTargetImplementation ( osg : : Camera : : FRAME_BUFFER_OBJECT ) ;
camera - > setViewport ( 0 , 0 , mTextureWidth , mTextureHeight ) ;
setDefaults ( mViewDependentDataMap [ cv ] - > mCamera . get ( ) ) ;
// Create any buffer attachments not added in setDefaults
if ( camera - > getBufferAttachmentMap ( ) . count ( osg : : Camera : : COLOR_BUFFER ) = = 0 )
{
auto colorBuffer = new osg : : Texture2D ;
colorBuffer - > setTextureSize ( mTextureWidth , mTextureHeight ) ;
colorBuffer - > setWrap ( osg : : Texture : : WRAP_S , osg : : Texture : : CLAMP_TO_EDGE ) ;
colorBuffer - > setWrap ( osg : : Texture : : WRAP_T , osg : : Texture : : CLAMP_TO_EDGE ) ;
colorBuffer - > setInternalFormat ( GL_RGB ) ;
colorBuffer - > setFilter ( osg : : Texture : : MIN_FILTER , osg : : Texture : : LINEAR ) ;
colorBuffer - > setFilter ( osg : : Texture : : MAG_FILTER , osg : : Texture : : LINEAR ) ;
camera - > attach ( osg : : Camera : : COLOR_BUFFER , colorBuffer ) ;
}
if ( camera - > getBufferAttachmentMap ( ) . count ( osg : : Camera : : DEPTH_BUFFER ) = = 0 )
{
auto depthBuffer = new osg : : Texture2D ;
depthBuffer - > setTextureSize ( mTextureWidth , mTextureHeight ) ;
depthBuffer - > setSourceFormat ( GL_DEPTH_COMPONENT ) ;
depthBuffer - > setInternalFormat ( GL_DEPTH_COMPONENT24 ) ;
depthBuffer - > setWrap ( osg : : Texture : : WRAP_S , osg : : Texture : : CLAMP_TO_EDGE ) ;
depthBuffer - > setWrap ( osg : : Texture : : WRAP_T , osg : : Texture : : CLAMP_TO_EDGE ) ;
depthBuffer - > setSourceType ( GL_UNSIGNED_INT ) ;
depthBuffer - > setFilter ( osg : : Texture : : MIN_FILTER , osg : : Texture : : LINEAR ) ;
depthBuffer - > setFilter ( osg : : Texture : : MAG_FILTER , osg : : Texture : : LINEAR ) ;
camera - > attach ( osg : : Camera : : DEPTH_BUFFER , depthBuffer ) ;
}
}
return mViewDependentDataMap [ cv ] . get ( ) ;