mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 05:33:36 +00:00
lottie/expressions: support wiggle effect
usage: wiggle(freq, amp, octaves=1, amp_mult=.5, t=time) issue: https://github.com/thorvg/thorvg/issues/1640
This commit is contained in:
parent
558a9991de
commit
96d4ab1590
1 changed files with 51 additions and 3 deletions
|
@ -68,6 +68,25 @@ static ExpContent* _expcontent(LottieExpression* exp, float frameNo, LottieObjec
|
|||
}
|
||||
|
||||
|
||||
static float _rand()
|
||||
{
|
||||
return (float)(rand() % 10000001) * 0.0000001f;
|
||||
}
|
||||
|
||||
|
||||
static jerry_value_t _point2d(const Point& pt)
|
||||
{
|
||||
auto obj = jerry_object();
|
||||
auto v1 = jerry_number(pt.x);
|
||||
auto v2 = jerry_number(pt.y);
|
||||
jerry_object_set_index(obj, 0, v1);
|
||||
jerry_object_set_index(obj, 1, v2);
|
||||
jerry_value_free(v1);
|
||||
jerry_value_free(v2);
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
static void contentFree(void *native_p, struct jerry_object_native_info_t *info_p)
|
||||
{
|
||||
free(native_p);
|
||||
|
@ -603,8 +622,7 @@ static jerry_value_t _length(const jerry_call_info_t* info, const jerry_value_t
|
|||
|
||||
static jerry_value_t _random(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt)
|
||||
{
|
||||
auto val = (float)(rand() % 10000001);
|
||||
return jerry_number(val * 0.0000001f);
|
||||
return jerry_number(_rand());
|
||||
}
|
||||
|
||||
|
||||
|
@ -821,6 +839,32 @@ static jerry_value_t _speedAtTime(const jerry_call_info_t* info, const jerry_val
|
|||
}
|
||||
|
||||
|
||||
|
||||
static jerry_value_t _wiggle(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt)
|
||||
{
|
||||
auto data = static_cast<ExpContent*>(jerry_object_get_native_ptr(info->function, &freeCb));
|
||||
auto freq = jerry_value_as_number(args[0]);
|
||||
auto amp = jerry_value_as_number(args[1]);
|
||||
auto octaves = (argsCnt > 2) ? jerry_value_as_int32(args[2]) : 1;
|
||||
auto ampm = (argsCnt > 3) ? jerry_value_as_number(args[3]) : 5.0f;
|
||||
auto time = (argsCnt > 4) ? jerry_value_as_number(args[4]) : data->exp->comp->timeAtFrame(data->frameNo);
|
||||
|
||||
Point result = {100.0f, 100.0f};
|
||||
|
||||
for (int o = 0; o < octaves; ++o) {
|
||||
auto repeat = int(time * freq);
|
||||
auto frac = (time * freq - float(repeat)) * 1.25f;
|
||||
for (int i = 0; i < repeat; ++i) {
|
||||
result.x += (_rand() * 2.0f - 1.0f) * amp * frac;
|
||||
result.y += (_rand() * 2.0f - 1.0f) * amp * frac;
|
||||
}
|
||||
freq *= 2.0f;
|
||||
amp *= ampm;
|
||||
}
|
||||
return _point2d(result);
|
||||
}
|
||||
|
||||
|
||||
static bool _loopOutCommon(LottieExpression* exp, const jerry_value_t args[], const jerry_length_t argsCnt)
|
||||
{
|
||||
exp->loop.mode = LottieExpression::LoopMode::OutCycle;
|
||||
|
@ -1044,7 +1088,11 @@ static void _buildProperty(float frameNo, jerry_value_t context, LottieExpressio
|
|||
jerry_object_set_native_ptr(speedAtTime, nullptr, exp);
|
||||
jerry_value_free(speedAtTime);
|
||||
|
||||
//wiggle(freq, amp, octaves=1, amp_mult=.5, t=time)
|
||||
auto wiggle = jerry_function_external(_wiggle);
|
||||
jerry_object_set_sz(context, "wiggle", wiggle);
|
||||
jerry_object_set_native_ptr(wiggle, &freeCb, _expcontent(exp, frameNo, exp->object));
|
||||
jerry_value_free(wiggle);
|
||||
|
||||
//temporalWiggle(freq, amp, octaves=1, amp_mult=.5, t=time)
|
||||
//smooth(width=.2, samples=5, t=time)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue