vault backup: 2025-04-19 03:02:43
This commit is contained in:
8
.obsidian/workspace.json
vendored
8
.obsidian/workspace.json
vendored
@@ -41,12 +41,12 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md",
|
"file": "PERSONAL PROJECTS/PS1 DOCS/fade calculation.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "PS1 Gamepad"
|
"title": "fade calculation"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -207,12 +207,13 @@
|
|||||||
},
|
},
|
||||||
"active": "dd912cc876184c4f",
|
"active": "dd912cc876184c4f",
|
||||||
"lastOpenFiles": [
|
"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 Gpu-DMA.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md",
|
"PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md",
|
"PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md",
|
"PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.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/PSX code IRQ handling.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md",
|
"PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
|
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
|
||||||
@@ -241,7 +242,6 @@
|
|||||||
"WORK & PROJECTS/Mol/Планы и диаграммы/MOL _ План разработки.md",
|
"WORK & PROJECTS/Mol/Планы и диаграммы/MOL _ План разработки.md",
|
||||||
"WORK & PROJECTS/Mol/Планы и диаграммы/План СИЛА.md",
|
"WORK & PROJECTS/Mol/Планы и диаграммы/План СИЛА.md",
|
||||||
"WORK & PROJECTS/Mol/Планы и диаграммы/СМК.md",
|
"WORK & PROJECTS/Mol/Планы и диаграммы/СМК.md",
|
||||||
"WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud readme.md",
|
|
||||||
"WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud",
|
"WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud",
|
||||||
"Структура объектов испытаний.png",
|
"Структура объектов испытаний.png",
|
||||||
"Схема связей юрлиц и адресов.png",
|
"Схема связей юрлиц и адресов.png",
|
||||||
|
|||||||
121
PERSONAL PROJECTS/PS1 DOCS/fade calculation.md
Normal file
121
PERSONAL PROJECTS/PS1 DOCS/fade calculation.md
Normal 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. Для модификации эффектов работайте с волновой таблицей и цветовыми множителями.
|
||||||
Reference in New Issue
Block a user