Sidebar

NEWBSPGUY

Статус
Закрита.
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
Ну правильно, drawTransparentEnts = pass == 1; Нулевой проход рисует непрозрачные энтити, а первый - прозрачные.
А как анимация будет работать если они останутся неподвижными
Заливай матрицы костей через юниформы в шейдер и трансформируй вертексы. Я ж тебе сразу сказал - бери ксаш-мод и смотри как устроено там.

тут такая штука, что из TRIANGLES STRIP/FAN, конвертит в GL_TRIANGLES, что бы потом целиком рисовать модель.
Тебе надо создавать этот буффер для дефолтного положения вертексов, впрочем ещё раз говорю - кури исходники ксаш-мода, там всё это есть.
И буффер там не обновляется вообще никогда.
 

karaul0v

Active member
06.05.10
350
Да я вкурсе что там ничего не создается, а обновляются положения костей каждый кадр только и по очереди каждая вершина рисуется через GL_TRIANGLES_FAN/STRIP

А тут у меня то же самое, только буфер создается и конвертируется в GL_TRIANGLES и по этому я не могу через стандартную функцию его поворачивать, а как сделать TransformBones с GL_TRIANGLES я не вкурсе пока что. (Но по идее можно заставить работать с GL_TRIANGLES, просто я пока еще не знаю как это следать)
Post automatically merged:

Ну правильно, drawTransparentEnts = pass == 1; Нулевой проход рисует непрозрачные энтити, а первый - прозрачные.
ну я когда в час ночи смотрел, казалось что это означает первый проход :) ))))) ну ошибся немного )
 
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
Тебе что ли заглянуть в исходники ксаш-мода религия не позволяет, раз ты упорно твердишь "я не в курсе как это сделать" ? :oops:
 

karaul0v

Active member
06.05.10
350
Тебе что ли заглянуть в исходники ксаш-мода религия не позволяет, раз ты упорно твердишь "я не в курсе как это сделать" ? :oops:
Да еще раз говорю, это две разные вещи, я уже качал где-то месяце назад исходники, и там каждый кадр обновляются вершины (ну всмысле применяются кости с текущей анимацией) и потом каждая вершина по очереди рисуется применяя GlBegin(FAN/STRIP), происходит огромное количество вызовов функций и так идет рендер, может я не те исходники скачал, хз.

А у меня то же самое, только после этого еще и в GL_TRIANGLES конвертируется, что бы в "один вызов" все отрисовать целиком, по этому там бесполезные исходники в этом плане.

Хотя я уже не пойму о чем речь идет :) Забыл мысль так сказать :)
 
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
я уже качал где-то месяце назад исходники
Ты качал исходники движка, а я тебе про ксаш-мод говорю. https://hlfx.ru/forum/showthread.php?s=&threadid=5279

Ну можешь ещё сорцы P2 посмотреть, но там кода сильно больше, в ксаш-моде разобраться проще.
Там же возьмёшь готовые шейдеры для рендеринга моделей со всеми халфовскими эффектами. Аддитив, солид, глоу-шелл и прочие. И заодно там поддержка моделей с развесовкой - это кастомный формат, доступный только на ксаше. Можешь заодно сразу всё это портировать и получишь полную поддержку расширенного формата моделей из Ксаша, что твоему форку пойдет только на пользу.
Post automatically merged:

И на будущее, вот лонгрид, чтобы отличать Гоголя от Гегеля, Гегеля от Бебеля, Бебеля от Бабеля, Бабеля от кабеля, кабеля от кобеля, а кобеля от суки и стать кандидадтом науки!
 

karaul0v

Active member
06.05.10
350
Ты качал исходники движка, а я тебе про ксаш-мод говорю. https://hlfx.ru/forum/showthread.php?s=&threadid=5279

Ну можешь ещё сорцы P2 посмотреть, но там кода сильно больше, в ксаш-моде разобраться проще.
Там же возьмёшь готовые шейдеры для рендеринга моделей со всеми халфовскими эффектами. Аддитив, солид, глоу-шелл и прочие. И заодно там поддержка моделей с развесовкой - это кастомный формат, доступный только на ксаше. Можешь заодно сразу всё это портировать и получишь полную поддержку расширенного формата моделей из Ксаша, что твоему форку пойдет только на пользу.
Post automatically merged:

И на будущее, вот лонгрид, чтобы отличать Гоголя от Гегеля, Гегеля от Бебеля, Бебеля от Бабеля, Бабеля от кабеля, кабеля от кобеля, а кобеля от суки и стать кандидадтом науки!
Выглядит как какой-то древний мамонт а не сайт по сравнению с csm.dev))

Меня уже успели забанить там :)

130278

Post automatically merged:

Перезапустил роутер, с другим айпишником тоже не пускает, почти такой только пишет уже город Солигорск вместо Минск :)
 

karaul0v

Active member
06.05.10
350
Я был зареган там лет 10 если не больше назад, помню забанили еще когда был форум старый по маппингу) кому-то там не нравились мои генераторы карт вроде бы, ну там переместили все мои темы в одну кучу сделали помойку какую-то из всех тем, ну и я обиделся тогда на кого-то :D :D :D
Post automatically merged:




Хочу добавить отладку VIS но столкнулся с проблемами.

В bspguy можно получить leaf в котором сейчас находится камера.
Пытаюсь перекрасить все клипноды в определенный цвет в зависимости от того виден он или нет.

Но все никак неполучается сделать, добавил decopressvis для текущего leaf в котором нахожусь, но в рендере клипнодов не смог понять как узнать в каком leaf находится сейчас.
Post automatically merged:

Есть какая-нибудь карта где точно работает VIS и правильно скомпилирован?))
 
Останнє редагування модератором:
  • Like
Reactions: Qwertyus
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
В bspguy можно получить leaf в котором сейчас находится камера.
Ничего себе!
Пытаюсь перекрасить все клипноды в определенный цвет в зависимости от того виден он или нет.
Клипноды никак не связаны с визом. Оттого и не получается.
Но можно поступить проще - вычислить CRC оригинального виза и сравнивать с тем, что оставляет после себя BSPGuy. Только ради бога не подгоняй результаты этой чудовищной тулзой. Вот жеш твари какую пакость удумали. В средние века их бы за это сожгли на костре. Потому что гладиолус.
 

karaul0v

Active member
06.05.10
350

Добавил в окно Debug кнопку "TEST VIS DATA".
Но я не пойму где я ошибся потому что на том же de_train , подсвечивает всю карту красным :)

Кнпока в общем делает следующее:

1. Запоминает все leafs которые находятся рядом с камерой
2. Запускает заново рендер клипнодов (0-4)
3. Во время рендера, проверяется видим ли leaf который сейчас должен рисоваться, и если виден, то цвет ставит красный.
Post automatically merged:

Клипноды никак не связаны с визом. Оттого и не получается.
не увидел сообщение.

Да я просто как-то визуально что бы видеть, можно конечно текстуры перекрашивать, но не хотелось по этому зачем-то решил через визуализацию клипнодов :)
Post automatically merged:

Сделал второй вариант, выделение фейсов, и это кажется работает на 80%... :) :)

Правда почему-то не все фейсы выделяет.
Post automatically merged:

В общем частично работает :)


Должно синим подсвечивать видимое, красным невидимое... Но как-то как будто VIS данные битые :( Или я не так распаковываю :(
Post automatically merged:

 
Останнє редагування модератором:
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
Из текущей позиции камеры мы получаем лиф, в котором находится игрок. К этому лифу прилинкована виз-дата. Её надо распаковать. Получится бит-вектор. Бит-вектор содержит в себе абсолютно все лифы на карте (включая и тот, в котором сейчас находится игрок), в виде битов. Если бит равен нулю - этот лиф очевидно не виден из этого лифа, в котором камера. Если бит равен еденице - значит виден.
Таким образом, пройдясь по виз-дате текущего лифа мы собираем коллекцию указателей на видимые лифы. И вот уже из этой коллекции собираем видимые сурфейсы, причём следует учитывать ещё две вещи:
1. Сурфейсы там дублируются, поэтому надо ввести проверку на уникальность, чёб не рисовать одно и тоже по нескольку раз.
2. в халфе все лифы сдвинуты на еденичку вперёд.
Post automatically merged:

Посмотрел твой код, он какой-то ерундой занимается.
C++:
for (int m = 0; m < map->modelCount; m++)
Виздата применяется только к миру, у бмоделей её нет.
C++:
for (int i = 0; i < MAX_MAP_HULLS; i++)
Зачем перебирать все хуллы, лишняя бессмысленная работа.
Перебирай только ЛИФЫ.
C++:
int contents = map->pointContents(headNode, localCamera, i, nodeBranch, leafIdx, childIdx);
                    if (leafIdx >= 0)
                    {
                        bool found = false;
                        for (auto const& s : leafIdxs)
                        {
                            if (s.leafIdx == leafIdx)
Это еще что за ужос? :oops:
Post automatically merged:

Или я что-то недопонял, или там идёт бессмысленная работа.
 
Останнє редагування:
  • Like
Reactions: karaul0v

karaul0v

Active member
06.05.10
350
второй вариант получился покороче и более чисто, но видимо плохо разобрался завтра ещё попробую ченибудь намутить)))
Post automatically merged:

Из текущей позиции камеры мы получаем лиф, в котором находится игрок. К этому лифу прилинкована виз-дата. Её надо распаковать. Получится бит-вектор. Бит-вектор содержит в себе абсолютно все лифы на карте (включая и тот, в котором сейчас находится игрок), в виде битов. Если бит равен нулю - этот лиф очевидно не виден из этого лифа, в котором камера. Если бит равен еденице - значит виден.
Ну это понятно, а вот далее не понятно, в рендере не используются лифы вообще, по этому я не могу проверить видимость объектов, скостылил конвертер получения лиф по фейсу, но в итоге как-то подозрительно работает.

В первом варианте вообще жесть сделал, поиск фейса по plane, потом уже поиск лиф по фейсам, и потом уже проверка на видимость)))

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

интересно правильно ли я использую decompressvis, может что-то не так передаю из-за этого плохие резльтаты
 
Останнє редагування модератором:
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
в рендере не используются лифы вообще
В самой карте содержится информация о том, какие сурфейсы к какому лифу принадлежат. Тебе не надо их искать по плоскости, да и вообще никак не надо искать. Судя по всему при загрузке карты в память эта информация в BSPGuy просто игнорируется, т.к. в ней не возникало надобности.
Таким образом тебе надо просто немного доработать загрузчик. В структуре dleaf_t находятся оффсет от начала и общее кол-во элементов с лумпе MARKSURFACES, который вероятно вообще никак не используется. Вот собственно в этом лумпе и лежат номера сурфейсов, прилинкованных к лифу.
Так что основная работа у тебя должна быть в загрузчике. А потом всё будет довольно просто.
Ну и не забываем про сдвиг лифов на еденичку. Хотя может быть конкретно BSPGuy это и не использует.
 

Qwertyus

Well-known member
13.08.09
1 474
65
48
  • Xash медаль
Вообще, у меня есть примеры того, что оптимизация карт в BSPGuy ломает их совместимость с Ксашем. Но не всегда, в каких-то отдельных странных случаях. При этом под Голдсорсом те же карты работают без проблем. Сама оптимизация напрвлена на удаление избыточной информации из карты для сокращения задействованных лимитов. @Дядя Миша возможно ты бы мог глянуть код оптимизации и увидеть там какую-то ошибку. Либо Ксаш на такое не вполне расчитан, и потому иногда неправильно обрабатывает изменения. По идее, оптимизация влияет на брашевые энтити карты, но я почему-то сталкивался с примерами того, что переставала правильно работать коллизия ворлдспавна и пропадали из вида точечные энтити (монстры), находившиеся на геометрии ворлдспавна. Т. е. вроде бы оптимизация не должна была их никак коснуться. В теории, ошибка может быть какой-нибудь глупой, по типу уже исправленной ситуации, когда вставка нулевых байтов 00 ломала энтпатч. Только в данном случае это происходит не с энтпатчем, а с информацией о хуллах, либо ещё с чем-то, чего касается оптимизация. И получается ситуация, когда ГС такое изменение игнорирует, а для Ксаша это препятствует нормальной загрузке информации о карте.
Post automatically merged:

Возможно, это как раз и относится к VIS...
 

karaul0v

Active member
06.05.10
350
Там автор сказал сам не помнит как работает функция decompress_vis_lump у него, он там походу напутал где надо +1 leaf делать , а где не надо. Там буквально функция 3 аргумента одинаковых принимает походу, ну или как минимум 1 лишний и 2 повтора :)
Post automatically merged:

А вот кстати он отписывался https://github.com/wootguy/bspguy/pull/105#issuecomment-1345545745
Post automatically merged:

Он там пишет что есть проверка на buffer overrun, но по сути эта проверка вообще нигде не работает, даже в ксаше :)

ну например decompressVis(visdata,visbytes) , в visbytes всегда пишут общее количество байт, не могу понять почему.

А по идее надо decompress(vis+leaf.offset, totalVisBytes - leaf.offset) ?
 
Останнє редагування модератором:
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
Вообще, у меня есть примеры того, что оптимизация карт в BSPGuy ломает их совместимость с Ксашем.
В Ксаше бывают 32-битные клипноды, BSPGuy про это не знает, вот и удаляет. К тому же там дополнительная информация - 12 дополнительных лумпов. Вряд ли он их сохраняет.
но по сути эта проверка вообще нигде не работает, даже в ксаше
Нет, она работает, почему же. На некоторых картах, скомпиленных ZHLT. Имеется в виду неправильно записанный VIS в самих картах.
 

karaul0v

Active member
06.05.10
350
Нет, она работает, почему же. На некоторых картах, скомпиленных ZHLT. Имеется в виду неправильно записанный VIS в самих картах.
ну в компиляторе и bspguy они точно не работают, на счет ксаша хз видимо я смотрел старые исходники какие-то, в новых не вижу


C++:
visdata например адрес от 0x10000000 до 0x10003000
vislength например 0x3000
leaf.visoffset например 0x200

получается первый аргумент 0x10000200
второй 0x3000
получается может быть overrun спокойно на 0x200 байт
DecompressVis(visdata + leaf.visoffset, vislength)
в коде DecompressVis проверка на (примерно скажем) currentvisbyte > vislength то выход за пределы, но проблема в том что это условие никогда не случится вовремя
то есть спокойно за пределы выйдет, т.к vislength передается полный размер compress данных, а в первом аргументе, идет compress+offset.
Ну а что за пределами буфера, то это уже рандомный вылет, то есть 50х50 что там 0x00 будет и парсинг прекратится до краша
 
Команда форуму
VIP
28.03.10
15 566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
проблема возникает на обычных картах, не формата Ксаша.
Проблема какого рода возникает? Карта совсем не загружается или начинает глючить?

выход за пределы, но проблема в том что это условие никогда не случится вовремя
Для Zero-Length Encoding без указания размеров распакованной даты довольно проблематично понять, когда случится overrun. Но вообще выход есть. Максимальный размер распакованных данных - это кол-во лифов + 1 >>7. Т.е. в битовом эквиваленте. Пример: у тебя на карте 8 лифов. 8 + 1 = 9. Т.е. максимальный размер буфера - 2 байта. Вообще эта замута со сдвигом на еденичку дико не удобная и Кармак от нее уже в ку2 отказался. Там получается, что нулевой лиф - это как бы солидный мир за пределами уровня. Поэтому POINT_CONTENTS за пределами уровня всегда попадёт в нулевой лиф и выдаст контент SOLID. Но он вроде как не записывается в карту компиляторами, я уже не помню просто.
 
Статус
Закрита.

Game Server

Доноры Красавчики

Користувачі онлайн

Немає користувачів онлайн.