From 4e97fa8a23f1516431358d9b8ea5929202af92c9 Mon Sep 17 00:00:00 2001 From: Unreal Karaulov Date: Wed, 13 Dec 2023 14:03:17 +0300 Subject: [PATCH] Add settings tab to lang files. Add settings tab to lang files. Preparing for lightmap scale --- cfg/language.ini | 9 +++++- cfg/language_ru.ini | 29 ++++++++++------- src/editor/Gui.cpp | 52 +++++++++++++++++++++-------- src/gl/primitives.h | 2 ++ src/util/util.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++ src/util/util.h | 5 ++- 6 files changed, 149 insertions(+), 27 deletions(-) diff --git a/cfg/language.ini b/cfg/language.ini index d502c466..5fb5cc45 100644 --- a/cfg/language.ini +++ b/cfg/language.ini @@ -1181,4 +1181,11 @@ LANG_1180 = No entity selected LANG_ERROR_TEXLEN = Warning: {} texture can not be readed.\n LANG_FGD_BAD_OFFSET = ERROR: Expected 3 components in offset() property (line {}) in FGD {}\n LANG_DUMP_TEX = Dump Textures -LANG_DUMP_TEX_DESC = Dump all loaded textures to .png files. \ No newline at end of file +LANG_DUMP_TEX_DESC = Dump all loaded textures to .png files. +LANG_SETTINGS_GENERAL = General +LANG_SETTINGS_FGDPATH = FGD's path +LANG_SETTINGS_WADPATH = WAD's path +LANG_SETTINGS_OPTIMIZE = Optimizing +LANG_SETTINGS_LIMITS = Limits +LANG_SETTINGS_RENDER = Rendering +LANG_SETTINGS_CONTROL = Controls \ No newline at end of file diff --git a/cfg/language_ru.ini b/cfg/language_ru.ini index a5f9e939..c79d39d8 100644 --- a/cfg/language_ru.ini +++ b/cfg/language_ru.ini @@ -708,7 +708,7 @@ LANG_0706 = прокрутка LANG_0707 = Очистить LANG_0708 = Автоматическая прокрутка LANG_0709 = левая панель -LANG_0710 = Применить настройки +LANG_0710 = Применить LANG_0711 = представление элемента LANG_0712 = содержимое правой панели LANG_0713 = Папка с игрой: @@ -719,21 +719,21 @@ LANG_0717 = ##workdir LANG_0718 = ...##workdir LANG_0719 = Размер шрифта LANG_0720 = %f пикселей -LANG_0721 = Уровни отмены -LANG_0722 = Подробное журналирование -LANG_0723 = Подробное журналирование нельзя отключить в РЕЖИМЕ ОТЛАДКИ +LANG_0721 = Уровней отмены +LANG_0722 = Подробные логи +LANG_0723 = Подробные логи нельзя отключить в РЕЖИМЕ ОТЛАДКИ LANG_0724 = Создать резервную копию карты LANG_0725 = Создает резервную копию файла BSP при первом сохранении. LANG_0726 = Сохранять CRC карты LANG_0727 = Изменять CRC оригинальной карты после редактирования. -LANG_0728 = Автоматический импорт файла объекта -LANG_0729 = Автоматически импортировать файл объекта при открытии карты. -LANG_0730 = Одинаковая директория для файла объекта -LANG_0731 = Использовать ту же директорию, что и файл BSP, для импорта и экспорта файла объекта. +LANG_0728 = Автоматический импорт .ent файла +LANG_0729 = Автоматически импортировать .ent файл объектов при открытии карты. +LANG_0730 = Экспортировать .ent в папку с картой +LANG_0731 = Использовать ту же директорию, что и файл BSP, для импорта и экспорта .ent файла. LANG_0732 = Сохранять состояние окон LANG_0733 = Сохранять положение и состояние окон. -LANG_0734 = Загружать пустой список по умолчанию -LANG_0735 = Если включено, загружать список настроек по умолчанию, если список пуст. +LANG_0734 = Загружать списки по умолчанию +LANG_0735 = Если включено, загружать список настроек сущностей по умолчанию, если список пуст. LANG_0736 = (список примерных сущностей, пути res и т. д.) LANG_0737 = Переместить камеру к первой сущности LANG_0738 = Если включено, камера перемещается к первой сущности player_start/player_deathmatch/trigger_camera. @@ -1180,4 +1180,11 @@ LANG_1180 = Ни одна сущность не выбрана LANG_ERROR_TEXLEN = Предупреждение: не удалось прочитать текстуру {}\n LANG_FGD_BAD_OFFSET = ОШИБКА: Ожидаемые 3 компонента в свойстве offset() (строка {}) в FGD {}\n LANG_DUMP_TEX = Выгрузить текстуры -LANG_DUMP_TEX_DESC = Выгрузить все загруженные текстуры в файлы .png. \ No newline at end of file +LANG_DUMP_TEX_DESC = Выгрузить все загруженные текстуры в файлы .png. +LANG_SETTINGS_GENERAL = Основные +LANG_SETTINGS_FGDPATH = Путь к .fgd +LANG_SETTINGS_WADPATH = Путь к .wad +LANG_SETTINGS_OPTIMIZE = Оптимизация +LANG_SETTINGS_LIMITS = Лимиты +LANG_SETTINGS_RENDER = Графика +LANG_SETTINGS_CONTROL = Управление \ No newline at end of file diff --git a/src/editor/Gui.cpp b/src/editor/Gui.cpp index 3b109b57..f94284d9 100644 --- a/src/editor/Gui.cpp +++ b/src/editor/Gui.cpp @@ -5435,14 +5435,14 @@ void Gui::drawSettings() static int fgdSelected = 0; - static const char* tab_titles[settings_tabs] = { - "General", - "FGDs", - "Asset Paths", - "Optimizing", - "Limits", - "Rendering", - "Controls" + std::string tab_titles[settings_tabs] = { + get_localized_string("LANG_SETTINGS_GENERAL"), + get_localized_string("LANG_SETTINGS_FGDPATH"), + get_localized_string("LANG_SETTINGS_WADPATH"), + get_localized_string("LANG_SETTINGS_OPTIMIZE"), + get_localized_string("LANG_SETTINGS_LIMITS"), + get_localized_string("LANG_SETTINGS_RENDER"), + get_localized_string("LANG_SETTINGS_CONTROL") }; // left @@ -5450,7 +5450,7 @@ void Gui::drawSettings() for (int i = 0; i < settings_tabs; i++) { - if (ImGui::Selectable(tab_titles[i], settingsTab == i)) + if (ImGui::Selectable(tab_titles[i].c_str(), settingsTab == i)) settingsTab = i; } @@ -5473,7 +5473,7 @@ void Gui::drawSettings() ImGui::BeginGroup(); float footerHeight = settingsTab <= 2 ? ImGui::GetFrameHeightWithSpacing() + 4.f : 0.f; ImGui::BeginChild(get_localized_string(LANG_0711).c_str(), ImVec2(0, -footerHeight)); // Leave room for 1 line below us - ImGui::Text(tab_titles[settingsTab]); + ImGui::Text(tab_titles[settingsTab].c_str()); ImGui::Separator(); if (reloadSettings) @@ -8067,7 +8067,7 @@ void Gui::drawFaceEditorWidget() if (ImGui::Begin(get_localized_string(LANG_0870).c_str(), &showFaceEditWidget)) { static float scaleX, scaleY, shiftX, shiftY; - static int lmSize[2]; + static std::vector> lightmapSizes{}; static float rotateX, rotateY; static bool lockRotate = true; static int bestplane; @@ -8170,10 +8170,19 @@ void Gui::drawFaceEditorWidget() tmpStyles[i] = face.nStyles[i]; } + lightmapSizes.clear(); + + int lmSize[2]; + GetFaceLightmapSize(map, faceIdx, lmSize); + lightmapSizes.push_back({ lmSize[0],lmSize[1] }); + + // show default values if not all faces share the same values for (int i = 1; i < app->pickInfo.selectedFaces.size(); i++) { int faceIdx2 = app->pickInfo.selectedFaces[i]; + GetFaceLightmapSize(map, faceIdx2, lmSize); + lightmapSizes.push_back({ lmSize[0],lmSize[1] }); BSPFACE32& face2 = map->faces[faceIdx2]; BSPTEXTUREINFO& texinfo2 = map->texinfos[face2.iTextureInfo]; @@ -8194,8 +8203,6 @@ void Gui::drawFaceEditorWidget() } } - GetFaceLightmapSize(map, faceIdx, lmSize); - for (int e = face.iFirstEdge; e < face.iFirstEdge + face.nEdges; e++) { int edgeIdx = map->surfedges[e]; @@ -8224,7 +8231,7 @@ void Gui::drawFaceEditorWidget() ImGui::PushItemWidth(inputWidth); if (app->pickInfo.selectedFaces.size() == 1) - ImGui::Text(fmt::format(fmt::runtime(get_localized_string(LANG_0422)), lmSize[0], lmSize[1], lmSize[0] * lmSize[1]).c_str()); + ImGui::Text(fmt::format(fmt::runtime(get_localized_string(LANG_0422)), lightmapSizes[0][0], lightmapSizes[0][1], lightmapSizes[0][0] * lightmapSizes[0][1]).c_str()); ImGui::Text(get_localized_string(LANG_1169).c_str()); @@ -8554,6 +8561,23 @@ void Gui::drawFaceEditorWidget() } mapRenderer->updateFaceUVs(faceIdx); + + + if ((updatedFaceVec || scaledX || scaledY || shiftedX || shiftedY || stylesChanged + || refreshSelectedFaces || updatedTexVec || mergeFaceVec)) + { + for (int n = 0; n < app->pickInfo.selectedFaces.size(); n++) + { + int lmSize[2]; + GetFaceLightmapSize(map, app->pickInfo.selectedFaces[n], lmSize); + if (lmSize[0] != lightmapSizes[n][0] || + lmSize[1] != lightmapSizes[n][1]) + { + print_log(PRINT_GREEN | PRINT_RED | PRINT_INTENSITY, "Warning need resize lightmap face {} from {}x{} to {}x{}\n", + app->pickInfo.selectedFaces[n], lightmapSizes[n][0], lightmapSizes[n][1], lmSize[0], lmSize[1]); + } + } + } } if (updatedFaceVec && app->pickInfo.selectedFaces.size() == 1) diff --git a/src/gl/primitives.h b/src/gl/primitives.h index a43a6467..627f699d 100644 --- a/src/gl/primitives.h +++ b/src/gl/primitives.h @@ -37,7 +37,9 @@ struct lightmapVert // last value scales the lightmap brightness float luv[MAXLIGHTMAPS][3]; + // color float r, g, b, a; + vec3 pos; }; diff --git a/src/util/util.cpp b/src/util/util.cpp index 364ca61b..2a85da61 100644 --- a/src/util/util.cpp +++ b/src/util/util.cpp @@ -1568,3 +1568,82 @@ void FixupAllSystemPaths() float floatRound(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } + + +void scaleImage(const COLOR4 * inputImage, std::vector& outputImage, + int inputWidth, int inputHeight, int outputWidth, int outputHeight) { + outputImage.resize(outputWidth * outputHeight); + + float xScale = static_cast(inputWidth) / outputWidth; + float yScale = static_cast(inputHeight) / outputHeight; + + for (int y = 0; y < outputHeight; y++) { + for (int x = 0; x < outputWidth; x++) { + float srcX = x * xScale; + float srcY = y * yScale; + + int x1 = static_cast(srcX); + int y1 = static_cast(srcY); + int x2 = x1 + 1; + int y2 = y1 + 1; + + float xWeight = srcX - x1; + float yWeight = srcY - y1; + + COLOR4 topLeft = inputImage[y1 * inputWidth + x1]; + COLOR4 topRight = inputImage[y1 * inputWidth + x2]; + COLOR4 bottomLeft = inputImage[y2 * inputWidth + x1]; + COLOR4 bottomRight = inputImage[y2 * inputWidth + x2]; + + COLOR4 interpolatedColor; + interpolatedColor.r = (1 - xWeight) * ((1 - yWeight) * topLeft.r + yWeight * bottomLeft.r) + + xWeight * ((1 - yWeight) * topRight.r + yWeight * bottomRight.r); + interpolatedColor.g = (1 - xWeight) * ((1 - yWeight) * topLeft.g + yWeight * bottomLeft.g) + + xWeight * ((1 - yWeight) * topRight.g + yWeight * bottomRight.g); + interpolatedColor.b = (1 - xWeight) * ((1 - yWeight) * topLeft.b + yWeight * bottomLeft.b) + + xWeight * ((1 - yWeight) * topRight.b + yWeight * bottomRight.b); + interpolatedColor.a = (1 - xWeight) * ((1 - yWeight) * topLeft.a + yWeight * bottomLeft.a) + + xWeight * ((1 - yWeight) * topRight.a + yWeight * bottomRight.a); + + outputImage[y * outputWidth + x] = interpolatedColor; + } + } +} + +void scaleImage(const COLOR3 * inputImage, std::vector& outputImage, + int inputWidth, int inputHeight, int outputWidth, int outputHeight) { + outputImage.resize(outputWidth * outputHeight); + + float xScale = static_cast(inputWidth) / outputWidth; + float yScale = static_cast(inputHeight) / outputHeight; + + for (int y = 0; y < outputHeight; y++) { + for (int x = 0; x < outputWidth; x++) { + float srcX = x * xScale; + float srcY = y * yScale; + + int x1 = static_cast(srcX); + int y1 = static_cast(srcY); + int x2 = x1 + 1; + int y2 = y1 + 1; + + float xWeight = srcX - x1; + float yWeight = srcY - y1; + + COLOR3 topLeft = inputImage[y1 * inputWidth + x1]; + COLOR3 topRight = inputImage[y1 * inputWidth + x2]; + COLOR3 bottomLeft = inputImage[y2 * inputWidth + x1]; + COLOR3 bottomRight = inputImage[y2 * inputWidth + x2]; + + COLOR3 interpolatedColor; + interpolatedColor.r = (1 - xWeight) * ((1 - yWeight) * topLeft.r + yWeight * bottomLeft.r) + + xWeight * ((1 - yWeight) * topRight.r + yWeight * bottomRight.r); + interpolatedColor.g = (1 - xWeight) * ((1 - yWeight) * topLeft.g + yWeight * bottomLeft.g) + + xWeight * ((1 - yWeight) * topRight.g + yWeight * bottomRight.g); + interpolatedColor.b = (1 - xWeight) * ((1 - yWeight) * topLeft.b + yWeight * bottomLeft.b) + + xWeight * ((1 - yWeight) * topRight.b + yWeight * bottomRight.b); + + outputImage[y * outputWidth + x] = interpolatedColor; + } + } +} diff --git a/src/util/util.h b/src/util/util.h index fc45e747..c7ab1f9e 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -235,6 +235,9 @@ int BoxOnPlaneSide(const vec3& emins, const vec3& emaxs, const BSPPLANE* p); : \ BoxOnPlaneSide(( emins ), ( emaxs ), ( p ))) - +void scaleImage(const COLOR4* inputImage, std::vector& outputImage, + int inputWidth, int inputHeight, int outputWidth, int outputHeight); +void scaleImage(const COLOR3* inputImage, std::vector& outputImage, + int inputWidth, int inputHeight, int outputWidth, int outputHeight); float floatRound(float f); \ No newline at end of file