[Moving to osg-users for discussion.]

Robert Osfield wrote:
> Hi Chris,
> There are other better ways to add the alias.

  Ok, well, if I'm going to need to rewrite this, let's work out what the best 
engineering
approach is first so it gets done right the (second) time.

>  Paul's suggestion of
> utilising the OSG's use of the "Chain of Responsibility" pattern to
> check for ability to load files from plugin is another approach you
> could use, an approach that is similar to use a custom
> Registry::ReadFileCallback.

  This does avert the only-one-ReadfileCallback issue I raised earlier. But, I 
have to be
honest, this approach seems fairly obscure and not-obvious. I personally was 
never aware
that you could have one plugin 'intercept' loads directed towards another 
plugin, and the
mechanism behind this seems cryptic at best to most users. I would personally 
like a
solution where the typical user can actually easily tell what happened and why 
the
pseudoloader got invoked to load the external file that had the extension for a 
different
loader plugin.

> Another approach would be to use a custom CullCallback on the PagedLOD
> node, and override the way that the plugin chooses it's children and
> dispatches the file requests.

  To me, this seems the most attractive. However, as I recall, custom 
CullCallbacks are
also singular -- if the pseudoloader uses this method, then it excludes the 
possibility
that the user would want to use a Custom CullCallback themselves. I was trying 
to deploy
the pseudoloader as a "system" that could seamlessly be used in any application 
without
disrupting any existing (or future) use of scenegraph technologies. I'm not 
just trying to
make a quick kludge that works for my current app, I want something that 
becomes part of
the whole OSG technology suite so others can utilize and build on it.

> Another approach would be to use a custom DatabaseRequestHandler
> attached to the CullVisitor that intercepts all the file requests done
> by PagedLOD then passes these on to the DatabasePager with the
> filename appropriately modified.

  If I understand correctly, this one seems like it has the most code 
associated with it,
and the least simplicity and obviousness. It means that to employ this method, 
a user
needs to be concerned with messing with the DatabaseRequestHandler and the 
CullVisitor,
which puts the "action" as it were, a long way from where the magic happens -- 
in the
PagedLOD and ProxyNode. It also means the user has to modify their calling 
code, they
can't just slap .modifyterrain onto the end of a file they're loading into 
osgViewer.

> All of these approaches are both more flexible and less intrusive than
> embedded the filename suffix into PagedLOD/ProxyNode.

  If you look at the scope of the submission I made, it is changes to a few 
concise lines
of code, and it stores the necessary suffix-override state right where it is 
needed. It's
self-contained in that no changes to user-code are required, and it's 
non-intrusive in
that it doesn't interfere with any existing usage of the scene graph. Granted, 
it's not as
flexible as some other approaches, but I thought the cleanliness and simplicity 
of it made
up for it.


  I'm all in favor of using callbacks or functors to make enhancements 
extensible and not
single-purpose (you'll see that in the .modifyterrain code which is highly 
customizable
and extensible, especially if three of the utility APIs are put into core OSG 
somewhere).
I felt the suffix member variable was isometric to the databaseprefix, and so 
the downside
of it being special-purpose and not generalized was excusable.


  I have an idea for mitigating the generalization issues of a custom 
CullCallback. What
if the external-reference node types (PagedLOD, ProxyNode and anything else in 
the future)
supported a custom LoadCallback? This would allow interception of the load 
operation
without having to take over the already-oft-utilized custom CullCallback. The
modifyterrain pseudoloader could store the suffix information in an existing 
state
variable, like using a Description string in the Node's DescriptionList. The 
LoadCallback
could rely on searching for a KEY=VALUE description of the form of
PSEUDOLOADER_LOAD_SUFFIX=.modifyterrain, and extract the suffix from there to 
employ it.

  Would this satisfy your objections to generality? From my perspective, it 
would satisfy
the desired qualities of obviousness/transparency, not requiring setting up 
scenegraph
magic outside the PagedLOD/ProxyNode nodes (like custom CullVisitors and
DatabaseRequestHandlers), as well as not interfering with existing use of 
current
scenegraph techniques like CullCallback.


>   I'll dive into
> your other submissions today and if there are points that you rely on
> your added PagedLOD functionality I'll review which of the above
> approach is most appropriate/easist to implement/less intrusive.

  I can't recall if the osgconv work is dependent on this, or not. I think it 
was intended
to be transparent, since the modifyterrain pseudoloader is self-contained and 
doesn't need
any fancy changes to the context in order to work.

> Cheers,
> Robert.

-- 
Chris 'Xenon' Hanson, omo sanza lettere                  Xenon AlphaPixel.com
PixelSense Landsat processing now available! http://www.alphapixel.com/demos/
"There is no Truth. There is only Perception. To Perceive is to Exist." - Xen
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to