Skip to content

Commit f909d9a

Browse files
committed
Merge pull request #188 from davidsminor/glCurveSelection
Added IECoreGL::Selector::push/popIDShader()
2 parents 5161431 + faa3d23 commit f909d9a

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

include/IECoreGL/Selector.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ class Selector : boost::noncopyable
110110
/// Typically one is set up automatically in baseState(), but
111111
/// if rendering must be performed with an alternative shader
112112
/// then it may be passed via this function.
113+
void pushIDShader( const IECoreGL::Shader *idShader );
114+
115+
/// Revert to previous ID shader:
116+
void popIDShader();
117+
118+
/// Deprecated: calls pushIDShader
113119
void loadIDShader( const IECoreGL::Shader *idShader );
114120

115121
/// Returns the currently active Selector - this may be used

src/IECoreGL/Selector.cpp

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,29 @@ class Selector::Implementation : public IECore::RefCounted
189189
return m_baseState;
190190
}
191191

192-
void loadIDShader( const IECoreGL::Shader *shader )
192+
void pushIDShader( const IECoreGL::Shader *shader )
193+
{
194+
bindIDShader( shader );
195+
m_IDShaderStack.push( shader );
196+
}
197+
198+
void popIDShader()
199+
{
200+
m_IDShaderStack.pop();
201+
if( m_IDShaderStack.size() )
202+
{
203+
bindIDShader( m_IDShaderStack.top() );
204+
}
205+
}
206+
207+
static Selector *currentSelector()
208+
{
209+
return g_currentSelector;
210+
}
211+
212+
private :
213+
214+
void bindIDShader( const IECoreGL::Shader *shader )
193215
{
194216
if( shader == m_currentIDShader )
195217
{
@@ -214,22 +236,15 @@ class Selector::Implementation : public IECore::RefCounted
214236

215237
m_currentIDShader = shader;
216238
glUseProgram( m_currentIDShader->program() );
217-
239+
218240
std::vector<GLenum> buffers;
219241
buffers.resize( fragDataLocation + 1, GL_NONE );
220242
buffers[buffers.size()-1] = GL_COLOR_ATTACHMENT0;
221243
glDrawBuffers( buffers.size(), &buffers[0] );
222244

223245
loadNameIDRender( m_currentName );
224246
}
225-
226-
static Selector *currentSelector()
227-
{
228-
return g_currentSelector;
229-
}
230-
231-
private :
232-
247+
233248
Mode m_mode;
234249
std::vector<HitRecord> &m_hits;
235250
StatePtr m_baseState;
@@ -285,6 +300,7 @@ class Selector::Implementation : public IECore::RefCounted
285300
boost::shared_ptr<FrameBuffer::ScopedBinding> m_frameBufferBinding;
286301
GLint m_prevProgram;
287302
ConstShaderPtr m_currentIDShader;
303+
std::stack<ConstShaderPtr> m_IDShaderStack;
288304
GLint m_prevViewport[4];
289305
GLint m_nameUniformLocation;
290306

@@ -346,7 +362,7 @@ class Selector::Implementation : public IECore::RefCounted
346362
}
347363

348364
glGetIntegerv( GL_CURRENT_PROGRAM, &m_prevProgram );
349-
loadIDShader( m_baseState->get<ShaderStateComponent>()->shaderSetup()->shader() );
365+
pushIDShader( m_baseState->get<ShaderStateComponent>()->shaderSetup()->shader() );
350366
}
351367

352368
void loadNameIDRender( GLuint name )
@@ -484,7 +500,15 @@ State *Selector::baseState()
484500

485501
void Selector::loadIDShader( const IECoreGL::Shader *idShader )
486502
{
487-
m_implementation->loadIDShader( idShader );
503+
m_implementation->pushIDShader( idShader );
504+
}
505+
void Selector::pushIDShader( const IECoreGL::Shader *idShader )
506+
{
507+
m_implementation->pushIDShader( idShader );
508+
}
509+
void Selector::popIDShader()
510+
{
511+
m_implementation->popIDShader();
488512
}
489513

490514
Selector *Selector::currentSelector()

src/IECoreGL/Shader.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ Shader::Setup::ScopedBinding::ScopedBinding( const Setup &setup )
880880
{
881881
if( currentSelector->mode() == Selector::IDRender )
882882
{
883-
currentSelector->loadIDShader( m_setup.shader() );
883+
currentSelector->pushIDShader( m_setup.shader() );
884884
}
885885
}
886886
}
@@ -894,6 +894,13 @@ Shader::Setup::ScopedBinding::~ScopedBinding()
894894
}
895895

896896
glUseProgram( m_previousProgram );
897+
if( Selector *currentSelector = Selector::currentSelector() )
898+
{
899+
if( currentSelector->mode() == Selector::IDRender )
900+
{
901+
currentSelector->popIDShader();
902+
}
903+
}
897904
}
898905

899906
///////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)