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

87 lines
3.3 KiB
Markdown

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