HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Half-Life world model (https://hlfx.ru/forum/showthread.php?threadid=2868)
Отправлено n00b 02-06-2011 в 07:08:
Half-Life world model
Рисую в cl_dll в HUD_DrawTransparentTriangles ребра карты кодом:
C++ Source Code:
1 | model_t *WorldModel = gEngfuncs.GetEntityByIndex( 0 )->model; |
4 | for( int i = 0; i < WorldModel->numedges; i++ ) |
6 | glVertex3fv( WorldModel->vertexes[ WorldModel->edges[ i ].v[ 0 ] ].position ); |
7 | glVertex3fv( WorldModel->vertexes[ WorldModel->edges[ i ].v[ 1 ] ].position ); |
Все прекрасно рисуется, но когда я пытаюсь работать с leaf'ами noda'ми и surface'ми то получается лабудень. В начале попробовал просто пройтись по всем ребрам фейсов, код:
C++ Source Code:
1 | for( int i = 0; i < WorldModel->numsurfaces; i++ ) |
3 | msurface_t *pface = &WorldModel->surfaces[ i ]; |
5 | for( int o = 0; o < pface->numedges; o++ ) |
Но получил зависон. Выяснил что pface->numedges выдает то милиарды, то вообще минус. С листами и нодами тоже самое. Тут я подумал, что получил криво модельку, но однако с рёбрами, которые беруться из той-же модельки проблем нет. Полазил в паронойе, там вроде бы точно такой-же код работает на ура. Подскажите пожалуйста в чем моя ошибка, уменя уже совсем мысли кончились.
Отправлено Дядя Миша 02-06-2011 в 10:42:
полигон формируется так
C++ Source Code:
4 | for( i = 0; i < fa->numedges; i++ ) |
6 | lindex = loadmodel->surfedges[fa->firstedge + i]; |
8 | if( lindex > 0 ) vec = loadmodel->vertexes[loadmodel->edges[lindex].v[0]].position; |
9 | else vec = loadmodel->vertexes[loadmodel->edges[-lindex].v[1]].position; |
Где fa это указатель на msurface_t.
Добавлено 02-06-2011 в 14:42:
Цитата:
n00b писал:
С листами и нодами тоже самое
листы и ноды линкуются в один список. Поэтому сначала убедись что именно перед тобой mleaf_t или mnode_t. Проще всего это делать по контентсам. Но в даркплейсе, к примеру делают указатель на mplane_t нулевым. Впрочем это дело вкуса, оба варианта идентичны.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено n00b 02-06-2011 в 11:01:
Всё заработало после того как я вытащил из паранои com_model.h
В сдк структуры нодов, листов и тд для програмного рендера, а они оказывается отличаются от аппаратного.
Я в шоке от такой подляны...
А вот интересно, в паранйе они этот файлик сами обновляли, или гдето надыбали?
Там даже комментарий сверху:
// 06/25/2002 MAH
// This header file has been modified to now include the proper BSP model
// structure definitions for each of the two Quakeworld client renderers:
// software mode and GL mode. Originally, Valve only supplied it with
// the software mode definitions, which caused General Protection Fault's
// when accessing members of the structures that are different between
// the two versions. These are: 'mnode_t', 'mleaf_t', 'msurface_t' and
// 'texture_t'. To select the GL hardware rendering versions of these
// structures, define 'HARDWARE_MODE' as a preprocessor symbol, otherwise
// it will default to software mode as supplied.
Стоит 2002 г. но дата изменения файла - 2007
Отправлено Дядя Миша 02-06-2011 в 11:32:
n00b в ксаше достоверный com_model.h
Правда ксаш сам кое-какие переменные под себя определяет, но хл их все равно не юзает.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено n00b 02-06-2011 в 11:40:
Ок, спасибо, посмотрю.
Отправлено n00b 04-06-2011 в 10:51:
Чтоб не создавать лишних тем спрашиваю сдесь:
Почему время хранят во флоатах? просто я сейчас наткнулся на сервер, на котором карта не менялась 1 - 2 недели, так там изза переполнения флоата все жутко дергалось... Почему бы не хранить время в интах в миллисекундах?
Работать будет 49,710269(629) дней, с точностью в миллисекунду 
Отправлено Дядя Миша 04-06-2011 в 11:13:
Цитата:
n00b писал:
Почему время хранят во флоатах?
можно и в интегере хранить, почему нет. Начиная со второй кваки, Кармак так и сделал. Только не обольщайся насчет 49 дней. Разрешение таймера ставят таким образом, чтобы на одну еденичку приходилась одна миллисекунда, и общее время работы таким образом составляет те же самые 23 дня. По уму карту надо рестартить при переполнении переменной, пример реализации такого рестарта можно подглядеть в ку3.
Вообще говоря в первой кваке время хранится не во флоате, а в дабле, просто серверное и клиентское время хранится во флоате по каким-то причинам, вероятно связанным с ограничениями виртуальной машины.
В целом особой разницы нету, но, допустим, если принудительно перевести ксаш на целочисленный отсчет времени, начнет глючить мовевитч в спирите и еще некоторые моменты - не хватит точности таймера. Впрочем если код изначально точился под максимальное разрешение в 1 мллисекунду, то проблем не будет.
Предиктинг опять же реализуется попроще.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено n00b 05-06-2011 в 11:39:
Через что лучше получать время? И как сделано в хл?
timeGetTime( ) на пример не очень точный, а на PerformanceCounter много плохого пишут 
Отправлено Дядя Миша 05-06-2011 в 11:58:
Цитата:
n00b писал:
а на PerformanceCounter много плохого пишут
ты хотя бы раз видел, чтобы сорс не запускался из-за проблем с таймером?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено n00b 05-06-2011 в 12:43:
Значит можно не боятся. А частоту его каждый кадр тоже смысла нет получать? Она невзначай не поменяется ? 
Отправлено Дядя Миша 05-06-2011 в 12:57:
таймер из сорса (и ксаша тожы)
C++ Source Code:
1 | double Sys_DoubleTime( void ) |
3 | static LARGE_INTEGER g_PerformanceFrequency; |
4 | static LARGE_INTEGER g_ClockStart; |
5 | LARGE_INTEGER CurrentTime; |
7 | if( !g_PerformanceFrequency.QuadPart ) |
9 | QueryPerformanceFrequency( &g_PerformanceFrequency ); |
10 | QueryPerformanceCounter( &g_ClockStart ); |
12 | QueryPerformanceCounter( &CurrentTime ); |
14 | return (double)( CurrentTime.QuadPart - g_ClockStart.QuadPart ) / (double)( g_PerformanceFrequency.QuadPart ); |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено n00b 05-06-2011 в 13:02:
Да я уже посмотрел в ксаше, вот и возник вопрос про частоту. Значит сделаю так. Спасибо.
Отправлено XaeroX 05-06-2011 в 13:50:
Цитата:
n00b писал:
timeGetTime( ) на пример не очень точный
Да ладно?__________________
Отправлено Дядя Миша 05-06-2011 в 14:12:
XaeroX максимальное разрешение - 1 миллисекунда.
QueryPerfomanceCounter всяко точнее.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено n00b 08-06-2011 в 12:08:
Я тут над квейком 2 издевался, решил все ускорить, заменил:
C++ Source Code:
curtime = timeGetTime() - base; |
на:
C++ Source Code:
curtime = timeGetTime() * 100 - base; |
Все получилось, все заметно ускорилось, и загрузка тоже... 
Просто так грузит первый уровень за 4 секунды, а с ускорением меньше чем за половину. Это что, ошибка в коде, сам код глючный, или это специально сделано было?