Маппер
Участник
Пользователь
- Сообщения
- 156
- Реакции
- 205
- Помог
- 5 раз(а)
Речь идет о компиляторах карт, вернее только об одном из четырех.
hlbsp - компилятор, который преобразует из исходного кода для редактирования карт двоичный код, понятный движку. Формирует всю архитектуру карты.
В нем интересуют только 3 .cpp файла и некоторые функции.
Что требуется: добавить merge-функции после выполнения subdivide.
В коде после SubdivideFace надо повторить MergePlaneFaces, но с другими объектами(которые мы получаем после SubdivideFace).
При этом выполнять merge следует только при линейных размерах объединенного полигона менее 256.
Рассмотрению подлежат:
solidbsp.cpp - прописан порядок проведения функций.
surfaces.cpp - процесс формирования конечных полигонов, надо выявить, какие "объекты" мы имеем на выходе.
merge.cpp - все merge-функции к адаптации для работы с полигонами.
+ функция для измерения линейных размеров полигона. Если общей размер двух полигонов более 256, совмещение не производить.
hlbsp - компилятор, который преобразует из исходного кода для редактирования карт двоичный код, понятный движку. Формирует всю архитектуру карты.
В нем интересуют только 3 .cpp файла и некоторые функции.
Что требуется: добавить merge-функции после выполнения subdivide.
В коде после SubdivideFace надо повторить MergePlaneFaces, но с другими объектами(которые мы получаем после SubdivideFace).
При этом выполнять merge следует только при линейных размерах объединенного полигона менее 256.
merge-функции направлены на преобразование двух поверхностей в одну при наличии общей грани и лежащих в одной плоскости. SubdivideFace разбивает все поверхности на полигоны в соответствии с требованиями к освещению(полигон не может быть больше 256 текстурных пискеля). В итоге хотелось бы добавить еще раз merge для совмещения мелких полигонов, которые можно узреть при не совсем логичном построении карты.
Рассмотрению подлежат:
solidbsp.cpp - прописан порядок проведения функций.
C++:
static void CopyFacesToNode(node_t* node, surface_t* surf)
{
face_t** prevptr;
face_t* f;
face_t* newf;
// merge as much as possible
MergePlaneFaces(surf);
// subdivide large faces
prevptr = &surf->faces;
while (1)
{
f = *prevptr;
if (!f)
{
break;
}
SubdivideFace(f, prevptr);
f = *prevptr;
prevptr = &f->next;
}
merge.cpp - все merge-функции к адаптации для работы с полигонами.
+ функция для измерения линейных размеров полигона. Если общей размер двух полигонов более 256, совмещение не производить.
Код:
static int CalcFaceExtents(face_t* f, int axis)
{
vec_t mins, maxs, val;
int i;
texinfo_t* tex;
mins = 999999;
maxs = -99999;
tex = &g_texinfo[f->texturenum];
for (i = 0; i < f->numpoints; i++)
{
val = f->pts[0] * tex->vecs[axis][0] +
f->pts[1] * tex->vecs[axis][1] + f->pts[2] * tex->vecs[axis][2] + tex->vecs[axis][3];
if (val < mins)
{
mins = val;
}
if (val > maxs)
{
maxs = val;
}
}
mins = floor(mins);
maxs = ceil(maxs);
return maxs - mins;
}
Вложения
-
430 KB Просмотры: 11