#include "camera.h"
-#include "framebuffer.h"
#include "renderable.h"
#include "renderer.h"
#include "view.h"
-using namespace std;
-
namespace Msp {
namespace GL {
-View::View(Graphics::Window &w, Graphics::GLContext &c):
- window(w),
- context(c),
- target(Framebuffer::system()),
- content(0)
+View::View(Framebuffer &t):
+ target(t),
+ camera(0),
+ content(0),
+ internal_renderer(0)
+{ }
+
+View::~View()
{
- window.signal_resize.connect(sigc::mem_fun(this, &View::window_resized));
+ delete internal_renderer;
}
void View::set_camera(Camera *c)
{
camera = c;
+ if(camera)
+ camera->set_aspect_ratio(get_aspect_ratio());
}
void View::set_content(Renderable *r)
content = r;
}
-void View::synchronize_camera_aspect(Camera &c)
+void View::render()
{
- synced_cameras.push_back(&c);
- c.set_aspect(static_cast<float>(window.get_width())/window.get_height());
+ if(!internal_renderer)
+ internal_renderer = new Renderer;
+ render(*internal_renderer);
}
-void View::render()
+void View::render(Renderer &renderer)
{
+ Bind bind_fbo(target);
target.clear(COLOR_BUFFER_BIT|DEPTH_BUFFER_BIT);
if(content)
{
- Renderer renderer(camera);
+ Renderer::Push push(renderer);
+ renderer.set_camera(*camera);
content->setup_frame(renderer);
content->render(renderer);
content->finish_frame();
}
- context.swap_buffers();
-}
-
-void View::window_resized(unsigned w, unsigned h)
-{
- target.viewport(0, 0, w, h);
- float aspect = static_cast<float>(w)/h;
- if(camera)
- camera->set_aspect(aspect);
- for(list<Camera *>::iterator i=synced_cameras.begin(); i!=synced_cameras.end(); ++i)
- (*i)->set_aspect(aspect);
}
} // namespace GL