From db44c91bdf15983ff1706efcd4c259940b0ced2c Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sun, 30 Apr 2023 23:33:34 +0300 Subject: [PATCH] [WiP] Weird story continues --- src/ReDIVA/x_pv_game.cpp | 50 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 1bb87ddc..f3bcacfd 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -8550,7 +8550,8 @@ void material_list_data::optimize() { i++; } - if (color.size() > 2) + while (color.size() > 2) { + bool optimized = false; for (size_t i = 0; i < length - 1; i++) for (size_t j = i + 1; j < length; j++) { size_t count = j - i; @@ -8583,9 +8584,56 @@ void material_list_data::optimize() { color.erase(color.begin() + (int32_t)end_value); i += count * 2; + optimized = true; break; } + if (!optimized) + break; + } + + while (color.size() > 2) { + bool optimized = false; + for (size_t i = 0; i < length - 1; i++) + for (size_t j = i + 1; j < length; j++) { + size_t count = j - i; + if (j + count > length || i + count * 2 + 1 >= length) + break; + + material_list_color* color_data = color.data(); + bool equal = true; + for (size_t k = 0, l = count * 2 + 1; k < count; k++, l--) + if (memcmp(&color_data[(int32_t)keys[i + k].value], + &color_data[(int32_t)keys[i + l].value], + sizeof(material_list_color))) { + equal = false; + break; + } + + if (!equal) + continue; + + float_t start_value = keys[i].value; + float_t end_value = keys[i + count * 2 + 1].value; + + for (size_t k = 1, l = count - 1; k <= count; k++, l--) { + keys[i + k + 1].tangent2 = -keys[i + k + 0].tangent2; + keys[i + k + 2].value = (float_t)(int32_t)l + start_value; + keys[i + k + 2].tangent1 = -keys[i + k + 1].tangent1; + } + + if (i + count * 2 + 2 == length) + color.erase(color.begin() + (int32_t)end_value); + + i += count * 2; + optimized = true; + break; + } + + if (!optimized) + break; + } + if (morph.size() > 1) { auto i_begin = morph.begin(); auto i_end = morph.end() - 1;