Итак, все форумчане наверняка знают о коде простых стенсильных теней, написанном BUzer'ом. Одним из недостатков этих теней(помимо того, что они не накладываются на модели; всегда смотрят в одну сторону; наконец, изредка рисуются сквозь стены[но очень редко]) является то, что для создания тени каждый(!) раз проводится операция пересчёта поверхностей и рёбер субмоделей. Это, конечно, не так уж заметно, но если сравнить скорость обработки обычной модели Барни и супрер детализированной(785 и 3200 полигонов соответственно), то мы имеем очень заметные подвисания в игре, когда модель попадает в поле зрения в первый раз. Затем, при смене уровней этого не наблюдается, поскольку пересчитанные фейсы и эджи хранятся в памяти. Но стоит выйти из игры(quit) и снова запустить её, как всё начинается заново. Это меня очень раздражает. На днях тов. fire64 дал ссылку на исходники мода Raven City, в котором использован код этих самых теней. Тени там улучшены: направление тени зависит источника света, теней для модели может быть несколько, тени накладываются на модели. Просматривая код я наткнулся на две функции: сохраняющую в файл и загружающую из него информацию о фейсах и эджах модели. Операция загрузки из файла занимает намного меньше времени, чем новый рассчёт. Посидев над этими функциями полчаса, я адаптировал их под код BUzer'a(они заточены под Raven City, а там гораздо больше параметров, правда я не знаю для чего).
Итак, приступим. Добавляем тени BUzer'a в ХЛ, пост здесь:
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 (я печатать замучился).
Ну что сказать... Молодцы ребята, постепенно своим умом восстанавливают код, который я написал пару лет назад
Нет чтоб предложить мне продать свои сорцы, ну чисто символически, за пару ящиков пива? Ээээх...
XaeroX речь идёт о коде теней из хлфх? А про пару я щиков пива это шутка? А то вдруг сейчас фанаты кинуться бегать по магазинам
Добавлено 07-01-2009 в 21:54:
У меня возник вопрос: файлы .дат от теней сохраняются в перемешку с моделями, это неудобно. Всё из-за того что имя модели в StudioModelRenderer с папкой models/, т.е. models/barney.mdl, models/hgrunt.mdl и т.п.
С помощью int strlen можно найти длину строки и "отрезать" опр. количество символов с конца. А есть ли функция "наоборот", т.е. "отрезать" символы с начала строки? Просто нужно избавиться от этого ненавистного models/
Ну помнишь старый хлфх со стенсильными тенями а ля дум3? Я еще на хлру выкладывал скрины. Сейчас-то в хлфх другие тени, а те - валяются без дела.
За пару ящиков пива отдам, че уж
Правда там тени совмещены с попиксельным освещением и бампом, и они не только от моделей, но и от вообще всего, так что просто так их не вставишь. За десять ящиков - могу отдать полностью
Цитата:
Ku2zoff писал: С помощью int strlen можно найти длину строки и "отрезать" опр. количество символов с конца. А есть ли функция "наоборот", т.е. "отрезать" символы с начала строки?
Проще простого. Просто прибавь strlen("models/") к указателю.
Итак, ещё один вопрос. Для сравнения нод и бсп файлов хл использует движковую функцию pfnCompareFile. Но она есть только в enginefuncs_s. В cl_enginefuncs_s её нет. Почему вальв не подумали, что когда-нибудь мододелы захотят сравнить файлы по дате на клиенте? Так вот сам вопрос: какой функцией виндовс можно воспользоваться для сравнения? Искал по слову compare, но ничего подходящего не нашёл.
От народ, такую элементарщину объяснять приходится. Только в пак не пихай эти файлы.
Добавлено 07-01-2009 в 22:41:
ЗЫ. способ сравнения времени файлов неудобен в принципе.
Гораздо умнее писать время файла непосредственно в заголовок файла при создании и сравнивать уже оттуда.
Проверка будет проведена, будет создан новый .dat файл, а .mdl не изменится. При следующей загрузке обнаружится, что .mdl старше и снова будет создан новый .dat. И так до бесконечности. Думаю, что вариант с записью информации в .dat файл наилучший. Я пробовал писать в файл и статус и время, но потом из него считывается "ничего", даже не null. Может надо как-то конвертировать time_t, например в int ?
Я делал так: в MDX-файл сохранял CRC16-значение данных MDL (т.е. CRC_ProcessBuffer(mod->cache.data)) и при загрузке снова его считал и сверял. Если не совпадали - значит MDL был изменен и MDX надо построить заново.
Ku2zoff
Я своё время искал в гугле, ни один из них не подошел (хотя названия теже, а вот содержание разное). Пришлось просить у людей.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!