HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Стенсильные тени BUzer'a
Небольшая оптимизация
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6861
Возраст: 34

Рейтинг



Exclamation Стенсильные тени BUzer'a

Итак, все форумчане наверняка знают о коде простых стенсильных теней, написанном BUzer'ом. Одним из недостатков этих теней(помимо того, что они не накладываются на модели; всегда смотрят в одну сторону; наконец, изредка рисуются сквозь стены[но очень редко]) является то, что для создания тени каждый(!) раз проводится операция пересчёта поверхностей и рёбер субмоделей. Это, конечно, не так уж заметно, но если сравнить скорость обработки обычной модели Барни и супрер детализированной(785 и 3200 полигонов соответственно), то мы имеем очень заметные подвисания в игре, когда модель попадает в поле зрения в первый раз. Затем, при смене уровней этого не наблюдается, поскольку пересчитанные фейсы и эджи хранятся в памяти. Но стоит выйти из игры(quit) и снова запустить её, как всё начинается заново. Это меня очень раздражает. На днях тов. fire64 дал ссылку на исходники мода Raven City, в котором использован код этих самых теней. Тени там улучшены: направление тени зависит источника света, теней для модели может быть несколько, тени накладываются на модели. Просматривая код я наткнулся на две функции: сохраняющую в файл и загружающую из него информацию о фейсах и эджах модели. Операция загрузки из файла занимает намного меньше времени, чем новый рассчёт. Посидев над этими функциями полчаса, я адаптировал их под код BUzer'a(они заточены под Raven City, а там гораздо больше параметров, правда я не знаю для чего).
Итак, приступим. Добавляем тени BUzer'a в ХЛ, пост здесь:

http://www.half-life.ru/forum/showt...&threadid=13398

Затем открываем StudioModelRenderer.h и после строки

C++ Source Code:
void			GetShadowVector( myvec3_t &vecOut );

в классе CStudioModelRenderer
добавляем две новые строчки:
C++ Source Code:
// Shadow data writing functions.
virtual void	StudioWriteData( void );
virtual bool	StudioReadData( void );

После этого открываем StudioModelRenderer.cpp в нём находим функцию
C++ Source Code:
void CStudioModelRenderer::SetupModelExtraData(void)

и вставляем в неё после условия
C++ Source Code:
if (m_pCurretExtraData->submodels.size() > 0)
  return;

новое условие
C++ Source Code:
if ( StudioReadData() )
  return;

затем вставляем в самый низ этой функции
C++ Source Code:
StudioWriteData();


После этого спускаемся в самый низ файла и вставляем, собственно, функции чтения и записи экстра данных для модели:
C++ Source Code:
1
#include <fstream>
2
#include <iostream>
3
 
4
using namespace std;
5
 
6
//====================
7
//StudioLoadData
8
//
9
//Load data from the .dat file.
10
//====================
11
 
12
bool CStudioModelRenderer::StudioReadData( void )
13
{
14
  int i;
15
  char szFile[256];
16
 
17
  std::string filename(m_pRenderModel->name);
18
  sprintf(szFile, "%s/%s.dat", gEngfuncs.pfnGetGameDirectory(), filename.substr(0, filename.rfind('.')).c_str() );
19
 
20
  std::ifstream fin(szFile, ios_base::in | ios_base::binary);
21
 
22
  if (fin.is_open())
23
  {
24
    int iSubmodelCount;
25
    fin.read((char*)&iSubmodelCount, sizeof(int));
26
    m_pCurretExtraData->submodels.resize(iSubmodelCount);
27
 
28
    for ( i = 0; i < iSubmodelCount; i++ )
29
    {
30
      int iTriangleCount;
31
      int iEdgeCount;
32
 
33
      Face m_fTriangles[MAXSTUDIOTRIANGLES];
34
      Edge m_fEdges[MAXSTUDIOTRIANGLES];
35
 
36
      SubModelData &m_pSubModel = m_pCurretExtraData->submodels[i];
37
 
38
      fin.read((char *)&iTriangleCount, sizeof(int));
39
      fin.read((char *)&m_fTriangles, sizeof(Face)*iTriangleCount );
40
 
41
      fin.read((char *)&iEdgeCount, sizeof(int));
42
      fin.read((char *)&m_fEdges, sizeof(Edge)*iEdgeCount );
43
 
44
      m_pSubModel.faces.reserve( iTriangleCount );
45
      for ( int k = 0; k < iTriangleCount; k++ )
46
        m_pSubModel.faces.push_back( Face( m_fTriangles[k].vertex0, m_fTriangles[k].vertex1, m_fTriangles[k].vertex2) );
47
 
48
      m_pSubModel.edges.reserve( iEdgeCount );
49
      for ( int j = 0; j < iEdgeCount; j++ )
50
        m_pSubModel.edges.push_back( Edge(m_fEdges[j]) );
51
 
52
    }
53
    gEngfuncs.Con_Printf("Loaded extra data for %s\n", m_pRenderModel->name);
54
    fin.close();
55
    return true;
56
  }
57
  gEngfuncs.Con_Printf("Error loading extra data for %s!\n", m_pRenderModel->name);
58
  return false;
59
}
60
 
61
//====================
62
//StudioWriteData
63
//
64
//Writes Shadow volume data into a file.
65
//====================
66
 
67
void CStudioModelRenderer::StudioWriteData( void )
68
{
69
  int i;
70
  char szFile[256];
71
 
72
  std::string filename(m_pRenderModel->name);
73
  sprintf(szFile, "%s/%s.dat", gEngfuncs.pfnGetGameDirectory(), filename.substr(0, filename.rfind('.')).c_str() );
74
  std::ofstream fout(szFile, ios_base::out | ios_base::binary | ios_base::trunc);
75
 
76
  if (fout.is_open())
77
  {
78
    int iSubmodelCount = m_pCurretExtraData->submodels.size();
79
    fout.write((const char *)&iSubmodelCount, sizeof(int));
80
 
81
    for ( i = 0; i < m_pCurretExtraData->submodels.size(); i++ )
82
    {
83
      SubModelData &m_pSubModel = m_pCurretExtraData->submodels[i];
84
      int iTriangleCount = m_pSubModel.faces.size();
85
 
86
      fout.write((const char *)&iTriangleCount, sizeof(int));
87
      fout.write((const char *)&m_pSubModel.faces[0], sizeof(Face)*iTriangleCount);
88
 
89
      int iEdgeCount = m_pSubModel.edges.size();
90
 
91
      fout.write((const char *)&iEdgeCount, sizeof(int));
92
      fout.write((const char *)&m_pSubModel.edges[0], sizeof(Edge)*iEdgeCount);
93
 
94
    }
95
    gEngfuncs.Con_Printf("Writing extra data for %s\n", m_pRenderModel->name);
96
    fout.close();
97
  }
98
 
99
}


Файлы с данными о рёбрах и поверхностях будут иметь форму имя_модели.dat и лежать в папке имя_мода/models
Вот собственно и всё, осталось только сделать проверку на обновление файлов при обновлении модели, также как это происходит с файлами *.nod и *.nrp в папке maps/graphs Это, я думаю будет не сложно, так что я не буду писать этот код, а то пост и так уже огромный :D (я печатать замучился).

Отредактировано Ku2zoff 07-01-2009 в 15:43

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

Старое сообщение 07-01-2009 15:35
- За что?
 XaeroX
Crystice Softworks

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

Рейтинг



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


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

__________________

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

Старое сообщение 07-01-2009 15:43
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6861
Возраст: 34

Рейтинг



XaeroX речь идёт о коде теней из хлфх? А про пару я щиков пива это шутка? А то вдруг сейчас фанаты кинуться бегать по магазинам

Добавлено 07-01-2009 в 21:54:

У меня возник вопрос: файлы .дат от теней сохраняются в перемешку с моделями, это неудобно. Всё из-за того что имя модели в StudioModelRenderer с папкой models/, т.е. models/barney.mdl, models/hgrunt.mdl и т.п.
С помощью int strlen можно найти длину строки и "отрезать" опр. количество символов с конца. А есть ли функция "наоборот", т.е. "отрезать" символы с начала строки? Просто нужно избавиться от этого ненавистного models/

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

Старое сообщение 07-01-2009 15:54
- За что?
 XaeroX
Crystice Softworks

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

Рейтинг



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


Цитата:
Ku2zoff писал:
речь идёт о коде теней из хлфх?

Ну помнишь старый хлфх со стенсильными тенями а ля дум3? Я еще на хлру выкладывал скрины. Сейчас-то в хлфх другие тени, а те - валяются без дела.
За пару ящиков пива отдам, че уж
Правда там тени совмещены с попиксельным освещением и бампом, и они не только от моделей, но и от вообще всего, так что просто так их не вставишь. За десять ящиков - могу отдать полностью

Цитата:
Ku2zoff писал:
С помощью int strlen можно найти длину строки и "отрезать" опр. количество символов с конца. А есть ли функция "наоборот", т.е. "отрезать" символы с начала строки?

Проще простого. Просто прибавь strlen("models/") к указателю.

__________________

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

Старое сообщение 07-01-2009 16:09
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6861
Возраст: 34

Рейтинг



Итак, ещё один вопрос. Для сравнения нод и бсп файлов хл использует движковую функцию pfnCompareFile. Но она есть только в enginefuncs_s. В cl_enginefuncs_s её нет. Почему вальв не подумали, что когда-нибудь мододелы захотят сравнить файлы по дате на клиенте? Так вот сам вопрос: какой функцией виндовс можно воспользоваться для сравнения? Искал по слову compare, но ничего подходящего не нашёл.

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

Старое сообщение 07-01-2009 18:33
- За что?
 XaeroX
Crystice Softworks

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

Рейтинг



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


Цитата:
Ku2zoff писал:
Так вот сам вопрос: какой функцией виндовс можно воспользоваться для сравнения?

GetFileTime

__________________

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

Старое сообщение 07-01-2009 18:36
-
 Дядя Миша
racing for fish

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

Рейтинг



code:
int FS_FileTime (const char *filename) { struct stat buf; if( stat( filename, &buf) == -1 ) return -1; return buf.st_mtime; } int pfnCompareFileTime( const char *filename1, const char *filename2, int *iCompare ) { int time1 = FS_FileTime( filename1 ); int time2 = FS_FileTime( filename2 ); if( iCompare ) { if( time1 > time2 ) *iCompare = 1; else if( time1 < time2 ) *iCompare = -1; else *iCompare = 0; } return (time1 != time2); }

От народ, такую элементарщину объяснять приходится. Только в пак не пихай эти файлы.

Добавлено 07-01-2009 в 22:41:

ЗЫ. способ сравнения времени файлов неудобен в принципе.
Гораздо умнее писать время файла непосредственно в заголовок файла при создании и сравнивать уже оттуда.

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 07-01-2009 19:41
-
 XaeroX
Crystice Softworks

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

Рейтинг



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


Цитата:
Дядя Миша писал:
Гораздо умнее писать время файла непосредственно в заголовок файла при создании и сравнивать уже оттуда.

Угу, как же, умнее.
То ли ты файл открыл, то ли время в FATе посмотрел - есть разница?

__________________

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

Старое сообщение 07-01-2009 21:30
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6861
Возраст: 34

Рейтинг



Проверка будет проведена, будет создан новый .dat файл, а .mdl не изменится. При следующей загрузке обнаружится, что .mdl старше и снова будет создан новый .dat. И так до бесконечности. Думаю, что вариант с записью информации в .dat файл наилучший. Я пробовал писать в файл и статус и время, но потом из него считывается "ничего", даже не null. Может надо как-то конвертировать time_t, например в int ?

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

Старое сообщение 08-01-2009 06:38
- За что?
 XaeroX
Crystice Softworks

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

Рейтинг



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


Я делал так: в MDX-файл сохранял CRC16-значение данных MDL (т.е. CRC_ProcessBuffer(mod->cache.data)) и при загрузке снова его считал и сверял. Если не совпадали - значит MDL был изменен и MDX надо построить заново.

__________________

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

Старое сообщение 08-01-2009 09:32
-
 Дядя Миша
racing for fish

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

Рейтинг



>>То ли ты файл открыл, то ли время в FATе посмотрел - есть разница?
ну конечно же есть! именно поэтому и советую. Вообще много способов есть.

Добавлено 08-01-2009 в 13:54:

Можно вписать доп инфу в саму модельку кстати. В заголовке есть какие-то неиспользуемые переменные - можно их заюзать как смещение до этой инфы.

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 08-01-2009 10:54
-
GuNsHiP
Sneekls!

Дата регистрации: Apr 2009
Проживает: Украина, Мариуполь
Сообщений: 348
Возраст: 33

Рейтинг



Сделал тени, но при компиляции нужны эти файлы

C++ Source Code:
#include "gl/gl.h"
#include "gl/glext.h"


У кого есть скиньте Расчитываю на вашу помощь!

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

Старое сообщение 27-04-2009 19:13
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6861
Возраст: 34

Рейтинг



Лучше в гугле поищи, быстрее будет. И кстати, я уже давно сделал норм. проверку возраста .mdl доберусь до своих исходников и выложу.

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

Старое сообщение 28-04-2009 03:16
- За что?
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 13519
Возраст: 33

Рейтинг



GuNsHiP
http://hlfx.ru/forum/showthread.php?s=&threadid=826
Еще в сдк паранои есть.

Ku2zoff
Я своё время искал в гугле, ни один из них не подошел (хотя названия теже, а вот содержание разное). Пришлось просить у людей.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

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

Старое сообщение 28-04-2009 09:07
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



первый есть в студии, второй надо искать как можно более толстый (килобайт на 300-400).

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 28-04-2009 10:27
-
Тема: (Опционально)
Ваш ответ:



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


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

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

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

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

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

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