Re: [osg-users] Extensions/State Update Question

2012-08-21 Thread Sergey Polischuk
Hi

did you call viewer.realize() before attempting to get contextID from it?

Cheers.

20.08.2012, 20:27, Jeremy Moles cubic...@gmail.com:
 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


Re: [osg-users] Extensions/State Update Question

2012-08-21 Thread Jeremy Moles
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] Extensions/State Update Question

2012-08-20 Thread Jeremy Moles
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


Re: [osg-users] Extensions/State Update Question

2012-08-20 Thread Paul Martz
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?


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


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


Re: [osg-users] Extensions/State Update Question

2012-08-20 Thread Jeremy Moles
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


Re: [osg-users] Extensions/State Update Question

2012-08-20 Thread Jean-Sébastien Guay

Hi Jeremy, nice to see you back writing graphics code!

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,

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