integrate RMLUI library
This commit is contained in:
@@ -2,12 +2,89 @@
|
||||
#include "egl_context.h"
|
||||
#include "render_target.h"
|
||||
#include "logger.h"
|
||||
#include "assets_manager.h"
|
||||
#include "aidl/com/omixlab/mosis/IMosisListener.h"
|
||||
#include <android/hardware_buffer.h>
|
||||
#include <android/asset_manager.h>
|
||||
#include <RmlUi/Core.h>
|
||||
#include "RmlUi_Renderer_GL3.h"
|
||||
#include <ranges>
|
||||
#include <span>
|
||||
|
||||
using namespace aidl::com::omixlab::mosis;
|
||||
using namespace aidl::android::hardware;
|
||||
|
||||
class AssetFilesInterface : public Rml::FileInterface
|
||||
{
|
||||
public:
|
||||
static AssetFilesInterface& Instance()
|
||||
{
|
||||
static AssetFilesInterface instance;
|
||||
return instance;
|
||||
}
|
||||
Rml::FileHandle Open(const Rml::String &path) override
|
||||
{
|
||||
AAssetManager* am = AssetsManager::Native();
|
||||
AAsset* asset = AAssetManager_open(am, path.c_str(), AASSET_MODE_BUFFER);
|
||||
return reinterpret_cast<Rml::FileHandle>(asset);
|
||||
}
|
||||
void Close(Rml::FileHandle file) override
|
||||
{
|
||||
AAsset* asset = reinterpret_cast<AAsset*>(file);
|
||||
AAsset_close(asset);
|
||||
}
|
||||
size_t Read(void *buffer, size_t size, Rml::FileHandle file) override
|
||||
{
|
||||
AAsset* asset = reinterpret_cast<AAsset*>(file);
|
||||
return AAsset_read(asset, buffer, size);
|
||||
}
|
||||
bool Seek(Rml::FileHandle file, long offset, int origin) override
|
||||
{
|
||||
AAsset* asset = reinterpret_cast<AAsset*>(file);
|
||||
off_t new_cursor = AAsset_seek(asset, offset, origin);
|
||||
return new_cursor != -1;
|
||||
}
|
||||
size_t Tell(Rml::FileHandle file) override
|
||||
{
|
||||
AAsset* asset = reinterpret_cast<AAsset*>(file);
|
||||
return AAsset_seek(asset, 0, SEEK_CUR);
|
||||
}
|
||||
|
||||
size_t Length(Rml::FileHandle file) override
|
||||
{
|
||||
AAsset* asset = reinterpret_cast<AAsset*>(file);
|
||||
return AAsset_getLength(asset);
|
||||
}
|
||||
|
||||
bool LoadFile(const Rml::String &path, Rml::String &out_data) override
|
||||
{
|
||||
AAssetManager* am = AssetsManager::Native();
|
||||
AAsset* asset = AAssetManager_open(am, path.c_str(), AASSET_MODE_BUFFER);
|
||||
if (!asset)
|
||||
return false;
|
||||
out_data.resize(AAsset_getLength(asset));
|
||||
auto data_ptr = static_cast<const char*>(AAsset_getBuffer(asset));
|
||||
std::span data = std::span(data_ptr, out_data.size());
|
||||
std::ranges::copy(data, out_data.begin());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class SystemInterface : public Rml::SystemInterface
|
||||
{
|
||||
public:
|
||||
static SystemInterface& Instance()
|
||||
{
|
||||
static SystemInterface instance;
|
||||
return instance;
|
||||
}
|
||||
bool LogMessage(Rml::Log::Type type, const Rml::String &message) override
|
||||
{
|
||||
Logger::Log(std::format("RMLUI: {}", message));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void Kernel::main_loop()
|
||||
{
|
||||
m_egl_context = std::make_unique<egl::Context>();
|
||||
@@ -30,12 +107,45 @@ void Kernel::main_loop()
|
||||
for (const auto& [pid, l] : m_listeners)
|
||||
l->onBufferAvailable(*m_aidl_buffer);
|
||||
|
||||
RenderInterface_GL3 rmlui_render_interface;
|
||||
if (!rmlui_render_interface)
|
||||
{
|
||||
Logger::Log("failed to create render interface");
|
||||
return;
|
||||
}
|
||||
Rml::SetRenderInterface(&rmlui_render_interface);
|
||||
Rml::SetFileInterface(&AssetFilesInterface::Instance());
|
||||
Rml::SetSystemInterface(&SystemInterface::Instance());
|
||||
Rml::Initialise();
|
||||
Rml::Context* context = Rml::CreateContext("default", Rml::Vector2i(1024, 1024));
|
||||
if (!context)
|
||||
{
|
||||
Logger::Log("RMLUI failed to create a context");
|
||||
Rml::Shutdown();
|
||||
return;
|
||||
}
|
||||
Rml::LoadFontFace("Roboto/static/Roboto_Condensed-Regular.ttf");
|
||||
Rml::LoadFontFace("LatoLatin-Regular.ttf");
|
||||
|
||||
// Now we are ready to load our document.
|
||||
Rml::ElementDocument* document = context->LoadDocument("demo.rml");
|
||||
document->Show();
|
||||
|
||||
while (true)
|
||||
{
|
||||
static float angle = 0.0f;
|
||||
angle += 0.1f;
|
||||
m_render_target->bind();
|
||||
glClearColor(fabs(sin(angle)), 0.0f, 0.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glViewport(0, 0, 1024, 1024);
|
||||
|
||||
context->Update();
|
||||
rmlui_render_interface.SetViewport(1024, 1024);
|
||||
rmlui_render_interface.BeginFrame();
|
||||
context->Render();
|
||||
rmlui_render_interface.EndFrame(m_render_target->framebuffer());
|
||||
|
||||
glFinish();
|
||||
{
|
||||
std::lock_guard _lock(m_mutex);
|
||||
@@ -44,6 +154,7 @@ void Kernel::main_loop()
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
}
|
||||
Rml::Shutdown();
|
||||
}
|
||||
|
||||
Kernel::Kernel(const std::shared_ptr<IMosisListener> &listener)
|
||||
|
||||
Reference in New Issue
Block a user