X-Git-Url: http://git.tdb.fi/?p=libs%2Fdemoscene.git;a=blobdiff_plain;f=source%2Ffilmgrain.cpp;fp=source%2Ffilmgrain.cpp;h=151daf51344b2d3e442e022721f0607dcc3a610f;hp=0000000000000000000000000000000000000000;hb=77d0c7ac9e3ebe1cecaf0c84e1501d3b6459055f;hpb=1e3954a988c6d6d946260019f25a4ad3262e01c4 diff --git a/source/filmgrain.cpp b/source/filmgrain.cpp new file mode 100644 index 0000000..151daf5 --- /dev/null +++ b/source/filmgrain.cpp @@ -0,0 +1,156 @@ +#include +#include +#include +#include "filmgrain.h" +#include "resources.h" + +using namespace std; + +namespace Msp { +namespace DemoScene { + +FilmGrain::FilmGrain(unsigned s, unsigned l): + mesh(get_fullscreen_quad()), + shprog(Resources::get_builtins().get("filmgrain.glsl")), + size(s), + layers(l), + current_layer(0) +{ + grain.set_min_filter(GL::LINEAR); + grain.set_mag_filter(GL::LINEAR); + grain.set_wrap(GL::REPEAT); + grain.storage(GL::R8, size, size, layers, 1); + + generate_grain(); + + texturing.attach(1, grain); + shdata.uniform("grain", 1); + + set_coarseness(2.0f); + set_strength(0.1f); +} + +void FilmGrain::generate_grain() +{ + UInt8 *data = new UInt8[size*size*layers]; + + unsigned noise_size = size/2; + UInt8 *noise = new UInt8[noise_size*noise_size]; + Int16 *dbuf = new Int16[3*noise_size*noise_size]; + minstd_rand random; + + for(unsigned i=0; i(current_layer)); + texturing.attach(0, color); + renderer.set_texturing(&texturing); + renderer.set_shader_program(&shprog, &shdata); + mesh.draw(renderer); +} + + +FilmGrain::Template::Template(): + size(256), + layers(16), + coarseness(2.0f), + strength(0.1f) +{ } + +FilmGrain *FilmGrain::Template::create(unsigned, unsigned) const +{ + FilmGrain *grain = new FilmGrain(size, layers); + grain->set_coarseness(coarseness); + grain->set_strength(strength); + return grain; +} + + +FilmGrain::Template::Loader::Loader(Template &t): + DerivedObjectLoader(t) +{ + add("coarseness", &Template::coarseness); + add("layers", &Template::layers); + add("size", &Template::size); + add("strength", &Template::strength); +} + +} // namespace DemoScene +} // namespace Msp