HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 29 сообщений этой темы на одной странице

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 Half-Life world model

Рисую в cl_dll в HUD_DrawTransparentTriangles ребра карты кодом:

C++ Source Code:
1
model_t *WorldModel = gEngfuncs.GetEntityByIndex( 0 )->model;
2
 
3
glBegin( GL_LINES );
4
for( int i = 0; i < WorldModel->numedges; i++ )
5
{
6
  glVertex3fv( WorldModel->vertexes[ WorldModel->edges[ i ].v[ 0 ] ].position );
7
  glVertex3fv( WorldModel->vertexes[ WorldModel->edges[ i ].v[ 1 ] ].position );
8
}
9
glEnd( );


Все прекрасно рисуется, но когда я пытаюсь работать с leaf'ами noda'ми и surface'ми то получается лабудень. В начале попробовал просто пройтись по всем ребрам фейсов, код:
C++ Source Code:
1
for( int i = 0; i < WorldModel->numsurfaces; i++ )
2
{
3
  msurface_t *pface = &WorldModel->surfaces[ i ];
4
 
5
  for( int o = 0; o < pface->numedges; o++ )
6
  {
7
    ...
8
  }
9
}


Но получил зависон. Выяснил что pface->numedges выдает то милиарды, то вообще минус. С листами и нодами тоже самое. Тут я подумал, что получил криво модельку, но однако с рёбрами, которые беруться из той-же модельки проблем нет. Полазил в паронойе, там вроде бы точно такой-же код работает на ура. Подскажите пожалуйста в чем моя ошибка, уменя уже совсем мысли кончились.


Отправлено Дядя Миша 02-06-2011 в 10:42:

полигон формируется так

C++ Source Code:
1
int	i, lindex;
2
float	*vec;
3
 
4
for( i = 0; i < fa->numedges; i++ )
5
{
6
  lindex = loadmodel->surfedges[fa->firstedge + i];
7
 
8
  if( lindex > 0 ) vec = loadmodel->vertexes[loadmodel->edges[lindex].v[0]].position;
9
  else vec = loadmodel->vertexes[loadmodel->edges[-lindex].v[1]].position;
10
  glVertex3fv( vec );
11
}

Где 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 )
2
{
3
  static LARGE_INTEGER	g_PerformanceFrequency;
4
  static LARGE_INTEGER	g_ClockStart;
5
  LARGE_INTEGER		CurrentTime;
6
 
7
  if( !g_PerformanceFrequency.QuadPart )
8
  {
9
    QueryPerformanceFrequency( &g_PerformanceFrequency );
10
    QueryPerformanceCounter( &g_ClockStart );
11
  }
12
  QueryPerformanceCounter( &CurrentTime );
13
 
14
  return (double)( CurrentTime.QuadPart - g_ClockStart.QuadPart ) / (double)( g_PerformanceFrequency.QuadPart );
15
}

__________________
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( ) на пример не очень точный

Да ладно?

__________________

xaerox on Vivino


Отправлено Дядя Миша 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 секунды, а с ускорением меньше чем за половину. Это что, ошибка в коде, сам код глючный, или это специально сделано было?


Временная зона GMT. Текущее время 15:26. Страницы (2): [1] 2 »
Показать все 29 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024