Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions include/IECoreGL/Selector.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ class Selector : boost::noncopyable
/// Typically one is set up automatically in baseState(), but
/// if rendering must be performed with an alternative shader
/// then it may be passed via this function.
void pushIDShader( const IECoreGL::Shader *idShader );

/// Revert to previous ID shader:
void popIDShader();

/// Deprecated: calls pushIDShader
void loadIDShader( const IECoreGL::Shader *idShader );

/// Returns the currently active Selector - this may be used
Expand Down
48 changes: 36 additions & 12 deletions src/IECoreGL/Selector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,29 @@ class Selector::Implementation : public IECore::RefCounted
return m_baseState;
}

void loadIDShader( const IECoreGL::Shader *shader )
void pushIDShader( const IECoreGL::Shader *shader )
{
bindIDShader( shader );
m_IDShaderStack.push( shader );
}

void popIDShader()
{
m_IDShaderStack.pop();
if( m_IDShaderStack.size() )
{
bindIDShader( m_IDShaderStack.top() );
}
}

static Selector *currentSelector()
{
return g_currentSelector;
}

private :

void bindIDShader( const IECoreGL::Shader *shader )
{
if( shader == m_currentIDShader )
{
Expand All @@ -214,22 +236,15 @@ class Selector::Implementation : public IECore::RefCounted

m_currentIDShader = shader;
glUseProgram( m_currentIDShader->program() );

std::vector<GLenum> buffers;
buffers.resize( fragDataLocation + 1, GL_NONE );
buffers[buffers.size()-1] = GL_COLOR_ATTACHMENT0;
glDrawBuffers( buffers.size(), &buffers[0] );

loadNameIDRender( m_currentName );
}

static Selector *currentSelector()
{
return g_currentSelector;
}

private :


Mode m_mode;
std::vector<HitRecord> &m_hits;
StatePtr m_baseState;
Expand Down Expand Up @@ -285,6 +300,7 @@ class Selector::Implementation : public IECore::RefCounted
boost::shared_ptr<FrameBuffer::ScopedBinding> m_frameBufferBinding;
GLint m_prevProgram;
ConstShaderPtr m_currentIDShader;
std::stack<ConstShaderPtr> m_IDShaderStack;
GLint m_prevViewport[4];
GLint m_nameUniformLocation;

Expand Down Expand Up @@ -346,7 +362,7 @@ class Selector::Implementation : public IECore::RefCounted
}

glGetIntegerv( GL_CURRENT_PROGRAM, &m_prevProgram );
loadIDShader( m_baseState->get<ShaderStateComponent>()->shaderSetup()->shader() );
pushIDShader( m_baseState->get<ShaderStateComponent>()->shaderSetup()->shader() );
}

void loadNameIDRender( GLuint name )
Expand Down Expand Up @@ -484,7 +500,15 @@ State *Selector::baseState()

void Selector::loadIDShader( const IECoreGL::Shader *idShader )
{
m_implementation->loadIDShader( idShader );
m_implementation->pushIDShader( idShader );
}
void Selector::pushIDShader( const IECoreGL::Shader *idShader )
{
m_implementation->pushIDShader( idShader );
}
void Selector::popIDShader()
{
m_implementation->popIDShader();
}

Selector *Selector::currentSelector()
Expand Down
9 changes: 8 additions & 1 deletion src/IECoreGL/Shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -880,7 +880,7 @@ Shader::Setup::ScopedBinding::ScopedBinding( const Setup &setup )
{
if( currentSelector->mode() == Selector::IDRender )
{
currentSelector->loadIDShader( m_setup.shader() );
currentSelector->pushIDShader( m_setup.shader() );
}
}
}
Expand All @@ -894,6 +894,13 @@ Shader::Setup::ScopedBinding::~ScopedBinding()
}

glUseProgram( m_previousProgram );
if( Selector *currentSelector = Selector::currentSelector() )
{
if( currentSelector->mode() == Selector::IDRender )
{
currentSelector->popIDShader();
}
}
}

///////////////////////////////////////////////////////////////////////////////
Expand Down