Перейти к основному содержимому

Нужен Blender 4.2 или новее · Бесплатно

Getly Publisher для Blender

Расширение для Blender. Читает ваш файл так, как его прочитает Blender покупателя, говорит, что сломается, и чинит то, что чинится, одним нажатием. Все проверки идут офлайн и без учётной записи; вход — отдельный необязательный шаг.

Проблема, в цифрах

В .blend лежат пути, а не файлы. У автора он открывается идеально, потому что его текстуры всё ещё на его диске; покупатель открывает — и каждая поверхность плоско-розовая. Сегодня на Getly есть 25 живых Blender-товаров в 6 магазинах и 1 файл .blend на весь каталог, потому что продавцы отгружают архивы.

Каждое решение и чего оно стоило

01

Гейт открывает архив, а не смотрит на расширение файла

Почему

25 из 25 живых Blender-товаров приезжают в .zip. Гейт, завязанный на расширение, как у Unity, не сработал бы почти ни на одном из них. Открытие архива к тому же делает главную проверку правильной, а не просто строгой: текстура, не упакованная в .blend, — не дефект, когда она лежит рядом с ним в той же загрузке.

Чего это стоило

Читатель .zip, работающий по байтам, которые загрузил незнакомый человек, со всеми вытекающими границами. Архивом он считает файл, только если внутри действительно есть .blend или манифест расширения, поэтому сотни обычных архивов в каталоге читаются один раз, и дальше их не трогают.

02

Он чинит, потому что отчёт проигрывает пункту меню

Почему

В Blender уже годы есть Report Missing Files, Make Paths Relative и Pack Resources. Инструмент, который лишь повторяет то, что они говорят, конкурирует с уже установленным и проигрывает по всем осям, включая стоимость установки. Этот выполняет те же шаги в правильном порядке одним нажатием — пути делаются относительными до упаковки, чтобы позднейшая распаковка оставила рабочий путь, а не тот абсолютный, с которого вы начали, — и потом говорит, что именно изменил.

Чего это стоило

Писать в чужой проект — серьёзное действие. Поэтому он сначала перечисляет, что собирается изменить, и только потом меняет, и он никогда не сохраняет файл: вы смотрите на результат и сохраняете сами.

03

Все проверки идут офлайн и без учётной записи

Почему

Инструмент обязан стоить установки тому, кто никогда ничего не станет продавать на Getly. Валидатор с прикрученным магазином — это реклама, и собственный репозиторий расширений Blender, бесплатный официальный канал внутри программы, прочитает его именно так.

Чего это стоило

Мы не узнаём ничего о том, кто его ставит и что он находит, пока человек сам не войдёт, поэтому каталог проверок откалиброван по файлам, которые пишем мы сами, а не по тому, на что реально натыкаются продавцы.

04

Файл, который мы не смогли прочитать, — это «не проверен», а не отказ

Почему

Написанный руками читатель самоописывающего формата рано или поздно встретит выпуск Blender, которого не понимает. В этот день сбой обязан звучать как «мы не смогли это проверить», а не «всем продавцам Blender отказано». Единственное исключение — файл, который вообще не .blend: его и Blender не откроет, и именно от этого покупателя надо избавить.

Чего это стоило

Намеренно испорченный файл проходит. Мы предпочтём вернуть за него деньги, чем положить площадку всем, кто продаёт работы для Blender, на той неделе, когда выходит новая версия.

05

Он под GPL, поэтому проверки можно форкнуть — и именно поэтому решает сервер

Почему

Blender Foundation считает Python API частью Blender, поэтому всё, что на нём построено, выходит совместимым с GPL. Значит, наш список проверок и наш вход читаемы и форкаемы кем угодно. Мы не стали это обходить: это ровно та причина, по которой Getly перечитывает загруженные байты, а не доверяет отчёту программы, которой распоряжается продавец.

Чего это стоило

Ничто в клиенте не даёт преимущества, которое нельзя скопировать. Остаются серверная сторона и то суждение, что заложено в каталог проверок, — и лицензия не касается ни того, ни другого.

В чём мы сначала ошиблись

Каждую из них поймали до того, как её увидел покупатель, — только поэтому мы можем их записать. Они здесь потому, что решения выше учат меньше, чем ошибки.

Мы написали

Сканер путей, который отказал бы каждому хорошо сделанному файлу.

Правда

План был такой: сканировать распакованные байты на пути с корнем в машине автора, как проверка Unity сканирует текстовые файлы. Замер на настоящих файлах убил его за минуту: в каждом .blend, который пишет Blender, есть собственный путь вида /Users/…, а корректно УПАКОВАННАЯ картинка записывает внутрь файла абсолютный путь к исходнику у автора. Сканирование сильнее всего срабатывало бы на безупречной работе. Теперь читатель разбирает собственное описание типов из файла и читает именованные поля из именованных структур.

Для вашей карточки

Проверьте идею на хорошем примере до того, как её строить. Если она жалуется на то, что вы точно знаете как правильное, — неверна идея, а не пример.

Мы написали

Читатель, падавший на любом архиве, собранном в Finder.

Правда

macOS при использовании Compress кладёт рядом с каждым настоящим файлом файл-спутник: в параллельную папку __MACOSX и с именем ._yourfile.blend. Его имя оканчивается на .blend, а .blend он не является. Читатель подхватывал его и падал, а это сломало бы проверку каждому продавцу на Mac. Синтетический тестовый архив этого не показал бы никогда; собранный настоящим инструментом показал сразу.

Для вашей карточки

Собирайте тестовые файлы тем инструментом, которым пользуется ваш покупатель, а не тем, который удобен вам. У нас заработало только после того, как мы перестали складывать архивы руками.

Мы написали

Файл на 407 КБ, который прочитался как 1 236 байт и выглядел нормально.

Правда

Blender сжимает Zstandard несколькими фреймами подряд. Стандартный распаковщик возвращает первый фрейм и останавливается: ни ошибки, ни предупреждения, просто правдоподобный заголовок и почти ничего из файла. Мы поймали это только потому, что тест сравнивал сжатую копию с её несжатым двойником.

Для вашей карточки

Дороже всего обходятся сбои, которые выглядят как успех. Сравнивайте с заведомо верным результатом, а не с тем, «упало или нет».

Мы написали

Значок «проверка пройдена», который мог поручиться за файл, который никто не открывал.

Правда

Два пути записывают отчёт о файле, который мы намеренно не читали: сверх лимита размера и такой, который наш читатель не смог разобрать. Оба сохраняют пустой список находок, а «находок нет» дальше по цепочке читалось как «всё в порядке». Никого ещё не пометили неверно, но следующий продавец, нажавший «Проверить» на большом пакете, был бы помечен. Теперь отчёт записывает, открывали ли мы файл на самом деле.

Для вашей карточки

«Мы ничего не нашли» и «мы не смотрели» — одинаковой формы и противоположного смысла. Везде, где ваша карточка намекает на проверку, убедитесь, что эти два случая можно различить.

Чего он не делает

  • Это не антивирус. В .blend может лежать Python, и проверка сообщает, когда скрипт помечен на запуск при открытии, — это факт о файле, а не суждение о вас.
  • Он не судит, хорош ли ваш ассет. Только доезжает ли он рабочим.
  • Он не скажет, совпадает ли рендер с картинками карточки. Он скажет, что в файле нет освещения, которым их можно было бы повторить.
  • Он только для Blender. Версия для Unity есть; для Unreal, Photoshop и Cinema 4D нет ничего.

Как мы себя убедили

Все тестовые файлы написал сам Blender

Ни одна фикстура не собрана руками. Весь риск в читателе формата в том, что формат не такой, как вы предположили, а фикстура, собранная руками, кодирует предположение дважды вместо того, чтобы один раз его проверить. Эта дисциплина поймала три отдельные ошибки до того, как хоть одна из них вышла.

Тестов на то, чему отказывать НЕЛЬЗЯ, больше, чем на то, чему нужно

Упакованный файл, .blend рядом с папкой текстур, архив, собранный в Finder, процедурный материал, библиотека материалов вообще без объектов. Доказать, что проверка ловит дефекты, — лёгкая половина; доказать, что на хорошей работе она молчит, — та половина, от которой зависит, станет ли её кто-нибудь читать дальше.

Сам стенд однажды соврал, и это стоило найти

Он печатал PASSED, пока падала проверка внутри, потому что скрипт на Python, выходящий с кодом ошибки внутри Blender, до шелла не доходит. Тест, который не может упасть, хуже, чем отсутствие теста, поэтому вердикт теперь маркерная строка, которую шелл ищет grep-ом, — отсутствие строки тоже считается провалом, — а сам стенд проверяют на заведомо сломанной сборке.

Сама карточка

Описание начинается с опыта покупателя, а не с нашего

Оно открывается розовой поверхностью, потому что это то, что автор под Blender узнаёт мгновенно и, скорее всего, уже однажды отгрузил. Дальше — что блокирует публикацию, дальше — честный ответ на «в Blender уже есть Pack Resources», то есть на возражение, которое опытный продавец выдвинет первым.

Обложка рисует сбой, а не инструмент

Лупа подошла бы любой площадке. Здесь нарисована текстура, убегающая из файла, и маскот, который тянется её поймать: читается в размере миниатюры и буквально показывает то, что товар предотвращает. Слово написано от руки, а не скопировано логотипом.

Бесплатно и вдобавок под GPL

Всё, что построено на Python API Blender, выходит совместимым с GPL, поэтому исходники читаемы и форкаемы. Брать за это деньги значило бы брать деньги за собственную планку качества.

Один архив, собранный собственным сборщиком Blender

Загрузку производит сборщик расширений, который поставляется с Blender, а не архивация руками. Из этого мы заодно знаем, что манифест корректен, потому что некорректный манифест сборщик не примет.

Наша собственная проверка нашла настоящую проблему в нашем собственном пакете

Публикация запускает тот же гейт, который проходит каждый продавец. Вернулась одна находка: в архиве нет README — одна из наших же двенадцати рекомендательных проверок. Мы починили пакет, а не проверку, и получившийся README теперь показывают и карточка, и репозиторий расширений.