• Чистое API приложение. Небольшое по размеру получаемого исполняемого файла, теоретически легко переносимое. Исходный код, правда, компактностью не отличается…
• MFC приложение. Наиболее распространенный выбор. Сейчас уже трудно найти компьютер, на котором отсутствует mfc42.dll, хотя, распространяя приложение, вы должны предусмотреть все варианты. К недостаткам можно отнести некоторую угловатость и тяжеловесность исходников.
• WTL (Windows Template Library) приложение. Замечательная штука, но почему-то еще не все люди слышали о WTL, и, что еще более печально, не у всех она установлена.
• И, наконец, ATL приложение. Наиболее любимый мною подход, пригодная (вопреки общему мнению) для создания практически любого Windows-приложения. К сожалению, мастер ATL из комплекта Visual C++6 не поддерживает генерацию не-COM приложения.
После долгих размышлений я остановился на последнем варианте. Как говорится, читателю все равно, а мне приятно. Шутка. На самом деле, я действительно считаю, что этот подход позволил мне сделать код максимально понятным, и человек, не измученный нарзаном в виде MFC, разберется там без особых проблем. Если вы ненавидите ATL – не читайте эту статью дальше. Чтобы внести некоторую ясность и определенность, спешу представить вашему вниманию диаграмму классов для демо-приложения. Выполнено в Rational Rose 2000 – нотация Буча.
Рисунок: диаграмма классов
Несколько комментариев по назначению реализованных классов:
• CMainDlg – Главный класс приложения. Унаследован от CDialogImpl и создается в функции WinMain как немодальный диалог. Содержит в себе один экземпляр класса C3DGraphic, один C3DGraphFrame, 4 немодальных диалога редактирования свойств (CMaterialPropsWindow, CLightPropsWindow, CBackColorWindow and CFunctionTypeWindow) и 3 объекта 3D функций (CSplashFunction, CPlaneFunction and CParabaloidFunction).
• CPropertyWindow – Базовый класс для всех окон редактирования свойств. Унаследован от CDialogImpl.
• C3DFunction – Базовый абстрактный класс, определяющий интерфейс получения информации о какой-либо функции 2-х переменных.
• CPropertyWindowNotify – Абстрактный класс-интерфейс, реализуемый клиентами окон свойств. Через этот интерфейс клиенты уведомляются об изменениях, происходящих со свойствами.
• CD3D8Application – Весьма простой класс-обертка для управления жизнью и смертью IDirect3D8 объекта.
• C3DGraphFrame – Окно, в котором будет отображаться результирующая 2D проекция трехмерного изображения. Говоря в терминах MFC, класс вида для трехмерного графика.
• C3DGraphic – Наиболее значимый и нагруженный класс, выполняющий всю основную работу по построению и обработке 3D картинки. Именно он реализует операции управления светом, свойствами материала, рендеринга и тому подобные. Собственно, ради него все и затевалось…
То ли Микеланджело, то ли еще кого-то из великих однажды спросили, как создать скульптуру. Великий, недолго думая, ответил: "Возьмите большой камень и удалите все лишнее." Окинув взглядом все вышеизложенное, можно сделать простой вывод: демо-приложение является ни чем иным, как обычным ATL EXE COM сервером, из исходного кода которого хитрой рукой автора было удалено все относящееся к COM технологии. Построение такого приложение само по себе является интересной задачей, но мы не скульпторы, так что подробности оставим в стороне. Тем более, что тема моей статьи все-таки DirectX, а не ATL. Вот сейчас – как раз об этом…
А что это за Direct3D8, и где оно живет???
Если вы когда-либо имели дело с предыдущими версиями DirectX, то Вас ждет очень интересное открытие: DirectDraw больше нет вообще!!! Microsoft в очередной раз решил обобщить все что можно, и теперь все относящееся к рисованию в DirectX представлено под одним общим заголовком DirectX Graphics. Все изменилось кардинальным образом по сравнению с DirectX7. Интерфейс IDirect3DDevice8, например, имеет 94 метода. Для сравнения, IDirect3DDevice7 позволял выполнить лишь 48 операций. Back-буферизация теперь поддерживается автоматически, без каких-либо усилий с Вашей стороны – не надо больше вручную создавать эти загадочные flip chains. Инициализация Direct3D стала простой как i++, и многие низкоуровневые детали теперь стали вообще недоступны программисту. Не всегда это здорово – например, теперь вы не можете рисовать что-либо непосредственно на primary surface. Более того, вы и читать то с нее ничего не можете. Точнее можете, но Microsoft не советует. От себя посоветую никогда не делать что-либо нерекомендованное Microsoft, а любопытных отсылаю к документации по методу IDirect3DDevice8::GetFrontBuffer. Впрочем, к вопросам совместимости Microsoft всегда относилась внимательно, и, установив DirectX8, Вы можете свободно работать и со всеми предыдущими версиями этого продукта.
Читать дальше