diff --git a/source/application.cpp b/source/application.cpp index bb6cc57..ac69d27 100644 --- a/source/application.cpp +++ b/source/application.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include #include @@ -1503,6 +1505,8 @@ namespace gmtk pop_ = audio::load_mp3(io::read_full(std::move(*app::open_resource("sounds/pop.mp3")))); error_ = audio::load_mp3(io::read_full(std::move(*app::open_resource("sounds/error.mp3")))); + resolve_texture_.nearest_filter(); + context_.windowed(is_windowed_); init_menu(); } @@ -1510,6 +1514,14 @@ namespace gmtk void on_event(app::resize_event const & event) override { screen_size_ = event.size; + + multisample_renderbuffer_.storage(math::cast(event.size), 4); + multisample_framebuffer_.color(multisample_renderbuffer_); + multisample_framebuffer_.assert_complete("multisample"); + + resolve_texture_.load(math::cast(event.size)); + resolve_framebuffer_.color(resolve_texture_); + resolve_framebuffer_.assert_complete("resolve"); } void on_event(app::touch_down_event const & event) override @@ -2144,6 +2156,8 @@ namespace gmtk void present() override { + multisample_framebuffer_.bind(); + gl::ClearColor(1.f, 1.f, 1.f, 1.f); gl::Clear(gl::COLOR_BUFFER_BIT); @@ -2548,6 +2562,17 @@ namespace gmtk } painter_.render(math::orthographic_camera{view_box_}.transform()); + + multisample_framebuffer_.bind_read(); + resolve_framebuffer_.bind(); + + gl::Clear(gl::COLOR_BUFFER_BIT); + gl::BlitFramebuffer(0, 0, screen_size_[0], screen_size_[1], 0, 0, screen_size_[0], screen_size_[1], gl::COLOR_BUFFER_BIT, gl::NEAREST); + + gfx::framebuffer::null().bind(); + + painter_.texture(resolve_texture_, {{{-1.f, 1.f}, {-1.f, 1.f}}}); + painter_.render(math::matrix::identity()); } private: @@ -2746,6 +2771,12 @@ namespace gmtk gfx::painter painter_; + gfx::framebuffer multisample_framebuffer_; + gfx::renderbuffer multisample_renderbuffer_; + + gfx::framebuffer resolve_framebuffer_; + gfx::texture_2d resolve_texture_; + struct view_transition { location old; @@ -2937,6 +2968,7 @@ namespace psemek::app application::options options { .name = "Color Fractory", + .multisampling = 0, }; return default_application_factory(options);