Дядя Миша писал: В телеграме выложил серию постов, отчёты о проделанной работе и о том, что предстоит сделать в ближайшее время.
Не хотелось бы чтобы это стало традицией, когда реальная инфа вся в телеграме.
Вот здесь можно скачать модельки Лондона в каких-то географических форматах, 1-2Гб, может получиться мощная тестовая карта.
nload/?mapService=EA/SurveyIndexFiles&Mode=spatial
В рамках написания универсального конвертора-мигратора со старых игр на XashNT, наконец-то дошли руки до обещанного декомпилятора уровней из халфы\кваки. Что тут можно сказать:
1. Информации, которая хранится в Q1BSP\HLBSP недостаточно для полноценной реконструкции брашей. Я не могу извлечь эту информацию из дерева, потому что соответствующие ветки дерева помечены как outside и обрублены ещё на этапе компиляции. Они все просто ссылаются на common outside leaf.
2. Тем не менее, учитывая вышесказанное, можно создать гигантский куб, по размеру всей модели и пропустить его сквозь дерево, нарубив внутренности на конвексные брашы. У такого подхода две очевидных проблемы:
- результат декомпиляции, запечённый в куб практически не подлежит дальнейшему редактированию.
- текстурные координаты для сурфейсов при таком подходе ищутся перебором примерно подходящих и в большинстве случаев оканчиваются фейлом. Нет хорошего способа наложить текстурные координаты на получившиеся брашы. Если не путаю, то BSPc вообще их не накладывает.
3. Таким образом декомпиляция по методу, описанному во втором пункте не годится - мы же хотим чтобы карту можно было ещё и редактировать в дальнейшем. Был ещё один декомпилятор под названием BSPTwoMap. Он на первый взгляд давал куда более лучшие результаты, но на самом деле просто превращал каждый полигон в отдельный браш. Т.е. максимально тупой способ.
4. Учитывая всё вышесказанное, надо было придумать что-то иное. Раз уж внешние стены всё равно до брашей не восстановишь, то их можно превратить в тонкие брашы, достроив недостающее. И в то же время, там где сторон достаточно для полноценной реконструкции - создавать настоящие браши. Именно такой подход я и принял за основу своего декомпилятора. Однако меня ждала весьма неожиданная и непреодолимая засада.
5. Дело в том, что перед тем, как уложить фейсы на ноду, компилятор их рубит на квадратики, согласно размерам их лайтмапы. Как легко догадаться, отличить сурфейс, разрубленный секущей плоскостью ноды, от сурфейса, разделённого субдивайдером на квадартики нет даже теоретической возможности. Казалось бы, ну и что такого? Надо просто смержить все сурфейсы да и всё. Но как раз тут нас и подстерегает вышеупомянутая засада:
6. Излишний мержинг убивает валидные стороны брашей! Т.е. если где-то были два браша у которых была планарная верхушка, существует очень высокая вероятность что эти две стороны смержатся в одну и там где могло бы получится два симпатичных замкнутых браша, получится 12 брашей из их сторон. Я бы не сказал, что эта ситуация возникает абсолютно всегда. Я больше скажу - брашей подлежащих полноценной реконструкции практически на всех картах удивительно мало, но оно и понятно. Ведь BSP в первую очередь задаёт геометрию, а детализации там весьма мало. Вот и получается что на какую-нибудь халфовскую карту приходится от силы 50-60 брашей, которые можно реконструировать. А всё остальное превращается в новые брашы из одной-единственной стороны. Т.е. это такой компромиссный вариант между BSPc и BSPTwoMap.
7. Теоретически в дальнейшем мне в голову придут какие-то новые идеи насчёт всего этого. Но пока - вот так.
Дядя Миша писал: - текстурные координаты для сурфейсов при таком подходе ищутся перебором примерно подходящих и в большинстве случаев оканчиваются фейлом. Нет хорошего способа наложить текстурные координаты на получившиеся брашы. Если не путаю, то BSPc вообще их не накладывает.
Почему? Это же просто UV для отдельного сурфейса. Почему его нельзя просто скопировать? или там проекцию сделать?
Цитата:
Дядя Миша писал: Он на первый взгляд давал куда более лучшие результаты, но на самом деле просто превращал каждый полигон в отдельный браш. Т.е. максимально тупой способ.
В целом да, но при этом геометрию косячит меньше всего. А в случае с ILE благодаря тому что мы использовали пирамидки, можно было импортировать даже obj. Правда без текстурных координат.
Добавлено 30-05-2023 в 11:52:
Цитата:
Дядя Миша писал: 6. Излишний мержинг убивает валидные стороны брашей! Т.е. если где-то были два браша у которых была планарная верхушка, существует очень высокая вероятность что эти две стороны смержатся в одну и там где могло бы получится два симпатичных замкнутых браша, получится 12 брашей из их сторон. Я бы не сказал, что эта ситуация возникает абсолютно всегда. Я больше скажу - брашей подлежащих полноценной реконструкции практически на всех картах удивительно мало, но оно и понятно. Ведь BSP в первую очередь задаёт геометрию, а детализации там весьма мало. Вот и получается что на какую-нибудь халфовскую карту приходится от силы 50-60 брашей, которые можно реконструировать. А всё остальное превращается в новые брашы из одной-единственной стороны. Т.е. это такой компромиссный вариант между BSPc и BSPTwoMap.
Наверное их надо проверять совпадают ли у них UV и текстурные координаты, и находятся ли они в одной плоскости, если да, то можно мержить, если нет, то это разные браши. В общем у них должна быть общая нормаль, общие UV координаты, и вершины плоскости должны быть конвексными.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал: Это же просто UV для отдельного сурфейса.
Ну во первых не UV, а текстурная матрица, а во вторых, как ты предлагаешь найти какой UV соответствует какому полигону? Если эти же самые полигоны размолоты в кучу после компиляции, а при выгрызании дыр в кубе они размолоты совершенно иначе. Если бы они совпадали - можно было бы сравнивать повертексно, все вертексы совпали - накладываем текстуру.
Цитата:
FiEctro писал: В целом да, но при этом геометрию косячит меньше всего
Для NT я мог бы вообще дропнуть весь уровень в единую модель и так скомпилить. Но ето неспортивно.
Цитата:
FiEctro писал: В общем у них должна быть общая нормаль, общие UV координаты, и вершины плоскости должны быть конвексными.
Вот в том-то и кроется весь ужас. Что абсолютно всё совпадает, но при этом брашы - разные. Единственное чего я надумал - это многопроходной подбор, построение матрицы смежности и её анализ. Если какой-то фейс цепляется к остальным всего через одно ребро - значит он не из этого браша.
сначало может от сабдивайд избавиться, вычистив разбиение и даже если вручную разбито мапером это тоже почиститься заодно. чистка на основе названия текстуры и текстурных координат и положения полигона в пространстве и общих вершин. получатся такие сложные многовершинные полигоны.
потом их уже разбить и превратить в обычные примитивы браши. этот результат вычесть от изначальной карты, останется много или мало кусков не распарсеной архитектуры. каждый из кусков превратить в модельку, за одно и ббокс подсчитать и впендюрить его к примитивам брашем, чтобы можно сходу карту скомпилить.
marikcool писал: сначало может от сабдивайд избавиться, вычистив разбиение
Как определить где субдивайд, а где разделение деревом?
Цитата:
marikcool писал: чтобы можно сходу карту скомпилить
ну карту к слову можно сразу компилить. Дырок нет.
У меня несколько иная идея сейчас - надо матрицу смежности строить.
Потом как-нибудь опробую. Пока что лимит времени выделенный на декомпилятор истёк. Другие задачи ждут.
Дядя Миша писал: Ну во первых не UV, а текстурная матрица, а во вторых, как ты предлагаешь найти какой UV соответствует какому полигону? Если эти же самые полигоны размолоты в кучу после компиляции, а при выгрызании дыр в кубе они размолоты совершенно иначе. Если бы они совпадали - можно было бы сравнивать повертексно, все вертексы совпали - накладываем текстуру.
Ну импортёры БСП в модельки же как то их находят? И в отличие от разного рода декомпиляторов, текстуры там не сползают. Может стоит сначала сконвертировать в модель и уже с ней работать? Я просто не очень силён в специфике БСП архитектуры.
Добавлено 31-05-2023 в 08:58:
Цитата:
Дядя Миша писал:
Вот в том-то и кроется весь ужас. Что абсолютно всё совпадает, но при этом брашы - разные.
Ну было 2 браша, мержнули их в один. Главное чтобы в инвалид его не превратит, какая разница? Всеравно работаем только с внешней стороной, все остальные грани можно покрасить в NULL.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша писал: Так не получится в один, в том-то и дело. Потому что от второго браша остался только один фейс. А остальное попало в наружние фейсы и было удалено.
Дядя Миша писал: У меня несколько иная идея сейчас - надо матрицу смежности строить.
Что такое матрица смежности и как она решает эту проблему?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!