mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-04 04:37:55 +03:00
Don't try curve fitting if value is constant
This commit is contained in:
+52
-38
@@ -379,52 +379,66 @@ namespace Glitter {
|
||||
int32_t c = 0;
|
||||
size_t i;
|
||||
for (i = reverse_min_count - 1; i < left_count; i++) {
|
||||
double_t t1_accum = 0.0;
|
||||
double_t t2_accum = 0.0;
|
||||
for (size_t j = 1; j < i - 1; j++) {
|
||||
vec2d t = vec2d(
|
||||
(double_t)((j + 0) * step),
|
||||
(double_t)((j + 1) * step)
|
||||
) / (double_t)(i * step);
|
||||
vec2d t_1 = t - 1.0f;
|
||||
bool constant = true;
|
||||
for (size_t j = 1; j <= i; j++)
|
||||
if (memcmp(&a[0], &a[j], sizeof(double_t))
|
||||
|| memcmp(&b[0], &b[j], sizeof(double_t))) {
|
||||
constant = false;
|
||||
break;
|
||||
}
|
||||
|
||||
vec2d t1_t2 = (*(vec2d*)&a[j + 0] + *(vec2d*)&b[j + 0]) - (a[0] + b[0])
|
||||
- (t * 2.0 - 3.0) * (t * t) * ((a[0] + b[0]) - (a[i] + b[i]));
|
||||
t1_t2 /= t_1 * t;
|
||||
|
||||
double_t t1 = -t1_t2.x * t.y + t1_t2.y * t.x;
|
||||
double_t t2 = t1_t2.x * t_1.y - t1_t2.y * t_1.x;
|
||||
|
||||
t1_accum += t1;
|
||||
t2_accum += t2;
|
||||
}
|
||||
t1 = t1_accum / (double_t)(i - 2);
|
||||
t2 = t2_accum / (double_t)(i - 2);
|
||||
|
||||
constant = true;
|
||||
t1 = 0.0;
|
||||
t2 = 0.0;
|
||||
has_error = false;
|
||||
has_error_lerp = false;
|
||||
has_error_hermite = false;
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
double_t val = InterpolateHermite(a[0] + b[0], (a[i] + b[i]) - (a[0] + b[0]), t1, t2,
|
||||
0.0, (double_t)(i * step), (double_t)(j * step));
|
||||
double_t val_lerp = InterpolateLinear(a[0] + b[0], a[i] + b[i],
|
||||
0.0, (double_t)(i * step), (double_t)(j * step));
|
||||
if (fabs(val - (a[0] + b[j])) > reverse_bias[0]) {
|
||||
has_error = true;
|
||||
constant = false;
|
||||
if (fabs(val_lerp - (a[j] + b[j])) > reverse_bias[1]) {
|
||||
has_error_lerp = true;
|
||||
if (fabs(val - (a[j] + b[j])) > reverse_bias[2]) {
|
||||
has_error_hermite = true;
|
||||
break;
|
||||
|
||||
if (!constant) {
|
||||
double_t t1_accum = 0.0;
|
||||
double_t t2_accum = 0.0;
|
||||
for (size_t j = 1; j < i - 1; j++) {
|
||||
vec2d t = vec2d(
|
||||
(double_t)((j + 0) * step),
|
||||
(double_t)((j + 1) * step)
|
||||
) / (double_t)(i * step);
|
||||
vec2d t_1 = t - 1.0f;
|
||||
|
||||
vec2d t1_t2 = (*(vec2d*)&a[j + 0] + *(vec2d*)&b[j + 0]) - (a[0] + b[0])
|
||||
- (t * 2.0 - 3.0) * (t * t) * ((a[0] + b[0]) - (a[i] + b[i]));
|
||||
t1_t2 /= t_1 * t;
|
||||
|
||||
double_t t1 = -t1_t2.x * t.y + t1_t2.y * t.x;
|
||||
double_t t2 = t1_t2.x * t_1.y - t1_t2.y * t_1.x;
|
||||
|
||||
t1_accum += t1;
|
||||
t2_accum += t2;
|
||||
}
|
||||
t1 = t1_accum / (double_t)(i - 2);
|
||||
t2 = t2_accum / (double_t)(i - 2);
|
||||
|
||||
has_error = false;
|
||||
has_error_lerp = false;
|
||||
has_error_hermite = false;
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
double_t val = InterpolateHermite(a[0] + b[0], (a[i] + b[i]) - (a[0] + b[0]), t1, t2,
|
||||
0.0, (double_t)(i * step), (double_t)(j * step));
|
||||
double_t val_lerp = InterpolateLinear(a[0] + b[0], a[i] + b[i],
|
||||
0.0, (double_t)(i * step), (double_t)(j * step));
|
||||
if (fabs(val - (a[0] + b[j])) > reverse_bias[0]) {
|
||||
has_error = true;
|
||||
if (fabs(val_lerp - (a[j] + b[j])) > reverse_bias[1]) {
|
||||
has_error_lerp = true;
|
||||
if (fabs(val - (a[j] + b[j])) > reverse_bias[2]) {
|
||||
has_error_hermite = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fabs(t1) > 0.5 || fabs(t2) > 0.5)
|
||||
has_error_hermite = true;
|
||||
if (fabs(t1) > 0.5 || fabs(t2) > 0.5)
|
||||
has_error_hermite = true;
|
||||
}
|
||||
|
||||
if (!has_error_hermite) {
|
||||
t1_prev = t1;
|
||||
|
||||
@@ -214,51 +214,57 @@ int32_t interpolate_chs_reverse_sequence(
|
||||
break;
|
||||
}
|
||||
|
||||
if (!fast) {
|
||||
double_t t1_accum = 0.0;
|
||||
double_t t2_accum = 0.0;
|
||||
|
||||
size_t j = 1;
|
||||
for (; j < i - 1 && j + 3 <= i - 1; j += 3) {
|
||||
float_t t1a = 0.0f;
|
||||
float_t t2a = 0.0f;
|
||||
float_t t1b = 0.0f;
|
||||
float_t t2b = 0.0f;
|
||||
float_t t1c = 0.0f;
|
||||
float_t t2c = 0.0f;
|
||||
interpolate_chs_reverse_value(a, left_count, t1a, t2a, t1b, t2b, t1c, t2c, 0, i, j);
|
||||
t1_accum += t1a;
|
||||
t2_accum += t2a;
|
||||
t1_accum += t1b;
|
||||
t2_accum += t2b;
|
||||
t1_accum += t1c;
|
||||
t2_accum += t2c;
|
||||
}
|
||||
|
||||
for (; j < i - 1; j++) {
|
||||
float_t t1 = 0.0f;
|
||||
float_t t2 = 0.0f;
|
||||
interpolate_chs_reverse_value(a, left_count, t1, t2, 0, i, j);
|
||||
t1_accum += t1;
|
||||
t2_accum += t2;
|
||||
}
|
||||
t1 = (float_t)(t1_accum / (double_t)(i - 2));
|
||||
t2 = (float_t)(t2_accum / (double_t)(i - 2));
|
||||
}
|
||||
else
|
||||
interpolate_chs_reverse_value(a, left_count, t1, t2, 0, i, 1);
|
||||
|
||||
t1 = 0.0f;
|
||||
t2 = 0.0f;
|
||||
has_error = false;
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
float_t val = interpolate_chs_value(a[0], a[i], t1, t2, 0.0f, (float_t)i, (float_t)j);
|
||||
if (fabsf(val - a[j]) > reverse_bias) {
|
||||
has_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f)
|
||||
has_error = true;
|
||||
if (!constant) {
|
||||
if (!fast) {
|
||||
double_t t1_accum = 0.0;
|
||||
double_t t2_accum = 0.0;
|
||||
|
||||
size_t j = 1;
|
||||
for (; j < i - 1 && j + 3 <= i - 1; j += 3) {
|
||||
float_t t1a = 0.0f;
|
||||
float_t t2a = 0.0f;
|
||||
float_t t1b = 0.0f;
|
||||
float_t t2b = 0.0f;
|
||||
float_t t1c = 0.0f;
|
||||
float_t t2c = 0.0f;
|
||||
interpolate_chs_reverse_value(a, left_count, t1a, t2a, t1b, t2b, t1c, t2c, 0, i, j);
|
||||
t1_accum += t1a;
|
||||
t2_accum += t2a;
|
||||
t1_accum += t1b;
|
||||
t2_accum += t2b;
|
||||
t1_accum += t1c;
|
||||
t2_accum += t2c;
|
||||
}
|
||||
|
||||
for (; j < i - 1; j++) {
|
||||
float_t t1 = 0.0f;
|
||||
float_t t2 = 0.0f;
|
||||
interpolate_chs_reverse_value(a, left_count, t1, t2, 0, i, j);
|
||||
t1_accum += t1;
|
||||
t2_accum += t2;
|
||||
}
|
||||
t1 = (float_t)(t1_accum / (double_t)(i - 2));
|
||||
t2 = (float_t)(t2_accum / (double_t)(i - 2));
|
||||
}
|
||||
else
|
||||
interpolate_chs_reverse_value(a, left_count, t1, t2, 0, i, 1);
|
||||
|
||||
has_error = false;
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
float_t val = interpolate_chs_value(a[0], a[i], t1, t2, 0.0f, (float_t)i, (float_t)j);
|
||||
if (fabsf(val - a[j]) > reverse_bias) {
|
||||
has_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f)
|
||||
has_error = true;
|
||||
}
|
||||
|
||||
if (!has_error) {
|
||||
i_prev = i;
|
||||
|
||||
+49
-43
@@ -255,51 +255,57 @@ mot_key_set_type mot_set::fit_keys_into_curve(std::vector<float_t>& values_src,
|
||||
break;
|
||||
}
|
||||
|
||||
if (!fast) {
|
||||
double_t t1_accum = 0.0;
|
||||
double_t t2_accum = 0.0;
|
||||
|
||||
size_t j = 1;
|
||||
for (; j < i - 1 && j + 3 <= i - 1; j += 3) {
|
||||
float_t t1a = 0.0f;
|
||||
float_t t2a = 0.0f;
|
||||
float_t t1b = 0.0f;
|
||||
float_t t2b = 0.0f;
|
||||
float_t t1c = 0.0f;
|
||||
float_t t2c = 0.0f;
|
||||
interpolate_mot_reverse_value(a, left_count, t1a, t2a, t1b, t2b, t1c, t2c, 0, i, j);
|
||||
t1_accum += t1a;
|
||||
t2_accum += t2a;
|
||||
t1_accum += t1b;
|
||||
t2_accum += t2b;
|
||||
t1_accum += t1c;
|
||||
t2_accum += t2c;
|
||||
}
|
||||
|
||||
for (; j < i - 1; j++) {
|
||||
float_t t1 = 0.0f;
|
||||
float_t t2 = 0.0f;
|
||||
interpolate_mot_reverse_value(a, left_count, t1, t2, 0, i, j);
|
||||
t1_accum += t1;
|
||||
t2_accum += t2;
|
||||
}
|
||||
t1 = (float_t)(t1_accum / (double_t)(i - 2));
|
||||
t2 = (float_t)(t2_accum / (double_t)(i - 2));
|
||||
}
|
||||
else
|
||||
interpolate_mot_reverse_value(a, left_count, t1, t2, 0, i, 1);
|
||||
|
||||
t1 = 0.0f;
|
||||
t2 = 0.0f;
|
||||
has_error = false;
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
float_t val = interpolate_mot_value(a[0], a[i], t1, t2, 0.0f, (float_t)i, (float_t)j);
|
||||
if (fabsf(val - a[j]) > reverse_bias) {
|
||||
has_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f)
|
||||
has_error = true;
|
||||
if (!constant) {
|
||||
if (!fast) {
|
||||
double_t t1_accum = 0.0;
|
||||
double_t t2_accum = 0.0;
|
||||
|
||||
size_t j = 1;
|
||||
for (; j < i - 1 && j + 3 <= i - 1; j += 3) {
|
||||
float_t t1a = 0.0f;
|
||||
float_t t2a = 0.0f;
|
||||
float_t t1b = 0.0f;
|
||||
float_t t2b = 0.0f;
|
||||
float_t t1c = 0.0f;
|
||||
float_t t2c = 0.0f;
|
||||
interpolate_mot_reverse_value(a, left_count, t1a, t2a, t1b, t2b, t1c, t2c, 0, i, j);
|
||||
t1_accum += t1a;
|
||||
t2_accum += t2a;
|
||||
t1_accum += t1b;
|
||||
t2_accum += t2b;
|
||||
t1_accum += t1c;
|
||||
t2_accum += t2c;
|
||||
}
|
||||
|
||||
for (; j < i - 1; j++) {
|
||||
float_t t1 = 0.0f;
|
||||
float_t t2 = 0.0f;
|
||||
interpolate_mot_reverse_value(a, left_count, t1, t2, 0, i, j);
|
||||
t1_accum += t1;
|
||||
t2_accum += t2;
|
||||
}
|
||||
t1 = (float_t)(t1_accum / (double_t)(i - 2));
|
||||
t2 = (float_t)(t2_accum / (double_t)(i - 2));
|
||||
}
|
||||
else
|
||||
interpolate_mot_reverse_value(a, left_count, t1, t2, 0, i, 1);
|
||||
|
||||
has_error = false;
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
float_t val = interpolate_mot_value(a[0], a[i], t1, t2, 0.0f, (float_t)i, (float_t)j);
|
||||
if (fabsf(val - a[j]) > reverse_bias) {
|
||||
has_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f)
|
||||
has_error = true;
|
||||
}
|
||||
|
||||
if (!has_error) {
|
||||
i_prev = i;
|
||||
|
||||
@@ -9565,63 +9565,6 @@ static int x_pv_game_auth_3d_hrc_obj_bone_compare_func(void const* src1, void co
|
||||
return bone1->dst_name.compare(bone2->dst_name);
|
||||
}
|
||||
|
||||
static void auth_3d_key_rev(auth_3d_key& k, std::vector<float_t>& values_src) {
|
||||
std::vector<kft3> values;
|
||||
int32_t type = interpolate_chs_reverse_sequence(values_src, values);
|
||||
|
||||
k = {};
|
||||
switch (type) {
|
||||
case A3DA_KEY_NONE:
|
||||
k.type = AUTH_3D_KEY_NONE;
|
||||
k.value = 0.0f;
|
||||
return;
|
||||
case A3DA_KEY_STATIC:
|
||||
k.type = values[0].value != 0.0f ? AUTH_3D_KEY_STATIC : AUTH_3D_KEY_NONE;
|
||||
k.value = values[0].value;
|
||||
return;
|
||||
case A3DA_KEY_LINEAR:
|
||||
k.type = AUTH_3D_KEY_LINEAR;
|
||||
break;
|
||||
case A3DA_KEY_HERMITE:
|
||||
default:
|
||||
k.type = AUTH_3D_KEY_HERMITE;
|
||||
break;
|
||||
case A3DA_KEY_HOLD:
|
||||
k.type = AUTH_3D_KEY_HOLD;
|
||||
break;
|
||||
}
|
||||
|
||||
k.max_frame = (float_t)(values_src.size() + 1);
|
||||
k.frame_delta = k.max_frame;
|
||||
k.value_delta = 0.0f;
|
||||
|
||||
size_t length = values.size();
|
||||
if (length > 1) {
|
||||
k.keys_vec.assign(values.begin(), values.end());
|
||||
k.length = length;
|
||||
k.keys = k.keys_vec.data();
|
||||
|
||||
kft3* first_key = &k.keys[0];
|
||||
kft3* last_key = &k.keys[length - 1];
|
||||
if (first_key->frame < last_key->frame
|
||||
&& last_key->frame > 0.0f && k.max_frame > first_key->frame) {
|
||||
k.ep_type_pre = AUTH_3D_EP_NONE;
|
||||
k.ep_type_post = AUTH_3D_EP_NONE;
|
||||
k.frame_delta = last_key->frame - first_key->frame;
|
||||
k.value_delta = last_key->value - first_key->value;
|
||||
}
|
||||
}
|
||||
else if (length == 1) {
|
||||
float_t value = values.front().value;
|
||||
k.type = value != 0.0f ? AUTH_3D_KEY_STATIC : AUTH_3D_KEY_NONE;
|
||||
k.value = value;
|
||||
}
|
||||
else {
|
||||
k.type = AUTH_3D_KEY_NONE;
|
||||
k.value = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
#if BAKE_X_PACK
|
||||
static void x_pv_game_update_object_set(ObjsetInfo* info) {
|
||||
prj::shared_ptr<prj::stack_allocator> old_alloc = info->alloc_handler;
|
||||
|
||||
Reference in New Issue
Block a user