Add a blend animation

This commit is contained in:
ehofman
2003-09-05 12:36:01 +00:00
parent 1dde23a0c9
commit d3db963dce
3 changed files with 96 additions and 0 deletions

View File

@@ -91,6 +91,31 @@ set_scale (sgMat4 &matrix, double x, double y, double z)
matrix[2][2] = z;
}
/**
* Recursively process all kids to change the alpha values
*/
static void
change_alpha( ssgBase *_branch, float _blend )
{
unsigned int i;
for (i = 0; i < ((ssgBranch *)_branch)->getNumKids(); i++)
change_alpha( ((ssgBranch *)_branch)->getKid(i), _blend );
if ( strcmp("ssgLeaf", _branch->getTypeName()) &&
strcmp("ssgVtxTable", _branch->getTypeName()) &&
strcmp("ssgVTable", _branch->getTypeName()) )
return;
int num_colors = ((ssgLeaf *)_branch)->getNumColours();
for (i = 0; i < num_colors; i++)
{
float *color = ((ssgLeaf *)_branch)->getColour(i);
color[3] = _blend;
}
}
/**
* Modify property value by step and scroll settings in texture translations
*/
@@ -414,6 +439,53 @@ SGRotateAnimation::update()
((ssgTransform *)_branch)->setTransform(_matrix);
}
////////////////////////////////////////////////////////////////////////
// Implementation of SGBlendAnimation
////////////////////////////////////////////////////////////////////////
SGBlendAnimation::SGBlendAnimation( SGPropertyNode *prop_root,
SGPropertyNode_ptr props )
: SGAnimation(props, new ssgTransform),
_prop((SGPropertyNode *)prop_root->getNode(props->getStringValue("property", "/null"), true)),
_offset(props->getDoubleValue("offset", 0.0)),
_factor(props->getDoubleValue("factor", 1.0)),
_table(read_interpolation_table(props)),
_has_min(props->hasValue("min")),
_min(props->getDoubleValue("min", 0.0)),
_has_max(props->hasValue("max")),
_max(props->getDoubleValue("max", 1.0)),
_prev_value(1.0)
{
}
SGBlendAnimation::~SGBlendAnimation ()
{
delete _table;
}
void
SGBlendAnimation::update()
{
double _blend;
if (_table == 0) {
_blend = 1.0 - (_prop->getDoubleValue() * _factor + _offset);
if (_has_min && (_blend < _min))
_blend = _min;
if (_has_max && (_blend > _max))
_blend = _max;
} else {
_blend = _table->interpolate(_prop->getDoubleValue());
}
if (_blend != _prev_value) {
_prev_value = _blend;
change_alpha( _branch, _blend );
}
}
////////////////////////////////////////////////////////////////////////

View File

@@ -221,6 +221,28 @@ private:
sgVec3 _axis;
};
/**
* Animation to blend an object.
*/
class SGBlendAnimation : public SGAnimation
{
public:
SGBlendAnimation( SGPropertyNode *prop_root,
SGPropertyNode_ptr props );
virtual ~SGBlendAnimation ();
virtual void update();
private:
SGPropertyNode_ptr _prop;
SGInterpTable * _table;
double _prev_value;
double _offset;
double _factor;
bool _has_min;
double _min;
bool _has_max;
double _max;
};
/**
* Animation to scale an object.
*/

View File

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