diff --git a/src/experimental/filament/mjr_compat.cc b/src/experimental/filament/mjr_compat.cc index 9d06dea6..c3cd27e1 100644 --- a/src/experimental/filament/mjr_compat.cc +++ b/src/experimental/filament/mjr_compat.cc @@ -36,7 +36,7 @@ void mjr_freeContext(mjrContext* con) { mjrf_freeContext(con); } void mjr_render(mjrRect viewport, mjvScene* scn, const mjrContext* con) { - mjrf_render(viewport, scn, con); + mjrf_renderScene(viewport, scn, con); } void mjr_uploadMesh(const mjModel* m, const mjrContext* con, int meshid) { mjrf_uploadMesh(m, con, meshid); diff --git a/src/experimental/filament/render_context_filament.cc b/src/experimental/filament/render_context_filament.cc index ed85bc28..8c13c404 100644 --- a/src/experimental/filament/render_context_filament.cc +++ b/src/experimental/filament/render_context_filament.cc @@ -145,6 +145,14 @@ void mjr_defaultReadPixelsRequest(mjrReadPixelsRequest* request) { memset(request, 0, sizeof(mjrReadPixelsRequest)); } +mjrfContext* mjrf_createContext(const mjrFilamentConfig* config) { + return new mujoco::FilamentContext(config); +} + +void mjrf_destroyContext(mjrfContext* ctx) { + delete mujoco::FilamentContext::downcast(ctx); +} + mjrTexture* mjrf_createTexture(mjrfContext* ctx, const mjrTextureConfig* cfg) { return new mujoco::Texture(mujoco::FilamentContext::downcast(ctx), *cfg); } @@ -328,6 +336,20 @@ void mjrf_configureSceneFromModel(mjrScene* scene, const mjModel* model) { mujoco::SceneView::downcast(scene)->Configure(model); } +mjrFrameHandle mjrf_render(mjrfContext* ctx, const mjrRenderRequest* req, + int nreq, const mjrReadPixelsRequest* read_req, + int nread_req) { + return mujoco::FilamentContext::downcast(ctx)->Render( + {req, static_cast(nreq)}, + {read_req, static_cast(nread_req)}); +} + +void mjrf_waitForFrame(mjrfContext* ctx, mjrFrameHandle frame) { + mujoco::FilamentContext::downcast(ctx)->WaitForFrame(frame); +} + +// Legacy API, to be deprecated. + void mjrf_makeFilamentContext(const mjModel* m, mjrContext* con, const mjrFilamentConfig* config) { // TODO: Support multiple contexts and multiple threads. For now, we'll just @@ -361,7 +383,7 @@ void mjrf_freeContext(mjrContext* con) { mjrf_defaultContext(con); } -void mjrf_render(mjrRect viewport, mjvScene* scn, const mjrContext* con) { +void mjrf_renderScene(mjrRect viewport, mjvScene* scn, const mjrContext* con) { CheckFilamentContext(); g_filament_context->Render(viewport, scn); } diff --git a/src/experimental/filament/render_context_filament.h b/src/experimental/filament/render_context_filament.h index 73ab3b4a..04074d97 100644 --- a/src/experimental/filament/render_context_filament.h +++ b/src/experimental/filament/render_context_filament.h @@ -421,6 +421,15 @@ struct mjrFilamentConfig { bool force_software_rendering; }; +// Initializes the mjrFilamentConfig to default values. +void mjrf_defaultFilamentConfig(mjrFilamentConfig* config); + +// Creates a filament rendering context. +mjrfContext* mjrf_createContext(const mjrFilamentConfig* config); + +// Destroys the filament rendering context. +void mjrf_destroyContext(mjrfContext* ctx); + // Creates a texture for the filament renderer. mjrTexture* mjrf_createTexture(mjrfContext* ctx, const mjrTextureConfig* cfg); @@ -538,6 +547,14 @@ void mjrf_setSceneReflectionsEnabled(mjrScene* scene, bool enabled); // Configures the scene based on the parameters in the model. void mjrf_configureSceneFromModel(mjrScene* scene, const mjModel* model); +// Submits the given requests for rendering. +mjrFrameHandle mjrf_render(mjrfContext* ctx, const mjrRenderRequest* req, + int nreq, const mjrReadPixelsRequest* read_req, + int nread_req); + +// Waits for the rendering to complete for the given frame handle. +void mjrf_waitForFrame(mjrfContext* ctx, mjrFrameHandle frame); + // Legacy API, to be deprecated. void mjrf_defaultFilamentConfig(mjrFilamentConfig* config); @@ -551,7 +568,7 @@ void mjrf_makeContext(const mjModel* m, mjrContext* con, int fontscale); void mjrf_freeContext(mjrContext* con); -void mjrf_render(mjrRect viewport, mjvScene* scn, const mjrContext* con); +void mjrf_renderScene(mjrRect viewport, mjvScene* scn, const mjrContext* con); void mjrf_uploadMesh(const mjModel* m, const mjrContext* con, int meshid); diff --git a/src/experimental/filament/render_context_filament_cpp.h b/src/experimental/filament/render_context_filament_cpp.h index 8df24b64..d5b58ed5 100644 --- a/src/experimental/filament/render_context_filament_cpp.h +++ b/src/experimental/filament/render_context_filament_cpp.h @@ -25,6 +25,11 @@ namespace mujoco { template using UniquePtr = std::unique_ptr; +inline UniquePtr CreateContext(const mjrFilamentConfig& config) { + mjrfContext* context = mjrf_createContext(&config); + return UniquePtr(context, mjrf_destroyContext); +} + inline UniquePtr CreateTexture(mjrfContext* ctx, const mjrTextureConfig& config) { mjrTexture* texture = mjrf_createTexture(ctx, &config); diff --git a/src/experimental/platform/hal/renderer.cc b/src/experimental/platform/hal/renderer.cc index a023c54e..c7d8c75b 100644 --- a/src/experimental/platform/hal/renderer.cc +++ b/src/experimental/platform/hal/renderer.cc @@ -95,7 +95,7 @@ void Renderer::Init(const mjModel* model) { : mjGRAPHICS_API_VULKAN; mjrf_makeFilamentContext(model, &render_context_, &render_config); render_ = [&](mjrRect rect, mjvScene* scene) { - mjrf_render(rect, scene, &render_context_); + mjrf_renderScene(rect, scene, &render_context_); }; set_buffer_ = [&](int framebuffer) { mjrf_setBuffer(framebuffer, &render_context_);