Files
SergObsidian/PERSONAL PROJECTS/P2EP/pseudoCode/FUN_80012df4 RenderInterface.md
2025-04-20 00:05:45 +05:00

3.3 KiB

#include <libgte.h>
#include <libgpu.h>
#include <libgs.h>

/* Константы */
#define SCRAM_ADDR    0x1F800000  // Быстрая память PS1
#define MAX_ELEMENTS  32          // Максимальное количество элементов интерфейса

/* Структура элемента интерфейса */
typedef struct {
    GsCOORDINATE2 coord;      // Система координат
    u_short flags;            // Флаги видимости/состояния
    RECT clip;                // Область отсечения
    u_char texture_page;      // Номер TPage
    SVECTOR position;         // Позиция (x,y,z)
    SVECTOR scale;            // Масштаб
    u_short *sprite_data;     // Данные спрайта
} InterfaceElement;

/* Главная функция рендеринга интерфейса */
u_long RenderInterface(GsOT *ot, InterfaceElement *elements, int count) 
{
    /* Инициализация буферов */
    u_long *work_buffer = (u_long*)SCRAM_ADDR;
    MATRIX local_matrix;
    GsCOORDINATE2 *current_coord;
    int i, processed = 0;
    
    /* Сохраняем текущую матрицу */
    GsPushMatrix();
    
    /* Очистка рабочего буфера */
    memset(work_buffer, 0, 0xD8);
    
    /* Настройка матрицы проекции */
    gte_SetGeomOffset(160, 120);  // Центр экрана (320x240)
    gte_SetGeomScreen(512);       // Коэффициент перспективы
    
    /* Основной цикл рендеринга */
    for (i = 0; i < count; i++) {
        InterfaceElement *elem = &elements[i];
        
        /* Проверка видимости элемента */
        if (!(elem->flags & 0x8000)) continue;
        
        /* Установка локальной матрицы */
        GsGetLs(&elem->coord, &local_matrix);
        GsSetLsMatrix(&local_matrix);
        
        /* Обработка спрайта */
        if (elem->flags & 0x0001) {
            /* Настройка TPage */
            GsSortTPage(elem->texture_page, GetTPage(2, 0, 0, 0), ot);
            
            /* Трансформация вершин */
            gte_ldv3(&elem->position, 
                    (SVECTOR*)((u_long)elem->position.vx + 8), 
                    (SVECTOR*)((u_long)elem->position.vy + 8));
            gte_rtpt();
            
            /* Проверка видимости полигона */
            if (gte_nclip()) {
                /* Генерация 2D-координат */
                POLY_FT3 *poly = (POLY_FT3 *)work_buffer;
                setPolyFT3(poly);
                
                /* Установка параметров */
                poly->tpage = GetTPage(2, 0, elem->texture_page, 0);
                poly->clut = GetClut(0, 0);
                
                /* Расчет координат */
                gte_stsxy3(&poly->x0, &poly->x1, &poly->x2);
                
                /* Добавление в Ordering Table */
                GsSortPrim(ot, poly);
            }
        }
        processed++;
    }
    
    /* Восстановление матрицы */
    GsPopMatrix();
    
    return processed;  // Возвращаем количество обработанных элементов
}