When one refers to a fix, one should probably attach it, no?

      
diff --git a/libfluxus/src/Renderer.cpp b/libfluxus/src/Renderer.cpp
index 8f5c877..15f606e 100644
--- a/libfluxus/src/Renderer.cpp
+++ b/libfluxus/src/Renderer.cpp
@@ -51,6 +51,9 @@ m_InitLights(false),
 m_Width(640),
 m_Height(480),
 m_MotionBlur(false),
+m_MBlurBlendSrc(GL_SRC_ALPHA),
+m_MBlurBlendDst(GL_ONE_MINUS_SRC_ALPHA),
+m_MBlurPlaneDist(1.0),
 m_Fade(0.02f),
 m_ShowAxis(false),
 m_Grabbed(NULL),
@@ -321,7 +324,8 @@ void Renderer::PreRender(unsigned int CamIndex, bool 
PickMode)
                glPolygonMode(GL_FRONT,GL_FILL);
                glDisable(GL_DEPTH_TEST);
                glPushMatrix();
-               glTranslatef(0,0,-10);
+               glBlendFunc(m_MBlurBlendSrc,m_MBlurBlendDst);
+               glTranslatef(0,0,0-m_MBlurPlaneDist);
                glBegin(GL_QUADS);
                        
glColor4f(m_BGColour.r,m_BGColour.g,m_BGColour.b,m_Fade);
                        glVertex3f(-10,-10,0);
diff --git a/libfluxus/src/Renderer.h b/libfluxus/src/Renderer.h
index c9e17d9..bc81df8 100644
--- a/libfluxus/src/Renderer.h
+++ b/libfluxus/src/Renderer.h
@@ -130,6 +130,8 @@ public:
        void DrawText(const string &Text);
        void Reinitialise()                      { m_Initialised=false; }
        void SetMotionBlur(bool s, float a=0.02) { m_MotionBlur=s; m_Fade=a; }
+       void SetMotionBlurBlendMode(int s, int d) { m_MBlurBlendSrc=s; 
m_MBlurBlendDst=d; }
+       void SetMotionBlurPlaneDist(float d)     { m_MBlurPlaneDist=d; }
        void SetResolution(int x, int y)         { m_Width=x; m_Height=y; 
m_Initialised=false; }
        void GetResolution(int &x, int &y)       { x=m_Width; y=m_Height; }
        TexturePainter *GetTexturePainter()      { return 
TexturePainter::Get(); }
@@ -173,6 +175,9 @@ private:
        bool  m_InitLights;
        int   m_Width,m_Height;
        bool  m_MotionBlur;
+       int   m_MBlurBlendSrc;
+       int   m_MBlurBlendDst;
+       float m_MBlurPlaneDist;
        float m_Fade;
        bool  m_ShowAxis;
        Primitive *m_Grabbed;
diff --git a/modules/fluxus-engine/src/GlobalStateFunctions.cpp 
b/modules/fluxus-engine/src/GlobalStateFunctions.cpp
index 8a39d63..df7a01e 100644
--- a/modules/fluxus-engine/src/GlobalStateFunctions.cpp
+++ b/modules/fluxus-engine/src/GlobalStateFunctions.cpp
@@ -134,6 +134,108 @@ Scheme_Object *blur(int argc, Scheme_Object **argv)
 }
 
 // StartFunctionDoc-en
+// blur-blend-mode src dst
+// Returns: void
+// Description:
+// Sets the blend mode for motion blur, and tweaking the effect of 
clear-colour.
+// This is basically the same as blend-mode in local state, but for the 
"hidden"
+// plane that blends the frame with clear-colour when blur is on. Use it to 
control
+// how blurring affects your scene and do strange things. Blendmode symbols can
+// consist of:
+// zero one dst-color one-minus-dst-color src-alpha one-minus-src-alpha 
dst-alpha
+// one-minus-dst-alpha
+// Also src-alpha-saturate as an option for the source blendmode only.
+//
+// Default is 'src-alpha 'one-minus-src-alpha
+// Example:
+// 
+// ; list out all the possible blendmodes
+// (define src-blend (vector 'zero 'one 'dst-color 'one-minus-dst-color 
'src-alpha
+//         'one-minus-src-alpha 'dst-alpha 'one-minus-dst-alpha
+//         'src-alpha-saturate))
+// 
+// (define dst-blend (vector 'zero 'one 'src-color 'one-minus-src-color 
'src-alpha
+//         'one-minus-src-alpha 'dst-alpha 'one-minus-dst-alpha))
+// 
+// ; picks a random element
+// (define (pick-rnd-item l)
+//     (vector-ref l (random (vector-length l))))
+// 
+// (define (rotor n)
+//     (with-state
+//         (hint-depth-sort)
+//         (opacity 0.5)
+//         (colour (vector (flxrnd) (flxrnd) (flxrnd)))
+//         (blend-mode (pick-rnd-item src-blend) (pick-rnd-item dst-blend))
+//         (parent hub)
+//         (translate (hsrndvec))
+//         (scale 0.2)
+//         (build-sphere 10 10))
+//     (if (zero? n)
+//         0
+//         (rotor (- n 1))))
+// 
+//
+// (define (animate)
+//     (with-primitive hub 
+//             (rotate (vector (* 10 (delta)) (* 15 (delta)) (* 30 (delta)))))
+//
+// ; cycle through the modes, press S to show current ones
+//     (let ([src (vector-ref src-blend (inexact->exact (modulo (round (* 
(time) 0.2))
+//                             (vector-length src-blend))))]
+//             [dst (vector-ref dst-blend (inexact->exact (modulo (round (* 
(time) 0.02))
+//                             (vector-length dst-blend))))])
+//         (blur-blend-mode src dst)
+//         (when (key-pressed "s") 
+//             (display (string-append (symbol->string src) " " 
(symbol->string dst)))
+//             (newline))))
+// 
+// (clear)
+// (blur 0.05)
+// (clear-colour (vector 0.05 0.05 0.05))
+// (define hub (with-state (scale 5) (build-locator)))
+// (rotor 50)
+// 
+// (every-frame (animate))
+//
+// EndFunctionDoc
+
+Scheme_Object *blur_blend_mode(int argc, Scheme_Object **argv)
+{
+       DECL_ARGV();
+       ArgCheck("blur-blend-mode", "SS", argc, argv);
+       string s=SymbolName(argv[0]);
+       string d=SymbolName(argv[1]);
+       int bls=GL_SRC_ALPHA;
+       int bld=GL_ONE_MINUS_SRC_ALPHA;
+
+       if (s=="zero") bls=GL_ZERO;
+       else if (s=="one") bls=GL_ONE;
+       else if (s=="dst-color") bls=GL_DST_COLOR;
+       else if (s=="one-minus-dst-color") bls=GL_ONE_MINUS_DST_COLOR;
+       else if (s=="src-alpha") bls=GL_SRC_ALPHA;
+       else if (s=="one-minus-src-alpha") bls=GL_ONE_MINUS_SRC_ALPHA;
+       else if (s=="dst-alpha") bls=GL_DST_ALPHA;
+       else if (s=="one-minus-dst-alpha") bls=GL_ONE_MINUS_DST_ALPHA;
+       else if (s=="src-alpha-saturate") bls=GL_SRC_ALPHA_SATURATE;
+       else Trace::Stream<<"source blend mode not recognised: "<<s<<endl;
+
+       if (d=="zero") bld=GL_ZERO;
+       else if (d=="one") bld=GL_ONE;
+       else if (d=="src-color") bld=GL_SRC_COLOR;
+       else if (d=="one-minus-src-color") bld=GL_ONE_MINUS_SRC_COLOR;
+       else if (d=="src-alpha") bld=GL_SRC_ALPHA;
+       else if (d=="one-minus-src-alpha") bld=GL_ONE_MINUS_SRC_ALPHA;
+       else if (d=="dst-alpha") bld=GL_DST_ALPHA;
+       else if (d=="one-minus-dst-alpha") bld=GL_ONE_MINUS_DST_ALPHA;
+       else Trace::Stream<<"dest blend mode not recognised: "<<d<<endl;
+
+       Engine::Get()->Renderer()->SetMotionBlurBlendMode(bls,bld);
+       MZ_GC_UNREG();
+       return scheme_void;
+}
+
+// StartFunctionDoc-en
 // fog fogcolour-vector amount-number begin-number end-number
 // Returns: void
 // Description:
@@ -801,6 +903,7 @@ Scheme_Object *clip(int argc, Scheme_Object **argv)
   ArgCheck("clip", "ff", argc, argv);
   Engine::Get()->GetCamera()->SetClip(FloatFromScheme(argv[0]),
                     FloatFromScheme(argv[1]));
+  Engine::Get()->Renderer()->SetMotionBlurPlaneDist(FloatFromScheme(argv[0]));
   MZ_GC_UNREG();
     return scheme_void;
 }
@@ -2559,6 +2662,7 @@ void GlobalStateFunctions::AddGlobals(Scheme_Env *env)
 
   scheme_add_global("clear-engine", scheme_make_prim_w_arity(clear_engine, 
"clear-engine", 0, 0), env);
   scheme_add_global("blur", scheme_make_prim_w_arity(blur, "blur", 1, 1), env);
+  
scheme_add_global("blur-blend-mode",scheme_make_prim_w_arity(blur_blend_mode,"blur-blend-mode",
 2, 2), env);
   scheme_add_global("fog", scheme_make_prim_w_arity(fog, "fog", 4, 4), env);
   scheme_add_global("show-axis", scheme_make_prim_w_arity(show_axis, 
"show-axis", 1, 1), env);
   scheme_add_global("show-fps", scheme_make_prim_w_arity(show_fps, "show-fps", 
1, 1), env);

Reply via email to