Frederic Bouvier:

The attached patch adds a new animation class, called SGAlphaTestAnimation, to enable alpha test in 3D models.
This will remove many artefact caused by painting order of translucent models, and I need it for an upcoming model. In addition, I added a min-factor and a max-factor to the range animation to modulate min-m, min-property, max-m or max-property.
This commit is contained in:
ehofman 2004-01-07 09:07:57 +00:00
parent 7bee5f1ab6
commit 3d43bc0480
3 changed files with 85 additions and 11 deletions

View File

@ -217,23 +217,34 @@ SGNullAnimation::~SGNullAnimation ()
SGRangeAnimation::SGRangeAnimation (SGPropertyNode *prop_root,
SGPropertyNode_ptr props)
: SGAnimation(props, new ssgRangeSelector),
_min(0.0), _max(0.0)
_min(0.0), _max(0.0), _min_factor(1.0), _max_factor(1.0)
{
float ranges[2];
SGPropertyNode_ptr node = props->getChild( "min-property" );
SGPropertyNode_ptr node = props->getChild( "min-factor" );
if (node != 0) {
_min_factor = props->getFloatValue("min-factor", 1.0);
}
node = props->getChild( "max-factor" );
if (node != 0) {
_max_factor = props->getFloatValue("max-factor", 1.0);
}
node = props->getChild( "min-property" );
if (node != 0) {
_min_prop = (SGPropertyNode *)prop_root->getNode(node->getStringValue(), true);
ranges[0] = _min_prop->getFloatValue();
ranges[0] = _min_prop->getFloatValue() * _min_factor;
} else {
ranges[0] = _min = props->getFloatValue("min-m", 0);
_min = props->getFloatValue("min-m", 0);
ranges[0] = _min * _min_factor;
}
node = props->getChild( "max-property" );
if (node != 0) {
_max_prop = (SGPropertyNode *)prop_root->getNode(node->getStringValue(), true);
ranges[1] = _max_prop->getFloatValue();
ranges[1] = _max_prop->getFloatValue() * _max_factor;
} else {
ranges[1] = _max = props->getFloatValue("max-m", 0);
_max = props->getFloatValue("max-m", 0);
ranges[1] = _max * _max_factor;
}
((ssgRangeSelector *)_branch)->setRanges(ranges, 2);
}
@ -248,19 +259,20 @@ SGRangeAnimation::update()
float ranges[2];
bool upd = false;
if (_min_prop != 0) {
ranges[0] = _min_prop->getFloatValue();
ranges[0] = _min_prop->getFloatValue() * _min_factor;
upd = true;
} else {
ranges[0] = _min;
ranges[0] = _min * _min_factor;
}
if (_max_prop != 0) {
ranges[1] = _max_prop->getFloatValue();
ranges[1] = _max_prop->getFloatValue() * _max_factor;
upd = true;
} else {
ranges[1] = _max;
ranges[1] = _max * _max_factor;
}
if (upd)
if (upd) {
((ssgRangeSelector *)_branch)->setRanges(ranges, 2);
}
}
@ -854,4 +866,45 @@ SGTexMultipleAnimation::update()
((ssgTexTrans *)_branch)->setTransform(tmatrix);
}
////////////////////////////////////////////////////////////////////////
// Implementation of SGAlphaTestAnimation
////////////////////////////////////////////////////////////////////////
SGAlphaTestAnimation::SGAlphaTestAnimation (SGPropertyNode *prop_root,
SGPropertyNode_ptr props)
: SGAnimation(props, new ssgBranch),
_done(false)
{
_alpha_clamp = props->getFloatValue("alpha-factor", 0.0);
}
SGAlphaTestAnimation::~SGAlphaTestAnimation ()
{
}
void SGAlphaTestAnimation::update()
{
if (!_done) {
_done = true;
setAlphaClampToBranch(_branch,_alpha_clamp);
}
}
void SGAlphaTestAnimation::setAlphaClampToBranch(ssgBranch *b, float clamp)
{
int nb = b->getNumKids();
for (int i = 0; i<nb; i++) {
ssgEntity *e = b->getKid(i);
if (e->isAKindOf(ssgTypeLeaf())) {
ssgSimpleState*s = (ssgSimpleState*)((ssgLeaf*)e)->getState();
s->enable( GL_ALPHA_TEST );
s->setAlphaClamp( clamp );
} else if (e->isAKindOf(ssgTypeBranch())) {
setAlphaClampToBranch( (ssgBranch*)e, clamp );
}
}
}
// end of animation.cxx

View File

@ -108,6 +108,8 @@ private:
SGPropertyNode_ptr _max_prop;
float _min;
float _max;
float _min_factor;
float _max_factor;
};
@ -379,4 +381,21 @@ private:
};
/**
* An animation to enable the alpha test
*/
class SGAlphaTestAnimation : public SGAnimation
{
public:
SGAlphaTestAnimation (SGPropertyNode *prop_root,
SGPropertyNode_ptr props);
virtual ~SGAlphaTestAnimation ();
virtual void update();
private:
void setAlphaClampToBranch(ssgBranch *b, float clamp);
bool _done;
float _alpha_clamp;
};
#endif // _SG_ANIMATION_HXX

View File

@ -130,6 +130,8 @@ sgMakeAnimation( ssgBranch * model,
animation = new SGTexMultipleAnimation(prop_root, node);
} else if (!strcmp("blend", type)) {
animation = new SGBlendAnimation(prop_root, node);
} else if (!strcmp("alpha-test", type)) {
animation = new SGAlphaTestAnimation(prop_root, node);
} else {
animation = new SGNullAnimation(node);
SG_LOG(SG_INPUT, SG_WARN, "Unknown animation type " << type);