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

Сообщения
161
Реакции
209
Помог
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;
    }
C++
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;
}
C++

 

Вложения

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

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