vault backup: 2025-04-19 03:02:43

This commit is contained in:
sShemet
2025-04-19 03:02:43 +05:00
parent b0a9dc5628
commit 668f5741ee
2 changed files with 125 additions and 4 deletions

View File

@@ -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",

View File

@@ -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. Для модификации эффектов работайте с волновой таблицей и цветовыми множителями.