Подготовка GLXcene компонентов на основе OpenGL для FMX (пока только для win32/64) возобновлена по новому адресу
https://github.com/GLScene/GLScene/tree/master/Source/FMX
Синхронизация юнитов и форм почти завершена с помощью BeyondCompare (входит теперь в состав редактора RAD Studio), префиксы классов и компонентов теперь разные, чтобы можно было устанавливать сразу обе сцены: у VCL - TGL.., у FMX - Tgx...
Пока компилируются run-time пакеты GLXcene for Delphi/C++Builder, а для design-time необходимо ещё добавить форму вьюера OpenGL и модуль дизайнера компонентов.
Для разработки графических 3D приложений под OpenGL для Delphi/C++Builder & Lazarus (Win/Linux/iOS/Android) лучше чем графический движок рендеринга GLScene ничего нет - в нём также есть своя физика, вейвлеты, менеджеры подключения сторонних звуковых и физических движков (BASS, OpenAL, Newton). Версия GLXcene объединит возможности Firemonkey для 3д моделирования и визуализации с имеющимися для Vcl версии.
Имеющие опыт создания компонентов под FMX, приглашаются принять участие в дальнейшей разработке графической платформы на гитхаб
https://github.com/GLScene/GLScene
Да, можно, пример использования OpenGL
в FireMonkey есть по адресу https://github.com/tothpaul/Delphi.
Там в демосе CubeMan3D используется модуль Execute.CrossGL.pas с реализацией кросс-платформенного
контекста для Windows, MacOSX, Android и Linux.
Также в проекте VXScene (https://sourceforge.net/p/glscene/code/HEAD/tree/branches/VXScene/Source/Basis/)
подключен модуль VKS.OpenGLFMX для работы
с OpenGL в FireMonkey под Win32/Win64.
Да, теперь всё работает и в рантайме. Не нашел Autotranslate в инспекторе в свойствах меню, а могли бы туда и добавить, чтобы не писать в коде лишнего.
Тест исправлен.
TestTLang_Menu.rar
На данный момент (до версии RAD Studio XE5) FireMonkey не имеет компонент TImageList.
Однако, для хранения графических ресурсов отлично подходит TStyleBook. Общая идея сводится к добавлению именованных графических ресурсов в TStyleBook в контейнере TImage. Затем мы каждому TImage задаем имя через StyleName. И затем в нашем коде уже по строковому идентификатору достаем нужную картинку.
Рассмотрим теперь это на практике.
Создадим приложение, которое будет вытаскивать картинку по имени из TStyleBook и отображать его в контейнере TImage.
1. Создаем TStyleBook. Перетаскиваем его палитры компонентов (Tool Palette) в дизайнере на форму. Так же на форме я разметил кнопку и TImage для отображения выбранного изображения.
2. Открываем дизайнер стилей и добавляем компонент TImage, путем перетаскивания TImage в корень Structure Panel (панель с деревом компонентов формы).
3. В TImage загружаем картинку и называем картинку через TImage.StyleName. В моем случае изображение андроида и название - 'android'.
4. Обратите внимание, что RAD Studio XE5 поддерживает картинки разного dpi для четкой отображения на экранах с разными dpi и Экранным масштабом (Scale). На рисунке выше, я загрузил два разрешения картинки, для обычных экранов, и экранов с удвоенной плотностью пикселей. Это актуально для мобильных платформ и OSX с экранами ретина.
5. Пишем метод, который вытащить картинку по имени:
function TForm4.GetImage(const AImageName: string): TBitmap;
var
StyleObject: TFmxObject;
Image: TImage;
begin
StyleObject := ImageBook.Style.FindStyleResource(AImageName);
if (StyleObject <> nil) and (StyleObject is TImage) then
begin
Image := StyleObject as TImage;
Result := Image.Bitmap;
end
else
Result := nil;
end;
Каждый объект FireMonkey TFmxObject предоставляет способ для поиска среди дочерних объектов объект с указанными именем StyleLookup. Доступ к корню всех стилей в StyleBook является свойство TStyleBook.Style. Далее ищем у корня стиль с нужным именем картинки. Если стиля нету, то метод вернет nil. Иначе проверяем, что стиль есть и он экземпляр контейнера TImage. Далее просто выбираем картинку через свойство Bitmap.
6. Вытаскиваем картинку и отображаем ее в TImage на форме.
procedure TForm4.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
Bitmap := GetImage('android');
if Bitmap <> nil then
Image1.Bitmap.Assign(Bitmap);
end;
Вот в принципе и вся идея. Эту идею можно обобщить, сделав отдельный компонент с быстрой загрузкой картинок. Но это уже практика.