``` c #include #include #include /* Константы */ #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; // Возвращаем количество обработанных элементов } ```