Псевдокод. Собственно вот здесь и была проблема, когда мы брали объект по ссылке, но должны были его скопировать в возвращаемое значение, компилятор, вместо того чтобы скопировать объект, копировал ссылку на него. У меня там было соответствующее условие для объекта, для указателя, а для ссылки я забыл добавить. Нуивот.
__________________
Kiss my ass if you don't like my Ford!
------------------------------------------ Game Area51 Update 1
First Person Shooter Released Jul 24, 2017
The game is a 3d shooter with the elements of the quest.
Дядя Миша писал: Псевдокод. Собственно вот здесь и была проблема, когда мы брали объект по ссылке, но должны были его скопировать в возвращаемое значение, компилятор, вместо того чтобы скопировать объект, копировал ссылку на него. У меня там было соответствующее условие для объекта, для указателя, а для ссылки я забыл добавить. Нуивот.
Клёво. А в шоте вообще можно без указателей какой то простой код делать? Ну примерно как на шарпах.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Внимание - на кол-во опкодов за кадр. Для того чтобы парент-система, реализованная на шоте могла работать (умножение, инвертирование матриц, физика трейнов), на первый взгляд простейшая конструкция расходует больше ста тысяч инструкций виртуальной машины за один кадр.
Для сравнения рядом скриншот из первого квейка - самая насыщенная карта первого эпизода. Целая куча монстров. Правда первый скриншот сделать в отладочной сборке, да и почти все матричные операции можно перевести в интринсики, но тем не менее.
Цитата:
FiEctro писал: А в шоте вообще можно без указателей какой то простой код делать? Ну примерно как на шарпах.
Дядя Миша
Я так понял у тебя мечта оставить только виртуальную машину, а весь движок на шоте написать?
Цитата:
Дядя Миша писал: Да можно конечно.
Отлично.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша
FPS подрос хорошо.
А что с гаммой и декалями? И почему на одной и той же сцене разное количество Дипов и треугольников? От количества декалей зависит?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал: И почему на одной и той же сцене разное количество Дипов и треугольников?
Кол-во дипов не является какой-то фундаментальной величиной, которая зависит от сцены. Сколько раз твой рендер сделает флуш - столько дипов и будет. И с кол-вом треугольников та же песня. Помоему старый ксаш вообще не учитывает полигоны декалей в статистике.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Поскольку я плотно занимаюсь рейтрейсером, у меня накопилось немного интересных новостей и я спешу поделиться ими с вами.
Вынужден признать, что несмотря на тот факт, что в своё время я написал компилятор уровней для Паранои, я по прежнему недостаточно хорошо понимаю принцип работы Q1BSP. Точнее в некоторых мелочах у меня пробелы в знаниях. Но поскольку рейтрейсер будет базироваться как раз на дереве такого типа, то я эти пробелы как раз и закрою. Для начала - минутка забавного. Как вы все знаете, для построения BSP используются только позитивные плоскости, но если в ку2 и в ку3 это явно видно в коде, то в ку1 и халфе - совсем даже неочевидно. Но вчера я наткнулся на замечательное:
C++ Source Code:
1
for( int i = 0; i < g_nummapplanes; i += 2 )
2
{
3
n = AllocSurface();
4
n->planenum = i; <-- !!!
Нувыпонели, да?
Ну а теперь перехожу к основному. Построить дерево несложно. Сложно определить где и что у нас внутри, а что снаружи. Где солидное, а где несолидное. Помните как я мучался в 2020-м году, строя BSP из полигонов для коллизии? Дерево построено, а где какие контентсы определить - ну решительно невозможно. Если ориентироваться на контентсы, заданные типом самого материала, мы просто придём к тому, что все наши пустые лифы окажутся заполненными. Правда мы можем прибегнуть к инверсному варианту - если в лифе есть геометрия, значит он пустой и наоборот.
Это прекрасно работает, на первый взгляд проблема решена?
Да, но нет. Потому что нам блин надо ещё как-то отличить solid от sky!!!!
Это же одна из основных фишек Q1BSP - возможность отличить просто твёрдую поверхность от неба, просто проверяя ноды, и не касаясь реальной геометрии. И, забегая вперёд, скажу что я был полностью прав - дерево такого типа действительно самая быстрая ускоряющая структура из всех существующих, известных мне. Ну навскидку, такое BSP-дерево быстрее BVH структуры (которая между прочим использует SSE2-оптимизации) в четыре с половиной раза. И это ещё рекурсивный вариант с одной оптимизацией goto. В шейдере-то будет вариант с циклом - он ещё быстрее. Но ровно до тех пор, пока мы не начинаем проверять реальные фейсы, принадлежащие ноде. Что вообщем-то и логично. Геометрия растворена в дереве, мы трейсим дерево и получаем сумашедшую производительность. Одна только мелочь нам мешает - как же диффернцировать солидные фейсы от небесных?
В Q1BSP (да и в халфе так же), контентсы сурфейсов приходят из CSG. А изначально (до CSG) контентсы ставятся брашам, т.е. замкнутным объемам.
Как вы помните, поскольку в Q1 (да и в халфе), может быть только единственный контентс на браш, функция выбора этих самых контентсов - очень ответственное и непростое дело. То есть нам надо решить как поступить если часть браша вода, а часть - солиды, ну итд. А можно не решать, т.к. CSG вполне может отрезать эту солидную часть и останется только вода. Из чего ясно следует - CSG в Q1BSP (да и в халфе тоже), определяет вообще абсолютно всё. Помните как я в своё время удивлялся, что CSG напрямую влияет и на швы на лайтмапе и на качество построения дерева и на всякие визуально-физичные глюки, типа невидимой воды. Ну и вот. При этом CSG в этом конвейере неотключаемый и выбросить его в принципе нельзя - без CSG построить дерево попросту не удасться, т.к. мы не будем знает где какие контентсы. Проще говоря ерунда получится, да и всё.
Хорошо, но так ли всё плохо? Ведь есть же Q2. Там с одной стороны уже и порталы ввели, а с другой - осталось классическое дерево из Q1 где все поверхности уложены на ноду. Совершенно верно, дерево там такое же, несмотря на то, что контентсы задаются уже битами. И CSG там тоже отключаемый, можно и вовсе без него (отдельный кайф это то, как там водяные брашы лишаются своих внутренних сторон, совершенно не так как в Q1, я вам как-нибудь расскажу), следовательно можно прибегнуть к опыту Кармака в Q2 и сделать как там? Да, можно, с одной маленькой поправкой. В Quake2 нет CONTENTS_SKY. Как раз в силу невозможности его определения без CSG. И теперь вы это тоже знаете.
А я буду думать дальше.
Добавлено 27-10-2024 в 14:05:
Собственно, как определяются контентсы в Q2
C++ Source Code:
1
for (b=brushes ; b ; b=b->next)
2
{
3
// if the brush is solid and all of its sides are on nodes,
4
// it eats everything
5
if (b->original->contents & CONTENTS_SOLID)
6
{
7
for (i=0 ; i<b->numsides ; i++)
8
if (b->sides[i].texinfo != TEXINFO_NODE)
9
break;
10
if (i == b->numsides)
11
{
12
node->contents = CONTENTS_SOLID;
13
break;
14
}
15
}
16
node->contents |= b->original->contents;
17
}
Обратите внимание на комментарий. Такое возможно, например для браша, висящего посреди комнаты. Тогда все его стороны окажутся уложенными на ноду. Ну и да - SOLID как видите не уживается с любыми другими типами контентсов. А другие типы, как несложно догадаться, это либо лава, либо вода, либо кислота.
А с небом так не прокатит, ведь из небесного браша типично остается только одна видимая сторона. А все остальные "тонут" в солидной геометрии.
Напомни пожалуйста что такое сторона, уложенная на ноду, и чем она отличается от стороны не уложенной на ноду.
Насколько я помню, ты всегда этим условием оперировал как понятным, а мы тебя и не спрашивали. Я понимаю термины, но они не складываются у меня в картинку.
Нода это секущая плоскость, сторона это плоскость браша. Нода, как я знаю, обычно появляется при распространении во все стороны плоскости браша, которую компилятор счёл достаточно важной (аксиальной и большой) чтобы рассечь ею ещё несколько листьев в дереве на более мелкие листья. Получается "сторона лежит на ноде" это просто когда стороны двух брашей лежат в одной плоскости? Но тогда как можно приводить пример с брашем висящим посреди комнаты? Что-то не складывается.