On Mon, 2012-08-20 at 17:55 -0400, Jean-Sébastien Guay wrote: > Hi Jeremy, nice to see you back writing graphics code!
I finally have the time again! > In the past, when I've needed to have a contextID in a custom Drawable, > I've always gotten it from inside my drawable's drawImplementation. IIRC > it gets a State pointer and this contains a valid contextID. Same when > I've needed to create a custom StateAttribute or something, in its > apply() method it gets a State pointer with a valid contextID or > something like that. > > So you can have a scheme where you defer doing any initialization until > your first Drawable / StateAttribute needs to be traversed for actual > rendering, and then you get a valid contextID, do your initialization > and further ones will use that since initialization has been done already. > > You need to make sure you consider the case where your Drawable / > StateAttribute will be used in multiple contexts. IIRC OSG uses the > BufferedValue to store resources associated with a context, and I used > the same pattern. Again IIRC, there were some order of initialization > issues where I assumed some initialization had been done for a context > before drawing but it hadn't, but that just involved a bit of pretty > simple debugging to get fixed. > > Hope this helps, It does. Your use of the word "deferred" is really helpful in this, as it was a "deferred" approach I was taking and was looking for some assurance this was an acceptable approach. :) > J-S > > > On 20/08/2012 12:48 PM, Jeremy Moles wrote: > > On Mon, 2012-08-20 at 10:44 -0600, Paul Martz wrote: > >> What you seem to be saying is that you want to set some OpenGL state once > >> that > >> applies to all contexts, and not have to set it every frame. AND, you > >> don't want > >> to have to add, then remove, a Camera draw callback just to make this > >> happen). > >> Is that a good synopsis of the issue? > > It's close; I don't actually mind using a Camera draw callback for this > > purpose if it's appropriate. > > > > A real summarizing question is: under what conditions is it "safe" to > > query for support of a particular extension? And what is the preferred > > API for either fetching or being provided the contextID with which to do > > this? > > > >> You could keep a bool buffered_value that tells you whether or not you've > >> set > >> the initial/global state for that particular context. Initially false, > >> then set > >> the global state for a context and flip it to true. Would something like > >> that help? > >> -Paul > > Certainly, but I'm still stuck on actually SETTING the state in the > > first place. :) > > > >> On 8/20/2012 10:27 AM, Jeremy Moles wrote: > >>> Hello everyone! I have a bit of a strange question here, so please bear > >>> with me. I'll try to be as descriptive as I possibly can, though I'm > >>> certain I will misuse some terminology. > >>> > >>> I am adding support for the NV_path_rendering extension to > >>> OpenSceneGraph. This extension adds a number of new functions to OpenGL > >>> when using an NVidia card which take on the form: > >>> > >>> glPath{_function_}NV > >>> > >>> http://osgnvpr.googlecode.com > >>> > >>> In order to create pointers to these new extension functions, I create > >>> an Extensions object in OSG using the contextID given to me during the > >>> compileGLObjects method of my overridden Drawable class. This works > >>> fine, and the code is running as I expect. > >>> > >>> https://code.google.com/p/osgnvpr/source/browse/trunk/src/PathCommands.cpp#45 > >>> > >>> HOWEVER, this paradigm really only works when I need to call extension > >>> functions associated with an instance (or instances) of my Drawable. > >>> There are other functions in the NV_path_rendering API that simply set > >>> global state, and it is with these functions that I'm having difficulty. > >>> > >>> The biggest problem here is that in order to get a pointer to the > >>> Extensions static object, I need a valid GraphicsContext contextID. > >>> However, I've tried a number of methods to obtain one of these, but > >>> every attempt I make actually breaks the entire codebase. I wish I could > >>> explain it better than that... > >>> > >>> For example, if I try to use some code like the following: > >>> > >>> ------------------------ > >>> > >>> Windows windows; > >>> > >>> viewer.getWindows(window); > >>> > >>> cID = windows[0]->getState()->getContextID(); > >>> > >>> osgNVPR::getNVPRExtensions(cID); > >>> > >>> ------------------------- > >>> > >>> ...then I seem to get an invalid contextID and all subsequent attempts > >>> to use that contextID (even by OSG itself) won't work. The entire > >>> rendering process seems to be broken in this manner. > >>> > >>> If instead I create a Camera::DrawCallback object and use the RenderInfo > >>> there instead, then everything works fine. However, I feel like I'm > >>> grossly misusing a Camera::DrawCallback just to set and unset state... > >>> > >>> My question is: if I need to set global state like this once, somewhere > >>> high in the scenegraph, what is the best way--keeping in mind that I > >>> also need a valid contextID in order to access my Extensions functions > >>> per-context? > >>> > >>> Thanks! > >>> > >>> _______________________________________________ > >>> osg-users mailing list > >>> osg-users@lists.openscenegraph.org > >>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >>> > >>> > >> _______________________________________________ > >> osg-users mailing list > >> osg-users@lists.openscenegraph.org > >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > > _______________________________________________ > > osg-users mailing list > > osg-users@lists.openscenegraph.org > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > > _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org