Difference Machine 0.7.5

После первой сумбурной публикации хочется разъяснить, что такое Difference Machine и что умеет. К тому же были внесены существенные изменения.Проект по‑прежнему реализован с использованием ИИ, однако я не вполне уверен в качестве сгенерированного кода, поэтому для дальнейшей разработки потребуется помощь профессиональных программистов.



Что вообще такое система контроля версий проекта?

Если кратко система контроля версий — это инструмент, который отслеживает изменения в файлах с течением времени, позволяя:
- Возвращаться к предыдущим версиям файлов;
- Сравнивать различия между версиями файлов;
- Работать над одними и теми же файлами нескольким людям без конфликтов;
- Безопасно экспериментировать создавая ответвления и "вливать" удачные эксперименты в основной проект;
- Сохранять историю изменений с комментариями (коммитами);

Самая популярная система контроля версий - это Git, созданная ДЛЯ РАЗРАБОТЧИКОВ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ и ИСКЛЮЧИТЕЛЬНО ДЛЯ ТЕКСТОВЫХ ФАЙЛОВ

Почему тогда просто не использовать Git?

Как было сказано ранее, Git создан для разработчиков и отлично работает с текстовыми фалами, но совершенно не умеет работать с бинарными файлами.
Есть надсройка в виде Git LFS бинарники через LFS — но бинарники хранятся отдельно от основного репозитория, плюс у каждого хостинга для размещения есть лимиты к тому же в этом случае «один файл = одна версия». Для .blend при слиянии веток получается конфликт целого файла: нужно вручную выбирать «нашу» или «их» версию или собирать сцену заново.

Для художников недавно появился Anchorpoint — удобный Git-клиент, но под капотом тот же Git + LFS: слияние по .blend по-прежнему на уровне файла, плюс платная подписка и привязка к вендору.

Почему Difference Machine?

Difference Machine (DFM) — это локальная система контроля версий, заточенная под проекты с бинарными и визуальными файлами: сцены Blender (`.blend`), текстуры, код и конфиги в одном репозитории. В отличие от Git, который версионирует только целые файлы, DFM умеет работать с объектами внутри .blend: при слиянии веток можно выбирать, какие объекты взять из какой ветки, а не заменять «файл целиком».
DFM пользователь может создавать "снимки" всей рабочей папки проекта, например:
- Файл главного проекта: .blend, .c4d, .ue5, .unity и т.д.;
- Папки или файлы с ассетами из которых в главный файл тянутся отдельные модели, материалы и т.д.;
- Текстовые файлы: заметки или код для игростроения.;
- Текстуры, видео, аудио.;

Frame 6555393.png

Для кого пригодится

- 3D-художники и арт-директора — версионирование сцен Blender без «одна правка = целая копия файла»; просмотр изменений текстур и сцен в GUI.
- Геймдев-команды — один репозиторий для кода (скрипты, шейдеры), конфигов и ассетов (.blend, текстуры); слияние веток по объектам в .blend, а не по файлу целиком.
- Небольшие студии и инди-разработчики — не нужен облачный Git-сервер; всё хранится локально в каталоге `.DFM`, без подписок и лимитов LFS.
- Все, кто уже использует Blender — аддон в сайдбаре 3D View: сравнение с коммитами, разметка объектов для merge, блокировки файлов, сохранение объектов как ассетов.

Из чего состоит Difference Machine

1. Forester — ядро и консоль.

Forester — написанное на Go CLI-приложение и движок репозитория. Один исполняемый файл.
Основные команды (по аналогии с Git):
- forester init — инициализация репозитория;
- forester add, forester commit — добавление в индекс и создание коммита;
- forester branch, forester switch — ветки и переключение;
- forester merge <ветка> — слияние ветки в текущую (в т.ч. с учётом объектных тегов для .blend);
- forester status, forester log, forester diff — статус, история, диффы;
- forester stash, forester lock, forester gc — временное сохранение, блокировки файлов, сборка мусора.

Особенности:
- Дедупликация по хешу содержимого и сжатие (zlib) — экономия места.
- Поддержка .dfmignore (по смыслу как .gitignore).
- Хуки (hooks) для интеграции с внешними процессами.
- Блокировки файлов (exclusive/shared) для совместной работы.
В GUI и аддоне все эти операции вызываются через Forester; коммиты, смена веток и merge делаются из diffmachine_gui или терминала, а не из Blender.


2. Аддон Blender (Difference Machine)

Аддон размещается в сайдбаре 3D View (категория «Difference Machine») и не делает коммиты сам — он отвечает за привязку к репозиторию, сравнение с историей, разметку объектов для merge и работу с ассетами/блокировками.

Панели:

Compare — Сравнивать целый проект из коммита с текущим состоянием - откроет еще один экземпляр Блендера с выгруженным проектом. Сравнивать отдельный объект сцены с объектом из выбранного коммита.

Снимок экрана_20260202_113708.png

Save as Asse
t — Расчленять большой файл по ассетам. При выделении объекта и сохранении его как ассет плагин сам определяет тип объекта и предлагает сохранить в папку с типом объекта. После сохранения объект автоматически удаляется и линкуется сохраненный ассет.

Снимок экрана_20260202_113743.png

Снимок экрана_20260202_113803.png

Mark To
— Помечать объекты в сцене, чтобы сделать слияние этих объектов в другой файл: помечать можно для удаления (удалит объект если в новом файле больше не нужен), переименования (переименует объект) и слияния (перенесет только этот объект при слиянии). Пометку понятное дело можно снять.

Снимок экрана_20260202_113833.png

File Locks
— Заблокировать файлы для других пользователей, если меш имеет материал с текстурами которые хранятся в папке, то плагин прочтет какие текстуры находятся в этом материале и заблокирует их.
Снимок экрана_20260202_113910.png


3. diffmachine_gui — десктоп-приложение

Приложение на PyQt6 и QML: открытие репозитория, проводник файлов, вкладки «Изменено» и «Коммиты», просмотр и диффы файлов, слияние веток.



Общее устройство:
- Меню: File, Repository, Branch, Help.
- Верхняя панель: выбор ветки, количество коммитов, HEAD (хеш + копирование), кнопка создания ветки.
- Вкладки: Explorer (дерево файлов), Changed (изменённые файлы и форма коммита), Commits (история коммитов и файлы выбранного коммита), Preview (превью выбранного файла).



  • Проводник (Explorer): поиск по файлам, дерево репозитория. При выборе файла справа показывается содержимое или метаданные (для бинарников — размер, путь, даты; для .blend — кнопки «Open in Blender» / «Compare»).
промотр файлов.pngизменения в структуре.png
  • Вкладка «Изменено» (Changed): список изменённых файлов с чекбоксами, блок COMMIT: поле сообщения (обязательно), автор, тег, кнопка «Create Commit». Справа — область просмотра/диффа выбранного файла.
создание коммита.png
  • Вкладка «Коммиты» (Commits): список коммитов текущей ветки; при выборе коммита — список файлов этого коммита. При выборе файла справа открывается Diff: для текста — построчный diff с подсветкой синтаксиса (Pygments); для изображений — режимы сравнения; для .blend — заглушка «Binary file» и кнопка Compare (запуск двух Blender с версиями parent/commit).
просмотр коммита.png
  • Дифф текста: выбор источников «From / vs» (working directory, коммит, ветка), опция «Extended diff». Unified-стиль, подсветка по расширению файла.

Снимок экрана_20260202_112245.png

  • Дифф изображений: четыре режима — 2-up (две картинки рядом), Swipe (вертикальная граница с движком), Onion Skin (наложение с регулировкой прозрачности), Difference (подсветка изменённых пикселей) ПОКА НЕ РАБОТАЕТ(((. Выбор пар версий через те же «From / vs».
    diff swipe.png
  • Слияние веток (Merge): Branch → Merge (или аналог) открывает диалог «Merge Branches» / «Слияние веток»: выбор ветки для слияния, отображение хеша/автора/сообщения/времени последнего коммита этой ветки.
Два списка
Files to merge — файлы, затрагиваемые слиянием (.dfmignore, .blend, текстуры и т.д.). При выборе .blend справа отображаются Objects to merge — объекты (MESH и др.) с пометкой «ours»/«theirs», если по этому файлу есть синхронизированные с БД теги (Mark To + Sync Objects to DB в аддоне). Если объекты для .blend не найдены в реестре, показывается подсказка: открыть файл в Blender, выбрать коммит в панели Compare и нажать «Sync Objects to DB»
Кнопки Cancel и Perform Merge («Выполнить слияние»). После выполнения merge применяется скрипт Blender (настраивается в конфиге), который по объектным тегам выполняет удаление/переименование/перенос объектов в объединённом .blend.
Создание ветки: диалог «Branch Name» — поле «Enter name», кнопки Cancel и Create.


Снимок экрана_20260130_102527.pngКонфигурация: глобальный конфиг (например, `~/.dfm/setup.cfg`) — путь к бинарнику Forester, путь к Blender, скрипт для merge. Язык интерфейса (русский/английский) задаётся через переводы (translations).

Снимок экрана_20260202_112043.png
  • И как же без темной темы, которая меняется в зависимости от настройки ОС

Снимок экрана_20260202_112348.png

Код открыт, но под лицензией, не позволяющей зарабатывать на продаже дистрибутивов, технической поддержке, построении сервисов по типу GitHub.
Но СОЗДАВАТЬ ПЛАТНЫЙ КОНТЕНТ МОЖНО БЕЗ ОГРАНИЧЕНИЙ. Почему так? Не хочется, чтобы, если вдруг каким-то чудесным образом этот проект взлетит, какие-нибудь ушлые компании, не внеся ни строчки кода, зарабатывали, как это сейчас происходит в open-source.

Если проект будет востребован есть идеи сделать плагины для других редакторов. Установщика не публикую, опубликую, если у вас будет потребность в этом.

Репозитории:

GitFllic: https://gitflic.ru/project/nopomuk/difference-mach...

GitHub: https://github.com/DSLitvinov/difference-machine

721 0 850 1
2
2026-02-02
О прикольно, в 2026 гит дошел и до cg
2026-02-02
Это мы пробуем однозначно
RENDER.RU