//------------------------------------------------------------------------------
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();
}
Пример #2
0
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);
}
Пример #3
0
//------------------------------------------------------------------------------
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;
    }
}