From 668f5741eed221c349449459dc27491e8f993928 Mon Sep 17 00:00:00 2001 From: sShemet Date: Sat, 19 Apr 2025 03:02:43 +0500 Subject: [PATCH] vault backup: 2025-04-19 03:02:43 --- .obsidian/workspace.json | 8 +- .../PS1 DOCS/fade calculation.md | 121 ++++++++++++++++++ 2 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 PERSONAL PROJECTS/PS1 DOCS/fade calculation.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 1afa53f..71a7779 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -41,12 +41,12 @@ "state": { "type": "markdown", "state": { - "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md", + "file": "PERSONAL PROJECTS/PS1 DOCS/fade calculation.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "PS1 Gamepad" + "title": "fade calculation" } } ], @@ -207,12 +207,13 @@ }, "active": "dd912cc876184c4f", "lastOpenFiles": [ + "PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md", + "PERSONAL PROJECTS/PS1 DOCS/fade calculation.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", - "PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md", "PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md", "PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md", @@ -241,7 +242,6 @@ "WORK & PROJECTS/Mol/Планы и диаграммы/MOL _ План разработки.md", "WORK & PROJECTS/Mol/Планы и диаграммы/План СИЛА.md", "WORK & PROJECTS/Mol/Планы и диаграммы/СМК.md", - "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud readme.md", "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud", "Структура объектов испытаний.png", "Схема связей юрлиц и адресов.png", diff --git a/PERSONAL PROJECTS/PS1 DOCS/fade calculation.md b/PERSONAL PROJECTS/PS1 DOCS/fade calculation.md new file mode 100644 index 0000000..4cf46f9 --- /dev/null +++ b/PERSONAL PROJECTS/PS1 DOCS/fade calculation.md @@ -0,0 +1,121 @@ +Давайте тщательно разберём функцию `fade_calculation` — это ключевая функция управления плавными переходами яркости в игре. Вот полный анализ: + +--- + +### **Назначение функции** +Функция вычисляет плавные цветовые переходы для эффектов затемнения/появления, используя: +1. **Временную синхронизацию** (через VSync) +2. **Циклическую анимацию** на основе волновой таблицы +3. **Аппаратный формат цвета PS1** (BGR555) + +--- + +### **Структура данных (DWORD_8007caa8)** +Глобальная структура с такими ключевыми полями: + +| Смещение | Тип | Описание | +|----------|-----------|-----------------------------------| +| +0x00 | uint | Флаг активности (param_1 & 1) | +| +0x04 | int | Предыдущий таймстамп VSync | +| +0x08 | int | Дельта времени между кадрами | +| +0x14 | int | Шаг анимации | +| +0x18 | int | Базовое смещение | +| +0x1c | uint | Текущее смещение анимации | +| +0x84 | int | Позиция в волновой таблице (0-63) | +| +0x88 | short[64] | Волновая таблица (амплитуды) | +| +0x126 | ushort | Результирующий цвет (BGR555) | +| +0x128 | byte | Множитель красного (R) | +| +0x129 | byte | Множитель зелёного (G) | +| +0x12a | byte | Множитель синего (B) | + +--- + +### **Пошаговая работа функции** + +1. **Синхронизация времени**: + ```c + iVar2 = callVsyncWithParam(0xffffffff); // Получаем текущее время + *(int *)(DWORD_8007caa8 + 8) = iVar2 - *(int *)(DWORD_8007caa8 + 4); // Дельта времени + ``` + +2. **Обновление позиции анимации**: + ```c + iVar8 = iVar8 + *(int *)(dVar1 + 8); // Увеличиваем позицию на дельту времени + iVar8 = iVar8 + (iVar2 >> 6) * -0x40; // Обеспечиваем цикл 0-63 (64 позиции) + *(int *)(dVar1 + 0x84) = iVar8; // Сохраняем новую позицию + ``` + +3. **Расчёт компонент цвета**: + Для каждой RGB-компоненты: + - Берётся значение из волновой таблицы по текущей позиции + - Умножается на множитель (0x128-0x12a) + - Нормализуется сдвигом `>> 0xC` (деление на 4096) + ```c + // Красная компонента (R) + (uint)*(byte *)(dVar1 + 0x128) * (int)*(short *)(dVar1 + (iVar8 + ...) * 2 + 0x88) >> 0xc; + + // Зелёная (G) - со смещением +0x20 + (uint)*(byte *)(dVar1 + 0x129) * (int)*(short *)(dVar1 + (iVar6 + ...) * 2 + 0x88) >> 0xc; + + // Синяя (B) + (uint)*(byte *)(dVar1 + 0x12a) * (int)*(short *)(dVar1 + (iVar7 + ...) * 2 + 0x88) >> 0xc; + ``` + +4. **Формирование цвета**: + Компоненты объединяются в формат BGR555 с битом прозрачности: + ```c + *(ushort *)(dVar1 + 0x126) = + (R & 0x1F) | + ((G & 0x1F) << 5) | + ((B & 0x1F) << 10) | + 0x8000; // Флаг прозрачности + ``` + +5. **Копирование состояния**: + ```c + // Копирует 32 байта из +0x108...+0x124 в +0x50...+0x6c + *(undefined4 *)(dVar1 + 0x50) = *(undefined4 *)(dVar1 + 0x108); + // ... и так для 8 полей ... + ``` + +--- + +### **Особенности волновой таблицы** +- Содержит 64 значения (short) по смещению `+0x88` +- Значения обычно в диапазоне 0-4095 (для >> 0xC) +- Зелёная компонента использует смещение +32 (+0x20) для фазового сдвига + +--- + +### **Как управлять эффектом?** +1. **Скорость анимации**: + - Измените шаг в `*(int *)(dVar1 + 8)` + - Или модифицируйте дельту времени в `callVsyncWithParam` + +2. **Интенсивность**: + ```c + // Увеличьте множители (по умолчанию 0-255): + *(byte *)(dVar1 + 0x128) = 0xFF; // Максимальный красный + ``` + +3. **Палитра**: + Подмените волновую таблицу: + ```c + *(short *)(dVar1 + 0x88 + i*2) = new_value; + ``` + +--- + +### **Пример работы** +```mermaid +sequenceDiagram + loop Каждый кадр + VSync->>+fade_calculation: Время + fade_calculation->>Волновая таблица: Чтение амплитуды + fade_calculation->>RGB: Расчёт компонент + fade_calculation->>BGR555: Упаковка цвета + fade_calculation->>OT: Запись команды + end +``` + +Функция — это сердце системы плавных переходов, где все вычисления оптимизированы под PS1. Для модификации эффектов работайте с волновой таблицей и цветовыми множителями. \ No newline at end of file