diff --git a/simgear/scene/model/animation.cxx b/simgear/scene/model/animation.cxx index 31d0862..e8a241c 100644 --- a/simgear/scene/model/animation.cxx +++ b/simgear/scene/model/animation.cxx @@ -105,30 +105,28 @@ set_translation (osg::Matrix &matrix, double position_m, const SGVec3d &axis) * Modify property value by step and scroll settings in texture translations */ static double -apply_mods(double property, double step, double scroll, double bias) +apply_mods(double property, double step, double scroll, double bias=0) { - - double modprop; - property += bias; - if(step > 0) { - double scrollval = 0.0; - if(scroll > 0) { - // calculate scroll amount (for odometer like movement) - double remainder = step - fmod(fabs(property), step); - if (remainder < scroll) { - scrollval = (scroll - remainder) / scroll * step; - } - } - // apply stepping of input value - if(property > 0) - modprop = ((floor(property/step) * step) + scrollval); - else - modprop = ((ceil(property/step) * step) + scrollval); - } else { - modprop = property; - } - return modprop; - + property += bias; + if (step <= 0) return property; + if (scroll < 0) scroll = step * 1e-6; + + double sign(1.0); + if(property < 0) { + property = -property; + sign = -sign; + } + double quantized = step * floor(property/step); + + double scrollval(0.0); + if(scroll > 0) { + // calculate scroll amount (for odometer like movement) + double togo = step + quantized - property; + if (togo < scroll) { + scrollval = step * (scroll - togo) / scroll; + } + } + return sign * (quantized + scrollval); } /** @@ -234,7 +232,7 @@ public: _scale(1), _offset(0), _step(0), - _scroll(0), + _scroll(-1), _bias(0), _min(-SGLimitsd::max()), _max(SGLimitsd::max()) @@ -2030,7 +2028,7 @@ SGTexTransformAnimation::appendTexTranslate(const SGPropertyNode* config, SGTexTableValue* value; value = new SGTexTableValue(inputNode, table); value->setStep(config->getDoubleValue("step", 0)); - value->setScroll(config->getDoubleValue("scroll", 0)); + value->setScroll(config->getDoubleValue("scroll", -1)); value->setBias(config->getDoubleValue("bias", 0)); animationValue = value; } else { @@ -2039,7 +2037,7 @@ SGTexTransformAnimation::appendTexTranslate(const SGPropertyNode* config, value->setScale(config->getDoubleValue("factor", 1)); value->setOffset(config->getDoubleValue("offset", 0)); value->setStep(config->getDoubleValue("step", 0)); - value->setScroll(config->getDoubleValue("scroll", 0)); + value->setScroll(config->getDoubleValue("scroll", -1)); value->setBias(config->getDoubleValue("bias", 0)); value->setMin(config->getDoubleValue("min", -SGLimitsd::max())); value->setMax(config->getDoubleValue("max", SGLimitsd::max()));