Hi Bill,

Is there any reason why you could retain a ref_ptr<> to the Operation and
modify it in your frame loop, or get the list of operations and use a
dynamic_cast<MotionBlurOperation*>() to determine which one is the one you
need to modify?

Robert.


On 16 May 2013 23:15, William Hart <[email protected]> wrote:

> Hi,
>
> I've been using the Accumulation buffer to apply motion blur to point
> cloud animations, directly taken from the osgMotionBlur example, where the
> motion blur is applied to each window as an osg::Operation.  What I'd like
> to be able to do is dynamically change the amount of blur by varying the
> persistence parameter.  I've poked around the API and found that I can
> remove the motion blur operation with a removeAllOperations call then
> reapply the motion blur with a different persistence value, but this causes
> the accumulation buffer to be cleared.  I can't see any other way to access
> the Operator once its been applied.
>
> Below is the code,
>
> #include <osgViewer/ViewerBase>
> #include <osgViewer/Viewer>
> #include <iostream>
>
> class MotionBlurOperation: public osg::Operation
> {
> public:
>     MotionBlurOperation(double persistence):
>         osg::Operation("MotionBlur",true),
>         cleared_(false),
>         persistence_(persistence)
>     {
>     }
>
>     virtual void operator () (osg::Object* object)
>     {
>         osg::GraphicsContext* gc =
> dynamic_cast<osg::GraphicsContext*>(object);
>         if (!gc) return;
>
>         double t = gc->getState()->getFrameStamp()->getSimulationTime();
>
>         if (!cleared_)
>         {
>             // clear the accumulation buffer
>             glClearColor(0, 0, 0, 0);
>             glClear(GL_ACCUM_BUFFER_BIT);
>             cleared_ = true;
>             t0_ = t;
>         }
>
>         double dt = fabs(t - t0_);
>         t0_ = t;
>
>         // compute the blur factor
>         double s = powf(0.2, dt / persistence_);
>
>         // scale, accumulate and return
>         glAccum(GL_MULT, s);
>         glAccum(GL_ACCUM, 1 - s);
>         glAccum(GL_RETURN, 1.0f);
>     }
>
> private:
>     bool cleared_;
>     double t0_;
>     double persistence_;
> };
>
> void motionblur(osgViewer::GraphicsWindow* w, double persistence) {
>   w->add(new MotionBlurOperation(persistence));
> }
>
> any ideas ?
>
> thanks in advance
>
> Bill
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to