Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
a152fd3
docs: завести документацию проекта и каталог скиллов агента
8bitniksis Aug 16, 2026
abadb62
docs(plan): дорожная карта Vulkan/DX12 и разделения ядра и редактора
8bitniksis Aug 16, 2026
bcd8e85
docs(plan): этап C#-скриптинга по модели Unity, редактор на C#
8bitniksis Aug 16, 2026
eddea18
chore(license): переход с GPL-3.0 на Apache-2.0
8bitniksis Aug 16, 2026
ef7ead2
docs(rhi): аудит Graphics/API перед переходом на Vulkan/DX12
8bitniksis Aug 16, 2026
26d8e9a
docs(rhi): дизайн целевого RHI под Vulkan/DX12/GL46
8bitniksis Aug 16, 2026
f7c2d40
docs(rhi): OpenGL закреплён как постоянный fallback-бэкенд
8bitniksis Aug 16, 2026
f710a60
feat(Graphics): GAPISelector — выбор графического API и DX12 в GAPIType
8bitniksis Aug 16, 2026
0c05de3
test(Smoke): эталонная рендер-сцена для сравнения графических бэкендов
8bitniksis Aug 16, 2026
5e5872c
test(Smoke): смоук-сцена рендера и readback attachment'ов; GAPISelect…
8bitniksis Aug 16, 2026
67133d9
docs(skills): скилл sgcore-graphics — факты и грабли графического слоя
8bitniksis Aug 16, 2026
63d7d9d
feat(SGSL): проход вулканизации SGSL → Vulkan-GLSL и тест шейдерного …
8bitniksis Aug 16, 2026
e15bb6a
feat(Graphics): SPIR-V компиляция и рефлексия шейдеров; glslang + spi…
8bitniksis Aug 16, 2026
8b9e37a
fix(Graphics): GL46Renderer снова рабочий; GL46 — основной GL-бэкенд
8bitniksis Aug 16, 2026
0c542ca
fix(Graphics): GL46Renderer снова рабочий; GL46 — основной GL-бэкенд
8bitniksis Aug 16, 2026
0b9f968
feat(RHI): каркас RHI и его GL46-реализация; вертикальный срез проверен
8bitniksis Aug 16, 2026
1372c1d
feat(RHI): первый проход на RHI — вывод текстуры на экран (ScreenBlit)
8bitniksis Aug 16, 2026
3bb3627
feat(Graphics): GL46Shader на RHI-модели данных — вулканизированный G…
8bitniksis Aug 16, 2026
0b4b40f
feat(RHI): меши через RHI на GL46 — IGPUBuffer, PSO из раскладки меша…
8bitniksis Aug 16, 2026
cb42d77
feat(RHI): legacy vertex arrays через RHI — все точки отрисовки GL46 …
8bitniksis Aug 16, 2026
8e3d2a8
feat(RHI): фреймбуферы GL46 через RHI render pass
8bitniksis Aug 16, 2026
94e9572
docs(rhi): шаг 6 миграции — юнит-модель текстур остаётся, фасад для V…
8bitniksis Aug 16, 2026
05e922f
feat(RHI): Vulkan-бэкенд — устройство, свопчейн и фасады текстур/фрей…
8bitniksis Aug 17, 2026
f5bafdd
feat(RHI): VkShader — legacy-фасад шейдера на Vulkan с таблицей юнитов
8bitniksis Aug 17, 2026
e6dcab1
feat(RHI): геометрия на Vulkan — буферы, uniform-буферы и renderMeshData
8bitniksis Aug 17, 2026
8326de9
fix(RHI): текстуры материалов на Vulkan — индексы массивов и dummy-де…
8bitniksis Aug 17, 2026
4b0612f
fix(RHI): общий командный список Vulkan больше не теряет записанную р…
8bitniksis Aug 17, 2026
ece7bdb
test(RHI): покрытие пути legacy-фасада фреймбуфера в SGRHITest
8bitniksis Aug 17, 2026
0459588
test(RHI): срез последовательности фреймбуферов кадра + контракт очистки
8bitniksis Aug 17, 2026
e5367eb
fix(RHI): SPIR-V-рефлексия разворачивает вложенные структуры в листов…
8bitniksis Aug 17, 2026
058f864
feat(RHI): Vulkan рисует сцену — заглушки для незаписанных дескрипторов
8bitniksis Aug 17, 2026
74b1e68
fix(RHI): юниформы на draw и конвертация readback — Vulkan рисует сцену
8bitniksis Aug 17, 2026
23f29c9
fix(render): небо на Vulkan — замороженные имена юниформов и альфа ск…
8bitniksis Aug 17, 2026
5d8d0ad
fix(render): стохастическая прозрачность — присваивать выходы на кажд…
8bitniksis Aug 17, 2026
f50918d
fix(RHI): вложения на Vulkan — NEAREST и очистка при создании
8bitniksis Aug 17, 2026
d2d0c57
fix(RHI): шум финального кадра на Vulkan — контур, квады без вершин, …
8bitniksis Aug 17, 2026
ae9a58b
fix(RHI): чистая валидация Vulkan на смоук-сцене — 43 сообщения до 9
8bitniksis Aug 18, 2026
5f938d2
fix(RHI): конверсия формата при аплоаде текстур — SSAO на Vulkan зара…
8bitniksis Aug 18, 2026
b939cfe
feat(RHI): DX12-бэкенд — устройство, адаптер и слой отладки (этап 3, …
8bitniksis Aug 18, 2026
ab1527f
feat(RHI): DX12-бэкенд рисует смоук-сцену наравне с Vulkan (этап 3, з…
8bitniksis Aug 22, 2026
b377d56
fix: Fixed ssao shader for both render API
8bitniksis Aug 22, 2026
a6a10b3
feat(RHI): батчинг на инстансинге и texel-буферы на explicit-бэкендах…
8bitniksis Aug 22, 2026
f994e8e
fix(render): мёртвый шейдер инстансинга и предупреждения валидации от…
8bitniksis Aug 22, 2026
1c9bc53
feat(render): инстансинг впервые заработал — покрытие смоуком и три д…
8bitniksis Aug 22, 2026
49af458
fix(RHI): матричный вершинный вход — инстансинг заработал на Vulkan и…
8bitniksis Aug 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 167 additions & 0 deletions .claude/skills/cpp-style/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
---
name: cpp-style
description: >-
Когда использовать: любой C++/заголовки в SungearEngine — модули SGCore
(ECS, Render, Serde, UI, Physics и др.), SGEntry, плагины редактора, тесты.
Соглашение о кодировании Pixelfield: именование файлов и типов
(UpperCamelCase), функций и локальных переменных (lowerCamelCase), префиксы
m_/s_ у членов, lower_snake_case для constexpr/using/typedef, правила
пробелов и скобок, порядок членов структуры, инклуды <> vs "", запрет
using namespace, смарт-поинтеры и RAII, C++23.
Triggers: naming convention, UpperCamelCase, lowerCamelCase, m_ prefix,
s_ prefix, snake_case, brace style, member order, include style, using
namespace, smart pointers, header file naming, CodingConvention, C++ style,
clang-format.
---

# C++: соглашение о кодировании Pixelfield

Стиль кода для всего C++ в репозитории. Первоисточник —
[`CodingConvention.md`](../../../CodingConvention.md) в корне; при конфликте
этого скилла с ним выигрывает первоисточник, а скилл нужно поправить.

⚠️ `.clang-format` в репозитории нет — стиль автоматикой не проверяется,
соблюдение целиком на авторе и ревью.

---

## 📋 Структура документа
- [Именование](#именование)
- [Пробелы и скобки](#пробелы-и-скобки)
- [Порядок членов структуры](#порядок-членов-структуры)
- [Инклуды](#инклуды)
- [Практики](#практики)
- [Как это ложится на Sungear Engine](#как-это-ложится-на-sungear-engine)

---

## Именование

| Что | Стиль | Пример |
|-----|-------|--------|
| Файлы C++ (.h/.cpp) | UpperCamelCase, по главной структуре файла | `Position.h` / `Position.cpp` |
| Файл без главной структуры | имя по назначению | `DataTypes.h` |
| Типы: struct/class/enum/union/namespace | UpperCamelCase | `struct MyStruct`, `namespace MyNamespace` |
| Функции | lowerCamelCase | `void moveTo(...)` |
| Локальные переменные | lowerCamelCase | `float myLocalVariable { };` |
| Нестатические члены | префикс `m_` + lowerCamelCase | `float m_x { };` |
| Статические члены | префикс `s_` + lowerCamelCase | `static inline float s_counter { };` |
| События и коллбеки | lowerCamelCase **без префикса** | `Event<void()> onClicked;` |
| Шаблонные параметры | UpperCamelCase; `T`-префикс, если имя совпадает с именем возможной переменной | `template<typename SomeType, FormatType TFormatType>` |
| Макросы | UPPER_SNAKE_CASE или lower_snake_case | `#define MY_MACRO_0` |
| constexpr, using, typedef | lower_snake_case | `using my_type = T;`, `static constexpr inline std::size_t num_dimensions = 3;` |

### Аббревиатуры

- В **начале** имени — строчными: `m_aabbMember`, `void aabbFunc()`.
- В **середине/конце** — прописными: `m_parentAABB`, `void resizeAABB(AABB& aabb)`.

---

## Пробелы и скобки

- После `(` и перед `)` пробелов нет: `doSomething(float a)`.
- Перед `;` пробела нет, после — есть: `for(int i = 0; i < 3; ++i)`.
Обратите внимание: **между `for`/`if`/`while`/`catch` и `(` пробела нет** —
так во всех примерах конвенции.
- Бинарные операторы (`+ - * / = == !=`) — по одному пробелу с обеих сторон.
- `[`, `]`, `<`, `>` — без внутренних пробелов: `std::unordered_map<int, int>`.
- Запятая: пробела до нет, после — есть.
- Двоеточие — пробел до и после: `for(const auto& v : values)`.
- Инициализация фигурными скобками — пробел внутри: `auto myVar = { 3, 4, 5 };`,
пустая инициализация — `float m_x { };`.
- **Скобки тела** функций, классов, структур, неймспейсов, юнионов —
**на новой строке**:

```cpp
namespace MyNamespace
{
struct MyString
{
void doSomething()
{
}
};
}
```

- Лямбды — скобка на той же строке или на новой, обе формы допустимы;
однострочная лямбда — пробелы внутри скобок: `auto f = []() { return 2 + 2; };`
- Обращение к неймспейсам/статике — без пробелов вокруг `::`:
`Core::Internal::doSomethingOther();`

---

## Порядок членов структуры

Публичные члены — **сверху**, приватные — **внизу**. Внутри каждого блока:

1. Вложенные типы (под-структуры, enum'ы).
2. Переменные, using'и, typedef'ы.
3. Функции.

```cpp
struct MyStruct
{
struct MySubStruct { };

using type = float;
static constexpr int my_constexpr_var = 4;
float m_myVar = 3.14f;

void doSomething();

private:
float m_myInternalVariable = 9.8f;

void doSomethingInternal();
};
```

---

## Инклуды

- Сторонние библиотеки — треугольные скобки: `#include <SomeLibrary/Test.h>`.
- Файлы текущего проекта — кавычки: `#include "MyProject/Test.h"`.

В движке встречаются оба стиля для SGCore-заголовков (`"SGCore/..."` внутри
ядра, `<SGCore/...>` из внешних потребителей вроде плагинов) — это соответствует
правилу: для плагина SGCore — сторонний проект.

---

## Практики

1. **Не использовать `using namespace`.**
2. **Смарт-поинтеры** — при разделяемом владении или когда нужен RAII;
следить за циклическими ссылками (`weak_ptr` для обратных связей).
3. **Избегать итерации по map'ам** (`std::map`, `std::unordered_map` и любым
другим) — это правило конвенции; горячие пути строить на векторах/пулах
(в ECS данные и так лежат в пулах EnTT).
4. Стандарт — **C++23** (`CMAKE_CXX_STANDARD 23`, REQUIRED): корутины,
концепты и прочие возможности стандарта использовать можно, ломать сборку
более старым стилем «на всякий случай» не нужно.

---

## Как это ложится на Sungear Engine

Раздел для проектной специфики — дополняется по мере разбора граблей.

- **Ядро — разделяемая библиотека.** Публичные классы SGCore экспортируются
через макросы из `Sources/sgcore_export.h`; новый публичный класс ядра без
экспорта не будет виден из SGEntry/плагинов на Windows.
- **Платформенные ветки** — только через макросы вида `SG_PLATFORM_OS_WINDOWS`
(в коде) и `SG_TARGET_OS_*` (в CMake, из `cmake/platform.cmake`).
- **Debug-код** — под `SUNGEAR_DEBUG` (определяется при `CMAKE_BUILD_TYPE=Debug`).
- **Не удалять дефайны-костыли** из корневого `CMakeLists.txt` (`NOGDI`,
`NOMINMAX`, `WIN32_LEAN_AND_MEAN`): они закрывают конфликт WinAPI-макросов
с ANTLR4 (`ParseTreeType::ERROR`) и `std::min/max`.
- **Инициализация членов** — фигурными скобками с пробелами: `float m_x { };`
(см. примеры в конвенции); не оставлять члены неинициализированными.
- **Компоненты ECS** — данные без тяжёлой логики; логика — в системах,
обходящих `Registry`. Визиторы компонентов — `SGCore/ECS/Visitors.h`.
- Новые файлы кладутся в модуль по подсистеме (`Sources/SGCore/<Module>/`);
список модулей и их назначение — в
[`docs/PROJECT_STRUCTURE.md`](../../../docs/PROJECT_STRUCTURE.md#ядро-движка-sgcore).
Loading