@@ -189,7 +189,29 @@ class Selector::Implementation : public IECore::RefCounted
189
189
return m_baseState;
190
190
}
191
191
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 )
193
215
{
194
216
if ( shader == m_currentIDShader )
195
217
{
@@ -214,22 +236,15 @@ class Selector::Implementation : public IECore::RefCounted
214
236
215
237
m_currentIDShader = shader;
216
238
glUseProgram ( m_currentIDShader->program () );
217
-
239
+
218
240
std::vector<GLenum> buffers;
219
241
buffers.resize ( fragDataLocation + 1 , GL_NONE );
220
242
buffers[buffers.size ()-1 ] = GL_COLOR_ATTACHMENT0;
221
243
glDrawBuffers ( buffers.size (), &buffers[0 ] );
222
244
223
245
loadNameIDRender ( m_currentName );
224
246
}
225
-
226
- static Selector *currentSelector ()
227
- {
228
- return g_currentSelector;
229
- }
230
-
231
- private :
232
-
247
+
233
248
Mode m_mode;
234
249
std::vector<HitRecord> &m_hits;
235
250
StatePtr m_baseState;
@@ -285,6 +300,7 @@ class Selector::Implementation : public IECore::RefCounted
285
300
boost::shared_ptr<FrameBuffer::ScopedBinding> m_frameBufferBinding;
286
301
GLint m_prevProgram;
287
302
ConstShaderPtr m_currentIDShader;
303
+ std::stack<ConstShaderPtr> m_IDShaderStack;
288
304
GLint m_prevViewport[4 ];
289
305
GLint m_nameUniformLocation;
290
306
@@ -346,7 +362,7 @@ class Selector::Implementation : public IECore::RefCounted
346
362
}
347
363
348
364
glGetIntegerv ( GL_CURRENT_PROGRAM, &m_prevProgram );
349
- loadIDShader ( m_baseState->get <ShaderStateComponent>()->shaderSetup ()->shader () );
365
+ pushIDShader ( m_baseState->get <ShaderStateComponent>()->shaderSetup ()->shader () );
350
366
}
351
367
352
368
void loadNameIDRender ( GLuint name )
@@ -484,7 +500,15 @@ State *Selector::baseState()
484
500
485
501
void Selector::loadIDShader ( const IECoreGL::Shader *idShader )
486
502
{
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 ();
488
512
}
489
513
490
514
Selector *Selector::currentSelector ()
0 commit comments