Update texture handling due to recent ImGui upgrade.
PiperOrigin-RevId: 837030453 Change-Id: I042c4a7df7dc6c7e07c40eb5f32e5031e5b1d60a
This commit is contained in:
committed by
Copybara-Service
parent
f2823836a6
commit
4ce0ee2011
@@ -17,6 +17,7 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
@@ -50,15 +51,6 @@ GuiView::GuiView(filament::Engine* engine, ObjectManager* object_mgr)
|
|||||||
view_->setPostProcessingEnabled(false);
|
view_->setPostProcessingEnabled(false);
|
||||||
|
|
||||||
material_ = object_mgr_->GetMaterial(ObjectManager::kUnlitUi);
|
material_ = object_mgr_->GetMaterial(ObjectManager::kUnlitUi);
|
||||||
|
|
||||||
// Upload the ImGui font as a texture that is sampled by the UX material.
|
|
||||||
int font_width = 0;
|
|
||||||
int font_height = 0;
|
|
||||||
int font_bpp = 0;
|
|
||||||
unsigned char* pixels = nullptr;
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
io.Fonts->GetTexDataAsRGBA32(&pixels, &font_width, &font_height, &font_bpp);
|
|
||||||
object_mgr_->UploadFont(pixels, font_width, font_height, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiView::~GuiView() {
|
GuiView::~GuiView() {
|
||||||
@@ -88,6 +80,52 @@ void GuiView::ResetRenderable() {
|
|||||||
buffers_.clear();
|
buffers_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GuiView::ProcessTexture(ImTextureData* data) {
|
||||||
|
filament::Engine* engine = object_mgr_->GetEngine();
|
||||||
|
|
||||||
|
if (data->Status == ImTextureStatus_OK) {
|
||||||
|
return;
|
||||||
|
} else if (data->Status == ImTextureStatus_WantCreate) {
|
||||||
|
if (data->Format != ImTextureFormat_RGBA32) {
|
||||||
|
mju_error("Unsupported texture format.");
|
||||||
|
}
|
||||||
|
|
||||||
|
filament::Texture* texture =
|
||||||
|
filament::Texture::Builder()
|
||||||
|
.width(data->Width)
|
||||||
|
.height(data->Height)
|
||||||
|
.levels(1)
|
||||||
|
.format(filament::Texture::InternalFormat::RGBA8)
|
||||||
|
.sampler(filament::Texture::Sampler::SAMPLER_2D)
|
||||||
|
.build(*engine);
|
||||||
|
|
||||||
|
const int size = data->Width * data->Height * 4;
|
||||||
|
filament::Texture::PixelBufferDescriptor pb(data->GetPixels(), size,
|
||||||
|
filament::Texture::Format::RGBA,
|
||||||
|
filament::Texture::Type::UBYTE);
|
||||||
|
texture->setImage(*engine, 0, std::move(pb));
|
||||||
|
|
||||||
|
data->SetTexID((ImTextureID)texture);
|
||||||
|
data->SetStatus(ImTextureStatus_OK);
|
||||||
|
} else if (data->Status == ImTextureStatus_WantUpdates) {
|
||||||
|
const int size = data->Width * data->Height * 4;
|
||||||
|
filament::Texture::PixelBufferDescriptor pb(data->GetPixels(), size,
|
||||||
|
filament::Texture::Format::RGBA,
|
||||||
|
filament::Texture::Type::UBYTE);
|
||||||
|
filament::Texture* texture = (filament::Texture*)data->TexID;
|
||||||
|
texture->setImage(*engine, 0, std::move(pb));
|
||||||
|
data->SetStatus(ImTextureStatus_OK);
|
||||||
|
} else if (data->Status == ImTextureStatus_WantDestroy &&
|
||||||
|
data->UnusedFrames > 0) {
|
||||||
|
filament::Texture* texture =
|
||||||
|
reinterpret_cast<filament::Texture*>(data->TexID);
|
||||||
|
engine->destroy(texture);
|
||||||
|
|
||||||
|
data->SetTexID(ImTextureID_Invalid);
|
||||||
|
data->SetStatus(ImTextureStatus_Destroyed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool GuiView::PrepareRenderable() {
|
bool GuiView::PrepareRenderable() {
|
||||||
ResetRenderable();
|
ResetRenderable();
|
||||||
|
|
||||||
@@ -126,6 +164,12 @@ bool GuiView::PrepareRenderable() {
|
|||||||
builder.boundingBox({{-100, -100, -100}, {100, 100, 100}});
|
builder.boundingBox({{-100, -100, -100}, {100, 100, 100}});
|
||||||
builder.culling(false);
|
builder.culling(false);
|
||||||
|
|
||||||
|
if (commands->Textures != nullptr) {
|
||||||
|
for (ImTextureData* tex : *commands->Textures) {
|
||||||
|
ProcessTexture(tex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int drawable_index = 0;
|
int drawable_index = 0;
|
||||||
for (int n = 0; n < commands->CmdListsCount; ++n) {
|
for (int n = 0; n < commands->CmdListsCount; ++n) {
|
||||||
const ImDrawList* cmds = commands->CmdLists[n];
|
const ImDrawList* cmds = commands->CmdLists[n];
|
||||||
@@ -190,7 +234,7 @@ filament::MaterialInstance* GuiView::GetMaterialInstance(int index,
|
|||||||
mjrRect rect,
|
mjrRect rect,
|
||||||
intptr_t texture_id) {
|
intptr_t texture_id) {
|
||||||
while (index >= instances_.size()) {
|
while (index >= instances_.size()) {
|
||||||
const filament::Texture* texture = object_mgr_->GetFont(texture_id);
|
const auto* texture = reinterpret_cast<filament::Texture*>(texture_id);
|
||||||
|
|
||||||
filament::TextureSampler sampler;
|
filament::TextureSampler sampler;
|
||||||
filament::MaterialInstance* instance = material_->createInstance();
|
filament::MaterialInstance* instance = material_->createInstance();
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_GUI_VIEW_H_
|
#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_GUI_VIEW_H_
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <unordered_map>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
#include <filament/Camera.h>
|
#include <filament/Camera.h>
|
||||||
#include <filament/Engine.h>
|
#include <filament/Engine.h>
|
||||||
#include <filament/Material.h>
|
#include <filament/Material.h>
|
||||||
@@ -47,6 +47,8 @@ class GuiView {
|
|||||||
filament::View* PrepareRenderView();
|
filament::View* PrepareRenderView();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void ProcessTexture(ImTextureData* data);
|
||||||
|
|
||||||
// Returns the filament::MaterialInstance configured to draw into the given
|
// Returns the filament::MaterialInstance configured to draw into the given
|
||||||
// scissor rect.
|
// scissor rect.
|
||||||
filament::MaterialInstance* GetMaterialInstance(int index, mjrRect rect,
|
filament::MaterialInstance* GetMaterialInstance(int index, mjrRect rect,
|
||||||
|
|||||||
Reference in New Issue
Block a user