Use runtime enum for the renderer backend instead of preprocessor macros.
TESTED: studio:vulkan studio:vulkan --offscreen_mode=true studio:opengl studio:opengl_egl studio:classic studio:classic --offscreen_mode=true studio:server robot_sim/frontend:debug_server pyviewer:example pyviewer:example --define=mujoco_gl=vulkan PiperOrigin-RevId: 864768322 Change-Id: I4478e0115b3807060d60d98b4ddfd63da9389aac
This commit is contained in:
committed by
Copybara-Service
parent
24e5b966c3
commit
1a2bca4986
@@ -18,21 +18,20 @@
|
||||
#include <span>
|
||||
|
||||
#include <mujoco/mujoco.h>
|
||||
#include "experimental/platform/renderer_backend.h"
|
||||
|
||||
#if defined(USE_FILAMENT_OPENGL) || defined(USE_FILAMENT_VULKAN)
|
||||
#include "experimental/filament/render_context_filament.h"
|
||||
#include "experimental/platform/plugin.h"
|
||||
#elif defined(USE_CLASSIC_OPENGL)
|
||||
#if defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
|
||||
#include <imgui.h>
|
||||
#include <backends/imgui_impl_opengl3.h>
|
||||
#else
|
||||
#error No rendering mode defined.
|
||||
#include "experimental/filament/render_context_filament.h"
|
||||
#include "experimental/platform/plugin.h"
|
||||
#endif
|
||||
|
||||
namespace mujoco::platform {
|
||||
|
||||
Renderer::Renderer(void* native_window) : native_window_(native_window) {
|
||||
#ifdef USE_CLASSIC_OPENGL
|
||||
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
|
||||
ImGui_ImplOpenGL3_Init();
|
||||
#endif
|
||||
}
|
||||
@@ -44,16 +43,18 @@ void Renderer::Init(const mjModel* model) {
|
||||
if (model) {
|
||||
mjr_defaultContext(&render_context_);
|
||||
|
||||
#if defined(USE_CLASSIC_OPENGL)
|
||||
#if defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
|
||||
mjr_makeContext(model, &render_context_, mjFONTSCALE_150);
|
||||
#else
|
||||
mjrFilamentConfig render_config;
|
||||
mjr_defaultFilamentConfig(&render_config);
|
||||
render_config.native_window = native_window_;
|
||||
render_config.enable_gui = true;
|
||||
#if defined(USE_FILAMENT_OPENGL)
|
||||
#if defined(MUJOCO_RENDERER_FILAMENT_OPENGL)
|
||||
render_config.graphics_api = mjGFX_OPENGL;
|
||||
#elif defined(USE_FILAMENT_VULKAN)
|
||||
#elif defined(MUJOCO_RENDERER_FILAMENT_OPENGL_HEADLESS)
|
||||
render_config.graphics_api = mjGFX_OPENGL;
|
||||
#elif defined(MUJOCO_RENDERER_FILAMENT_VULKAN)
|
||||
render_config.graphics_api = mjGFX_VULKAN;
|
||||
#endif
|
||||
mjr_makeFilamentContext(model, &render_context_, &render_config);
|
||||
@@ -92,7 +93,7 @@ void Renderer::Render(const mjModel* model, mjData* data,
|
||||
width * height * 3);
|
||||
}
|
||||
|
||||
#ifdef USE_CLASSIC_OPENGL
|
||||
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
|
||||
mjr_resizeOffscreen(width, height, &render_context_);
|
||||
mjr_setBuffer(mjFB_OFFSCREEN, &render_context_);
|
||||
#else
|
||||
@@ -108,7 +109,7 @@ void Renderer::Render(const mjModel* model, mjData* data,
|
||||
|
||||
// The filament backend knows how to renders the ImGui draw data. For the
|
||||
// classic backend, we need to render the ImGui draw data ourselves.
|
||||
#ifdef USE_CLASSIC_OPENGL
|
||||
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
ImGui::Render();
|
||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||
@@ -141,7 +142,7 @@ void Renderer::RenderToTexture(const mjModel* model, mjData* data,
|
||||
|
||||
int Renderer::UploadImage(int texture_id, const std::byte* pixels, int width,
|
||||
int height, int bpp) {
|
||||
#if defined(USE_CLASSIC_OPENGL)
|
||||
#if defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
|
||||
return 0;
|
||||
#else
|
||||
return mjr_uploadGuiImage(texture_id,
|
||||
@@ -153,7 +154,7 @@ int Renderer::UploadImage(int texture_id, const std::byte* pixels, int width,
|
||||
double Renderer::GetFps() { return fps_; }
|
||||
|
||||
void Renderer::UpdateFps() {
|
||||
#ifdef USE_CLASSIC_OPENGL
|
||||
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
|
||||
TimePoint now = std::chrono::steady_clock::now();
|
||||
TimePoint::duration delta_time = now - last_fps_update_;
|
||||
const double interval = std::chrono::duration<double>(delta_time).count();
|
||||
@@ -168,9 +169,25 @@ void Renderer::UpdateFps() {
|
||||
#endif
|
||||
}
|
||||
|
||||
RendererBackend Renderer::GetBackend() {
|
||||
#if defined(MUJOCO_RENDERER_FILAMENT_OPENGL_HEADLESS)
|
||||
return RendererBackend::FilamentOpenGlHeadless;
|
||||
#elif defined(MUJOCO_RENDERER_FILAMENT_OPENGL)
|
||||
return RendererBackend::FilamentOpenGl;
|
||||
#elif defined(MUJOCO_RENDERER_FILAMENT_VULKAN)
|
||||
return RendererBackend::FilamentVulkan;
|
||||
#elif defined(MUJOCO_RENDERER_FILAMENT_WEBGL)
|
||||
return RendererBackend::FilamentWebGl;
|
||||
#elif defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
|
||||
return RendererBackend::ClassicOpenGl;
|
||||
#else
|
||||
#error "Unsupported renderer backend."
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace mujoco::platform
|
||||
|
||||
#if !defined(USE_CLASSIC_OPENGL)
|
||||
#if !defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
|
||||
mjPLUGIN_LIB_INIT {
|
||||
mujoco::platform::GuiPlugin plugin;
|
||||
plugin.name = "Filament";
|
||||
|
||||
Reference in New Issue
Block a user