MdlVis – кривой, но всё же довольно популярный редактор моделей для WarcraftIII. Редактирование мешей, текстурирование, работа со скелетом, расстановка ключевых кадров, создание анимаций, импорт и слияние моделей – и всё это в единственном файле весом 500Кб. К тому же MdlVis был единственной утилитой, способной конвертировать модели из World of Warcraft в формат WarcraftIII.
История редактора – под катом.
Игра нового тысячелетия
До нашего города третий Варкрафт добрался на рубеже 2004-2005 годов. Точнее, достать-то его можно было и раньше, но только в виде пиратки с кривым переводом, рипнутыми роликами и выкинутыми картами.
И вдруг мир перевернулся. Рожа Артаса красовалась на каждом компьютерном магазине. В Варкрафт рубились в каждом компьютерном клубе. Многие даже раскошеливались на покупку новых компов, если старые вдруг не тянули игрушку.
Warcraft III вообще первая компьютерная игра, которая всерьёз меня зацепила. И первая, которая попала мне в руки в лицензионном виде. До этого стандартом считалось, когда игры идут на дисках по 100р. за штуку, устанавливаются через раз, глючат, а кроме setup.exe на том диске непременно имеются директория crack и файл keygen.exe.
Тут же покупатель с первого взгляда понимал, что перед нами лицензия: два бокса в стильных упаковках, плюс всё это обтянуто плёнкой, т.е. диски не вскрывались и не б/у. Внутри находился лицензионный ключ. Цена правда кусалась, 580р., но все брали и не жаловались: игра того стоила.
Взять хотя бы качество перевода. Оно просто завораживало. До тех пор я и не подозревал, что такое вообще возможно: все надписи, даже в заставках, переведены, причём перевод человеческий, не машинный. Все персонажи, все юниты – переозвучены. В общем, тогда это казалось нереально круто. Даже годы спустя в магазинах и близко не лежало хоть что-то похожее, а уж тогда, на фоне всяких там Фаргусов и Акелл, нормальная локализация вызывала чувство, близкое к эйфории.
(Второй раз столь же качественная локализация попалась мне лишь после 2007-го, и это были Sudeki).
Модмейкерство
Редактор карт у игрушки просто шикарный. Особенно понравилась возможность создавать ролики на движке Варкрафта. Тогда их не делал только ленивый. Карты-кинематики передавались из рук в руки на дискетах либо скачивались из сети (теми, у кого эта сеть вообще была. Удивительно, но даже простой домашний телефон тогда пришёл далеко не в каждый дом). Тут были и просто музыкальные клипы, и отдельные мультистории, и даже целые мультсериалы (например, «Сказ про лича Ильича и покорение эльфийских минеральных вод»).
Меня очаровал сам подход: ничего не надо рисовать покадрово, как в обычных мультфильмах. Достаточно всего лишь расставить декорации и наших виртуальных актёров, а дальше просто командовать им, что делать: сесть, встать, пробежаться вон до того дерева, взмахнуть мечом, — и дальше они уже сами, используя стандартные анимации, всё это проделывали. Тогда я был почему-то уверен, что уже через пару лет, когда эта технология разовьётся, вообще все мультфильмы будут делаться именно так, и создать мультфильм станет не сложнее, чем написать рассказ. Будущее казалось таким близким и таким привлекательным…
Но, начав заниматься модмейкерством, столкнулся с проблемой: очень часто в игре просто не было подходящих моделей. Редактор игры позволял импортировать модели, созданные сторонними разработчиками, но тут возникала другая проблема: не существовало нормального инструмента для создания этих самых моделей.
Blizzard’ы предлагали так называемый ArtTools. Это плагин к 3DSMax 5-й версии. Да-да, требовался именно Max5. Ни с 4, ни с 6 версиями оно не работало. Ну, а добыть этот самый 3DSMax я тогда не мог. Оббегал все магазины, смотрел на всех развалах… Нету. О торрентах же при тех скоростях и тех сетях оставалось только мечтать. Достаточно сказать лишь, что я впервые вышел в Интернет только в 2004 году. И на тот момент в сеть попадал через университетский шлюз, где даже 5Мб выкачать было целой проблемой. На скачку тех же ArtTools, которые весили около 30Мб, ушёл почти весь день.
И, что самое обидное: зачастую даже не требовалось полностью новой модели. Хотелось лишь чуточку подправить уже существующую. Ну, там, эльфийке плащ убрать, или фонарь на столбе перевернуть вверх ногами…
Неужели же для таких простейших, необходимейших действий нет подходящего инструмента? Оказалось, нету. Существовал правда набор инструментов от Oinkerwinkle, но тамошний редактор выглядел вот так:
Да, никакой возможности вращения, только простейшие проекции.
И тут я вспомнил, что вообще-то немного умею программировать.
Кодинг
Ну, «умею» — пожалуй, сильно сказано. Просто поверхностные знания Delphi и чуть более глубокие – ассемблера, но под DOS. Последний изучал по зачитанному до дыр учебнику Юрова. С другой стороны, думал я, мне ведь не клон 3DSMax’а нужен, а простенькая по сути программка. Вот точь-в-точь как VertexModify, только с возможностью свободного вращения камеры.
Я сформулировал основные требования к программе:
- Должна как можно меньше весить, чтоб её удобно было пересылать по сети
- Должна запускаться на любой машине, где только стартует Warcraft III. А лучше даже и там, где War не идёт
- Должна выглядеть в точности как VertexModify, только проще и с возможностью вращения камеры.
В качестве языка программирования выбрал Delphi5. Почему именно пятый? Потому что именно там впервые появляются динамические массивы, а размер готовых бинарников всё ещё относительно мал (позже на форуме не раз спрашивали, почему пустая форма, собранная в Delphi2005, весит больше, чем весь мой редактор).
Также встал вопрос выбора API: OpenGL или DirectX. Думаю, все уже догадались, что именно я выбрал. Да, код DX казался мне тупым и чрезмерно усложнённым. «Ещё там зачем-то COM-интерфейсы прикрутили, Microsoft определённо империя зла», — думал я. Зато в OGL всё чётко, просто, понятно и работает гарантированно вообще везде, тогда как DX ещё может быть и не установлен. Или установлен, но не той версии. В общем, GL – лучший.
Как же я тогда ошибался…
Первой трудностью стал формат моделей. Модельки Варкрафта идут в двух видах: бинарном (MDX), который собственно и импортировался в карты, и текстовом (MDL). Никаких данных по бинарному формату не существовало вовсе, а текстовый был описан частично, и именно с ним работали все модмейкерские редакторы. Из одного формата в другой модели переводились специальной тулзой (Yobguls converter), автор которой устройство форматов тоже не знал, а просто-напросто юзал для конверсии рипнутые прямо из бинарника куски кода Варкрафта. Естественно, рип работал нестабильно с точки зрения вылетов, зато конвертил абсолютно всё.
В общем, я тоже решил работать именно с MDL. И гордо назвал свою прогу «Визуализатором MDL», дав проекту название MdlVis.
Половинчатость документации MDL меня нимало не смущала: я-то планировал работать только с геометрией, т.е. вершинами и сеткой. А всякие там анимации, текстуры, материалы, камеры, источники частиц, источники следа, истчники света, звуковые эффекты, и т.д. объекты меня не интересовали. В память грузились только секции геометрии, и они же потом и перезаписывались, а всё остальное я вообще не трогал.
Начало
Кодил в свободное от учёбы время, по вечерам, часто засиживаясь допоздна. Первоначальный вариант программы появился на свет спустя ровно месяц с тех пор, как в редактор кода легла первая строчка.
Окно «о программе» одной из начальных версий редактора.
Немного поработав с получившейся программой, решил поделиться ею с другими модмейкерами.
В те времена Blizzard даже не помышлял о том, чтобы прийти в Россию, поэтому крупнейшее русскоязычное комьюнити располагалось на сайте blizzard.ru.
Туда-то я и выложил свой редактор, обозначив сборку как альфа-версию.
Отзывы не заставили себя долго ждать. Поначалу они были весьма негативными: как и ожидалось, программа сильно глючила, подвисала и отличалась весьма неинтуитивным интерфейсом, а туториалами к ней я как-то не озаботился.
Тем не менее, MdlVis, по сравнению с VertexModify, действительно предоставлял куда более наглядный способ работы с моделями. Поэтому хотя бывалые модмейкеры лишь морщились, новички самоотверженно воевали с глюками программы.
Я же тем временем параллельно с багфиксами осваивал текстурирование.
Текстуры в Warcraft III шли в формате BLP, который представлял собой изрядно покорёженный гибрид BMP с JPEG. Для декодирования текстур Близзы использовали интеловский кодек. Соответственно, передо мной встал выбор: писать процедуру декодинга самостоятельно или же задействовать библиотеку ijl15.dll, которая по умолчанию ставилась вместе с Warcraft’ом. Я выбрал второй путь: зачем плодить глюки и увеличивать размер exe, если нужный модуль гарантированно будет на компе каждого модмейкера?
Тем не менее, заботясь о тех, кто по какой-то причине не имел доступа к игре, сделал загрузку ijl15.dll динамической. MdlVis проверял наличие этого модуля, и, если таковой не обнаружен, всё равно запускался, просто не позволял включить отображение текстур.
Исправленную версию я обозначил как бета.
Примерно в это же самое время мне пришло письмо с ещё одного игрового ресурса, xgm.ru, с просьбой выложить редактор. Я согласился.
Если blizzard.ru был сайтом комьюнити, то xgm позиционировался именно как модмейкерский сайт: меньше простых игроков, но больше модмейкеров. Поэтому в дальнейшем именно он стал моей основной рабочей площадкой.
Бета-версию редактора, выложенную на оба ресурса сразу, постигла судьба альфы:
Бейте меня палками, но пока это просто перспективный проект, но уж никак не лучше вертекс модифай, и тем более аниматионс мерджера.
Довольно неясный интерфейс (для меня). Нерабочая опция «общий вид», нет, она конечно работает, но затем вешает комп. Невозможные режимы выделения, мне так и не удалось снять выделялку.
Единственное что порадовало — хоть какая-никакая перспектива.
В целом — на доработку.
Я конечно правил баги, но не слишком активно, т.к. меня осенила новая титаническая идея: добавить в программу редактор анимаций! Даже на то, чтоб просто реализовать проигрывание этих самых анимаций, времени ушла масса. Пришлось перелопатить кучу материала, выясняя, что такое кватернионы, как они интерполируются и что вообще такое скелетная анимация. Тут я впервые слегка пожалел, что не выбрал DX – там-то всё делается парой кликов, т.к. все функции для работы с кватернионами и матрицами есть в библиотеке. Мне же пришлось набивать всю эту математику ручками. На тот момент осилил лишь частично – интерполяцию кривыми Безье, которые к тому же задавались углами наклона, реализовать не смог, как и сплайны Эрмита. В результате модели, использовавшие данные типы интерполяции, выглядели в MdlVis довольно дергано.
Ну, лучше уж хоть что-то, чем вообще ничего.
Итак, в мае 2005г. наконец-то вышла первая (1.0) версия MdlVis. В ней, как водится, немедленно нашли глюки (в частности, текстуры в формате tga грузились почему-то вверх ногами), так что по горячим следам пришлось выпустить пару багфиксов (1.01, 1.02). После чего редактор стал наконец работоспособен и начал медленно, но уверенно завоёвывать популярность среди модмейкеров.
Редактор анимаций в MdlVis
Первая версия MdlVis уже умела работать с буфером обмена и даже позволяла копировать фрагменты из одной модели в другую, вместе со всеми материалами. Правда, не без шаманства: чтобы вставить фрагмент из другой модели, надо было сперва выделить одну и ровно одну точку (т.н. точку вставки), к которой и «привязывался» вставленный фрагмент, копируя все её движения.
Так, если планировалось вставить меч, то выделяли точку на кисти руки. Если вставлялась голова или шлем – точку шеи и т.д. Согласитесь, действия не вполне интуитивные.
Несмотря на то, что всё это было подробнейшим образом расписано в FAQ к программе, вопрос «как прицепить дриаде голову Артаса» вскоре стал одним из самых популярных на форуме. Его задавали снова и снова, буквально выбешивая модеров…
Тем временем на развалах среди прочей пиратки таинственным образом обнаружился диск с пятым 3DSMax’ом. Радостно схватив его, я тут же побежал ставить Art Tools, и очень скоро полное описание MDL-формата буквально упало мне в руки. Теперь я грузил не только те секции, с которыми редактор непосредственно работал, но и вообще всю модель. А значит, настало время реализовать работу и с бинарным форматом, избавившись от Yobgul’овского конвертера и превратив MdlVis в универсальный комбайн модельщика.
Вообще, как оказалось, комьюнити – это не только генератор идей, до которых я сам ни за что бы не додумался, но и отличный источник информации. Если надо достать какие-то доки, статьи, алгоритмы, редкие материалы – достаточно лишь кинуть клич. Стоило только сказать, что мне очень нужны доки по MDX, как они волшебным образом у меня материализовались.
Бинарный формат оказался значительно проще текстового: когда не надо парсить, а достаточно просто маппить структуры, это такой кайф…
И августовская версия редактора уже позволяла грузить MDX, заодно поддерживая конверсию MDL/MDX. Там же добавился импорт 3DS-моделей, но эта функция оказалось невостребованной. Стало ясно, что MdlVis используют именно для быстрой и лёгкой правки уже существующих моделей.
Поддержка
Но есть у комьюнити и недостатки: в частности, люди довольно неохотно сообщают о мелких глюках. Если упало вообще всё, и падает на данной модели стабильно – то да, сообщат. А если падает один раз из десяти, или чуток подлагивает, скорее всего я о таком и не узнаю. Как ни ругался на форуме, ничего не помогало. Даже высказывал идею, что хорошо бы распространять MdlVis как Shareware, где регистрационный ключ высылался бы в обмен на баг-репорт.
А глюки были. Причём значительная часть из них оказалась связана не с самим редактором, а… с видеодрайверами. Стандарт OpenGL на деле оказался полным отсутствием стандарта. Отдельные вендоры трактовали его спецификацию настолько своеобразно, что у меня просто глаза на лоб лезли. Особенно отличались карточки от ATI и их китайские клоны, среди которых мне например попался экземпляр, не поддерживающий двойную буферизацию. В итоге 3D-движок со временем обрастал паутиной многочисленных трюков, хаков и проверок на каждый чих, чтобы просто заставить всё это работать на многочисленном «зоопарке» видеокарт. И это при том, что я тогда юзал чистый OpenGL1.0, вообще без каких бы то ни было расширений!
Трудностей добавляли и сами моделлеры. Поскольку редактор был всё ещё весьма ограничен, они нередко правили текстовые MDL’ы прямо в Notepad’е. При этом получалось нечто, не предусмотренное спецификацией, и оно неправильно интерпретировалось редактором (т.е. не так, как в движке самой игры). Приходилось подстраиваться. Я провёл уйму времени, генеря самые дикие комбинации флагов и элементов, «скармливая» всё это War’у и наблюдая за его реакцией.
Сам MdlVis тоже не отличался стабильностью. Когда я его начинал, то не планировал, что он настолько разрастётся (в переносном смысле конечно – весь бинарник редактора до самого конца так и не преодолел рубеж в 500к, и шёл всегда одним-единственным файлом, без дополнительных зависимостей). В итоге никакой архитектурой там и не пахло, память текла во все дыры, Access violation’ы вываливались пачками, а каждый исправленный баг мог с лёгкостью активизировать парочку новых.
Также я столкнулся с ещё одной, совершенно неожиданной проблемой: у меня не оставалось времени на моделлинг! Программирование пожирало время в любых количествах, и получалась абсурдная ситуация: я создавал редактор специально для того, чтобы поразить наконец народ крутыми картами, а в итоге моделлили совсем другие люди.
Но, не смотря на все трудности, MdlVis приближался к пику своей славы. Тем более что конец 2005 года – это расцвет Warcraft III. Карты выпускались пачками, составлялись паки моделей, проводились конкурсы кинематиков, проекты множились, как грибы после дождя. Люди экспериментировали с геймплеем, создавая невероятные, фантастические карты (вроде FPS на движке WC3). Работа кипела.
WoW! It’s coming…
И тут пришёл ОН. Первый из богов новой эры, эры онлайна. Предвестник апокалипсиса и гибели синглов как таковых.
World of warcraft.
Точнее, появился-то он ещё раньше, но в России был знаком лишь понаслышке да по собственноручно поднятым на собственных же десктопах эмуляторам. Не с тогдашними сетями в него рубиться. Более-менее повезло разве что москвичам, там по слухам с Интернетом уже тогда было относительно неплохо.
В общем, на тот момент для российских геймеров WoW оказался бесполезен. Но зато в нём были модели. И какие! Высокополигональные, с тоннами сверхкачественных анимаций, с детальными текстурами. И, что особенно ценно, все на тематику Варкрафта. Идея рипнуть эти модельки в MDX-формат буквально витала в воздухе.
Так, появился написанный кем-то из умельцев скрипт для импорта M2 (формат моделей WoW) в 3DSMax, но работал он настолько криво, что его и запустить-то удавалось далеко не всем. К тому же он импортировал только меши и скелет, который вдобавок требовалось цеплять к вершинам вручную.
А тут ещё Blizzard выпустил новый патч WoW, и скрипт вообще перестал работать.
Ситуация осложнялась тем, что у меня не было возможности ни скачать WoW (сетка проапгрейдилась, да, но всё ещё диал-ап с 33.8кбит/с на пике), ни купить его. И тут на помощь вновь пришло комьюнити. По моим просьбам почту завалили модельками и текстурами, а также скринами, как всё это должно выглядеть в игре. Где-то добыли и набросок документации по формату M2. Как потом выяснилось, те доки во многом не соответствовали действительности.
Я неделями просиживал в HEX-редакторе, разбираясь в хитросплетениях нового формата. Движок WoW оказался гораздо прогрессивнее движка WC3, поэтому многие фичи моделей M2 просто не имели аналогов в MDX. Приходилось импровизировать: придумывать, как на основе анализа M2 по сути с нуля сгенерировать максимально похожую MDX-модель.
Пришлось повозиться и с текстурным форматом, BLP2. Там использовался целый набор алгоритмов сжатия, от JPEG до DXT (с последним я столкнулся впервые, и тоже долго курил форумы, разбираясь, как оно вообще декодируется).
И вот настал исторический момент: 9 ноября 2005г. выходит MdlVis 1.2. Первая в мире программа, способная конвертить модели и текстуры WoW для третьего Варкрафта.
Я сам настолько проникся важностью момента, что даже написал подробнейший туториал, где разжёвывал буквально каждую деталь процесса.
Сказать, что конвертер оказался востребованным – просто ничего не сказать. Форумы взорвались. Народ сутками напролёт конвертил модели, задавшись кажется целью переконвертить весь контент WoW целиком.
Мало того, про MdlVis внезапно узнало англоязычное комьюнити. Это меня несколько удивило: до сих пор я как-то даже не задумывался о том, что за границей тоже есть игроки и модмейкеры, и что их даже больше, чем в России. Поэтому редактор делался исключительно для русскоязычной аудитории. Интерфейс, readme, FAQ и туторы – всё было на русском. А неинтуитивный интерфейс практически полностью исключал вероятность разобраться в программе методом тыка.
Однако же, на wc3search и ряде других ресурсов появился англоязычный туториал по конверсии WoW-моделей (в стиле «а теперь кликаем по третьему сверху ряду иероглифов в меню, далее не читаем – сразу жмём на левую кнопку…»), а заодно – сами модели.
Последние, правда, на следующий день исчезли с wc3search, зато появился наполненный флеймом топик «легально ли это – использовать в модах WC3 модели из WoW».
Помню, тогда ещё долго смеялся над этой дискуссией. Даже специально скинул всю ветку себе в рабочую папку, больно уж настроение поднимало. О да, Близзы безусловно обидятся, что фанаты выкрали модели из одной их игры, дабы вставить в другую той же самой фирмы и на ту же тематику. В те времена это звучало как анекдот, ведь мы все абсолютно искренне верили, что знаки вроде ©,тм, ® предназначены исключительно для того, чтоб название смотрелось солиднее.
WoW-модель, импортированная в рабочее пространство MdlVis
MdlVis, к слову, шёл под «никакой» лицензией. То есть мне даже в голову не могло прийти, чтобы требовать за него деньги или хотя бы добавлять в каждый файл исходника многокилометровую шапку с текстом свободной лицензии.
Как бы то ни было, флейм ширился, а Blizzard хранил многозначительное молчание. То ли потеряли дар речи, то ли (что скорее всего) им было и вправду плевать.
Впрочем, две недели спустя их саппорт всё же ответил, что выкладывать можно, но только не в карты Battle.net. Ещё через месяц – что можно и в battle.net, но только если модель со всеми текстурами не превышает 1Мб. А затем и вовсе махнули рукой, тем более что к тому времени от всего Battle.net’а осталась по сути одна лишь DotA.
Передо мной же встала проблема оптимизации: требовалось впихнуть здоровенные модели WoW в заявленный 1Мб.
Вопрос с уменьшением размера решался постепенно и неторопливо, путём коллекционирования разных трюков и хаков. Например, числа в MDX задавались 4-байтными float. Два байта из этих четырёх, как оказалось, можно безболезненно обнулить, что приводило всего лишь к снижению точности и обычно не сказывалось на качестве модели. А вот в архив такие модельки жались уже гораздо лучше… Ну и всё в таком же стиле.
Чрезмерно «похаченные» подобным образом модели нормально кушались как игрой, так и MdlVis, однако же сторонние моделлерские тулзы на них сыпались только в путь. В итоге такие модели ничем кроме моей программы было не отредактировать, комьюнити начало возмущаться, и мне пришлось добавить в редактор «канонизатор» — антихак, который приводил модели вновь к стандартному виду, пусть и за счёт увеличения их размера.
Помимо M2, в WoW использовался ещё один формат, WMO. Если в M2 хранились в основном модельки разных активных мобов, то в WMO лежало окружение. Столбы, здания, даже целые города. По структуре WMO напоминал мини-карту: там содержалось описание способа сборки модели из кусочков и ссылки на «строительные блоки».
В конце концов я, не без помощи комьюнити, разобрался и с этим форматом, добавив его поддержку в очередную версию редактора.
Конкуренция
Примерно в то самое время у MdlVis появляется конкурент: редактор Warcraft III Model Editor (W3ME). Этот был написан на C++, шёл сразу с открытыми исходниками, использовал DirectX, английский язык интерфейса, и весил раз в шесть больше MdlVis’а (в те времена я очень гордился такой миниатюрностью своего редактора).
Автор W3ME явно не новичок в программировании, и с архитектурой был знаком не понаслышке: очень чёткий, понятный даже без комментариев, читабельный код, высокая модульность и невероятная стабильность. W3ME оказался своего рода антиподом MdlVis, там всё было наоборот: DirectX vs. OpenGL, C++ vs Delphi, модульность vs спагетти. Даже функции, под которые затачивался каждый из редакторов, не совпадали: W3ME позволял работать с источниками частиц, скелетом, анимациями, но удобных инструментов для правки мешей там не было. В MdlVis, напротив, отредактировать меши не составляло труда, но вот убогий и глючный редактор анимаций оставлял желать лучшего.
Тогда-то я и совершил очередную ошибку: решил переписать редактор анимаций MdlVis с нуля, чтобы не просто скопировать, но и превзойти функциональность W3ME, не оставив тем самым конкуренту ни единого шанса.
В те времена я ещё не знал о системах контроля версий, поэтому действовал по принципу «очередная версия – это билд текущего состояния кода». И когда мне сообщали об очередных багах в MdlVis, я не мог их исправить, поскольку это означало бы выложить версию без редактора анимаций вообще (он ведь был полностью убран из кода, а новый только создавался). Тот же Git с лёгкостью решил бы мою проблему, но я о нём тогда даже не догадывался, а подсказать было некому.
А тут ещё Blizzard’ы выпустили очередной патч WoW, где поменяли формат моделей, так что они перестали открываться конвертером. В общем, фиксы стали неизбежностью. Следующая версия MdlVis вышла исправленной. Меньше багов, возможность конверсии нового формата WoW-моделей… но никакого редактора анимаций. Вообще.
А в это время автор W3ME всерьёз взялся за редактор мешей. Его программа начала догонять MdlVis, так что пришлось поднажать и мне. Главной проблемой вновь стала математика: пришлось собирать информацию о видах интерполяции, разбираться в сплайнах Эрмита, искать алгоритмы.
В конце концов редактор анимаций всё же появился в MdlVis. Он действительно оказался существенно функциональнее, чем в W3ME, но отличался всё той же спагетти-архитектурой, и потому регулярно приводил к падению программы.
Поиск багов
И новая проблема: в баг-репортах накопилось множество невоспроизводимых глюков. То есть у меня всё работало как часы, а у пользователя точно те же самые действия почему-то приводили к вылету. Что делать?
Немного покурив форумы, решил добавить в программу VEH и возможность снятия минидампов. Тогда, получив от пользователя дамп, можно будет загрузить его в отладчик и хотя бы попытаться понять, из-за чего возникла проблема.
Сказано – сделано. MdlVis 1.39 вышел уже с новой функциональностью. Все исключения дополнительно перехватывались VEH, а в обработчике снимался дамп. При этом я опять же учёл, что ни VEH, ни работы с дампами нету в Win98. Поэтому MdlVis сперва проверял наличие нужных функций, подгружая требуемые модули динамически. Если система не поддерживала VEH и дампы, MdlVis всё равно нормально работал, просто без этой самой добавочной функциональности.
Принцип «максимальной совместимости» и параноидальных проверок всего подряд, которого я придерживался с самого начала разработки, оправдал себя, когда вышла Windows Vista. W3ME сразу же отказался на ней запускаться, так что модмейкерам пришлось почти две недели ждать фикса, а MdlVis заработал без каких-либо проблем.
Итак, новая версия пошла в народ. И сразу же вызвала жалобы: если MdlVis часто вылетал, то рабочая директория быстро забивалась тоннами дампов. Но зато вместо описания бага оказывалось достаточно просто прикрепить дамп, и поиск причины падения стал куда проще и приятнее.
Именно благодаря дампам мне удалось выявить и пофиксить уйму ранее не воспроизводившихся багов. Основная их часть выловилась к 1.39c, которая до сих пор считается наиболее стабильной из всех версий.
Дальнейшая судьба редактора
Что же было дальше? А дальше – аспирантура, диссертация, защита, поиск работы, собственно работа. Времени на MdlVis оставалось всё меньше, да и Warcraft постепенно терял популярность, выродившись до Battle.net и Доты.
Зато поползли слухи о грядущем скором выходе StarcraftII. Я уже заранее облизывался: ведь можно будет переделать MdlVis уже под модели Starcraft! Наверняка же нам дадут куда более мощный редактор карт, более мощный движок и вообще Близзы 100% готовят очередную революцию. Только я не учёл, что «скоро» в понимании Blizzard – понятие растяжимое. И когда StarcraftII вышел, внезапно оказалось, что онлайн захватил мир. Ныне помимо казуалок существует только MMO. Синглы мертвы, модмейкеры никому не интересны, и нет ни малейшего смысла развивать редактор.
Основные ошибки и выводы
Вот мои главные ошибки, сделанные в процессе разработки и поддержки MdlVis:
- Wild development. Всё же архитектуру надо планировать сначала, а не потом. И покрывать код юнит-тестами хотя бы в самом минимальном объёме.
- Документация. Доки надо вообще писать до, а не после кода. И потом править, если не получилось написать код под доку. Скверная документация уже давно стала визитной карточкой OpenSource, и не стоит продолжать эту традицию, ожидая, что комьюнити само разберётся и напишет туториалы. Когда в доках половина разделов «каминг сун», а вторая половина устарела на пару лет и не соответствует действительности, у пользователя остаётся гнетущее впечатление.
- OpenGL. Он напрочь отбил у меня охоту связываться с любыми «стандартами», не имеющими единого владельца, способного продавить чёткую однозначную реализацию и настучать по шапке всем альтернативно видящим. Если какая-то технология развивается неким комитетом или консорциумом, от неё надо бежать как от чумы. Так, начав новый проект, я теперь уж точно выберу DirectX вместо OpenGL, и Flash вместо JS+HTML+CSS (на которых даже hello world без десятка хаков не сделать).
Также я теперь с изрядным подозрением буду относиться к такому «кроссплатформенному» коду, который на 90% состоит из #define/#ifdef, а оставшиеся 10% — символы подчёркивания. - Погоня за размером. То, что MdlVis влезал в 500к, это конечно круто, но бесполезно. Объёмы винтов и скорости сетей растут столь стремительно, что уже и 500Мб для пользователя скачать не проблема. Поэтому все бесконечные хаки и оптимизации по размеру не имеют смысла. Например, Windows XP в 1Гб укладывалась, а Win8 уже 20Гб требует, даже закрадывается подозрение, что её на C# писали. И ничего, работает, все довольны.
- Переписывание кода. То и дело поддавался желанию «взять и переписать», как будто замена одного куска бесструктурного кода на другой такой же что-то изменит. В итоге каждое переписывание приводило лишь к потере времени и целому букету дополнительных багов.
- Погоня за универсальностью. В 2005 году уже глупо было равняться на Win98 и разного рода «особые» системы.
Несмотря на многочисленные ошибки, я получил просто колоссальный опыт по ведению собственного проекта и взаимодействию с комьюнити, и море удовольствия от процесса. ИМХО, каждый, кто увлекается программированием, должен хотя бы раз через это пройти.
Начать очень легко: достаточно всего лишь найти крупное сплочённое комьюнити, стать его частью и начать кодить инструмент, которого очень-очень не хватает. Да, первая версия будет слабой и глючной. Но дальше комьюнити само подскажет, в каком направлении двигаться.
Автор: Alexey2005