X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fstereoview.h;fp=source%2Fstereoview.h;h=63ee1834db7b27b2c9f67ea202c32bbf616198ba;hb=ca12f072923156f02b316b72e3b38bdb8cda5ebc;hp=0000000000000000000000000000000000000000;hpb=95743b7460a42cb21056a1a2c24897f01487c2b4;p=libs%2Fgl.git diff --git a/source/stereoview.h b/source/stereoview.h new file mode 100644 index 00000000..63ee1834 --- /dev/null +++ b/source/stereoview.h @@ -0,0 +1,73 @@ +#ifndef MSP_GL_STEREOVIEW_H_ +#define MSP_GL_STEREOVIEW_H_ + +#include "camera.h" +#include "framebuffer.h" +#include "renderable.h" +#include "renderbuffer.h" +#include "texture2d.h" + +namespace Msp { +namespace GL { + +class StereoCombiner; + +class StereoView: public Renderable +{ +private: + struct RenderTarget + { + Framebuffer fbo; + Texture2D color; + Renderbuffer depth; + + RenderTarget(unsigned, unsigned); + }; + + struct EyeParams + { + float fov; + float aspect; + float near_clip; + float far_clip; + }; + + struct Eye + { + mutable Camera camera; + RenderTarget *target; + + Eye(); + + void create_target(unsigned, unsigned); + void setup_frame(const Camera &, const Vector3 &, const EyeParams &) const; + void render(const Renderable &, const Tag &) const; + }; + + unsigned width; + unsigned height; + const Camera &base_camera; + const Renderable &renderable; + const StereoCombiner *combiner; + Eye left; + Eye right; + float eye_spacing; + mutable Vector3 offset_axis; + +public: + StereoView(unsigned, unsigned, const Camera &, const Renderable &, const StereoCombiner &); + + void set_combiner(const StereoCombiner &); + void set_eye_spacing(float); + + virtual void setup_frame() const; + virtual void finish_frame() const; + + virtual void render(const Tag & = Tag()) const; + virtual void render(Renderer &, const Tag & = Tag()) const; +}; + +} // namespace GL +} // namespace Msp + +#endif