HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Half-Life world model
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



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 выдает то милиарды, то вообще минус. С листами и нодами тоже самое. Тут я подумал, что получил криво модельку, но однако с рёбрами, которые беруться из той-же модельки проблем нет. Полазил в паронойе, там вроде бы точно такой-же код работает на ура. Подскажите пожалуйста в чем моя ошибка, уменя уже совсем мысли кончились.

Сообщить модератору | IP: Записан
Сообщение: 78717

Старое сообщение 02-06-2011 07:08
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



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

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'

Сообщить модератору | IP: Записан
Сообщение: 78724

Старое сообщение 02-06-2011 10:42
-
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг




Всё заработало после того как я вытащил из паранои 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

Отредактировано n00b 02-06-2011 в 11:07

Сообщить модератору | IP: Записан
Сообщение: 78727

Старое сообщение 02-06-2011 11:01
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



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'

Сообщить модератору | IP: Записан
Сообщение: 78729

Старое сообщение 02-06-2011 11:32
-
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



Ок, спасибо, посмотрю.

Сообщить модератору | IP: Записан
Сообщение: 78730

Старое сообщение 02-06-2011 11:40
- За что?
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



Чтоб не создавать лишних тем спрашиваю сдесь:

Почему время хранят во флоатах? просто я сейчас наткнулся на сервер, на котором карта не менялась 1 - 2 недели, так там изза переполнения флоата все жутко дергалось... Почему бы не хранить время в интах в миллисекундах?
Работать будет 49,710269(629) дней, с точностью в миллисекунду

Сообщить модератору | IP: Записан
Сообщение: 78812

Старое сообщение 04-06-2011 10:51
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | IP: Записан
Сообщение: 78816

Старое сообщение 04-06-2011 11:13
-
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



Через что лучше получать время? И как сделано в хл?
timeGetTime( ) на пример не очень точный, а на PerformanceCounter много плохого пишут

Сообщить модератору | IP: Записан
Сообщение: 78829

Старое сообщение 05-06-2011 11:39
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | IP: Записан
Сообщение: 78832

Старое сообщение 05-06-2011 11:58
-
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



Значит можно не боятся. А частоту его каждый кадр тоже смысла нет получать? Она невзначай не поменяется ?

Сообщить модератору | IP: Записан
Сообщение: 78833

Старое сообщение 05-06-2011 12:43
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



таймер из сорса (и ксаша тожы)

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'

Сообщить модератору | IP: Записан
Сообщение: 78834

Старое сообщение 05-06-2011 12:57
-
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



Да я уже посмотрел в ксаше, вот и возник вопрос про частоту. Значит сделаю так. Спасибо.

Сообщить модератору | IP: Записан
Сообщение: 78835

Старое сообщение 05-06-2011 13:02
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35063
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


Цитата:
n00b писал:
timeGetTime( ) на пример не очень точный

Да ладно?

__________________

Сообщить модератору | IP: Записан
Сообщение: 78836

Старое сообщение 05-06-2011 13:50
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



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'

Сообщить модератору | IP: Записан
Сообщение: 78837

Старое сообщение 05-06-2011 14:12
-
n00b
Житель форума

Дата регистрации: Nov 2010
Проживает: (void)
Сообщений: 128

Рейтинг



Я тут над квейком 2 издевался, решил все ускорить, заменил:

C++ Source Code:
curtime = timeGetTime() - base;

на:
C++ Source Code:
curtime = timeGetTime() * 100 - base;

Все получилось, все заметно ускорилось, и загрузка тоже...
Просто так грузит первый уровень за 4 секунды, а с ускорением меньше чем за половину. Это что, ошибка в коде, сам код глючный, или это специально сделано было?

Сообщить модератору | IP: Записан
Сообщение: 78927

Старое сообщение 08-06-2011 12:08
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 15:24. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Half-Life world model
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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