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


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

Цитата:
n00b писал:
Это что, ошибка в коде, сам код глючный, или это специально сделано было?

архитектура такая. Сеть, согласно внутренним правилам ку2 при соединении с сервером не может обмениваться пакетами чаще чем 10 раз в секунду, а данных там много. Если попробуешь тот же фокус по сети провернуть, оно скорее всего зависнет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено n00b 14-06-2011 в 16:59:

Делаю трейс по прицеливанию игрока - в основном, PointContent точки прицеливания идет CONTENT_EMPTY ( -1 ). Но иногда проскакивает CONTENT_SOLID ( -2 ), причем в основном на наклонных поверхностях.
Для чего нужен этот CONTENT_SOLID?


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

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено n00b 14-06-2011 в 17:12:

Цитата:
Дядя Миша писал:
всмысле, для чего нужен?

Всмысле почему так получается, не так выразился.
Спасибо.


Отправлено Дядя Миша 14-06-2011 в 19:01:

Я тут полезную картинку нарисовал, на случай если вдруг непонятно.

Добавлено 14-06-2011 в 23:01:

ЗЫ. отсюда же происходит и эпический упор в невидимую стенку при наклонных поверхностях, со включенным -clipeconomy mode.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено n00b 15-06-2011 в 09:51:

Спасибо большое, теперь я уверен что понял верно
Мне примерно такая картинка пришла в голову ещё до того как я вопрос задал. Я потихоньку водил прицелом по наклонной двери и PointContent был по очереди то -1, то -2.


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

В pm_shared есть код, который отвечает за сглаживание подобных вещей, поэтому игрок не замечает что по сути бежит по маленьким ступенькам.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено n00b 30-06-2011 в 07:20:

Я тут наляпал карту, в ней коридорчик. Если с 1 стороны смотреть - рисует 1600 wpoly, задержка 2мс, если с другой - 1400. Я решил с фонариком пробежаться с 1 конца на другой, попутно все освещая. Добежал, повернулся, и начались тормоза. Смотрю на кол-во полигонов, думал в их колличестве дело - оказалось их даже меньше чем на другом конце, посмотрел на задержку - 8мс! Тут уменя кончился фонарик. Тык, и тормозить перестало, задержка упала до 2 мс. Здрасте думаю, из-за фонарика чтоли такие тормоза? На других картах, например на арканосе, не лагал же этот кривой фонарик, даже в месте где и вполи и еполи под 10000! Включаю его заново, тормозов нет. Что за ерунда думаю... Ну решил повторить пробежку. Стал светить на все подряд. И чем больше я водил по разным фейсам, тем больше начинало тормозить. Выключил фонарик - опять 2мс. Получается, если фейс осветил длайт, то для этого фейса всеравно будет обновлятся лайтмапа, пока длайт не кончится, даже если фейс им уже не освещается? Или этот баг только уменя? ( что наврятли конечно )

Добавлено 30-06-2011 в 11:20:

Проверил под ксашем, там такого вроде нет ( не удивительно конечно ), но фонарик наглым образом светит не туда где прицел, не в центр экрана, а заметно ниже


Отправлено Дядя Миша 30-06-2011 в 14:38:

n00b ну я прямо знаю какой там у тебя фонарик
Если из первокваки, то там в каждом сурфейсе есть dlight_cached и dlightframe, которые, собственно для того и используются, чтобы обновление текстур не происходило каждый кадр. Длайт сместился - кэш обновился, длайт стоит на месте - текстуры не обновляются.
А твоя ситуация похожа на то, что у тебя каждая текстурка, которой коснулся длайт начинает обновляться, пока кол-во активных длайтов не станет равным нулю. Ищи, где в кэше накосячил.

Цитата:
n00b писал:
но фонарик наглым образом светит не туда где прицел, не в центр экрана, а заметно ниже

а, да. У меня там predicted_viewofs берется даже когда предиктинг отключен, и соответственно равен нулю. Включи предиктинг и луч вернется на своё место. Я совсем забыл об этом, надо будет подправить.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено n00b 30-06-2011 в 16:11:

Цитата:
Дядя Миша писал:
n00b ну я прямо знаю какой там у тебя фонарик
Если из первокваки, то там в каждом сурфейсе есть dlight_cached и dlightframe, которые, собственно для того и используются, чтобы обновление текстур не происходило каждый кадр. Длайт сместился - кэш обновился, длайт стоит на месте - текстуры не обновляются.
А твоя ситуация похожа на то, что у тебя каждая текстурка, которой коснулся длайт начинает обновляться, пока кол-во активных длайтов не станет равным нулю. Ищи, где в кэше накосячил.


Да вся проблема в том, что этот баг я в оригинальном хл словил
Вышел, зашел заного, повторил тот-же трюк. Да, задержка опять увеличилась, но уже не до 8мс а до 3мс. После выключения фонаря стало опять 2мс. Баг этот походу редко проявляется, но всетаки он есть.

Добавлено 30-06-2011 в 19:54:

Полигонов в коридоре поменьше стало, 1200. Сделал тоже самое. С 1мс до 3мс поднялось. Запустил ракету, ( от нее длайт ) также 3мс. Пока она летела выключил фонарь стало 1мс. Значит не "пока кол-во активных длайтов не станет равным нулю" а пока длайт который осветил фейс не погаснет. Повторюсь, этот баг я словил в оригинальном хл, даже библиотеки не перекомпиленные.

Добавлено 30-06-2011 в 20:05:

Мда. Сейчас в CS решил проверить, на арканосе. Залез в тот уголок, где под 10000 вполи и еполи, задержка 8мс - 100 фпс ещё держит. Все нормально, запускаю nvg - 12мс. И тут придраться некчему. Дальше пробежался по всей карте со включенным нвг, возвращаюсь в уголок - о ужас! 45мс, около 20 фпс! Выключаю - 8мс, включаю заного - 12мс.

Добавлено 30-06-2011 в 20:11:

И все-таки да, сделал все тоже, на арканосе, с включенным фонариком - при выключении нвг так и осталось 45мс, пока не выключил фонарик. Так что "пока кол-во активных длайтов не станет равным нулю" == true.


Отправлено n00b 25-08-2011 в 17:51:

Как определяется цвет подводного тумана? В ксаше полазил, нашел что цвет берется из текстуры, только как он определяется не понял.

C++ Source Code:
1
// check for half-life water texture
2
if( hl_texture && ( mip.name[0] == '!' || !Q_strnicmp( mip.name, "water", 5 )))
3
{
4
  // grab the fog color
5
  image.fogParams[0] = pal[3*3+0];
6
  image.fogParams[1] = pal[3*3+1];
7
  image.fogParams[2] = pal[3*3+2];
8
 
9
  // grab the fog density
10
  image.fogParams[3] = pal[4*3+0];
11
}


Отправлено Дядя Миша 25-08-2011 в 18:10:

Говорят это в мануале по текстурам написано.
Третий цвет в палитре = цвет подводного тумана. А четвертый цвет в палитре (красный канал) - это плотность тумана.
Опять же, это не я придумал, так в халфе.
Кстати. Сможешь зачинить туман? А то, когда лифов много под водой, он выключается переодически.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено thambs 25-08-2011 в 18:17:

Дядя Миша

он не только выключается, он ещё почему то модели и мир разным цветом туманит. такой же баг в хл2 был, но его пофиксили потом.


Отправлено Дядя Миша 25-08-2011 в 19:38:

thambs да зачем сюда? Есть же специальная тема для багов:
http://www.hlfx.ru/forum/showthread...=&threadid=2810
А то вы про нее забыли.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 13:27.
Показать все 29 сообщений этой темы на одной странице

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