[fluxus] Stereo Fluxus
Alex Norman
alex at neisis.net
Tue May 22 14:42:11 PDT 2007
So I have a working setup, I added (set-eye-separation val) and
(get-eye-separation) to the scratchpad.
I used "strings" to set the draw buffers (draw-buffer "back") instead of symbols
because I don't know how to use scheme symbols when interfacing with C yet... I
figure symbols would be better. 'back, 'back-right etc.
I implemented (set-stereo-mode mode) and (get-stereo-mode)
the only 2 modes available are "crystal-eyes" and "no-stereo"
if you don't have a stereo window then you only get "no-stereo"
set-stereo-mode returns a bool indicating success or not.
I include a compile time flag that makes glut try a stereo window by default,
this is off by default so you have to say scons STEREODEFAULT=1 in order to
default to stereo mode.
the problem here is that I don't know if there is any way to test for stereo
window capability in glut, so you either have stereo or you crash.
It'll be nice to add a run time flag to use stereo windows at some point [if this
gets put into the main distro].
GEM implements some other types of stereo, I figure it wouldn't be so hard to
include those other types [like the blue/red glasses], and these don't require
stereo windows (or special graphics card setup).
anyways, I've included the diff.
btw, even without my modifications I noticed that fluxus crashes when I execute
a function in repl or whatever it is called ("the command line interp") and give
the wrong number of arguments [ie (display) ]
-Alex
On 0, Alex Norman <alex at neisis.net> wrote:
> I guess I should be doing this?
>
> (set-camera
> (mmul
> (mtranslate (vector half_sep 0 0))
> (get-camera-transform)
> ))
>
> looks good now,
>
> -Alex
>
> On 0, Alex Norman <alex at neisis.net> wrote:
> > So I've got stereo partially working in the standalone version of fluxus,
> > attached is a diff to the current cvs version... note that I'm setting up a
> > stereo window with glut, this will fail to open a window at all if you don't
> > support stereo [via your graphics card]. I should add a command line option to
> > try to allow for stereo rendering...
> >
> > it still needs some work but I figured I'd show my progress
> >
> > one thing is that this:
> > (set-camera (mmul (get-camera-transform)
> > (mtranslate (vector -1 0 0)))) ; move to the left
> >
> > translates in the x relative to the center of the "world", not to the screen.
> > I'm no master of matrix operations so if someone would send me the operation to
> > do the correct translation I'd appreciate it. (in the current mode if you move
> > around the world the translation might end up being up and down relative to the
> > screen...)
> >
> > Also, I figure there should be some (set-eye-separation val) and
> > (get-eye-separation) functions, I don't see any reason why that needs to be
> > implemented anywhere other than scheme land, but I'm not exactly sure how/where
> > to implement it. (right now the eye separation is "hard coded")
> >
> > btw, I tried to get this working in mred, the manual claims that you can create
> > a stereo canvas, but I cannot seem to get it working... I've also attached my
> > attempt at that.
> >
> > -Alex
> >
> >
> > On 0, Alex Norman <alex at neisis.net> wrote:
> > > On 0, Dave Griffiths <dave at pawfal.org> wrote:
> > > >
> > > > > Hi,
> > > > > I want to modify fluxus to allow for active stereo video [via crystal
> > > > > glasses], I've already done this for pd's GEM and it was quite easy,
> > > > > though they already had some other stereo modes. Basically, I need to
> > > > > render the scene one time for each eye, selecting a different buffer to
> > > > > write to for each and offsetting the camera position slightly for each
> > > > > eye. I intend to write it in such a way that one could select this
> > > > > functionality or not, so that it might actually be put into the main
> > > > > distro eventually as others might find it useful (once this stereo mode
> > > > > is in place it probably wouldn't be hard to implement other stereo modes).
> > > > >
> > > > > Anyways, if anyone could suggest where to implement this I'd appreciate
> > > > > it (i figure in the renderer, but where in the renderer :)
> > > >
> > > > Do you want to do this inside the fluxus scratchpad (traditional style) or
> > > > with mred? It should be possible to do this with mred now, but I haven't
> > > > had a chance to figure out much of mred's gl canvas yet - but you should
> > > > be able to get it to change the draw buffer and rerender the scene.
> > >
> > > I guess I'd like to check out both, I was thinking I'd do it inside the scratch
> > > pad but I figure eventually it would be nice to have both options.
> > >
> > > I'll check into the scratchpad.ss stuff as well as the mred gl canvas to see if
> > > it supports stereo windows.
> > >
> > > thanks,
> > > -Alex
> > >
> > > >
> > > > To get it to work in the scratchpad, it'll take some C++ work - I think we
> > > > need a low level render command which sets the current buffer to draw to
> > > > from scheme (via glDrawBuffer) and enumerate all the options.
> > > >
> > > > But however it's set, the place to make it work is from the frame
> > > > callback, which currently looks like this (and lives inside
> > > > scratchpad.ss):
> > > >
> > > > (define (fluxus-frame-callback)
> > > > (set-camera (get-camera-transform))
> > > > (framedump-update)
> > > > (begin-scene)
> > > > (if (not (null? user-callback))
> > > > (user-callback))
> > > > (end-scene)
> > > > (tick-physics)
> > > > (update-audio))
> > > >
> > > > We should be able to change it to something like:
> > > >
> > > > (define (fluxus-frame-callback)
> > > >
> > > > ; draw the left buffer
> > > > (draw-buffer 'back-left) ; or equivelent mred func call
> > > > (set-camera (mmul (get-camera-transform)
> > > > (mtranslate (vector -1 0 0)) ; move to the left
> > > > (begin-scene)
> > > > (if (not (null? user-callback))
> > > > (user-callback))
> > > > (end-scene)
> > > >
> > > > ; draw the right buffer
> > > > (draw-buffer 'back-right) ; or equivelent mred func call
> > > > (set-camera (mmul (get-camera-transform)
> > > > (mtranslate (vector 1 0 0)) ; move to the right
> > > > (begin-scene)
> > > > (if (not (null? user-callback))
> > > > (user-callback)) ; need to call the user callback twice, as immediate
> > > > ; mode objects will be lost the second time otherwise
> > > > (end-scene)
> > > >
> > > > ; update everything that should only be updated once per frame
> > > > (tick-physics)
> > > > (update-audio))
> > > >
> > > >
>
> > ? stereo-5-21-07
> > ? stereo-5-22-07
> > ? modules/fluxus-audio/src/AudioCollector.os
> > ? modules/fluxus-audio/src/FluxusAudio.os
> > ? modules/fluxus-audio/src/JackClient.os
> > ? modules/fluxus-engine/src/Engine.os
> > ? modules/fluxus-engine/src/FluxusEngine.os
> > ? modules/fluxus-engine/src/GlobalStateFunctions.os
> > ? modules/fluxus-engine/src/LightFunctions.os
> > ? modules/fluxus-engine/src/LocalStateFunctions.os
> > ? modules/fluxus-engine/src/MathsFunctions.os
> > ? modules/fluxus-engine/src/PDataFunctions.os
> > ? modules/fluxus-engine/src/PhysicsFunctions.os
> > ? modules/fluxus-engine/src/PrimitiveFunctions.os
> > ? modules/fluxus-engine/src/SchemeHelper.os
> > ? modules/fluxus-engine/src/TurtleBuilder.os
> > ? modules/fluxus-engine/src/TurtleFunctions.os
> > ? modules/fluxus-engine/src/UtilFunctions.os
> > ? modules/fluxus-osc/src/FluxusOSC.os
> > ? modules/fluxus-osc/src/OSCCore.os
> > ? modules/fluxus-osc/src/OSCServer.os
> > ? modules/scheme/scratchpad.ss-old
> > Index: examples/12-particles2.scm
> > ===================================================================
> > RCS file: /sources/fluxus/fluxus/examples/12-particles2.scm,v
> > retrieving revision 1.5
> > diff -r1.5 12-particles2.scm
> > 26c26,27
> > < (texture (load-texture "textures/smoke.png"))
> > ---
> > > ;(texture (load-texture "textures/smoke.png"))
> > > (texture (load-texture "/usr/local/src/fluxus-cvs/examples/textures/smoke.png"))
> > Index: libfluxus/src/Renderer.cpp
> > ===================================================================
> > RCS file: /sources/fluxus/fluxus/libfluxus/src/Renderer.cpp,v
> > retrieving revision 1.29
> > diff -r1.29 Renderer.cpp
> > 66a67
> > > m_StereoMode(noStereo),
> > 695a697,740
> > >
> > > void Renderer::DrawBuffer(const string &Modename){
> > > if(Modename == "back")
> > > glDrawBuffer(GL_BACK);
> > > else if(Modename == "back-right")
> > > glDrawBuffer(GL_BACK_RIGHT);
> > > else if(Modename == "back-left")
> > > glDrawBuffer(GL_BACK_LEFT);
> > > else if(Modename == "front")
> > > glDrawBuffer(GL_FRONT);
> > > else if(Modename == "front-right")
> > > glDrawBuffer(GL_FRONT_RIGHT);
> > > else if(Modename == "front-left")
> > > glDrawBuffer(GL_FRONT_LEFT);
> > > else if(Modename == "right")
> > > glDrawBuffer(GL_RIGHT);
> > > else if(Modename == "left")
> > > glDrawBuffer(GL_LEFT);
> > > else if(Modename == "front-and-back")
> > > glDrawBuffer(GL_FRONT_AND_BACK);
> > > else if(Modename == "none")
> > > glDrawBuffer(GL_NONE);
> > > else
> > > cerr<<Modename<<" is not a valid draw buffer"<<endl;
> > > }
> > >
> > > bool Renderer::SetStereoMode(stereo_mode_t mode){
> > > GLboolean stereoWindowTest;
> > > switch(mode){
> > > case noStereo: m_StereoMode = noStereo;
> > > return true;
> > > case crystalEyes:
> > > //test for a stereo window
> > > glGetBooleanv (GL_STEREO, &stereoWindowTest);
> > > if(stereoWindowTest){
> > > m_StereoMode = crystalEyes;
> > > return true;
> > > } else {
> > > m_StereoMode = noStereo;
> > > return false;
> > > }
> > > };
> > > return false;
> > > }
> > Index: libfluxus/src/Renderer.h
> > ===================================================================
> > RCS file: /sources/fluxus/fluxus/libfluxus/src/Renderer.h,v
> > retrieving revision 1.20
> > diff -r1.20 Renderer.h
> > 90a91
> > > void DrawBuffer(const string &Modename);
> > 135a137
> > >
> > 143a146,148
> > > enum stereo_mode_t {noStereo, crystalEyes};
> > > bool SetStereoMode(stereo_mode_t mode);
> > > stereo_mode_t GetStereoMode(){ return m_StereoMode;}
> > 173a179
> > > stereo_mode_t m_StereoMode;
> > Index: modules/fluxus-engine/src/GlobalStateFunctions.cpp
> > ===================================================================
> > RCS file: /sources/fluxus/fluxus/modules/fluxus-engine/src/GlobalStateFunctions.cpp,v
> > retrieving revision 1.8
> > diff -r1.8 GlobalStateFunctions.cpp
> > 593a594,662
> > > // StartFunctionDoc-en
> > > // draw-buffer buffer_name
> > > // Returns: void
> > > // Description:
> > > // Select which buffer to draw in
> > > // for stereo mode you'd do 'back-right and 'back-left
> > > // Example:
> > > // (draw-buffer 'back)
> > > // EndFunctionDoc
> > >
> > > Scheme_Object *draw_buffer(int argc, Scheme_Object **argv)
> > > {
> > > DECL_ARGV();
> > > ArgCheck("draw-buffer", "s", argc, argv);
> > > Engine::Get()->Renderer()->DrawBuffer(StringFromScheme(argv[0]));
> > > MZ_GC_UNREG();
> > > return scheme_void;
> > > }
> > >
> > > // StartFunctionDoc-en
> > > // set-stereo-mode mode
> > > // Returns: bool
> > > // Description:
> > > // select which stereo mode to use
> > > // Example:
> > > // (set-stereo-mode "crystal_eyes")
> > > // EndFunctionDoc
> > >
> > > Scheme_Object *set_stereo_mode(int argc, Scheme_Object **argv)
> > > {
> > > bool success;
> > > std::string val;
> > > DECL_ARGV();
> > > ArgCheck("set-stereo-mode", "s", argc, argv);
> > > val = StringFromScheme(argv[0]);
> > > if(val == "crystal-eyes")
> > > success = Engine::Get()->Renderer()->SetStereoMode(Renderer::crystalEyes);
> > > else if(val == "no-stereo")
> > > success = Engine::Get()->Renderer()->SetStereoMode(Renderer::noStereo);
> > > else {
> > > Engine::Get()->Renderer()->SetStereoMode(Renderer::noStereo);
> > > success = false;
> > > }
> > > MZ_GC_UNREG();
> > >
> > > if(success)
> > > return scheme_true;
> > > else
> > > return scheme_false;
> > > }
> > >
> > > Scheme_Object *get_stereo_mode(int argc, Scheme_Object **argv)
> > > {
> > > Renderer::stereo_mode_t mode;
> > > DECL_ARGV();
> > > mode = Engine::Get()->Renderer()->GetStereoMode();
> > > MZ_GC_UNREG();
> > >
> > > switch(mode){
> > > case Renderer::noStereo:
> > > return scheme_intern_symbol("no-stereo");
> > > case Renderer::crystalEyes:
> > > return scheme_intern_symbol("crystal-eyes");
> > > default:
> > > return scheme_intern_symbol("no_stereo");
> > > }
> > > }
> > >
> > >
> > 626a696,699
> > >
> > > scheme_add_global("draw-buffer", scheme_make_prim_w_arity(draw_buffer, "draw-buffer", 1, 1), env);
> > > scheme_add_global("set-stereo-mode", scheme_make_prim_w_arity(set_stereo_mode, "set-stereo-mode", 1, 1), env);
> > > scheme_add_global("get-stereo-mode", scheme_make_prim_w_arity(get_stereo_mode, "get-stereo-mode", 0, 0), env);
> > Index: modules/scheme/scratchpad.ss
> > ===================================================================
> > RCS file: /sources/fluxus/fluxus/modules/scheme/scratchpad.ss,v
> > retrieving revision 1.3
> > diff -r1.3 scratchpad.ss
> > 221d220
> > < (set-camera (get-camera-transform))
> > 223,226c222,252
> > < (begin-scene)
> > < (if (not (null? user-callback))
> > < (user-callback))
> > < (end-scene)
> > ---
> > >
> > > (if (eq? (get-stereo-mode) 'crystal-eyes)
> > > (let ((half_sep (/ 0.5 2)))
> > > (draw-buffer "back-left")
> > > (set-camera (mmul (get-camera-transform)
> > > (mtranslate (vector (- half_sep) 0 0))))
> > > (begin-scene)
> > > (if (not (null? user-callback))
> > > (user-callback))
> > > (end-scene)
> > >
> > > (draw-buffer "back-right")
> > > (set-camera (mmul (get-camera-transform)
> > > (mtranslate (vector half_sep 0 0))))
> > > (begin-scene)
> > > (if (not (null? user-callback))
> > > (user-callback))
> > > (end-scene)
> > > (draw-buffer "back")
> > > )
> > > (begin
> > > (draw-buffer "back")
> > > (set-camera (get-camera-transform))
> > > (begin-scene)
> > > (if (not (null? user-callback))
> > > (user-callback))
> > > (end-scene)
> > > )
> > > )
> > >
> > >
> > Index: src/main.cpp
> > ===================================================================
> > RCS file: /sources/fluxus/fluxus/src/main.cpp,v
> > retrieving revision 1.50
> > diff -r1.50 main.cpp
> > 149c149
> > < glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
> > ---
> > > glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL|GLUT_STEREO);
>
> > (require
> > (lib "gl.ss" "sgl")
> > (prefix gl- (lib "sgl.ss" "sgl")))
> >
> > (load-extension "/usr/local/lib/plt/collects/fluxus-0.12/extensions/fluxus-engine.so")
> > (require fluxus-engine)
> > ;(fluxus-init)
> > (clear-engine)
> >
> > (define ob '())
> >
> > (define (setup)
> > (clear-colour (vector 0 0 0))
> >
> > (let ((l (make-light "point" "free")))
> > (light-position l (vector 10 50 10)))
> >
> > ;(hint-unlit)
> > (shinyness 80)
> > (specular (vector 1 1 1))
> > (line-width 4)
> > ;(hint-wire)
> > (texture (load-texture "/usr/local/src/fluxus-cvs/examples/textures/refmap.png"))
> >
> > (push)
> > (hint-unlit)
> > (rotate (vector 180 90 0))
> > (scale (vector -10 -10 -10))
> > (build-sphere 6 6)
> > (pop)
> >
> > (colour (vector 0.5 0.5 1))
> > (scale (vector 3 3 3))
> > (set! ob (build-nurbs-sphere 20 20))
> > (grab ob)
> > ; more reference geometry for the deformation
> > (pdata-copy "p" "pref")
> > (ungrab))
> >
> > ; some sinewave deformation with time
> > (define (deform n)
> > (let ((v (vector (* 1 (sin (+ (flxtime) (* (vector-ref (pdata-get "pref" n) 1) 5.4)))) 0 0)))
> > (set! v (vmul v (* (sin (flxtime)) 0.5)))
> > (pdata-set "p" n (vadd v (pdata-get "pref" n))))
> > (if (< n 0)
> > 0
> > (deform (- n 1))))
> >
> >
> > ; take the eye and normal vectors and return the texture coordinates of the
> > ; reflection vector, calculated by converting them into a spherical lookup
> > ; this is a bad quality, but fast - and looks like it might be buggy
> > (define reflect
> > (lambda (eye normal)
> > (let ((refl (vmul (vsub eye normal) (vdot eye normal)))) ; reflection vec
> > (vector (+ (/ (vector-ref refl 0) 2) 0.5) ; s coord
> > (+ (/ (vector-ref refl 1) 2) 0.5) 0)))) ; t coord
> >
> > ; this is the interesting part, the facing ratio is the dot product of the direction we are looking
> > ; at the vertex from, and the normal of the vertex - where all vectors are normalised. the complex bit
> > ; is getting the incident direction, from the camera space transform (see below) and the vertex position
> > ; in worldspace.
> > (define (toon n camerapos obpos)
> > (let ((v (vadd obpos (pdata-get "p" n)))) ; find the vertex in worldspace
> > (let ((i (vnormalise (vsub v camerapos)))) ; incident direction (normalised)
> > (pdata-set "t" n (reflect i (pdata-get "n" n))))) ; set s to the facing ratio (i dot n)
> > (if (< n 0)
> > 0
> > (toon (- n 1) camerapos obpos)))
> >
> > (define (render)
> > (grab ob)
> > (deform (pdata-size))
> > (recalc-normals 1)
> > (toon (pdata-size)
> > ; transforming a vector gets that vector "into" the space of the transform, so 0,0,0 in camera
> > ; space is the camera position...
> > (vtransform (vector 0 0 0) (get-camera)) ; gets the eye position
> >
> > ; and 0,0,0 in object space is the object position
> > (vtransform (vector 0 0 0) (get-transform))) ; gets the object position
> > (ungrab))
> >
> >
> >
> > (define fluxus-canvas%
> > (class* canvas% ()
> > (inherit with-gl-context swap-gl-buffers)
> >
> > (define/override (on-paint)
> > (with-gl-context
> > (lambda ()
> >
> > ; draw the left buffer
> > (glDrawBuffer GL_BACK_LEFT)
> > (glClearColor 0.0 0.0 0.0 0.0)
> > (gl-clear 'color-buffer-bit 'depth-buffer-bit)
> >
> > ;(set-camera (mmul (get-camera-transform)
> > ;(set-camera (mmul (vtransform (vector 0 0 0) (get-camera))
> > ; (mtranslate (vector -1 0 0)))) ; move to the left
> > (begin-scene)
> > (if (null? ob) (setup))
> > (render)
> > (end-scene)
> >
> > ; draw the right buffer
> > (glDrawBuffer GL_BACK_RIGHT)
> > (glClearColor 0.0 0.0 0.0 0.0)
> > (gl-clear 'color-buffer-bit 'depth-buffer-bit)
> > ;(set-camera (mmul (get-camera-transform)
> > ; (mtranslate (vector 1 0 0)))) ; move to the right
> > (begin-scene)
> > (if (null? ob) (setup))
> > (render)
> > (end-scene) ; and here, and have to be inside a with-gl-context
> >
> > (swap-gl-buffers)
> > (super on-paint))))
> >
> > (define/override (on-size width height)
> > (with-gl-context
> > (lambda () 0)))
> >
> > (define stereo-gl-config (new gl-config%))
> > (send stereo-gl-config set-stereo #t)
> > ;(send stereo-gl-config get-stereo)
> > (super-instantiate () (style '(gl)) (gl-config stereo-gl-config))))
> > ;(super-instantiate () (style '(gl)))))
> >
> > (define frame (instantiate frame% ("fluxus in mred")))
> > (define fluxus-canvas (instantiate fluxus-canvas% (frame) (min-width 640) (min-height 400)))
> > (send frame show #t)
> >
>
-------------- next part --------------
? fluxus-stereo-5-22-07.diff
? stereo-5-21-07
? modules/fluxus-audio/src/AudioCollector.os
? modules/fluxus-audio/src/FluxusAudio.os
? modules/fluxus-audio/src/JackClient.os
? modules/fluxus-engine/src/Engine.os
? modules/fluxus-engine/src/FluxusEngine.os
? modules/fluxus-engine/src/GlobalStateFunctions.os
? modules/fluxus-engine/src/LightFunctions.os
? modules/fluxus-engine/src/LocalStateFunctions.os
? modules/fluxus-engine/src/MathsFunctions.os
? modules/fluxus-engine/src/PDataFunctions.os
? modules/fluxus-engine/src/PhysicsFunctions.os
? modules/fluxus-engine/src/PrimitiveFunctions.os
? modules/fluxus-engine/src/SchemeHelper.os
? modules/fluxus-engine/src/TurtleBuilder.os
? modules/fluxus-engine/src/TurtleFunctions.os
? modules/fluxus-engine/src/UtilFunctions.os
? modules/fluxus-osc/src/FluxusOSC.os
? modules/fluxus-osc/src/OSCCore.os
? modules/fluxus-osc/src/OSCServer.os
? modules/scheme/scratchpad.ss-old
Index: SConstruct
===================================================================
RCS file: /sources/fluxus/fluxus/SConstruct,v
retrieving revision 1.62
diff -r1.62 SConstruct
48a49,51
>
> if ARGUMENTS.get("STEREODEFAULT","0")=="1":
> env.Append(CCFLAGS=' -DSTEREODEFAULT')
Index: libfluxus/src/Renderer.cpp
===================================================================
RCS file: /sources/fluxus/fluxus/libfluxus/src/Renderer.cpp,v
retrieving revision 1.29
diff -r1.29 Renderer.cpp
66a67
> m_StereoMode(noStereo),
695a697,740
>
> void Renderer::DrawBuffer(const string &Modename){
> if(Modename == "back")
> glDrawBuffer(GL_BACK);
> else if(Modename == "back-right")
> glDrawBuffer(GL_BACK_RIGHT);
> else if(Modename == "back-left")
> glDrawBuffer(GL_BACK_LEFT);
> else if(Modename == "front")
> glDrawBuffer(GL_FRONT);
> else if(Modename == "front-right")
> glDrawBuffer(GL_FRONT_RIGHT);
> else if(Modename == "front-left")
> glDrawBuffer(GL_FRONT_LEFT);
> else if(Modename == "right")
> glDrawBuffer(GL_RIGHT);
> else if(Modename == "left")
> glDrawBuffer(GL_LEFT);
> else if(Modename == "front-and-back")
> glDrawBuffer(GL_FRONT_AND_BACK);
> else if(Modename == "none")
> glDrawBuffer(GL_NONE);
> else
> cerr<<Modename<<" is not a valid draw buffer"<<endl;
> }
>
> bool Renderer::SetStereoMode(stereo_mode_t mode){
> GLboolean stereoWindowTest;
> switch(mode){
> case noStereo: m_StereoMode = noStereo;
> return true;
> case crystalEyes:
> //test for a stereo window
> glGetBooleanv (GL_STEREO, &stereoWindowTest);
> if(stereoWindowTest){
> m_StereoMode = crystalEyes;
> return true;
> } else {
> m_StereoMode = noStereo;
> return false;
> }
> };
> return false;
> }
Index: libfluxus/src/Renderer.h
===================================================================
RCS file: /sources/fluxus/fluxus/libfluxus/src/Renderer.h,v
retrieving revision 1.20
diff -r1.20 Renderer.h
90a91
> void DrawBuffer(const string &Modename);
135a137
>
143a146,148
> enum stereo_mode_t {noStereo, crystalEyes};
> bool SetStereoMode(stereo_mode_t mode);
> stereo_mode_t GetStereoMode(){ return m_StereoMode;}
173a179
> stereo_mode_t m_StereoMode;
Index: modules/fluxus-engine/src/GlobalStateFunctions.cpp
===================================================================
RCS file: /sources/fluxus/fluxus/modules/fluxus-engine/src/GlobalStateFunctions.cpp,v
retrieving revision 1.8
diff -r1.8 GlobalStateFunctions.cpp
593a594,662
> // StartFunctionDoc-en
> // draw-buffer buffer_name
> // Returns: void
> // Description:
> // Select which buffer to draw in
> // for stereo mode you'd do 'back-right and 'back-left
> // Example:
> // (draw-buffer 'back)
> // EndFunctionDoc
>
> Scheme_Object *draw_buffer(int argc, Scheme_Object **argv)
> {
> DECL_ARGV();
> ArgCheck("draw-buffer", "s", argc, argv);
> Engine::Get()->Renderer()->DrawBuffer(StringFromScheme(argv[0]));
> MZ_GC_UNREG();
> return scheme_void;
> }
>
> // StartFunctionDoc-en
> // set-stereo-mode mode
> // Returns: bool
> // Description:
> // select which stereo mode to use
> // Example:
> // (set-stereo-mode "crystal_eyes")
> // EndFunctionDoc
>
> Scheme_Object *set_stereo_mode(int argc, Scheme_Object **argv)
> {
> bool success;
> std::string val;
> DECL_ARGV();
> ArgCheck("set-stereo-mode", "s", argc, argv);
> val = StringFromScheme(argv[0]);
> if(val == "crystal-eyes")
> success = Engine::Get()->Renderer()->SetStereoMode(Renderer::crystalEyes);
> else if(val == "no-stereo")
> success = Engine::Get()->Renderer()->SetStereoMode(Renderer::noStereo);
> else {
> Engine::Get()->Renderer()->SetStereoMode(Renderer::noStereo);
> success = false;
> }
> MZ_GC_UNREG();
>
> if(success)
> return scheme_true;
> else
> return scheme_false;
> }
>
> Scheme_Object *get_stereo_mode(int argc, Scheme_Object **argv)
> {
> Renderer::stereo_mode_t mode;
> DECL_ARGV();
> mode = Engine::Get()->Renderer()->GetStereoMode();
> MZ_GC_UNREG();
>
> switch(mode){
> case Renderer::noStereo:
> return scheme_intern_symbol("no-stereo");
> case Renderer::crystalEyes:
> return scheme_intern_symbol("crystal-eyes");
> default:
> return scheme_intern_symbol("no_stereo");
> }
> }
>
>
626a696,699
>
> scheme_add_global("draw-buffer", scheme_make_prim_w_arity(draw_buffer, "draw-buffer", 1, 1), env);
> scheme_add_global("set-stereo-mode", scheme_make_prim_w_arity(set_stereo_mode, "set-stereo-mode", 1, 1), env);
> scheme_add_global("get-stereo-mode", scheme_make_prim_w_arity(get_stereo_mode, "get-stereo-mode", 0, 0), env);
Index: modules/scheme/scratchpad.ss
===================================================================
RCS file: /sources/fluxus/fluxus/modules/scheme/scratchpad.ss,v
retrieving revision 1.3
diff -r1.3 scratchpad.ss
42a43,44
> get-eye-separation
> set-eye-separation
43a46,49
>
> (define eye-separation 0.3)
> (define (get-eye-separation) eye-separation)
> (define (set-eye-separation val) (set! eye-separation val))
221d226
< (set-camera (get-camera-transform))
223,226c228,264
< (begin-scene)
< (if (not (null? user-callback))
< (user-callback))
< (end-scene)
---
>
> (if (eq? (get-stereo-mode) 'crystal-eyes)
> (let ((half_sep (/ (get-eye-separation) 2)))
> (draw-buffer "back-left")
> (set-camera
> (mmul
> (mtranslate (vector (- half_sep) 0 0))
> (get-camera-transform)
> ))
> (begin-scene)
> (if (not (null? user-callback))
> (user-callback))
> (end-scene)
>
> (draw-buffer "back-right")
> (set-camera
> (mmul
> (mtranslate (vector half_sep 0 0))
> (get-camera-transform)
> ))
> (begin-scene)
> (if (not (null? user-callback))
> (user-callback))
> (end-scene)
> (draw-buffer "back")
> )
> (begin
> (draw-buffer "back")
> (set-camera (get-camera-transform))
> (begin-scene)
> (if (not (null? user-callback))
> (user-callback))
> (end-scene)
> )
> )
>
>
Index: src/main.cpp
===================================================================
RCS file: /sources/fluxus/fluxus/src/main.cpp,v
retrieving revision 1.50
diff -r1.50 main.cpp
121a122,126
> #ifdef STEREODEFAULT
> bool stereoWindow = true;
> #else
> bool stereoWindow = false;
> #endif
149c154,159
< glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
---
>
> if(stereoWindow)
> glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL|GLUT_STEREO);
> else
> glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
>
More information about the Fluxus
mailing list