GTA Builder Форум

GTA Vice City => Идеи => Тема начата: xanser от Октябрь 18, 2017, 03:13:50 pm

Название: Смена текстур транспорта
Отправлено: xanser от Октябрь 18, 2017, 03:13:50 pm
Предлагаю запилить мод для смены скинов машин или поделиться соображениями, возможно это или нет. Вот, что мне удалось. Во вложении вторая текстура для танка rhino2.txd для gta3.img и тестовая asi-шка, которая меняет скин танка до его первого появления нажатием на Tab, для проверки после этого можно ввести например чит-код panzer. Проблема в том, что текстуру танка пока удалось сменить только до появления первой модели, потом все модели создаются такие же. Если первым создать стандартный танк, то мой код уже не оказывает эффекта. Нужна помощь в поиске причины. Хотелось бы сделать смену на лету.

(https://s6.postimg.org/px29cgs1t/Untitled-1.jpg)

Почему это кажется возможным. Я позаимствовал функции из этого блока: 0x40AA60 CStreaming::RequestSpecialModel, здесь меняются модели и текстуры для специальных актеров для миссий:
109, special01, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9
110, special02, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9
......................................
129, special21, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9

Получается, что можно на один id вешать любые модели и текстуры, в перспективе кажется возможным таким способом расширить количество транспортных средств, используя одни и те же номера.
Что касается скинов, то мне видится возможным внедрение кода с чередующимися текстурами до отрисовки отдельной машины в функцию 0x589AE0 CAutomobile::PreRender

Вот примеры практического применения с использованием этого кода, но пока неодновременные полуфейки:

(https://s6.postimg.org/id4kwnmc1/scr_20171016095056766.jpg) (https://s6.postimg.org/fj1fj7zld/scr_20171016100440815.jpg)
Название: Re: Смена текстур транспорта
Отправлено: kenking от Октябрь 18, 2017, 06:48:04 pm
Мне тоже интересно можно ли нормально реализовать возможность установки скинов на транспорт в VC и GTA3.
Протестировал плагин, перенёс код для своих экспериментов на основу plugin-sdk. Что интересно - значение m_nTxdIndex перезаписывается при нажатии клавиш, а скин устанавливается только один. Первоначальный опять не поставить.
Код: C++
  1. #include "plugin_vc.h"
  2. #include "extensions\KeyCheck.h"
  3. #include "game_vc\CModelInfo.h"
  4. #include "game_vc\CFont.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class MyPlugin {
  9. public:
  10.     MyPlugin() {
  11.  
  12.         Events::drawingEvent += [] {
  13.             CFont::SetScale(0.5f, 1.0f);
  14.             CFont::SetColor(CRGBA(255, 255, 255, 255));
  15.             CFont::SetJustifyOn();
  16.             CFont::SetFontStyle(2);
  17.             CFont::SetPropOn();
  18.             CFont::SetWrapx(600.0f);
  19.             wchar_t text[32];
  20.             swprintf(text, L"TxdIndex %d", CModelInfo::ms_modelInfoPtrs[162]->m_nTxdIndex);
  21.             CFont::PrintString(10.0f, 30.0f, text);
  22.         };
  23.        
  24.         Events::gameProcessEvent += [] {
  25.             KeyCheck::Update();
  26.             if (KeyCheck::CheckWithDelay(VK_TAB, 1000)) {
  27.                 CModelInfo::ms_modelInfoPtrs[162]->ClearTexDictionary();
  28.                 CModelInfo::ms_modelInfoPtrs[162]->SetTexDictionary("rhino2");
  29.             }
  30.             if (KeyCheck::CheckWithDelay(110, 1000)) {
  31.                 CModelInfo::ms_modelInfoPtrs[162]->ClearTexDictionary();
  32.                 CModelInfo::ms_modelInfoPtrs[162]->SetTexDictionary("rhino");
  33.             }
  34.         };
  35.     }
  36. } myPlugin;
Название: Re: Смена текстур транспорта
Отправлено: DK от Октябрь 19, 2017, 12:18:25 am
Вариант с эвентом CVehicle::Render не прокатит - прозрачные части транспорта рендерятся дополнительно, позже (думаю, понятно, почему). Такой себе отложенный рендер.
Но можно внедриться чуть "глобальнее", и отловить момент когда все части транспорта уже отрендерены.
Либо внедриться в рендер атомика (но тогда надо будет как-то сохранять указатель на авто в атомике, а для этого надо будет создавать своё расширение для атомика).
Другая проблема - для того, чтобы текстура нормально выглядела на транспорте, надо заранее подготовить хорошую развертку (UV координаты). Вроде оригинальные авто используют текстуру white, и я не уверен, что там вменяемая развертка.

Кстати, динамические текстуры есть в San Andreas - вспомните покраски или то же переключение текстуры vehiclelights_on/off (этот метод был успешно использован и в ImVehFt).
Название: Re: Смена текстур транспорта
Отправлено: xanser от Октябрь 19, 2017, 04:21:50 am
Может тогда поэкспериментировать пока на спец. актерах с id 109-129, посоздавать одновременно на один номер разные модели или текстуры. Как поведет себя игра, создаст разных или одинаковых, и что нужно, чтобы происходила смена. Между миссиями это же как-то происходит. Возможно придется удалить созданные модели, чтобы появилась новая, тогда это поставит крест на всей задумке. А может достаточно поменять какой-то флаг или что-то переинициализировать.
Название: Re: Смена текстур транспорта
Отправлено: DK от Октябрь 23, 2017, 08:49:10 pm
Зачем делать наугад? Надеяться, что сработает?

Вот небольшой пример - показывает, как динамически менять текстуры трансорта.


Код: C++
  1. #include "plugin.h"
  2. #include "common.h"
  3. #include <map>
  4.  
  5. using namespace plugin;
  6.  
  7. class VehicleTextures {
  8. public:
  9.     VehicleTextures() {
  10.         static CdeclEvent<AddressList<0x4C9ED1, H_CALL, 0x4C9F23, H_CALL, 0x4CA10D, H_CALL, 0x5813D1, H_CALL>,
  11.             PRIORITY_BEFORE, ArgPickN<CEntity*, 0>, void(CEntity*)> myOnRenderOneNonRoad;
  12.  
  13.         static std::map<RpMaterial*, RwTexture *> originalTextures;
  14.  
  15.         myOnRenderOneNonRoad.before += [](CEntity *entity) {
  16.             if (KeyPressed('Z') && entity == FindPlayerVehicle()) {
  17.                 CVehicle *vehicle = reinterpret_cast<CVehicle *>(entity);
  18.                 RpClumpForAllAtomics(vehicle->m_pRwClump, [](RpAtomic *atomic, void *data) {
  19.                     RpGeometryForAllMaterials(atomic->geometry, [](RpMaterial *material, void *data) {
  20.                         if (originalTextures.find(material) == originalTextures.end())
  21.                             originalTextures[material] = material->texture;
  22.                         material->texture = *reinterpret_cast<RwTexture **>(0x77FA58);
  23.                         return material;
  24.                     }, nullptr);
  25.                     return atomic;
  26.                 }, nullptr);
  27.             }
  28.         };
  29.  
  30.         myOnRenderOneNonRoad.after += [](CEntity *) {
  31.             if (originalTextures.size() > 0) {
  32.                 for (auto &i : originalTextures)
  33.                     i.first->texture = i.second;
  34.                 originalTextures.clear();
  35.             }
  36.         };
  37.     }
  38. } vehicleTextures;

По нажатию на Z транспорт игрока будет использовать текстуру waterclear256 (0x77FA58).

(https://i.imgur.com/Txj39AU.png)
Название: Re: Смена текстур транспорта
Отправлено: xanser от Октябрь 24, 2017, 05:19:26 am
Радует, что это возможно. Спасибо за код, буду разбираться.
Название: Re: Смена текстур транспорта
Отправлено: kenking от Октябрь 24, 2017, 03:51:03 pm
Если в принципе это возможно, то надо продумать, как это лучше реализовать. Возможен такой вариант - допустим, нужные детали модели авто имеют текстуру remap, также в txd файле этой модели имеются текстуры remap1 (remap2, remap3 и remap4), в файле .dat записаны ID модели и количество сменных текстур remap, сверяем модели в трафике с моделью из .dat, находим материал (текстуру) remap, выбираем из имеющихся сменных текстур и заменяем? И наверно надо к структуре "прикрепить" какую-то переменную, чтобы отслеживать какая текстура используется? Так можно реализовать показанным выше примером или есть способ лучше? 
Название: Re: Смена текстур транспорта
Отправлено: DK от Октябрь 24, 2017, 04:56:56 pm
Лучше всего - отделить каждый 'remap' в свой txd-файл, как это сделано в SA.
Иначе получится, что в загруженном txd у тебя будет куча неиспользуемых текстур.
Название: Re: Смена текстур транспорта
Отправлено: xanser от Апрель 06, 2019, 01:52:44 pm
Немного изменил первоначальный код, теперь работает. Бывают правда проблемы при выходе из игры с очисткой материалов. Последний вариант во вложении. Смена скинов для новых танков клавишами 1-4. Небольшая демонстрация:

https://youtu.be/q2UE8aXzdso (https://youtu.be/q2UE8aXzdso)

(https://i.postimg.cc/MHz4GnVR/screen.jpg)
Название: Re: Смена текстур транспорта
Отправлено: Shagg_E от Апрель 06, 2019, 08:12:33 pm
Крутяк! Пригодится, спасибо!
Название: Re: Смена текстур транспорта
Отправлено: xanser от Апрель 07, 2019, 11:44:52 am
Вариант пока так побаловаться. В такой виде его оставлять нельзя. Есть неприятные последствия.
Название: Re: Смена текстур транспорта
Отправлено: Shagg_E от Апрель 07, 2019, 11:56:24 am
Например?(я просто ща затестить не могу)
Название: Re: Смена текстур транспорта
Отправлено: xanser от Апрель 07, 2019, 05:05:54 pm
Я заметил, что новые текстуры срабатывают в этой функции CStreaming::RequestModel при LoadState == 0. Это объясняет, почему раньше срабатывало только один раз, вот я и обнуляю его каждый раз при смене txd, но добром это не кончится. Из замеченных проблем в игре пока зависания, ошибки при выходе, пропадающие куски карты. Видимо происходит переполнение, связанное с этим классом CStreaming. В общем пока топорный вариант с непредсказуемыми последствиями.
Название: Re: Смена текстур транспорта
Отправлено: Shagg_E от Апрель 08, 2019, 02:54:40 am
А, ну это уже серьезные проблемы. Глянул код.... тут я бессилен))
Если будет что-то по этому поводу - сообщу!
Название: Re: Смена текстур транспорта
Отправлено: kenking от Июнь 05, 2019, 02:47:13 pm
Вот небольшой пример - показывает, как динамически менять текстуры транспорта.
По нажатию на Z транспорт игрока будет использовать текстуру waterclear256 (0x77FA58).
А как сделать, чтобы текстура заменялась не на всех материалах, а только на одном нужном, например, с названием remap?
Самостоятельно разобрать не получилось.  >:(
Название: Re: Смена текстур транспорта
Отправлено: xanser от Январь 29, 2020, 11:46:55 am
Поправил немного первоначальный код. Теперь то, что показано на видео, работает без ошибок. Просьба потестить. Моим способом перезагрузка модели работает, если ее сильно не мучить и дать пару секунд на смену. Каждый раз при смене игра вынуждена заново вызывать RequestModel и LoadRequestModels. Но созданные скины существуют одновременно. В примере смена скинов встроена в место создания танка в трафике при 6 звездах с периодичностью в 5 секунд. Другие машины можно аналогично встраивать например в функцию парковки или еще куда в зависимости от условий, положения игрока и т.д. Можно например таким способом сделать разные скины полицейским машинам на разных островах проверкой x-координаты игрока. Хотел было сделать мод, чтобы на первом острове ездили полиции с альфа-текстурой, но там поправлена еще и сама модель. Чуть позже покажу видео моего применения этого. Вариант с одной txd и remap-ом внутри нее я пока не знаю, как сделать.

Спустя три года: КОД НЕ СОВСЕМ ВЕРНЫЙ, ТАК ДЕЛАТЬ НЕ НАДО!
Название: Re: Смена текстур транспорта
Отправлено: daniel_360 от Январь 29, 2020, 01:00:58 pm
Крутая вещь, попробую посмотреть!
Название: Re: Смена текстур транспорта
Отправлено: Shagg_E от Январь 29, 2020, 01:32:44 pm
Вроде работает: желтый-красный-синий-зеленый - и так по кругу.
Название: Re: Смена текстур транспорта
Отправлено: daniel_360 от Январь 30, 2020, 11:11:34 pm
Да, тоже протестил, всё работает!
Название: Re: Смена текстур транспорта
Отправлено: xanser от Февраль 01, 2020, 08:02:12 am
Вобщем-то все делалось ради этого:

(https://i.postimg.cc/mrWG3zj0/scr-20200131082413576.jpg)
Название: Re: Смена текстур транспорта
Отправлено: Shagg_E от Февраль 01, 2020, 01:00:53 pm
Хах! Прикольно. Выглядит, как подготовка к какой-то баталии. Я бы погамал в твои разработки. Понятия не имею, что ты там делаешь, но выглядит это необычно и интригующе.
Название: Re: Смена текстур транспорта
Отправлено: daniel_360 от Февраль 01, 2020, 01:44:52 pm
Вобщем-то все делалось ради этого:

(https://i.postimg.cc/mrWG3zj0/scr-20200131082413576.jpg)
Танковый биатлон в VC?