From 1d518a54914531d7a4fab3a6835b75de85bd7bc7 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Wed, 9 Jul 2014 19:18:31 +0000 Subject: Initial support for multi-layered materials, requires shaders files in the new format. --- src/ui/paint.cc | 119 +++++++++++++++++++++++++------------------------------- 1 file changed, 52 insertions(+), 67 deletions(-) (limited to 'src/ui/paint.cc') diff --git a/src/ui/paint.cc b/src/ui/paint.cc index cea363c..d33e1a3 100644 --- a/src/ui/paint.cc +++ b/src/ui/paint.cc @@ -76,15 +76,7 @@ void Paint::draw_rectangle_gradient(const math::Vector2f &global_location, const void Paint::draw_bitmap(const math::Vector2f &global_location, const math::Vector2f &size, const std::string &texture, const float preserve_aspect) { - // find the material - model::Material *material = model::Material::find(texture); - if (!material) { - material = new model::Material(texture); - model::Material::add(material); - material->set_texture(material->name()); - // ui btimaps are fullbright - material->set_flags(model::Material::FlagBright); - } + model::Material *material = model::Material::load(texture, true); math::Vector2f bitmap_location; math::Vector2f bitmap_size(size); @@ -101,39 +93,34 @@ void Paint::draw_bitmap(const math::Vector2f &global_location, const math::Vecto render::State::set_color(math::Color()); render::State::set_color_second(math::Color()); - render::State::use_material(material); - gl::begin(gl::Quads); - - glTexCoord2f(0.0f, 0.0f); - gl::vertex(bitmap_location.x(), bitmap_location.y()); + for (model::Material::Layers::const_iterator lit = material->layers().begin(); lit != material->layers().end(); ++lit) { + render::State::use_material_layer(material, *lit); + + gl::begin(gl::Quads); - glTexCoord2f(1.0f, 0.0f); - gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y()); + glTexCoord2f(0.0f, 0.0f); + gl::vertex(bitmap_location.x(), bitmap_location.y()); - glTexCoord2f(1.0f, 1.0f); - gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y() + bitmap_size.height()); + glTexCoord2f(1.0f, 0.0f); + gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y()); - glTexCoord2f(0.0f, 1.0f); - gl::vertex(bitmap_location.x(), bitmap_location.y() + bitmap_size.height()); + glTexCoord2f(1.0f, 1.0f); + gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y() + bitmap_size.height()); - gl::end(); + glTexCoord2f(0.0f, 1.0f); + gl::vertex(bitmap_location.x(), bitmap_location.y() + bitmap_size.height()); + gl::end(); + } + render::State::reset(); } // draw a bitmap and override material color void Paint::draw_bitmap(const math::Vector2f &global_location, const math::Vector2f &size, const math::Color & color, const std::string &texture, const float preserve_aspect) { - // find the material - model::Material *material = model::Material::find(texture); - if (!material) { - material = new model::Material(texture); - model::Material::add(material); - material->set_texture(material->name()); - // ui btimaps are fullbright - material->set_flags(model::Material::FlagBright); - } + model::Material *material = model::Material::load(texture, true); math::Vector2f bitmap_location; math::Vector2f bitmap_size(size); @@ -148,41 +135,36 @@ void Paint::draw_bitmap(const math::Vector2f &global_location, const math::Vecto } render::State::set_power(true); - render::State::use_material(material); - // this overrides material color - gl::color(color); - gl::begin(gl::Quads); + for (model::Material::Layers::const_iterator lit = material->layers().begin(); lit != material->layers().end(); ++lit) { + render::State::use_material_layer(material, *lit); + + // this overrides material color + gl::color(color); + + gl::begin(gl::Quads); - glTexCoord2f(0.0f, 0.0f); - gl::vertex(bitmap_location.x(), bitmap_location.y()); + glTexCoord2f(0.0f, 0.0f); + gl::vertex(bitmap_location.x(), bitmap_location.y()); - glTexCoord2f(1.0f, 0.0f); - gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y()); + glTexCoord2f(1.0f, 0.0f); + gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y()); - glTexCoord2f(1.0f, 1.0f); - gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y() + bitmap_size.height()); + glTexCoord2f(1.0f, 1.0f); + gl::vertex(bitmap_location.x() + bitmap_size.width(), bitmap_location.y() + bitmap_size.height()); - glTexCoord2f(0.0f, 1.0f); - gl::vertex(bitmap_location.x(), bitmap_location.y() + bitmap_size.height()); + glTexCoord2f(0.0f, 1.0f); + gl::vertex(bitmap_location.x(), bitmap_location.y() + bitmap_size.height()); - gl::end(); - - render::State::reset(); + gl::end(); + render::State::reset(); + } } void Paint::draw_material(const math::Vector2f &global_location, const math::Vector2f &size, const std::string &texture) { - // find the material - model::Material *material = model::Material::find(texture); - if (!material) { - material = new model::Material(texture); - model::Material::add(material); - material->set_texture(material->name()); - // ui btimaps are fullbright - material->set_flags(model::Material::FlagBright); - } + model::Material *material = model::Material::load(texture, true); // use global coordinates const float w0 = global_location.x() / material->size().width(); @@ -194,25 +176,28 @@ void Paint::draw_material(const math::Vector2f &global_location, const math::Vec render::State::set_power(true); render::State::set_color(math::Color()); render::State::set_color_second(math::Color()); - render::State::use_material(material); - gl::begin(gl::Quads); - - glTexCoord2f(w0, h0); - gl::vertex(global_location.x(), global_location.y()); + + for (model::Material::Layers::const_iterator lit = material->layers().begin(); lit != material->layers().end(); ++lit) { + render::State::use_material_layer(material, *lit); + + gl::begin(gl::Quads); - glTexCoord2f(w1, h0); - gl::vertex(global_location.x() + size.width(), global_location.y()); + glTexCoord2f(w0, h0); + gl::vertex(global_location.x(), global_location.y()); - glTexCoord2f(w1, h1); - gl::vertex(global_location.x() + size.width(), global_location.y() + size.height()); + glTexCoord2f(w1, h0); + gl::vertex(global_location.x() + size.width(), global_location.y()); - glTexCoord2f(w0, h1); - gl::vertex(global_location.x(), global_location.y() + size.height()); + glTexCoord2f(w1, h1); + gl::vertex(global_location.x() + size.width(), global_location.y() + size.height()); - gl::end(); + glTexCoord2f(w0, h1); + gl::vertex(global_location.x(), global_location.y() + size.height()); - render::State::reset(); + gl::end(); + render::State::reset(); + } } // draw unaligned text -- cgit v1.2.3