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