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);