//------------------------------------------------------------------------------ void HudTextureElement::init() { Texture * tex_object = s_texturemanager.getResource(texture_name_); if (!tex_object) return; osg::ref_ptr<osg::Texture2D> tex = tex_object->getOsgTexture(); osg::ref_ptr<osg::Image> image = tex->getImage(); aspect_ratio_ = (float)image->s() / image->t(); tex->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); tex->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); tex->setBorderColor(osg::Vec4(0,0,0,0)); tex->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_BORDER); tex->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_BORDER); getOrCreateStateSet()->setTextureAttributeAndModes(0,tex.get(),osg::StateAttribute::ON); setUseDisplayList(false); setUseVertexBufferObjects(true); addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4)); Color color = s_params.get<Color> ("hud." + section_ + ".color"); osg::Vec2Array* texcoord = new osg::Vec2Array(4); setTexCoordArray(0,texcoord); osg::Vec4Array * osg_color = new osg::Vec4Array(1); (*osg_color)[0].set(color.r_, color.g_, color.b_, color.a_); setColorArray(osg_color); setColorBinding(osg::Geometry::BIND_OVERALL); (*texcoord)[0].set(0,0); (*texcoord)[1].set(1,0); (*texcoord)[2].set(1,1); (*texcoord)[3].set(0,1); s_scene_manager.addObserver(ObserverCallbackFun0(this, &HudTextureElement::onResolutionChanged), SOE_RESOLUTION_CHANGED, &fp_group_); onResolutionChanged(); }
Widget::Widget(const std::string& name, point_type w, point_type h): _parent (0), _index (0), _layer (LAYER_LOW), _padLeft (0.0f), _padRight (0.0f), _padTop (0.0f), _padBottom (0.0f), _valign (VA_CENTER), _halign (HA_CENTER), _coordMode (CM_ABSOLUTE), _canFill (false), _canClone (true), _isManaged (false), _isStyled (false), _minWidth (0.0f), _minHeight (0.0f) { _name = name.size() ? name : generateRandomName("Widget"); if(!_norms.valid()) { _norms = new PointArray(1); (*_norms)[0].set(0.0f, 0.0f, 1.0f); (*_norms)[0].normalize(); } TexCoordArray* texs = new TexCoordArray(4); // Fill our texture coordinates with null stuff for now, since we aren't using them // until an Image is set at some later point. std::fill(texs->begin(), texs->end(), osg::Vec2(0.0f, 0.0f)); setUseDisplayList(false); setDataVariance(osg::Object::DYNAMIC); setVertexArray(new PointArray(4)); setColorArray(new ColorArray(4)); setNormalArray(_norms.get()); setTexCoordArray(0, texs); setNormalBinding(osg::Geometry::BIND_OVERALL); setColorBinding(osg::Geometry::BIND_PER_VERTEX); addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); setDimensions(0.0f, 0.0f, w, h); setColor(1.0f, 1.0f, 1.0f, 1.0f); }
//------------------------------------------------------------------------------ void HudBar::updateVb() { // Recreate buffers to reflect new size osg::Vec3Array * vertex = new osg::Vec3Array(4); // vec3 or computeBounds will complain setVertexArray(vertex); osg::Vec2Array* texcoord = new osg::Vec2Array(4); setTexCoordArray(0,texcoord); Vector2d pos; float size; getPositionAndSize(pos, size); switch (fill_direction_) { case HBFD_LEFT_RIGHT: (*vertex)[0].set(pos.x_, pos.y_, 0.0f); (*vertex)[1].set(pos.x_+size*aspect_ratio_*value_, pos.y_, 0.0f); (*vertex)[2].set(pos.x_+size*aspect_ratio_*value_, pos.y_+size, 0.0f); (*vertex)[3].set(pos.x_, pos.y_+size, 0.0f); (*texcoord)[0].set(0,0); (*texcoord)[1].set(value_,0); (*texcoord)[2].set(value_,1); (*texcoord)[3].set(0,1); break; case HBFD_RIGHT_LEFT: (*vertex)[0].set(pos.x_+size*aspect_ratio_*(1.0f-value_), pos.y_, 0.0f); (*vertex)[1].set(pos.x_+size*aspect_ratio_, pos.y_, 0.0f); (*vertex)[2].set(pos.x_+size*aspect_ratio_, pos.y_+size, 0.0f); (*vertex)[3].set(pos.x_+size*aspect_ratio_*(1.0f-value_), pos.y_+size, 0.0f); (*texcoord)[0].set(1-value_, 0); (*texcoord)[1].set(1, 0); (*texcoord)[2].set(1, 1); (*texcoord)[3].set(1-value_, 1); break; case HBFD_TOP_DOWN: (*vertex)[0].set(pos.x_, pos.y_+size*(1.0f-value_), 0.0f); (*vertex)[1].set(pos.x_+size*aspect_ratio_, pos.y_+size*(1.0f-value_), 0.0f); (*vertex)[2].set(pos.x_+size*aspect_ratio_, pos.y_+size, 0.0f); (*vertex)[3].set(pos.x_, pos.y_+size, 0.0f); (*texcoord)[0].set(0,1-value_); (*texcoord)[1].set(1,1-value_); (*texcoord)[2].set(1,1); (*texcoord)[3].set(0,1); break; case HBFD_BOTTOM_UP: (*vertex)[0].set(pos.x_, pos.y_, 0.0f); (*vertex)[1].set(pos.x_+size*aspect_ratio_, pos.y_, 0.0f); (*vertex)[2].set(pos.x_+size*aspect_ratio_, pos.y_+size*value_, 0.0f); (*vertex)[3].set(pos.x_, pos.y_+size*value_, 0.0f); (*texcoord)[0].set(0,0); (*texcoord)[1].set(1,0); (*texcoord)[2].set(1,value_); (*texcoord)[3].set(0,value_); break; } }