Теперь, имея 2 OpenGL ES проекта на разных платформах, можно прикинуть что в них общего и в чем разница.
Общая структура: Создание GL context-а, инициализация данных, главный цикл с покадровым rendering-ом, выход. GL команды (Слава Богу!) выглядят тоже похоже. Разница в инициализации окна и GL-a, в GL-related инклюдах (gl/egl на Android-е и glfw/glad в Windows-е). Прием и обработка системных событий и ручного ввода тоже различаются.
Значит надо собрать platform-specific вещи в 2 отдельных набора (один для PC и другой для Android-а).
Начнем с printf-обрАзной функции, которая будет нужна для разработки и потребует разных реализаций для Windows и для Android-а. Сперва на
Windows:
- Запускаем Visual Studio. Открываем C:\CPP\a999hello\p_windows\p_windows.sln
2. Приготовим для нее место: right-click на “p_windows ” project -> Add -> New Filter
Имя – xPlatform
3. Физически мы будем держать Windows-specific файлы в каталоге C:\CPP\p_windows (там же где и GLFW/GLAD). Надо проинформировать Проект, что искать инклюды и там тоже:
Right-click на “p_windows” project -> Properties, All configurations, Win32, Configuration properties -> C++ -> General -> Additional Include Directories -> Edit, добавляем New Line (Новую Строку), идем в
C:\CPP\p_windows
Select Folder, Ok, Apply, Ok
4. Под xPlatform добавляем header file: Right-click на xPlatform, Add -> New Item,
- выбрать “Header File (.h)”
- name – platform.h
- Location неправильный, заменим на C:\CPP\p_windows
Теперь – Add.
Как и было заявлено выше, мы напишем функцию, которая сможет напечатать что-либо на экране (в данном случае – в окне Консоли), что-то типа printf-а.
Мы НЕ можем использовать сам printf потому что:
- Он работает только на PC. На Android-е работать не будет.
- Не работает в OpenGL экране.
- Нужен только в Debug конфигурации, в Release должен быть отключен.
Эту функцию я назову mylog(). Хочу, чтобы она принимала параметры так же как printf (сперва форматирующая строка, и потом – по обстоятельствам).
Еще она должна отключаться в Release конфигурации. Код:
#pragma once
#include "stdio.h"
#include <stdarg.h>
inline void mylog(const char* _Format, ...) {
#ifdef _DEBUG
va_list _ArgList;
va_start(_ArgList, _Format);
vprintf(_Format, _ArgList);
va_end(_ArgList);
#endif
};
Теперь можно ее опробовать.
5. Откроем main.cpp.
Сверху, где инклюды, добавим строку:
#include "platform.h"
В функции main(void), в самом начале, сразу после “{“ добавим строку
mylog(" Hello %s !\n", "Windows");
Выбираем Debug конфигурацию (в верхнем меню).
Запускаем (зеленая стрелка). Смотрим окно Консоли:
Hello Windows !
6. Теперь можно убрать “#include <stdio.h>” из main.cpp и поменять error_callback() с использования printf на mylog (это было единственное использование printf-а в main.cpp):
static void error_callback(int error, const char* description)
{
mylog("Error: %s\n", description);
}
Еще раз запускаем – норм.
Теперь
Android:
На Android-е это будет слегда по-другому. Во-первых – нет окна Консоли. Во-вторых – нет “окон” вообще (в Windows-овском смысле). Зато есть “LogCat” – собственный Android-овский механизм для вывода debug/development сообщений.
7. Закрываем и пере-запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln.
8. Добавляем filter (virtual folder): right-click на p_android.NativeActivity project -> Add -> New Filter.
Имя то же, xPlatform
9. Под xPlatform создадим header file: Right-click на xPlatform, Add -> New Item,
- выбираем “Header File (.h)”
- name – platform.h
- Меняем location на C:\CPP\p_android\
Затем – Add.
Код:
#pragma once
#include <android/log.h>
#include "stdio.h"
inline void mylog(const char* _Format, ...) {
#ifdef _DEBUG
char outStr[1024];
va_list _ArgList;
va_start(_ArgList, _Format);
vsprintf(outStr, _Format, _ArgList);
__android_log_print(ANDROID_LOG_INFO, "mylog", outStr, NULL);
va_end(_ArgList);
#endif
};
Этот код полагается на константу _DEBUG, но она пропущена в Android’s debug конфигурации.
10. Открываем p_android.NativeApplication project properties, выбираем Debug configuration, ARM64,
Идем в Configuration Properties -> C/C++ -> Preprocessor, открываем Preprocessor Definitions -> Edit. Если _DEBUG там нет, то добавить, затем OK, Apply, Ok.
11. Теперь откроем main.cpp.
В #include секции добавим новую строку:
#include "platform.h"
В функции android_main (…), в самом начале, сразу после “{“ добавим строку:
mylog(" Hello %s ! \n", "Android");
12. Опять-же, надо проинформировать p_android.NativeActivity проект где искать этот platform.h.
Right-click на p_android.NativeActivity project -> Properties, All Configurations, ARM64. Открываем Configuration Properties -> C/C++ -> General -> Additional Include Directories -> Edit, Добавляем строку, идем на
C:\CPP\p_android
Select Folder, Ok, Apply, Ok.
13. Включаем и разблокируем наш Android, подключаем к PC USB кабелем, разрешаем USB Debugging.
14. Компиляция и запуск (зеленая стрелка). На Android-е ничего нового, тот же мигающий зеленый экран, но теперь мы можем посмотреть LogCat.
15. На VS экране открываем верхнее меню -> Tools -> Android Tools -> Logcat.
В поле <Search Logcat> набираем “mylog”, Enter. И что там у нас?:
Hello Android !