HLFX.Ru Forum > Разработка игр > Наши проекты > S2GConverter: перенос моделей с Source на Goldsource Конвертирует (почти) любые модели с Source на GoldSource
S2GConverter: перенос моделей с Source на Goldsource
Что за утилита?
Автоматический конвертер моделей с движка Source на GoldSource. Поддерживает модели с большим количеством полигонов (на тестах максимум был 80K полигонов, потом у меня закончились высокополигональные модели). Кроме того, конвертер переносит и все анимации.
На данный момент не поддерживаются следующие типы моделей:
1) Модели с анимациями больше 64Кб
2) Модели с числом костей больше 128
Примеры результатов:
Как использовать?
1) У вас должен быть установлен Python версии 3.*
2) Установите пакет Pillow, введя в командной строке следующее:
code:pip install Pillow
3) Создайте новую папку, перенесите в неё все файлы модели, а именно: .mdl, .vtf, .vmt, .vtx, .vvd
4) Перейдите в папку со скаченной утилитой, откройте командную строку и введите:
code:python S2GConverter.py -i путь\к\модели.mdl
5) Найдите результат в папке с исходной моделью. К названию модели будет добавлен постфикс _goldsource. Пример названия: v_knife_goldsource.mdl
6) Profit!
Благодарности:
Дядя Миша - автор используемого studiomdl.exe Nem - VTFLib
Потому что корректно сдекомпилировать сорсовские модели как правило невозможно, особенно если там есть дельта-анимации.
А вот переконвертить без потери данных - реально.
Добавлено 20-03-2022 в 16:51:
Цитата:
Glaster писал: 1) Модели с анимациями больше 64Кб
2) Модели с числом костей больше 128
Это не данный момент, увы. Это в принципе. Ограничение голдсорсовского формата. Можно снять, но сломается бинарная совместимость.
Что касается сорс-специфичных возможностей, то я такого не добавлял (честно признаться, я из вашего списка не понял ни пункта, уж в таком не шарю, извините).
По поводу "на данный момент" есть у меня пара мыслей на решение сей проблемы. Для П1 можно пытаться как-то пытаться группировать кости в одну (результат будет сомнительный), так же можно пытаться как-то определять кости, используемые (условно) для контроля поведения волос (видел такое в модели Орнштейна из Dark Souls аддона к GMod'у) или нечто подобное и выпиливать их.
Для П2 можно попробовать безбожно вырезать фреймы. Для Idle анимаций такое может и прокатывает (сам при конвертировании моделей Doom Eternal из GMod'a так делал), однако если речь идёт о каких-то сложных анимациях - приведёт черт знает к чему.
А мне казалось, что в сорсе и так лимит на 128 костей
C++ Source Code:
1
struct mstudioboneweight_t
2
{
3
DECLARE_BYTESWAP_DATADESC();
4
float weight[MAX_NUM_BONES_PER_VERT];
5
char bone[MAX_NUM_BONES_PER_VERT];
6
byte numbones;
7
};
Правда это для Source 2007.
Добавлено 20-03-2022 в 20:14:
С анимациями, если интересно, расскажу в чём там замута.
Потому что в голдсорсе и в сорсе оффсеты 16-битные, но у первого лимит на 64 килобайта, а у второго - практически без ограничений.
Смысл вот в чём.
В голдсорсе хидер анимации хранит оффсеты для всех блендов, всех кадров и всех степеней свободы. Т.е. сделано по-простому. Все бленды, все кадры и все степени свободы должны влезть в лимит 64 килобайта. Обычно оно влезает, но когда много костей, много блендов, то не вариант.
В сорсе умнее сделано. Во первых, поскольку там есть хидер самой анимации (в голдсорсе нет, там только хидер секвенции), то можно сохранять их независимо. Анимация от секвенции отличается тем, что одна секвенция может содержать несколько анимаций. Например для блендинга их кол-во может колебаться от 2 до 9 или даже больше, ну понятно.
Так вот, первая оптимизация в Сорсе - это то, что анимации всегда используют оффсеты только для своих кадров. Соседняя анимация для этой же секвенции будет использовать другие локальные оффсеты. Таким образом убирается зависимость на лимит при использовании большого кол-ва блендов. Но это не всё.
Второй немаловажный момент - между оффсетами хранятся 6DOF только для одной кости! Все кадры анимации, но только для одной кости.
В голдсорсе же между оффсетами надо впихнуть все кадры для всех костей для всех степеней свободы и для всех блендингов.
Для перехода к следующей кости используется еще один локальный оффсет, к сожалению это уже требует изменения структуры mstudioanim_t, поэтому я и говорю, что бинарная совместимость.
В теории, исходя из вышеописанного, можно попробовать немного изменить структуру репрезентации анимдаты и отодвинуть лимит примерно вдвое. Но я не готов сказать насколько это реально сделать с сохранением бинарной совместимости, не помню уже просто.
Пересел с 7 на 10ку.
Студиомодел надо оба раза вызывать по абсолютному пути(иначе он записывает путь к директории юзера с двойными бакслешами и ищет там студиомодел):
shutil.copy("e:\s2gconverter\studiomdl.exe ", os.getcwd() )
arguments = "e:\s2gconverter\studiomdl.exe " + qc_file
Тогда он доходит до упаковки мешей и падает с out of memory, командная строка потребляет 110 мб.
code:Part 59 of sumbodel 0 was successful written
====================================================================================================
Writing part: 1
Part 1 of sumbodel 0 was successful written
Writing part: 2
Part 2 of sumbodel 0 was successful written
WARNING! SMD data parsing error! It can cause some problems!
Excepted: e:\s2gconverter\sonic\mdldecompiler_delta.smd
Writing part: 1
Part 1 of sumbodel 0 was successful written
WARNING! SMD data parsing error! It can cause some problems!
Excepted: e:\s2gconverter\sonic\sonic_physics.smd
Writing part: 1
Part 1 of sumbodel 0 was successful written
P2:Savior Studio Model Compiler
XashXT Group 2018(c)
grabbing: sonic_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: sonic_decompiled_part_nr_2_submodel_0.smd [mesh]
grabbing: sonic_decompiled_part_nr_3_submodel_0.smd [mesh]
grabbing: sonic_decompiled_part_nr_4_submodel_0.smd [mesh]
grabbing: sonic_decompiled_part_nr_5_submodel_0.smd [mesh]
grabbing: sonic_decompiled_part_nr_6_submodel_0.smd [mesh]
grabbing: sonic_decompiled_part_nr_7_submodel_0.smd [mesh]
(тут все примерно одинаково)
grabbing: sonic_lod3_decompiled_part_nr_4_submodel_0.smd [mesh]
grabbing: scarf_lod3_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: hand_r_lod3_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: hand_l_lod3_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: shoes_r_lod3_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: shoes_r_lod3_decompiled_part_nr_2_submodel_0.smd [mesh]
grabbing: shoes_l_lod3_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: shoes_l_lod3_decompiled_part_nr_2_submodel_0.smd [mesh]
grabbing: sonic_lod4_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: sonic_lod4_decompiled_part_nr_2_submodel_0.smd [mesh]
grabbing: sonic_lod4_decompiled_part_nr_3_submodel_0.smd [mesh]
grabbing: scarf_lod4_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: hand_r_lod4_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: hand_l_lod4_decompiled_part_nr_1_submodel_0.smd [mesh]
grabbing: shoes_r_lod4_decompiled_part_nr_1_submodel_0.smd [mesh]
Fatal Error: out of memory!
HLFX.Ru Forum > Разработка игр > Наши проекты > S2GConverter: перенос моделей с Source на Goldsource Конвертирует (почти) любые модели с Source на GoldSource