HLFX.Ru Forum
Показать все 9 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Наши проекты (https://hlfx.ru/forum/forumdisplay.php?forumid=1)
-- S2GConverter: перенос моделей с Source на Goldsource (https://hlfx.ru/forum/showthread.php?threadid=5811)


Отправлено Glaster 20-03-2022 в 10:09:

Half-Life 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


ССЫЛКА: https://github.com/mrglaster/S2GConverter


Отправлено Aynekko 20-03-2022 в 12:15:

Спасибо огромное. Работает. Очень пригодится.

__________________
Мой мод на Xash


Отправлено Дядя Миша 20-03-2022 в 13:51:

Такой вопрос: переносит ли эта штука сорс-специфичные возможности, которые я добавил в своём расширенном формате?

Ну навскидку:
- развесовку
- мультислойные анимации
- параметры позы
- инверсную кинематику
- группы хитбоксов
- джиггл-кости
- интерполяцию костей по кватернионам

Потому что корректно сдекомпилировать сорсовские модели как правило невозможно, особенно если там есть дельта-анимации.
А вот переконвертить без потери данных - реально.

Добавлено 20-03-2022 в 16:51:

Цитата:
Glaster писал:
1) Модели с анимациями больше 64Кб
2) Модели с числом костей больше 128

Это не данный момент, увы. Это в принципе. Ограничение голдсорсовского формата. Можно снять, но сломается бинарная совместимость.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Glaster 20-03-2022 в 15:25:

Что касается сорс-специфичных возможностей, то я такого не добавлял (честно признаться, я из вашего списка не понял ни пункта, уж в таком не шарю, извините).

По поводу "на данный момент" есть у меня пара мыслей на решение сей проблемы. Для П1 можно пытаться как-то пытаться группировать кости в одну (результат будет сомнительный), так же можно пытаться как-то определять кости, используемые (условно) для контроля поведения волос (видел такое в модели Орнштейна из Dark Souls аддона к GMod'у) или нечто подобное и выпиливать их.

Для П2 можно попробовать безбожно вырезать фреймы. Для Idle анимаций такое может и прокатывает (сам при конвертировании моделей Doom Eternal из GMod'a так делал), однако если речь идёт о каких-то сложных анимациях - приведёт черт знает к чему.


Отправлено Дядя Миша 20-03-2022 в 17:14:

А мне казалось, что в сорсе и так лимит на 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, поэтому я и говорю, что бинарная совместимость.
В теории, исходя из вышеописанного, можно попробовать немного изменить структуру репрезентации анимдаты и отодвинуть лимит примерно вдвое. Но я не готов сказать насколько это реально сделать с сохранением бинарной совместимости, не помню уже просто.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Crystallize 17-10-2023 в 18:04:

Запускаю на семерке, питон 3.8

code:
C:\Users\HOME>python c:\users\home\downloads\s2gconverter\s2gconverter.py -i c:\ users\home\downloads\s2gconverter\sonic\sonic.mdl Analyzing .vmt files Detected material: _Tail Detected material: chr_sonic_cloth_dif Detected material: chr_sonic_scarf_dif Detected material: body Detected material: _Tail Detected material: chr_tails_eye_white Detected material: chr_tails_eye_white Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: chr_tails_eye_white Detected material: chr_tails_eye_white Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: _Tail Detected material: _Tail VTX Detected: True VTF Detected: True VMT Detected: True VVD Detected: True Traceback (most recent call last): File "c:\users\home\downloads\s2gconverter\s2gconverter.py", line 374, in <mod ule> main() File "c:\users\home\downloads\s2gconverter\s2gconverter.py", line 371, in main convert_model(input_data) File "c:\users\home\downloads\s2gconverter\s2gconverter.py", line 241, in conv ert_model convert_to_bmp_folder(os.path.dirname(path_to_model)) File "c:\users\home\downloads\s2gconverter\s2gconverter.py", line 46, in conve rt_to_bmp_folder subprocess.call(args) File "C:\Users\HOME\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 340, in call with Popen(*popenargs, **kwargs) as p: File "C:\Users\HOME\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 858, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\HOME\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1311, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] Не удается найти указанный файл


Отправлено Дядя Миша 17-10-2023 в 18:52:

У Питона вообще чудесный вывод ошибок, он меня ещё в кварке пугал.
Столько мусора выдаёт не поделу.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Crystallize 18-10-2023 в 14:56:

Ему нужны абсолютные пути чтобы запустить эксешники.


Отправлено Crystallize 26-10-2023 в 09:27:

Пересел с 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!


Временная зона GMT. Текущее время 05:59.
Показать все 9 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024