osg.ValueStack是OpenSceneGraph的一个类,用于实现osg::StateAttribute值的栈。
osg::StateAttribute是属性状态的基类,例如材质的Diffuse颜色。osg::StateAttribute的所有派生类都可以作为osg::StateSet属性的一部分,osg::StateSet是OpenSceneGraph渲染状态的一个集合。osg::ValueStack就是用于对osg::StateAttribute的属性进行管理,是osg::StateSet的底层实现之一。
这个栈用于存储任意类型值的序列,当需要记录渲染状态时,可以把当前某个属性状态入栈,调用绘制函数,然后出栈,这样绘制函数就能获取到所需的值。同时,osg::ValueStack也可以协同渲染状态变化的持久化和更新。
osg::ValueStack使用如下方式定义:
template<class T> class /*ref*/ ValueStack : public osg::Referenced
{
public:
typedef T ValueType;
ValueStack();
ValueStack(const ValueStack&);
~ValueStack();
void clear();
void push(const ValueType& value);
ValueType& top();
const ValueType& top() const;
void pop();
void popAll(bool clearOldValues=true);
void erase(ValueType& value);
bool empty() const;
unsigned int size() const;
};
ValueStack模板类有一个类型参数T,代表存储的值类型。模板类继承于osg::Referenced类,说明ValueStack类可以使用OpenSceneGraph智能指针机制管理。ValueStack类提供了以下接口函数:
void clear():清空ValueStack中的所有值。
void push(const ValueType& value):将一个值value压入ValueStack。
ValueType& top():返回栈的顶部值的引用,可以修改这个值。
const ValueType& top() const:返回栈的顶部值的const引用,不可以修改这个值。
void pop():从栈中弹出顶部值,同时删除它。
void popAll(bool clearOldValues=true):删除栈中所有元素,如果参数clearOldValues为真,则同时清空旧的值(通过调用ValueType的析构函数来完成)。
void erase(ValueType& value):从栈中删除一个指定值value。
bool empty() const:判断ValueStack是否为空。
unsigned int size() const:返回ValueStack中值的数量。
以下是一个ValueStack的示例代码,展示了ValueStack的基本用法:
// 创建ValueStack
osg::ref_ptr<osg::ValueStack<osg::Vec4f> > colorStack = new osg::ValueStack<osg::Vec4f>;
// 压入值
osg::Vec4f color0(1.0f, 0.0f, 0.0f, 1.0f);
osg::Vec4f color1(0.0f, 1.0f, 0.0f, 1.0f);
osg::Vec4f color2(0.0f, 0.0f, 1.0f, 1.0f);
colorStack->push(color0);
colorStack->push(color1);
colorStack->push(color2);
// 获取值
osg::Vec4f color = colorStack->top();
std::cout << "Top: " << color << std::endl;
// 弹出值
colorStack->pop();
color = colorStack->top();
std::cout << "Top: " << color << std::endl;
// 删除值
colorStack->erase(color1);
// 清空ValueStack
colorStack->popAll(true);
// 判断ValueStack是否为空
if (colorStack->empty())
std::cout << "The color stack is empty." << std::endl;
else
std::cout << "The color stack is not empty." << std::endl;