Требуется помощь с C++

Сообщения
156
Реакции
205
Помог
5 раз(а)
Речь идет о компиляторах карт, вернее только об одном из четырех.
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;
}
surfaces.cpp - процесс формирования конечных полигонов, надо выявить, какие "объекты" мы имеем на выходе.
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;
}

 

Вложения

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу