IPB

>

MetroEX - универсальный инструмент для работы с ресурсами игр серии Метро

 
 iOrange
сообщение 22.02.2019, 19:21
Сообщение #581


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



(IMG:https://images.gameru.net/image/direct/f00e707647a32ce.png)

Комплексная программа для работы с ресурсами игр серии Metro (+ Arktika.1) от iOrange - MetroEX
http://s.gameru.net/metro/MetroEX_v047.zip
Github репозиторий - временно недоступен

Чейнджлог по версиям:
MetroEX v0.3

1) Исправлен зум моделей колесиком мышки на Windows 7/8 (автор - abramcumner)
2) Добавлена фильтрация дерева файлов (автор - slik)
3) Известные типы файлов теперь отображаются со своими иконками (автор - Shoker)
4) config.bin теперь можно раскрыть и просматривать / извлекать файлы находящиеся в нем (автор - Shoker)
5) Добавлена инфо-панель для текстур и моделей, которая показывает полезную информацию о выбранном файле
6) Экспорт модели вместе с ее анимациями в FBX! *
7) Возможность просмотра анимаций прямо в программе (данный функционал не до конца доработан, учтите)

* При единичном экспорте в FBX модель всегда экспортируется с анимациями. При пакетном извлечении можно отключить экспорт анимаций.
Экспорт с анимациями может занять некоторое время. Я постараюсь оптимизировать это, но похоже что проблема в FBX SDK.



Так выглядит проигрывание анимации в программе:


А так выглядит результат экспорта открытый в 3Ds Max:


MetroEX v0.4

были добавлены доп. опции экспорта в FBX:
* Export animations - определяет нужно ли вообще экспортировать анимации. Полезно если вам просто нужна модель в FBX, без анимаций
* Animations to separate files - имеет смысл только в паре с предыдущей опцией, и при включении будет экспортировать анимационные треки в отдельные FBX файлы. Т.е. на выходе будет FBX файл с моделью и скелетом, и рядом с ним FBX файлы, по одному на анимацию. Попытка экспорта моделей с 11,000 анимаций все равно займет прилично времени, но при этом памяти будет потребляться не много, и даже при сбое - у вас останутся те файлы, что успели записаться.

[1] Был доработан немного 3D просмотрщик моделей - теперь реализована "правильная" Arcball камера, так что вращать и рассматривать модели стало удобнее.
Так же был добавлен режим отображения сетки полигонов поверх модели.

[2] Добавлено окно отображения свойств модели. Там отображена вся информация о модели. Есть даже информация о том, кто и на каком компьютере создал эту модель, и имя оригинального файла.

[3] Добавлено окно отображения свойств текстур, находящихся в текстурной базе. Полезно тем, что вы можете найти там дополнительные текстуры, которые на данный момент не экспортирует программа (бамп, детали...)

[4] Добавлено окно настроек программы, настройки сохраняются в файл рядом в папку с программой. Пока там только настройки экспорта, но в будущем туда будут добавляться / выноситься больше настроек.

[5] Реализована заргузка, отображение, и экспорт локализационных файлов. Экспорт производится в формат Excel 2003.

[6] Добавлено меню инструментов, содержащее следующие тулзы:
- [7] Конвертер текстур в формат Metro Exodus. Умеет конвертировать как одиночный файл, так и папку (с подпапками).
- Конвертер локализационных файлов из формата Excel 2003 назад в формат Metro Exodus.
- [8] Злополучная утилита для создания патч-архивов. Указываете где лежит папка content, куда сохранять результирующий архив, и жмете кнопку. Остально за вас сделает программа.

Так же было переписано много кода, решались организационные вопросы, велись работы по функционалу, который войдет в v0.5, но об этом будет позже.

Дальше прикладываю скриншоты к отмеченным изменениям:


MetroEX v0.41

В версии MetroEX v0.41 добавлены опции экспорта моделей
(IMG:https://images.gameru.net/thumb/1c995d6916d1cbd.png)

Так же добавлена кнопка на панели для включения / выключения показа колизии (если таковая есть).
примеры

Включено:
(IMG:https://images.gameru.net/thumb/00021eddee13f88.jpg)

Выключено:
(IMG:https://images.gameru.net/thumb/f442e23a7e5eb59.jpg)

Ну и злополучные деревья, кстати. Помню кто-то в этой теме на них жаловался.
Включено:
(IMG:https://images.gameru.net/thumb/052abc73297e4e4.jpg)

Выключено:
(IMG:https://images.gameru.net/thumb/14e7e8868eabf9e.jpg)


Ну и по традиции - небольшой бонус - теперь зажав правую кнопку мышки можно перемещать модель.
Так же на панели инструментов появилась кнопка сброса камеры, для удобства.

MetroEX v0.42

* Исправлен экспорт единичной модели в FBX (не всегда правильно реагировала на настройки)
+ Добавлена поддержка текстур и моделей Redux версий Метро (просмотр + экспорт)

MetroEX v0.45

+ Добавлена возможность модификации игровых архивов
+ Добавлено чтение шрифтовой базы
* Исправлена конвертация игровых локализаций назад в формат игры

MetroEX v0.45a

+ Переписана файловая система, теперь можно указать папку с игрой, и будут загружены абсолютно все игровые паки, включая патчи и ДЛЦ. Новые файлы будут заменять собой старые, так же как это делает игра.
+ Добавлен функционал экспорта набора текстур описывающих "поверхность" (альбедо, "бамп", карта нормалей, карта деталей)
+ Добавлена опция экспорта моделей для экспорта всех текстур "поверхности"

(IMG:https://images.gameru.net/thumb/a91c489ad64e0b1.png)

(IMG:https://images.gameru.net/thumb/8b29aa0ba30fc96.jpg)

(IMG:https://images.gameru.net/thumb/22769ae5a05703c.png)


MetroEX v0.46

+ Добавлена возможность сохранить отдельную анимацию (by SkyLoader)
+ Добавлено отображение и экспортирование лодов у модели (если таковые имеются) (by SkyLoader)
+ Инструмент "Textures converter" был доработан и теперь может создавать текстуры для предыдущих версий Metro (обычные и Redux)
+ Сильно переработана подсистема чтения/записи игровых ресурсов (больше задел на будущее, но уже дает свои плоды)
+ Доработана файловая система (ФС). Теперь ФС правильно обрабатывает дубликаты файлов, а так же поддерживает архивы вплоть до последнего DLC.
+ Написан код позволяющий заменять файлы в файле config.bin, и сохранять измененный config.bin.
+ Добавлен инструмент для редактирования/замены/проверки шрифтов.

(IMG:https://images.gameru.net/thumb/72c3881efd4e615.png)

(IMG:https://images.gameru.net/thumb/c43a3f8dea9394b.png)

(IMG:https://images.gameru.net/thumb/5b8d7a215660c3d.png)

MetroEX v0.46a

* Исправлена загрузка всех архивов из папки игры (было поломано для старых версий игры)
* Улучшено качество отрисовки шрифтов в Font Preview.


MetroEX v0.47

+ Добавлена поддержка всех версий игр Metro и Arktika.1
* Исправлен просмотр анимаций
* Исправлен экспорт в OBJ (была неправильная настройка материалов)
* Улучшения стабильности


Программа предназначена только для личного пользования в ознакомительных целях!
Распространение извлеченных файлов и их содержимого за пределы вашего личного ПК - нарушение лицензионного соглашения.
Автор программы не несет ответственности за прямой или косвенный ущерб причиненный в результате неправомерного использования программы.


Дополнительный/алтернативный софт:

Программа для конвертирования текстур любых версий Метро от iOrange - MetroTC
http://s.gameru.net/metro/MetroTC.zip
Github репозиторий - https://github.com/iOrange/MetroTC
Описание

Встречайте MetroTC - комбайн-конвертер любых текстур всех версий Метро в одном флаконе.
Ваша задача - указать где лежат текстуры (или одна текстура) и дать команду "Convert!", и программа сама найдет в указанном месте все текстуры Метро, обработает, и выдаст DDS читаемый любыми редакторами и утилитами.

Отличительные особенности:
1) Поддержка всех версий игр серии Метро
2) Текстуры 512/1024/2048 (если присутствуют) собираются в один DDS со всем мипмапами и правильными свойствами
3) Программа умеет определять что текстура уже была сконвертированна, и потому ее можно "натравливать" на папки с частично конвертированными текстурами
4) Эксклюзив для Gameru.net (IMG:style_emoticons/default/rolleyes.gif)
5) Программа залита на сайт gameru.net, а потому ссылка не умрет (IMG:style_emoticons/default/cool.gif)

(IMG:https://images.gameru.net/thumb/e15d5150d10d5eb.png)


Распаковщик архивов Metro Exodus от abramcumner
https://yadi.sk/d/XhCjq0wVK_oAsQ

Конвертер для текстур эксодуса в .dds от Prodnik
https://yadi.sk/d/G1xL2FcYE4FlxQ
Перейти в начало страницы
 
 
 
Ответов
 iOrange
сообщение 02.05.2019, 22:23
Сообщение #582


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Цитата(WolfHeart @ 02.05.2019, 21:21) *
Сначала просили 2033 и Last Light добавить

Ниже Redux версий я точно не буду обещать поддержку, ибо это действительно будет много работы.
А вот Redux'ы добавить вполне по силам, но прошу меня понять - есть более приоритетные задачи, так что эта - как говорится "если будет свободная минутка", коих и так нет.
Перейти в начало страницы
 
 
 WolfHeart
сообщение 02.05.2019, 22:33
Сообщение #583


Продвинутый геймер
********

Группа: Участник
Сообщений: 268
Регистрация: 18.08.2017
Из: Донецк, ДНР
Пользователь №: 27656



Цитата(iOrange @ 02.05.2019, 22:23) *
Ниже Redux версий

Бррр...
Извини что отвлекаю, но чет я совсем запутался.
Дело в том, что я увлекся Метро только после релиза Exodus-а. И считал, что основные это 2033, LL и Exodus, а Redux-ы, это уже как дополнения.
Так что ты имеешь в виду ниже Redux версий? Ниже есть еще что-то, или ты ниже имеешь в виду 2033, LL?

Сообщение отредактировал WolfHeart - 02.05.2019, 22:36
Перейти в начало страницы
 
 
 iOrange
сообщение 02.05.2019, 23:11
Сообщение #584


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Цитата(WolfHeart @ 02.05.2019, 21:33) *
Так что ты имеешь в виду ниже Redux версий?

Сначала вышли Metro 2033 и Metro Last Light.

Через некоторое время, они были перевыпущены (Redux Edition).
На новом движке, устройство которого очень близко к Exodus (и Arktika.1).

Так вот те "старые" версии (оригинальные 2033 и Last Light) я не собираюсь поддерживать.

А Redux версии 2033 и Last Light - ок.
Перейти в начало страницы
 
 
 WolfHeart
сообщение 02.05.2019, 23:15
Сообщение #585


Продвинутый геймер
********

Группа: Участник
Сообщений: 268
Регистрация: 18.08.2017
Из: Донецк, ДНР
Пользователь №: 27656



Цитата(iOrange @ 02.05.2019, 23:11) *
А Redux версии 2033 и Last Light

Ага, теперь понял. Благодарю за просвещение!
А то ведь я думал что в Redux-ах просто дополнение.
Перейти в начало страницы
 
 
 iOrange
сообщение 03.05.2019, 07:21
Сообщение #586


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Цитата(Z-O-M-B-I-E @ 02.05.2019, 10:33) *
есть ли возможность отключить экспорт/показ коллизии на модели

Цитата(Z-O-M-B-I-E @ 02.05.2019, 10:33) *
а так же возможность отключить экспорт текстур при экспорте моделей.

Добавил.
В версии MetroEX v0.41 добавлены опции экспорта моделей
(IMG:https://images.gameru.net/thumb/1c995d6916d1cbd.png)

Так же добавлена кнопка на панели для включения / выключения показа колизии (если таковая есть).
примеры

Включено:
(IMG:https://images.gameru.net/thumb/00021eddee13f88.jpg)

Выключено:
(IMG:https://images.gameru.net/thumb/f442e23a7e5eb59.jpg)

Ну и злополучные деревья, кстати. Помню кто-то в этой теме на них жаловался.
Включено:
(IMG:https://images.gameru.net/thumb/14e7e8868eabf9e.jpg)

Выключено:
(IMG:https://images.gameru.net/thumb/052abc73297e4e4.jpg)


Ну и по традиции - небольшой бонус - теперь зажав правую кнопку мышки можно перемещать модель.
Так же на панели инструментов появилась кнопка сброса камеры, для удобства.

Внимание: перенесите файл settings.mex из прошлой версии программы в папку с новой, если хотите сохранить ваши текущие настройки.

http://s.gameru.net/metro/MetroEX_v041.zip

Сообщение отредактировал iOrange - 03.05.2019, 07:22
Перейти в начало страницы
 
 
 Z-O-M-B-I-E
сообщение 03.05.2019, 13:58
Сообщение #587


Игрок
***

Группа: Участник
Сообщений: 31
Регистрация: 05.05.2013
Пользователь №: 16701



Спасибо за оперативность, но коллизия все равно экспортируется (в любой формат), даже если галка стоит (будто при экспорте это просто игнорируется). Отключение экспорта текстур работает. Так же есть модели, где несколько коллизий, но как я понимаю, программа и с ними работает без проблем, все коллизии скрывает.
(IMG:https://images.gameru.net/thumb/61767a90cd79656.png)

Было бы не плохо еще отключить показ nxcform33x файлов, для удобства.

Сообщение отредактировал Z-O-M-B-I-E - 03.05.2019, 14:06
Перейти в начало страницы
 
 
 WolfHeart
сообщение 03.05.2019, 14:09
Сообщение #588


Продвинутый геймер
********

Группа: Участник
Сообщений: 268
Регистрация: 18.08.2017
Из: Донецк, ДНР
Пользователь №: 27656



Цитата(Z-O-M-B-I-E @ 03.05.2019, 13:58) *
Было бы не плохо еще отключить показ nxcform33x файлов, для удобства.

А так-же, если возможно, отключить экспорт не нужных файлов *.ph_model *.mesh *.bin *.nxcform33x, при массовом экспорте в obj или fbx всей папки meshes. И уж совсем замечательно было бы, если бы при этом экспортировались и текстуры в папку textures с возможностью выбора формата. (IMG:style_emoticons/default/blush1.gif)
Перейти в начало страницы
 
 
 iOrange
сообщение 03.05.2019, 16:16
Сообщение #589


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Цитата(Z-O-M-B-I-E @ 03.05.2019, 12:58) *
будто при экспорте это просто игнорируется

Прошу прощения, замотался.
Исправлено, просто перекачайте v0.41
Спасибо за бдительность!

Цитата(Z-O-M-B-I-E @ 03.05.2019, 12:58) *
отключить показ nxcform33x файлов

Цитата(WolfHeart @ 03.05.2019, 13:09) *
отключить экспорт не нужных файлов *.ph_model *.mesh *.bin *.nxcform33x, при массовом экспорте в obj или fbx всей папки meshes

Добавил в список на подумать.

Цитата(WolfHeart @ 03.05.2019, 13:09) *
И уж совсем замечательно было бы, если бы при этом экспортировались и текстуры в папку textures с возможностью выбора формата

Да, это у меня есть в списке, просто руки не дошли пока.
Перейти в начало страницы
 
 
 Thekello
сообщение 03.05.2019, 17:10
Сообщение #590


Геймер
******

Группа: Участник
Сообщений: 100
Регистрация: 02.03.2019
Из: Россия
Пользователь №: 30622



Цитата(iOrange @ 03.05.2019, 07:21) *
Добавил.
В версии MetroEX v0.41 добавлены опции экспорта моделей

Большое Спасибо за обновление (IMG:style_emoticons/default/good.gif)

Сообщение отредактировал Thekello - 03.05.2019, 17:10
Перейти в начало страницы
 
 
 Z-O-M-B-I-E
сообщение 03.05.2019, 18:15
Сообщение #591


Игрок
***

Группа: Участник
Сообщений: 31
Регистрация: 05.05.2013
Пользователь №: 16701



iOrange, сейчас все работает, большое спасибо! Надеюсь поддержка редукса не за горами, хотя бы просмотр и эскпорт моделей с отключением коллизии, ибо плагин для макса грузит все подряд, а коллизию от модели порой не отличить.
Перейти в начало страницы
 
 
 Imon
сообщение 03.05.2019, 21:14
Сообщение #592


Новичок
*

Группа: Участник
Сообщений: 12
Регистрация: 20.04.2019
Пользователь №: 30958



iOrange,Большое Спасибо за вашу программу, сейчас попробовал выгрузить модель из Redux, выгрузилась но увы без текстур, я не вкоем случае не тороплю, если у вас появится время заняться Redux, пожалуйста, добавьте выгрузку модели с текстурами (IMG:style_emoticons/default/smile.gif) .
Перейти в начало страницы
 
 
 iOrange
сообщение 03.05.2019, 21:38
Сообщение #593


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Цитата(Imon @ 03.05.2019, 20:14) *
попробовал выгрузить модель из Redux, выгрузилась но увы без текстур

(IMG:style_emoticons/default/o_O.gif)

Однако, это неожиданно. Хехе. Ну раз так просите, постараюсь поправить чтоб работали Redux версии.
Но в анимации впрягаться не буду, сразу говорю.

Кстати - тут народ уже развлекается )))



(IMG:https://images.gameru.net/thumb/b04898c93cce508.jpg)

Сообщение отредактировал iOrange - 03.05.2019, 21:40
Перейти в начало страницы
 
 
 ed_rez
сообщение 04.05.2019, 01:47
Сообщение #594


Продвинутый геймер
********

Группа: Участник
Сообщений: 434
Регистрация: 10.12.2015
Из: Рига
Пользователь №: 22952



Цитата(WolfHeart @ 02.05.2019, 21:21) *
Может есть смысл тогда это поделить, по принципу SDK для Сталка, SoC_SDK, CS_SDK, CoP_SDK?

Эх, как тут развивается тема, так бы и о перечисленном. (IMG:style_emoticons/default/biggrin.gif)


iOrange,
благодарю за новую версию! (IMG:style_emoticons/default/thank_you2.gif)
Перейти в начало страницы
 
 
 iOrange
сообщение 05.05.2019, 03:41
Сообщение #595


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Небольшой тизер (IMG:style_emoticons/default/wink_old.gif)

(IMG:https://images.gameru.net/thumb/917e1b660dda5d1.png)
Перейти в начало страницы
 
 
 Thekello
сообщение 05.05.2019, 12:15
Сообщение #596


Геймер
******

Группа: Участник
Сообщений: 100
Регистрация: 02.03.2019
Из: Россия
Пользователь №: 30622



Цитата(iOrange @ 05.05.2019, 03:41) *

Опа, + настроение (IMG:style_emoticons/default/wink.gif)
Перейти в начало страницы
 
 
 GoatZombie
сообщение 05.05.2019, 15:45
Сообщение #597





Группа: Участник
Сообщений: 2
Регистрация: 12.04.2019
Пользователь №: 30904



Superb work! Thank you very much, I really appreciate the time and effort you put into this! Like all changes you made so far.

1. Most of the "skeletal" models triangles are skewed when previewing its animation in render panel, but when I export the mesh animations as separate files, import it into Unreal engine (as is) it fails to import the animation, but it succeed to import when I reexport (just import -> export) it with 3DS MAX. And it looks fine for most of them that I tried.

2. Since most meshes have normal map associated with them could you possibly add basic normal mapping support in preview window (render panel) with directional light.
I have done it myself somewhat, but I am not that experienced and could be bugs somewhere.

MetroEX ORIGINAL

https://i.imgur.com/a90UTn4.png
https://i.imgur.com/C07uzeU.png

MetroEX WITH NORMAL MAPPING

https://i.imgur.com/MNJahJF.png
https://i.imgur.com/XwNhvA6.png

Changes I made:
RenderPanel.h
CODE
struct RenderGeometry {
        ID3D11Buffer*   vb;
        ID3D11Buffer*   ib;
        size_t          numFaces;
        RenderTexture*  texture;
        RenderTexture*  texture2; // normal map
        bool            isCollision;
    };

struct ConstantBufferData {
        vec4 modelBSphere;
        mat4 matModel;
        mat4 matView;
        mat4 matProjection;
        mat4 matModelView;
        mat4 matModelViewProj;
        mat4 matModelInvTranspose; // world-inverse-transpose, might not be necessary with uniform scaling only
        vec4 camParams;
        mat4 bones[256];
    };


MetroTypes.h
CODE
PACKED_STRUCT_BEGIN
struct MetroVertex {
    vec3        pos;
    uint8_t     bones[4];
    vec4        normal;
    uint8_t     weights[4];
    vec2        uv0;
    vec2        uv1;
    vec4        tangent; // added tangent vector
} PACKED_STRUCT_END;


RenderPanel.cpp InitGraphics function, changed vertex input layout to match
CODE
D3D11_INPUT_ELEMENT_DESC vsDesc[] = {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT,    0, offsetof(MetroVertex, pos),     D3D11_INPUT_PER_VERTEX_DATA, 0},
            { "TEXCOORD", 0, DXGI_FORMAT_R8G8B8A8_UINT,      0, offsetof(MetroVertex, bones),   D3D11_INPUT_PER_VERTEX_DATA, 0},
            { "TEXCOORD", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(MetroVertex, normal),  D3D11_INPUT_PER_VERTEX_DATA, 0},
            { "TEXCOORD", 2, DXGI_FORMAT_R8G8B8A8_UNORM,     0, offsetof(MetroVertex, weights), D3D11_INPUT_PER_VERTEX_DATA, 0},
            { "TEXCOORD", 3, DXGI_FORMAT_R32G32_FLOAT,       0, offsetof(MetroVertex, uv0),     D3D11_INPUT_PER_VERTEX_DATA, 0},
            { "TEXCOORD", 4, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(MetroVertex, tangent),     D3D11_INPUT_PER_VERTEX_DATA, 0}
        };


RenderPanel.cpp added utility function to calculate tangent vectors
CODE
void CalcTangentVector(MetroVertex& v1, MetroVertex& v2, MetroVertex& v3)
{
    vec4 tangent   = vec4(1.0f, 0.0f, 0.0f, 1.0f);
    vec3 bitangent = vec3(0.0f, 1.0f, 0.0f);

    vec3 edge1 = v2.pos - v1.pos;
    vec3 edge2 = v3.pos - v1.pos;

    vec3 normal = glm::normalize(glm::cross(edge1, edge2));

    edge1 = glm::normalize(edge1);
    edge2 = glm::normalize(edge2);

    vec2 texEdge1 = v2.uv0 - v1.uv0;
    vec2 texEdge2 = v3.uv0 - v1.uv0;

    texEdge1 = glm::normalize(texEdge1);
    texEdge2 = glm::normalize(texEdge2);

    float det = (texEdge1.x * texEdge2.y) - (texEdge1.y * texEdge2.x);

    if (fabsf(det) >= 1e-6f)
    {
        det = 1.0f / det;

        tangent.x = (texEdge2.y * edge1.x - texEdge1.y * edge2.x) * det;
        tangent.y = (texEdge2.y * edge1.y - texEdge1.y * edge2.y) * det;
        tangent.z = (texEdge2.y * edge1.z - texEdge1.y * edge2.z) * det;
        tangent.w = 0.0f;

        bitangent.x = (-texEdge2.x * edge1.x + texEdge1.x * edge2.x) * det;
        bitangent.y = (-texEdge2.x * edge1.y + texEdge1.x * edge2.y) * det;
        bitangent.z = (-texEdge2.x * edge1.z + texEdge1.x * edge2.z) * det;

        tangent   = glm::normalize(tangent);
        bitangent = glm::normalize(bitangent);
    }

    vec3 t = tangent;
    vec3 b;

    b = glm::cross(normal, t);
    tangent.w = (glm::dot(b, bitangent) < 0.0f) ? -1.0f : 1.0f;

    v1.tangent = tangent;
    v2.tangent = tangent;
    v3.tangent = tangent;
}


RenderPanel.cpp modified CreateModelGeometries function
CODE
// MetroModel.h
//MetroMesh*        GetMesh(const size_t idx) const; // removed return constness to be able to change verts without making new copies

//vb
for (int i = 0; i < mesh->faces.size(); i++)
                    {
                        auto& v1 = mesh->vertices[mesh->faces[i].a];
                        auto& v2 = mesh->vertices[mesh->faces[i].b];
                        auto& v3 = mesh->vertices[mesh->faces[i].c];
                        CalcTangentVector(v1, v2, v3);
                    }


                    desc.ByteWidth = scast<UINT>(mesh->vertices.size() * sizeof(MetroVertex));
                    desc.Usage = D3D11_USAGE_DEFAULT;
                    desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
                    subData.pSysMem = mesh->vertices.data();
                    mDevice->CreateBuffer(&desc, &subData, &rg->vb);


RenderPanel.cpp CreateTexture function, added normal map
CODE
...
String^ texNameManaged = ToNetString(textureName);
                String^ texNameManaged2 = ToNetString(textureName + std::string("_nm"));

                const bool contains = mModelTextures->ContainsKey(texNameManaged);
                if (!contains)
                {
                    CharString texturePath = CharString("content\\textures\\") + (sourceName.empty() ? textureName : sourceName);

                    CharString texturePathBest = texturePath + ".512";
                    size_t textureIdx = VFXReader::Get().FindFile(texturePathBest);

                    rg->texture2 = nullptr;
                    CharString texturePathBest2 = texturePath + "_nm.512";
                    size_t textureIdx2 = VFXReader::Get().FindFile(texturePathBest2);

                    if (textureIdx != MetroFile::InvalidFileIdx) {
                        MemStream stream = VFXReader::Get().ExtractFile(textureIdx);
                        if (stream) {
                            const MetroFile& mf = VFXReader::Get().GetFile(textureIdx);

                            MetroTexture texture;
                            if (texture.LoadFromData(stream, mf.name)) {
                                RenderTexture* rt = new RenderTexture;
                                this->CreateRenderTexture(&texture, rt);
                                mModelTextures->Add(texNameManaged, IntPtr(rt));

                                rg->texture = rt;
                            }
                        }
                    }

                    if (textureIdx2 != MetroFile::InvalidFileIdx) {
                        MemStream stream = VFXReader::Get().ExtractFile(textureIdx2);
                        if (stream) {
                            const MetroFile& mf = VFXReader::Get().GetFile(textureIdx2);

                            MetroTexture texture;
                            if (texture.LoadFromData(stream, mf.name)) {
                                RenderTexture* rt = new RenderTexture;
                                this->CreateRenderTexture(&texture, rt);
                                mModelTextures->Add(texNameManaged2, IntPtr(rt));

                                rg->texture2 = rt;
                            }
                        }
                    }
                }
...


RenderPanel.cpp Render function, set const buffer additional matrix and pass normal map to pixel shader
CODE
...
auto invTrn = glm::inverse(mConstantBufferData->matModel);
            mConstantBufferData->matModelInvTranspose = glm::transpose(invTrn);
...
ID3D11ShaderResourceView* texSRV = (rg->texture) ? rg->texture->srv : nullptr;
                            pin_ptr<ID3D11ShaderResourceView*> srvPtr(&texSRV);
                            mDeviceContext->PSSetShaderResources(0, 1, srvPtr);

                            ID3D11ShaderResourceView* texSRV2 = (rg->texture2) ? rg->texture2->srv : nullptr;
                            pin_ptr<ID3D11ShaderResourceView*> srvPtr2(&texSRV2);
                            mDeviceContext->PSSetShaderResources(1, 1, srvPtr2);


Shaders:

common.hlsli
CODE
struct VSOutput {
    float4 pos      : SV_Position;
    float4 normal   : TEXCOORD0;
    float2 uv       : TEXCOORD1;
    float3 tangent  : TEXCOORD2;
    float3 binormal : TEXCOORD3;
    float3 normalWS : TEXCOORD4;
};

cbuffer ConstantBuffer0 : register(b0)
{
    float4            BSphere;
    row_major matrix  MatModel;
    row_major matrix  MatView;
    row_major matrix  MatProjection;
    row_major matrix  MatModelView;
    row_major matrix  MatModelViewProj;
    row_major matrix  MatModelInvTrans; // new
    float4            CamParams;          // x - FOV, y - aspect, zw - vacant
    row_major matrix  Bones[256];
};


ModelViewerVS.hlsl
CODE
...
struct VSInput {
    float3  pos     : POSITION;
    uint4   bones   : TEXCOORD0;
    float4  normal  : TEXCOORD1;
    float4  weights : TEXCOORD2;
    float2  uv      : TEXCOORD3;
    float4 tangent  : TEXCOORD4; // new
};

VSOutput main(VSInput IN)
{
    VSOutput OUT;

    float3 skinnedPos, skinnedNorm;
    Skin(IN, skinnedPos, skinnedNorm);

    OUT.pos = mul(float4(skinnedPos - BSphere.xyz, 1.0f), MatModelViewProj);
    OUT.normal.xyz = mul(skinnedNorm, (float3x3)MatModelView);
    OUT.normal.w = IN.normal.w;
    OUT.uv = IN.uv;

    OUT.normalWS = mul(IN.normal.xyz, (float3x3)MatModelInvTrans);
    OUT.tangent  = mul(IN.tangent.xyz, (float3x3)MatModelInvTrans);
    OUT.binormal = cross(OUT.normalWS, OUT.tangent) * IN.tangent.w;

    return OUT;
}


ModelViewerPS
CODE
#include "common.hlsli"

Texture2D TexAlbedo     : register(t0);
Texture2D TexNormal     : register(t1);
SamplerState Sampler0   : register(s0);

float4 main(VSOutput IN) : SV_Target0
{
    float3 normalMap = TexNormal.Sample(Sampler0, IN.uv).rgb * 2.0f - 1.0f;

    float3x3 tangentBasis = float3x3(normalize(IN.tangent), normalize(IN.binormal), normalize(IN.normalWS));
    float3 normal = normalize(mul(normalMap, tangentBasis));

    float ambient   = 0.32f;
    float3 lightDir = normalize(float3(0.5f, 0.35f, 0.5f));
    float diffuse   = clamp(dot(normal, lightDir), ambient, 1.0f);

    float vao = IN.normal.w;

    float clipAlpha = 0.1f;
    float4 albedo = TexAlbedo.Sample(Sampler0, IN.uv);
    clip(albedo.a - clipAlpha);

    return float4(albedo.rgb * diffuse * vao, 1.0f);
}


and CubemapViewerVS.hlsl
CODE
#include "common.hlsli"

VSOutput main(uint vertexId : SV_VertexID) {
    VSOutput OUT;

    const float idDiv2 = (float)(vertexId / 2);
    const float idMod2 = (float)(vertexId % 2);

    OUT.pos = float4(idDiv2 * 4.0f - 1.0f, idMod2 * 4.0f - 1.0f, 0.0f, 1.0f);
    OUT.normal = 0.0f;
    OUT.uv = float2(idDiv2 * 2.0f, 1.0f - idMod2 * 2.0f);

// not using these
    OUT.tangent  = 0.0f;
    OUT.binormal = 0.0f;
    OUT.normalWS = 0.0f;

    return OUT;
}


Hopefully I didn't miss anything else.




Перейти в начало страницы
 
 
 iOrange
сообщение 06.05.2019, 07:34
Сообщение #598


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Цитата(GoatZombie @ 05.05.2019, 14:45) *
Superb work! Thank you very much, I really appreciate the time and effort you put into this!

Hi! Thanks for the feedback (IMG:style_emoticons/default/smile.gif)

As for the changes - if you want to contribute - you can make a pull-request on Github, I'll review the code and will include the code if everything is ok.

As for normalmapping - didn't add it because of reasons (need to make proper materials system, make proper rendering framework etc.)

Version v0.5 will include lots of changes, as well as new renderer, so stay tuned (IMG:style_emoticons/default/wink.gif)

As for the code you've posted - no need to calculate TBN since it's there already (aux0 will contain tangent if normalmapped)
Перейти в начало страницы
 
 
 iOrange
сообщение 06.05.2019, 07:55
Сообщение #599


Половина землекопа
**************

Куратор темы
Сообщений: 1813
Регистрация: 30.03.2010
Из: Planet Earth
Пользователь №: 13811



Выкладываю версию v0.42
Если не будет серьезных косяков - то это будет последняя версия перед v0.5

Что в ней:
* Исправлен экспорт единичной модели в FBX (не всегда правильно реагировала на настройки)
+ Добавлена поддержка текстур и моделей Redux версий Метро (просмотр + экспорт)

Напоминаю что все что не является Metro Exodus - есть неприоритетным и малоинтересным для меня.
Однако, я решил потратить немного времени, и добавить минимальную поддержку, потому что понимаю что для них утилит удобных практически нет.

Надеюсь на ваше понимание, хочу полностью сосредоточиться на версии v0.5, ибо там работы еще море.

http://s.gameru.net/metro/MetroEX_v042.zip
Перейти в начало страницы
 
 
 Thekello
сообщение 06.05.2019, 12:53
Сообщение #600


Геймер
******

Группа: Участник
Сообщений: 100
Регистрация: 02.03.2019
Из: Россия
Пользователь №: 30622



Цитата(iOrange @ 06.05.2019, 07:55) *
Выкладываю версию v0.42
Если не будет серьезных косяков - то это будет последняя версия перед v0.5

Спасибо вы Волшебник (IMG:style_emoticons/default/wink.gif)
Перейти в начало страницы
 
 
 ed_rez
сообщение 06.05.2019, 14:07
Сообщение #601


Продвинутый геймер
********

Группа: Участник
Сообщений: 434
Регистрация: 10.12.2015
Из: Рига
Пользователь №: 22952



iOrange,
на сколько трудозатратно сделать поддержку файлов уже распакованных игровых файлов, к примеру, моделей, с текстурами и так все ясно?
Перейти в начало страницы
 
 
 
 

 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 29.10.2020, 21:30