Use FilamentContext for creating objects (instead of filament::Engine).

PiperOrigin-RevId: 907568857
Change-Id: If7b1b55bac9ef56dde43dc56b45c2c1034149dac
This commit is contained in:
Haroon Qureshi
2026-04-29 07:04:00 -07:00
committed by Copybara-Service
parent 9796345888
commit e745538ad6
26 changed files with 233 additions and 221 deletions
@@ -24,20 +24,20 @@
#include <math/mat3.h>
#include <math/vec3.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/scene_view.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
using filament::math::float3;
using filament::math::mat3f;
ImguiBridge::ImguiBridge(ObjectManager* object_mgr) : object_mgr_(object_mgr) {
scene_view_ = std::make_unique<SceneView>(object_mgr_->GetEngine());
ImguiBridge::ImguiBridge(FilamentContext* ctx) : ctx_(ctx) {
scene_view_ = std::make_unique<SceneView>(ctx_);
scene_view_->DisableShadows();
scene_view_->DisableReflections();
scene_view_->DisablePostProcessing();
@@ -88,7 +88,7 @@ uintptr_t ImguiBridge::UploadImage(uintptr_t tex_id, const uint8_t* pixels,
config.target = mjTEXTURE_2D;
config.format = bpp == 4 ? mjPIXEL_FORMAT_RGBA8 : mjPIXEL_FORMAT_RGB8;
config.color_space = mjCOLORSPACE_LINEAR;
texture = std::make_unique<Texture>(scene_view_->GetEngine(), config);
texture = std::make_unique<Texture>(ctx_, config);
}
// Create a copy of the image to pass it to filament as we don't know the
@@ -124,8 +124,7 @@ void ImguiBridge::CreateTexture(ImTextureData* data) {
config.color_space = mjCOLORSPACE_LINEAR;
const uintptr_t tex_id = next_tex_id_++;
textures_[tex_id] =
std::make_unique<Texture>(scene_view_->GetEngine(), config);
textures_[tex_id] = std::make_unique<Texture>(ctx_, config);
data->SetTexID((ImTextureID)tex_id);
UpdateTexture(data);
}
@@ -232,7 +231,7 @@ void ImguiBridge::Update() {
data.indices = cmds->IdxBuffer.Data;
data.index_type = mjINDEX_TYPE_U16;
data.primitive_type = mjMESH_PRIMITIVE_TYPE_TRIANGLES;
meshes_.push_back(std::make_unique<Mesh>(scene_view_->GetEngine(), data));
meshes_.push_back(std::make_unique<Mesh>(ctx_, data));
const Mesh* mesh = meshes_.back().get();
@@ -278,8 +277,8 @@ void ImguiBridge::PrepareRenderables(int count) {
mjrRenderableParams params;
mjr_defaultRenderableParams(&params);
params.shading_model = mjSHADING_MODEL_UX;
auto& r = renderables_.emplace_back(
std::make_unique<Renderable>(object_mgr_, params));
auto& r =
renderables_.emplace_back(std::make_unique<Renderable>(ctx_, params));
r->SetCastShadows(false);
r->SetReceiveShadows(false);
r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size()));
@@ -21,18 +21,18 @@
#include <vector>
#include <imgui.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/scene_view.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/filament/object_manager.h"
namespace mujoco {
// Creates and manages a SceneView using data read from ImGui.
class ImguiBridge {
public:
explicit ImguiBridge(ObjectManager* object_mgr);
explicit ImguiBridge(FilamentContext* ctx);
~ImguiBridge();
// Prepares the Renderables using data from the current ImGui state. This
@@ -59,7 +59,7 @@ class ImguiBridge {
void UpdateTexture(ImTextureData* data);
void DestroyTexture(ImTextureData* data);
ObjectManager* object_mgr_ = nullptr;
FilamentContext* ctx_ = nullptr;
std::unique_ptr<SceneView> scene_view_;
std::vector<std::unique_ptr<Renderable>> renderables_;
std::vector<std::unique_ptr<Mesh>> meshes_;
@@ -28,18 +28,17 @@
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/model_util.h"
#include "experimental/filament/filament/render_target.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
MjrFilamentRenderer::MjrFilamentRenderer(const mjrFilamentConfig* config)
: FilamentContext(config) {
MjrFilamentRenderer::MjrFilamentRenderer(const mjrFilamentConfig* config) {
filament_context_ = std::make_unique<FilamentContext>(config);
}
void MjrFilamentRenderer::Init(const mjModel* model) {
scene_bridge_ = std::make_unique<SceneBridge>(GetObjectManager(), model);
imgui_bridge_ = std::make_unique<ImguiBridge>(GetObjectManager());
scene_bridge_ = std::make_unique<SceneBridge>(filament_context_.get(), model);
imgui_bridge_ = std::make_unique<ImguiBridge>(filament_context_.get());
mjr_defaultRenderRequest(&render_requests_[0]);
mjr_defaultRenderRequest(&render_requests_[1]);
@@ -66,12 +65,12 @@ void MjrFilamentRenderer::Init(const mjModel* model) {
render_requests_[1].camera.frustum_near = 0.0f;
render_requests_[1].camera.frustum_far = 1.0f;
SetClearColor(ReadElement(model, "filament.clearColor",
filament::math::float4(0, 0, 0, 1)));
filament_context_->SetClearColor(ReadElement(
model, "filament.clearColor", filament::math::float4(0, 0, 0, 1)));
}
void MjrFilamentRenderer::Render(const mjrRect& viewport, const mjvScene* scene) {
void MjrFilamentRenderer::Render(const mjrRect& viewport,
const mjvScene* scene) {
scene_bridge_->Update(viewport, scene);
// Update the UX renderable entity after processing the scene in case there
// are any elements in the scene which generate UX draw calls (e.g. labels).
@@ -92,7 +91,8 @@ void MjrFilamentRenderer::Render(const mjrRect& viewport, const mjvScene* scene)
render_requests_[1].width = viewport.width;
render_requests_[1].height = viewport.height;
render_requests_[0].camera = mjv_averageCamera(scene->camera, scene->camera + 1);
render_requests_[0].camera =
mjv_averageCamera(scene->camera, scene->camera + 1);
render_requests_[1].camera.frustum_center = viewport.width / 2.0f;
render_requests_[1].camera.frustum_width = viewport.width / 2.0f;
render_requests_[1].camera.frustum_bottom = viewport.height;
@@ -100,7 +100,7 @@ void MjrFilamentRenderer::Render(const mjrRect& viewport, const mjvScene* scene)
if (mode_ == FrameBufferMode::Window) {
render_requests_[0].target = nullptr;
render_requests_[1].target = nullptr;
FilamentContext::Render(render_requests_);
filament_context_->Render(render_requests_);
}
}
@@ -136,7 +136,8 @@ void MjrFilamentRenderer::ReadPixels(mjrRect viewport, unsigned char* rgb,
mjr_defaultRenderTargetConfig(&config);
config.color_format = mjPIXEL_FORMAT_RGB8;
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
auto target = std::make_unique<RenderTarget>(GetEngine(), config);
auto target =
std::make_unique<RenderTarget>(filament_context_.get(), config);
target->Prepare(viewport.width, viewport.height);
render_requests_[0].target = target.get();
render_requests_[1].target = target.get();
@@ -148,9 +149,9 @@ void MjrFilamentRenderer::ReadPixels(mjrRect viewport, unsigned char* rgb,
mjr_defaultReadPixelsRequest(&read_request);
read_request.output = rgb;
read_request.num_bytes = viewport.width * viewport.height * 3;
const mjrFrameHandle frame = FilamentContext::Render(
const mjrFrameHandle frame = filament_context_->Render(
{&render_requests_[0], num_requests}, {&read_request, 1});
FilamentContext::WaitForFrame(frame);
filament_context_->WaitForFrame(frame);
render_requests_[0].target = nullptr;
render_requests_[1].target = nullptr;
@@ -161,7 +162,8 @@ void MjrFilamentRenderer::ReadPixels(mjrRect viewport, unsigned char* rgb,
mjr_defaultRenderTargetConfig(&config);
config.color_format = mjPIXEL_FORMAT_R32F;
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
auto target = std::make_unique<RenderTarget>(GetEngine(), config);
auto target =
std::make_unique<RenderTarget>(filament_context_.get(), config);
target->Prepare(viewport.width, viewport.height);
render_requests_[0].target = target.get();
render_requests_[1].target = target.get();
@@ -173,9 +175,9 @@ void MjrFilamentRenderer::ReadPixels(mjrRect viewport, unsigned char* rgb,
mjr_defaultReadPixelsRequest(&read_request);
read_request.output = reinterpret_cast<uint8_t*>(depth);
read_request.num_bytes = viewport.width * viewport.height * sizeof(float);
const mjrFrameHandle frame =
FilamentContext::Render({&render_requests_[0], 1}, {&read_request, 1});
FilamentContext::WaitForFrame(frame);
const mjrFrameHandle frame = filament_context_->Render(
{&render_requests_[0], 1}, {&read_request, 1});
filament_context_->WaitForFrame(frame);
render_requests_[0].target = nullptr;
render_requests_[1].target = nullptr;
@@ -205,8 +207,8 @@ void MjrFilamentRenderer::UploadHeightField(const mjModel* model, int id) {
}
uintptr_t MjrFilamentRenderer::UploadGuiImage(uintptr_t tex_id,
const uint8_t* pixels, int width,
int height, int bpp) {
const uint8_t* pixels, int width,
int height, int bpp) {
return imgui_bridge_->UploadImage(tex_id, pixels, width, height, bpp);
}
@@ -29,7 +29,7 @@
namespace mujoco {
// Subclass of the FilamentContext that implements the legacy mjr API.
class MjrFilamentRenderer : public FilamentContext {
class MjrFilamentRenderer {
public:
explicit MjrFilamentRenderer(const mjrFilamentConfig* config);
~MjrFilamentRenderer() = default;
@@ -65,6 +65,10 @@ class MjrFilamentRenderer : public FilamentContext {
// Renders an ImGui window containing Filament-specific editor UI.
void UpdateGui();
double GetFrameRate() const {
return filament_context_->GetFrameRate();
}
MjrFilamentRenderer(const MjrFilamentRenderer&) = delete;
MjrFilamentRenderer& operator=(const MjrFilamentRenderer&) = delete;
@@ -75,6 +79,7 @@ class MjrFilamentRenderer : public FilamentContext {
OffScreenWithGui,
};
std::unique_ptr<FilamentContext> filament_context_;
FrameBufferMode mode_ = FrameBufferMode::Window;
mjrRenderRequest render_requests_[2];
std::unique_ptr<SceneBridge> scene_bridge_;
@@ -32,6 +32,7 @@
#include <math/vec4.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/builtins.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/model_util.h"
@@ -493,21 +494,21 @@ void UpdateSkinFlexmjrMeshData(mjrMeshData* data, const mjModel* model,
data->user_data = nullptr;
}
ModelObjects::ModelObjects(const mjModel* model, filament::Engine* engine)
: model_(model), engine_(engine) {
ModelObjects::ModelObjects(const mjModel* model, FilamentContext* ctx)
: model_(model), ctx_(ctx) {
const int nstack = model->vis.quality.numstacks;
const int nslice = model->vis.quality.numslices;
const int nquad = model->vis.quality.numquads;
shapes_[kLine] = CreateLine(engine_);
shapes_[kBox] = CreateBox(engine_, nquad);
shapes_[kLineBox] = CreateLineBox(engine_);
shapes_[kCone] = CreateCone(engine_, nstack, nslice);
shapes_[kDisk] = CreateDisk(engine_, nslice);
shapes_[kDome] = CreateDome(engine_, nstack / 2, nslice);
shapes_[kTube] = CreateTube(engine_, nstack, nslice);
shapes_[kPlane] = CreatePlane(engine_, nquad);
shapes_[kSphere] = CreateSphere(engine_, nstack, nslice);
shapes_[kTriangle] = CreateTriangle(engine_);
shapes_[kLine] = CreateLine(ctx_);
shapes_[kBox] = CreateBox(ctx_, nquad);
shapes_[kLineBox] = CreateLineBox(ctx_);
shapes_[kCone] = CreateCone(ctx_, nstack, nslice);
shapes_[kDisk] = CreateDisk(ctx_, nslice);
shapes_[kDome] = CreateDome(ctx_, nstack / 2, nslice);
shapes_[kTube] = CreateTube(ctx_, nstack, nslice);
shapes_[kPlane] = CreatePlane(ctx_, nquad);
shapes_[kSphere] = CreateSphere(ctx_, nstack, nslice);
shapes_[kTriangle] = CreateTriangle(ctx_);
for (int i = 0; i < model_->ntex; ++i) {
UploadTexture(model_, i);
@@ -545,13 +546,13 @@ void ModelObjects::UploadMesh(const mjModel* model, int id) {
mjrMeshData data;
mjr_defaultMeshData(&data);
UpdatemjrMeshData(&data, model, id, MeshType::kNormal);
meshes_[id] = std::make_unique<Mesh>(engine_, data);
meshes_[id] = std::make_unique<Mesh>(ctx_, data);
if (model->mesh_graphadr[id] >= 0) {
mjrMeshData convex_hull_data;
mjr_defaultMeshData(&convex_hull_data);
UpdatemjrMeshData(&convex_hull_data, model, id, MeshType::kConvexHull);
convex_hulls_[id] = std::make_unique<Mesh>(engine_, convex_hull_data);
convex_hulls_[id] = std::make_unique<Mesh>(ctx_, convex_hull_data);
}
}
@@ -587,7 +588,6 @@ void ModelObjects::UploadTexture(const mjModel* model, int id) {
config.format = mjPIXEL_FORMAT_KTX;
}
mjrTextureData payload;
mjr_defaultTextureData(&payload);
payload.bytes = model->tex_data + model->tex_adr[id];
@@ -597,7 +597,7 @@ void ModelObjects::UploadTexture(const mjModel* model, int id) {
payload.user_data = nullptr;
payload.release_callback = nullptr;
auto texture = std::make_unique<Texture>(engine_, config);
auto texture = std::make_unique<Texture>(ctx_, config);
texture->Upload(payload);
textures_[id] = std::move(texture);
}
@@ -615,14 +615,14 @@ void ModelObjects::UploadHeightField(const mjModel* model, int id) {
mjrMeshData data;
mjr_defaultMeshData(&data);
UpdatemjrMeshData(&data, model, id, MeshType::kHeightField);
height_fields_[id] = std::make_unique<Mesh>(engine_, data);
height_fields_[id] = std::make_unique<Mesh>(ctx_, data);
}
void ModelObjects::CreateSkinFlexMesh(const mjvScene* scene, const mjvGeom& geom) {
mjrMeshData data;
mjr_defaultMeshData(&data);
UpdateSkinFlexmjrMeshData(&data, model_, scene, geom);
dynamic_meshes_[geom.objid] = std::make_unique<Mesh>(engine_, data);
dynamic_meshes_[geom.objid] = std::make_unique<Mesh>(ctx_, data);
}
const Mesh* ModelObjects::GetMeshBuffer(int data_id) const {
@@ -19,9 +19,9 @@
#include <memory>
#include <unordered_map>
#include <filament/Engine.h>
#include <mujoco/mjmodel.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/texture.h"
@@ -30,7 +30,7 @@ namespace mujoco {
// Creates and owns various filament objects based on the mjModel.
class ModelObjects {
public:
ModelObjects(const mjModel* model, filament::Engine* engine);
ModelObjects(const mjModel* model, FilamentContext* ctx);
~ModelObjects();
enum ShapeType {
@@ -75,7 +75,7 @@ class ModelObjects {
private:
const mjModel* model_ = nullptr;
filament::Engine* engine_ = nullptr;
FilamentContext* ctx_ = nullptr;
std::array<std::unique_ptr<Mesh>, kNumShapes> shapes_;
std::unordered_map<int, std::unique_ptr<Mesh>> meshes_;
std::unordered_map<int, std::unique_ptr<Mesh>> convex_hulls_;
@@ -19,15 +19,7 @@
#include <string_view>
#include <utility>
#include <filament/ColorGrading.h>
#include <filament/IndirectLight.h>
#include <filament/LightManager.h>
#include <filament/Material.h>
#include <filament/Options.h>
#include <filament/Renderer.h>
#include <filament/RenderableManager.h>
#include <filament/RenderTarget.h>
#include <filament/Skybox.h>
#include <filament/View.h>
#include <math/TMatHelpers.h>
#include <math/mat4.h>
@@ -40,6 +32,7 @@
#include "experimental/filament/compat/model_objects.h"
#include "experimental/filament/compat/scene_geom_util.h"
#include "experimental/filament/filament/color_grading_options.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/light.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/model_util.h"
@@ -47,6 +40,7 @@
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/scene_view.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
@@ -56,12 +50,13 @@ using filament::math::mat3;
using filament::math::mat4;
static std::unique_ptr<Texture> CreateFallbackIndirectLightTexture(
ObjectManager* object_mgr, std::string_view filename = "") {
FilamentContext* ctx, std::string_view filename = "") {
if (filename.empty()) {
filename = ObjectManager::kDefaultEnvironmentLight;
}
std::unique_ptr<ObjectManager::Asset> asset = object_mgr->LoadAsset(filename);
std::unique_ptr<ObjectManager::Asset> asset =
ctx->GetObjectManager()->LoadAsset(filename);
mjrTextureConfig config;
mjr_defaultTextureConfig(&config);
@@ -71,7 +66,7 @@ static std::unique_ptr<Texture> CreateFallbackIndirectLightTexture(
config.format = mjPIXEL_FORMAT_KTX;
config.color_space = mjCOLORSPACE_AUTO;
auto texture = std::make_unique<Texture>(object_mgr->GetEngine(), config);
auto texture = std::make_unique<Texture>(ctx, config);
mjrTextureData payload;
mjr_defaultTextureData(&payload);
@@ -86,11 +81,10 @@ static std::unique_ptr<Texture> CreateFallbackIndirectLightTexture(
return texture;
}
SceneBridge::SceneBridge(ObjectManager* object_mgr, const mjModel* model)
: object_mgr_(object_mgr) {
scene_view_ = std::make_unique<SceneView>(object_mgr_->GetEngine());
model_objects_ =
std::make_unique<ModelObjects>(model, object_mgr_->GetEngine());
SceneBridge::SceneBridge(FilamentContext* ctx, const mjModel* model)
: ctx_(ctx) {
scene_view_ = std::make_unique<SceneView>(ctx_);
model_objects_ = std::make_unique<ModelObjects>(model, ctx_);
// Configure options for the normal view.
auto cg = scene_view_->GetColorGradingOptions();
@@ -203,15 +197,14 @@ void SceneBridge::SetEnvironmentLight(std::string_view filename,
fallback_ibl_.reset();
}
fallback_ibl_texture_ =
CreateFallbackIndirectLightTexture(object_mgr_, filename);
fallback_ibl_texture_ = CreateFallbackIndirectLightTexture(ctx_, filename);
mjrLightParams params;
mjr_defaultLightParams(&params);
params.type = mjLIGHT_IMAGE;
params.texture = fallback_ibl_texture_.get();
params.intensity = intensity;
fallback_ibl_ = std::make_unique<Light>(object_mgr_->GetEngine(), params);
fallback_ibl_ = std::make_unique<Light>(ctx_, params);
scene_view_->AddToScene(fallback_ibl_.get());
}
@@ -224,7 +217,6 @@ std::optional<float3> SceneBridge::ClipFromWorld(const float3& pos) const{
}
void SceneBridge::PrepareLights() {
filament::Engine* engine = object_mgr_->GetEngine();
const mjModel* model = model_objects_->GetModel();
bool has_image_based_light = false;
@@ -238,7 +230,7 @@ void SceneBridge::PrepareLights() {
params.type = mjLIGHT_IMAGE;
params.texture = model_objects_->GetTexture(model->light_texid[i]);
params.intensity = model->light_intensity[i];
auto light_obj = std::make_unique<Light>(engine, params);
auto light_obj = std::make_unique<Light>(ctx_, params);
scene_view_->AddToScene(light_obj.get());
lights_.emplace_back(std::move(light_obj));
has_image_based_light = true;
@@ -259,7 +251,7 @@ void SceneBridge::PrepareLights() {
params.spot_cone_angle = model->light_cutoff[i];
}
auto light_obj = std::make_unique<Light>(engine, params);
auto light_obj = std::make_unique<Light>(ctx_, params);
scene_view_->AddToScene(light_obj.get());
lights_.emplace_back(std::move(light_obj));
}
@@ -279,7 +271,7 @@ void SceneBridge::PrepareLights() {
params.cast_shadows = 0;
params.intensity = 0.0f;
params.spot_cone_angle = 90.0f;
auto light_obj = std::make_unique<Light>(engine, params);
auto light_obj = std::make_unique<Light>(ctx_, params);
scene_view_->AddToScene(light_obj.get());
lights_.emplace_back(std::move(light_obj));
}
@@ -287,12 +279,11 @@ void SceneBridge::PrepareLights() {
if (!has_image_based_light && total_light_intensity > 0.0f) {
// Create a black indirect light to ensure that the skybox is
// oriented to respect mujoco's Z-up convention.
filament::Engine* engine = object_mgr_->GetEngine();
mjrLightParams params;
mjr_defaultLightParams(&params);
params.type = mjLIGHT_IMAGE;
params.intensity = 10.0f;
fallback_ibl_ = std::make_unique<Light>(engine, params);
fallback_ibl_ = std::make_unique<Light>(ctx_, params);
scene_view_->AddToScene(fallback_ibl_.get());
}
@@ -301,14 +292,14 @@ void SceneBridge::PrepareLights() {
// default environment light and set the light intensity ourselves.
if (total_light_intensity == 0.0f) {
// Create a fallback environment light.
fallback_ibl_texture_ = CreateFallbackIndirectLightTexture(object_mgr_);
fallback_ibl_texture_ = CreateFallbackIndirectLightTexture(ctx_);
mjrLightParams params;
mjr_defaultLightParams(&params);
params.type = mjLIGHT_IMAGE;
params.texture = fallback_ibl_texture_.get();
params.intensity = fallback_environment_light_intensity_;
fallback_ibl_ = std::make_unique<Light>(engine, params);
fallback_ibl_ = std::make_unique<Light>(ctx_, params);
scene_view_->AddToScene(fallback_ibl_.get());
// Distribute the fallback scene light intensity among the lights.
@@ -325,8 +316,7 @@ void SceneBridge::PrepareLights() {
scene_view_->SetSkybox(model_objects_->GetSkyboxTexture());
}
filament::math::mat4 CalculateClipFromWorld(const mjrRect& viewport,
const mjvGLCamera& cam) {
mat4 CalculateClipFromWorld(const mjrRect& viewport, const mjvGLCamera& cam) {
const float3 cam_pos(cam.pos[0], cam.pos[1], cam.pos[2]);
const float3 cam_fwd(cam.forward[0], cam.forward[1], cam.forward[2]);
const float3 cam_up(cam.up[0], cam.up[1], cam.up[2]);
@@ -394,7 +384,7 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) {
}
std::unique_ptr<Renderable> renderable = CreateGeomRenderable(
*geom, scene, object_mgr_, model_objects_.get(), headpos);
*geom, scene, ctx_, model_objects_.get(), headpos);
scene_view_->AddToScene(renderable.get());
renderables_.push_back(std::move(renderable));
@@ -25,8 +25,8 @@
#include <mujoco/mjvisualize.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/compat/model_objects.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/light.h"
#include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/scene_view.h"
#include "experimental/filament/filament/texture.h"
@@ -36,7 +36,7 @@ namespace mujoco {
// Manages all mjModel data and updates a SceneView using an mjvScene.
class SceneBridge {
public:
SceneBridge(ObjectManager* object_mgr, const mjModel* model);
SceneBridge(FilamentContext* ctx, const mjModel* model);
~SceneBridge();
// Updates the environment light using the KTX image at the given path.
@@ -68,8 +68,8 @@ class SceneBridge {
std::optional<filament::math::float3> ClipFromWorld(
const filament::math::float3& pos) const;
FilamentContext* ctx_ = nullptr;
std::unique_ptr<SceneView> scene_view_;
ObjectManager* object_mgr_ = nullptr;
std::unique_ptr<ModelObjects> model_objects_;
std::unique_ptr<Light> fallback_ibl_;
std::unique_ptr<Texture> fallback_ibl_texture_;
@@ -20,9 +20,6 @@
#include <numbers>
#include <vector>
#include <filament/Material.h>
#include <filament/RenderableManager.h>
#include <filament/Texture.h>
#include <math/mat4.h>
#include <math/vec2.h>
#include <math/vec3.h>
@@ -30,9 +27,9 @@
#include <mujoco/mjvisualize.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/compat/model_objects.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
@@ -343,7 +340,6 @@ static void PrepareGeomMeshes(Renderable& renderable, const mjvGeom& geom,
static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom,
const mjvScene* scene, ModelObjects* model_objs,
ObjectManager* object_mgr,
const float headpos[3]) {
const mjModel* model = model_objs->GetModel();
@@ -491,7 +487,7 @@ static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom,
}
std::unique_ptr<Renderable> CreateGeomRenderable(
const mjvGeom& geom, const mjvScene* scene, ObjectManager* object_mgr,
const mjvGeom& geom, const mjvScene* scene, FilamentContext* ctx,
ModelObjects* model_objs, const float headpos[3]) {
mjrShadingModel shading_model = mjSHADING_MODEL_SCENE_OBJECT;
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
@@ -503,11 +499,9 @@ std::unique_ptr<Renderable> CreateGeomRenderable(
mjrRenderableParams params;
mjr_defaultRenderableParams(&params);
params.shading_model = shading_model;
auto renderable = std::make_unique<Renderable>(object_mgr, params);
auto renderable = std::make_unique<Renderable>(ctx, params);
PrepareGeomMeshes(*renderable, geom, scene, model_objs);
UpdateGeomMaterial(*renderable, geom, scene, model_objs, object_mgr, headpos);
UpdateGeomMaterial(*renderable, geom, scene, model_objs, headpos);
return renderable;
}
} // namespace mujoco
@@ -19,14 +19,14 @@
#include <mujoco/mjvisualize.h>
#include "experimental/filament/compat/model_objects.h"
#include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/renderable.h"
namespace mujoco {
// Creates a Renderable from the given mjvGeom.
std::unique_ptr<Renderable> CreateGeomRenderable(
const mjvGeom& geom, const mjvScene* scene, ObjectManager* object_mgr,
const mjvGeom& geom, const mjvScene* scene, FilamentContext* ctx,
ModelObjects* model_objs, const float headpos[3]);
} // namespace mujoco
+46 -51
View File
@@ -21,14 +21,13 @@
#include <numbers>
#include <vector>
#include <backend/DriverEnums.h>
#include <filament/Box.h>
#include <filament/Engine.h>
#include <math/vec2.h>
#include <math/vec3.h>
#include <math/vec4.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
@@ -59,13 +58,13 @@ static std::size_t NumIndicesPerSide(int num_quads_per_axis) {
return kNumIndicesPerQuad * num_quads_per_axis * num_quads_per_axis;
}
class BuiltinBuilder : mjrMeshData {
class BuiltinBuilder : public mjrMeshData {
public:
BuiltinBuilder() { mjr_defaultMeshData(this); }
virtual ~BuiltinBuilder() = default;
template <typename T, typename... Args>
static std::unique_ptr<Mesh> Create(filament::Engine* engine,
static std::unique_ptr<Mesh> Create(FilamentContext* ctx,
Args&&... args) {
auto builder = new T(std::forward<Args>(args)...);
mjrMeshData* mesh_data = builder->PrepareMeshData();
@@ -73,7 +72,7 @@ class BuiltinBuilder : mjrMeshData {
delete static_cast<BuiltinBuilder*>(user_data);
};
mesh_data->user_data = builder;
return std::make_unique<Mesh>(engine, *mesh_data);
return std::make_unique<Mesh>(ctx, *mesh_data);
}
mjrMeshData* PrepareMeshData() {
@@ -89,33 +88,29 @@ class BuiltinBuilder : mjrMeshData {
indices = indices_.data();
nindices = indices_.size();
primitive_type =
primitive_type_ == filament::backend::PrimitiveType::TRIANGLES
? mjMESH_PRIMITIVE_TYPE_TRIANGLES
: mjMESH_PRIMITIVE_TYPE_LINES;
index_type = mjINDEX_TYPE_U16;
bounds_min[0] = bounds_.getMin().x;
bounds_min[1] = bounds_.getMin().y;
bounds_min[2] = bounds_.getMin().z;
bounds_max[0] = bounds_.getMax().x;
bounds_max[1] = bounds_.getMax().y;
bounds_max[2] = bounds_.getMax().z;
return this;
}
protected:
void SetBounds(const float3& min, const float3& max) {
bounds_min[0] = min.x;
bounds_min[1] = min.y;
bounds_min[2] = min.z;
bounds_max[0] = max.x;
bounds_max[1] = max.y;
bounds_max[2] = max.z;
}
std::vector<float3> positions_;
std::vector<float4> orientations_;
std::vector<uint16_t> indices_;
filament::Box bounds_;
filament::RenderableManager::PrimitiveType primitive_type_ =
filament::RenderableManager::PrimitiveType::TRIANGLES;
};
class LineBuilder : public BuiltinBuilder {
public:
LineBuilder() {
primitive_type_ = filament::RenderableManager::PrimitiveType::LINES;
primitive_type = mjMESH_PRIMITIVE_TYPE_LINES;
positions_.reserve(2);
positions_.emplace_back(0, 0, 0);
@@ -127,7 +122,7 @@ class LineBuilder : public BuiltinBuilder {
indices_.push_back(0);
indices_.push_back(1);
bounds_.set({0, 0, 0}, {0, 0, 1});
SetBounds({0, 0, 0}, {0, 0, 1});
}
};
@@ -161,7 +156,7 @@ class PlaneBuilder : public BuiltinBuilder {
}
}
bounds_.set({-1, -1, -0.001}, {1, 1, 0.001});
SetBounds({-1, -1, -0.001}, {1, 1, 0.001});
}
};
@@ -180,14 +175,14 @@ class TriangleBuilder : public BuiltinBuilder {
indices_.emplace_back(1);
indices_.emplace_back(2);
bounds_.set({-1, -1, -0.001}, {1, 1, 0.001});
SetBounds({-1, -1, -0.001}, {1, 1, 0.001});
}
};
class LineBoxBuilder : public BuiltinBuilder {
public:
explicit LineBoxBuilder() {
primitive_type_ = filament::RenderableManager::PrimitiveType::LINES;
primitive_type = mjMESH_PRIMITIVE_TYPE_LINES;
positions_.reserve(8);
positions_.emplace_back(-1.0f, -1.0f, -1.0f);
@@ -229,7 +224,7 @@ class LineBoxBuilder : public BuiltinBuilder {
indices_.push_back(1);
indices_.push_back(5);
bounds_.set({-1, -1, -1}, {1, 1, 1});
SetBounds({-1, -1, -1}, {1, 1, 1});
}
};
@@ -277,7 +272,7 @@ class BoxBuilder : public BuiltinBuilder {
}
}
bounds_.set({-1, -1, -1}, {1, 1, 1});
SetBounds({-1, -1, -1}, {1, 1, 1});
}
private:
@@ -334,7 +329,7 @@ class TubeBuilder : public BuiltinBuilder {
}
}
bounds_.set({-1, -1, -1}, {1, 1, 1});
SetBounds({-1, -1, -1}, {1, 1, 1});
}
};
@@ -398,7 +393,7 @@ class ConeBuilder : public BuiltinBuilder {
}
}
bounds_.set({-1, -1, 0}, {1, 1, 1});
SetBounds({-1, -1, 0}, {1, 1, 1});
}
private:
@@ -440,7 +435,7 @@ class DiskBuilder : public BuiltinBuilder {
indices_.push_back(1 + next);
}
bounds_.set({-1, -1, -0.001}, {1, 1, 0.001});
SetBounds({-1, -1, -0.001}, {1, 1, 0.001});
}
};
@@ -527,7 +522,7 @@ class SphereBuilder : public BuiltinBuilder {
indices_.push_back(row_start + adjacent);
}
bounds_.set({-1, -1, -1}, {1, 1, 1});
SetBounds({-1, -1, -1}, {1, 1, 1});
}
private:
@@ -611,7 +606,7 @@ class DomeBuilder : public BuiltinBuilder {
row_start += num_slices;
}
bounds_.set({-1, -1, 0}, {1, 1, 1});
SetBounds({-1, -1, 0}, {1, 1, 1});
}
private:
@@ -622,44 +617,44 @@ class DomeBuilder : public BuiltinBuilder {
}
};
std::unique_ptr<Mesh> CreateLine(filament::Engine* engine) {
return BuiltinBuilder::Create<LineBuilder>(engine);
std::unique_ptr<Mesh> CreateLine(FilamentContext* ctx) {
return BuiltinBuilder::Create<LineBuilder>(ctx);
}
std::unique_ptr<Mesh> CreatePlane(filament::Engine* engine, int nquad) {
return BuiltinBuilder::Create<PlaneBuilder>(engine, nquad);
std::unique_ptr<Mesh> CreatePlane(FilamentContext* ctx, int nquad) {
return BuiltinBuilder::Create<PlaneBuilder>(ctx, nquad);
}
std::unique_ptr<Mesh> CreateTriangle(filament::Engine* engine) {
return BuiltinBuilder::Create<TriangleBuilder>(engine);
std::unique_ptr<Mesh> CreateTriangle(FilamentContext* ctx) {
return BuiltinBuilder::Create<TriangleBuilder>(ctx);
}
std::unique_ptr<Mesh> CreateBox(filament::Engine* engine, int nquad) {
return BuiltinBuilder::Create<BoxBuilder>(engine, nquad);
std::unique_ptr<Mesh> CreateBox(FilamentContext* ctx, int nquad) {
return BuiltinBuilder::Create<BoxBuilder>(ctx, nquad);
}
std::unique_ptr<Mesh> CreateLineBox(filament::Engine* engine) {
return BuiltinBuilder::Create<LineBoxBuilder>(engine);
std::unique_ptr<Mesh> CreateLineBox(FilamentContext* ctx) {
return BuiltinBuilder::Create<LineBoxBuilder>(ctx);
}
std::unique_ptr<Mesh> CreateSphere(filament::Engine* engine, int nstack, int nslice) {
return BuiltinBuilder::Create<SphereBuilder>(engine, nstack, nslice);
std::unique_ptr<Mesh> CreateSphere(FilamentContext* ctx, int nstack, int nslice) {
return BuiltinBuilder::Create<SphereBuilder>(ctx, nstack, nslice);
}
std::unique_ptr<Mesh> CreateTube(filament::Engine* engine, int nstack, int nslice) {
return BuiltinBuilder::Create<TubeBuilder>(engine, nstack, nslice);
std::unique_ptr<Mesh> CreateTube(FilamentContext* ctx, int nstack, int nslice) {
return BuiltinBuilder::Create<TubeBuilder>(ctx, nstack, nslice);
}
std::unique_ptr<Mesh> CreateDisk(filament::Engine* engine, int nslice) {
return BuiltinBuilder::Create<DiskBuilder>(engine, nslice);
std::unique_ptr<Mesh> CreateDisk(FilamentContext* ctx, int nslice) {
return BuiltinBuilder::Create<DiskBuilder>(ctx, nslice);
}
std::unique_ptr<Mesh> CreateDome(filament::Engine* engine, int nstack, int nslice) {
return BuiltinBuilder::Create<DomeBuilder>(engine, nstack, nslice);
std::unique_ptr<Mesh> CreateDome(FilamentContext* ctx, int nstack, int nslice) {
return BuiltinBuilder::Create<DomeBuilder>(ctx, nstack, nslice);
}
std::unique_ptr<Mesh> CreateCone(filament::Engine* engine, int nstack, int nslice) {
return BuiltinBuilder::Create<ConeBuilder>(engine, nstack, nslice);
std::unique_ptr<Mesh> CreateCone(FilamentContext* ctx, int nstack, int nslice) {
return BuiltinBuilder::Create<ConeBuilder>(ctx, nstack, nslice);
}
} // namespace mujoco
+11 -11
View File
@@ -17,22 +17,22 @@
#include <memory>
#include <filament/Engine.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/mesh.h"
// Generates buffers for built-in shapes.
namespace mujoco {
std::unique_ptr<Mesh> CreateLine(filament::Engine* engine);
std::unique_ptr<Mesh> CreatePlane(filament::Engine* engine, int nquad);
std::unique_ptr<Mesh> CreateTriangle(filament::Engine* engine);
std::unique_ptr<Mesh> CreateBox(filament::Engine* engine, int nquad);
std::unique_ptr<Mesh> CreateLineBox(filament::Engine* engine);
std::unique_ptr<Mesh> CreateSphere(filament::Engine* engine, int nstack, int nslice);
std::unique_ptr<Mesh> CreateTube(filament::Engine* engine, int nstack, int nslice);
std::unique_ptr<Mesh> CreateDisk(filament::Engine* engine, int nslice);
std::unique_ptr<Mesh> CreateDome(filament::Engine* engine, int nstack, int nslice);
std::unique_ptr<Mesh> CreateCone(filament::Engine* engine, int nstack, int nslice);
std::unique_ptr<Mesh> CreateLine(FilamentContext* ctx);
std::unique_ptr<Mesh> CreatePlane(FilamentContext* ctx, int nquad);
std::unique_ptr<Mesh> CreateTriangle(FilamentContext* ctx);
std::unique_ptr<Mesh> CreateBox(FilamentContext* ctx, int nquad);
std::unique_ptr<Mesh> CreateLineBox(FilamentContext* ctx);
std::unique_ptr<Mesh> CreateSphere(FilamentContext* ctx, int nstack, int nslice);
std::unique_ptr<Mesh> CreateTube(FilamentContext* ctx, int nstack, int nslice);
std::unique_ptr<Mesh> CreateDisk(FilamentContext* ctx, int nslice);
std::unique_ptr<Mesh> CreateDome(FilamentContext* ctx, int nstack, int nslice);
std::unique_ptr<Mesh> CreateCone(FilamentContext* ctx, int nstack, int nslice);
} // namespace mujoco
@@ -36,12 +36,16 @@
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_platform_factory.h"
#include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/render_target.h"
#include "experimental/filament/filament/scene_view.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
// Forward declarations of functions defined in scene_view.cc to prevent
// circular dependencies.
void DoRender(filament::Renderer* renderer, const mjrRenderRequest& request);
void DoReadPixels(filament::Renderer* renderer, const mjrRenderRequest& request,
const mjrReadPixelsRequest& read_request);
FilamentContext::FilamentContext(const mjrFilamentConfig* config)
: config_(*config) {
FilamentPlatformSetup setup = CreateFilamentPlatform(config_);
@@ -122,12 +126,7 @@ mjrFrameHandle FilamentContext::Render(
break;
}
if (render_began) {
SceneView::RenderRequest scene_view_request;
scene_view_request.draw_mode = request.draw_mode;
scene_view_request.viewport = {0, 0, request.width, request.height};
scene_view_request.camera = request.camera;
SceneView* scene_view = SceneView::downcast(request.scene);
scene_view->Render(renderer_, scene_view_request);
DoRender(renderer_, request);
}
} else {
if (read_requests.empty()) {
@@ -147,17 +146,8 @@ mjrFrameHandle FilamentContext::Render(
break;
}
if (render_began) {
RenderTarget* render_target = RenderTarget::downcast(request.target);
SceneView::RenderRequest scene_view_request;
scene_view_request.draw_mode = request.draw_mode;
scene_view_request.viewport = {0, 0, request.width, request.height};
scene_view_request.camera = request.camera;
scene_view_request.target = render_target;
SceneView* scene_view = SceneView::downcast(request.scene);
scene_view->Render(renderer_, scene_view_request);
render_target->ReadColorPixels(renderer_, (uint8_t*)read_request.output,
read_request.num_bytes);
DoRender(renderer_, request);
DoReadPixels(renderer_, request, read_request);
}
}
}
+3 -2
View File
@@ -25,6 +25,7 @@
#include <utils/Entity.h>
#include <utils/EntityManager.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
@@ -34,8 +35,8 @@ namespace mujoco {
using filament::math::float3;
using filament::math::mat3f;
Light::Light(filament::Engine* engine, const mjrLightParams& params)
: engine_(engine), params_(params) {
Light::Light(FilamentContext* ctx, const mjrLightParams& params)
: engine_(ctx->GetEngine()), params_(params) {
// Filament treats image-based lights (IBLs) as separate objects (i.e.
// filament::IndirectLight) and so we need to handle IBLs specially.
if (params.type == mjLIGHT_IMAGE) {
+2 -1
View File
@@ -20,6 +20,7 @@
#include <math/vec3.h>
#include <utils/Entity.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
@@ -27,7 +28,7 @@ namespace mujoco {
// Manages the filament Entities for a single mjvLight.
class Light : public mjrLight {
public:
Light(filament::Engine* engine, const mjrLightParams& params);
Light(FilamentContext* ctx, const mjrLightParams& params);
~Light() noexcept;
Light(const Light&) = delete;
+3 -2
View File
@@ -32,6 +32,7 @@
#include <math/vec3.h>
#include <math/vec4.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/render_context_filament.h"
@@ -102,8 +103,8 @@ int FillSequence(std::byte* buffer, std::size_t num_bytes) {
return num;
}
Mesh::Mesh(filament::Engine* engine, const mjrMeshData& data)
: engine_(engine), shared_state_(std::make_shared<SharedState>()) {
Mesh::Mesh(FilamentContext* ctx, const mjrMeshData& data)
: engine_(ctx->GetEngine()), shared_state_(std::make_shared<SharedState>()) {
type_ = data.primitive_type == mjMESH_PRIMITIVE_TYPE_TRIANGLES
? filament::RenderableManager::PrimitiveType::TRIANGLES
: filament::RenderableManager::PrimitiveType::LINES;
+2 -1
View File
@@ -29,6 +29,7 @@
#include <filament/RenderableManager.h>
#include <filament/VertexBuffer.h>
#include <math/vec4.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/render_context_filament.h"
// Functions for creating filament vertex and index buffers.
@@ -38,7 +39,7 @@ namespace mujoco {
class Mesh : public mjrMesh {
public:
// Creates a Mesh from the given MeshData.
Mesh(filament::Engine* engine, const mjrMeshData& data);
Mesh(FilamentContext* ctx, const mjrMeshData& data);
~Mesh();
@@ -27,7 +27,6 @@
#include <filament/Skybox.h>
#include <filament/Texture.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/texture.h"
#include "user/user_resource.h"
namespace mujoco {
@@ -26,13 +26,15 @@
#include <filament/RenderTarget.h>
#include <filament/Texture.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
RenderTarget::RenderTarget(filament::Engine* engine,
RenderTarget::RenderTarget(FilamentContext* ctx,
const mjrRenderTargetConfig& config)
: engine_(engine), config_(config) {}
: ctx_(ctx), config_(config) {}
RenderTarget::~RenderTarget() noexcept {
Destroy();
@@ -56,7 +58,7 @@ void RenderTarget::Prepare(int width, int height) {
color_config.color_space = mjCOLORSPACE_LINEAR;
color_config.format = mjPIXEL_FORMAT_RGB8;
color_flags.color_attachment = true;
color_texture_ = std::make_unique<Texture>(engine_, color_config, color_flags);
color_texture_ = std::make_unique<Texture>(ctx_, color_config, color_flags);
mjrTextureConfig depth_config;
mjr_defaultTextureConfig(&depth_config);
@@ -68,14 +70,14 @@ void RenderTarget::Prepare(int width, int height) {
depth_config.color_space = mjCOLORSPACE_LINEAR;
depth_config.format = mjPIXEL_FORMAT_DEPTH32F;
depth_flags.depth_attachment = true;
depth_texture_ = std::make_unique<Texture>(engine_, depth_config, depth_flags);
depth_texture_ = std::make_unique<Texture>(ctx_, depth_config, depth_flags);
filament::RenderTarget::Builder builder;
builder.texture(filament::RenderTarget::AttachmentPoint::COLOR,
color_texture_->GetFilamentTexture());
builder.texture(filament::RenderTarget::AttachmentPoint::DEPTH,
depth_texture_->GetFilamentTexture());
render_target_ = builder.build(*engine_);
render_target_ = builder.build(*ctx_->GetEngine());
}
void RenderTarget::ReadColorPixels(filament::Renderer* renderer, uint8_t* bytes,
@@ -109,7 +111,7 @@ void RenderTarget::ReadColorPixels(filament::Renderer* renderer, uint8_t* bytes,
void RenderTarget::Destroy() {
if (render_target_) {
engine_->destroy(render_target_);
ctx_->GetEngine()->destroy(render_target_);
render_target_ = nullptr;
}
color_texture_.reset();
@@ -21,6 +21,7 @@
#include <filament/Engine.h>
#include <filament/Texture.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/texture.h"
#include "experimental/filament/render_context_filament.h"
@@ -31,7 +32,7 @@ class RenderTarget : public mjrRenderTarget {
public:
// Defines the types of textures to create for the color and depth
// attachments.
RenderTarget(filament::Engine* engine, const mjrRenderTargetConfig& config);
RenderTarget(FilamentContext* ctx, const mjrRenderTargetConfig& config);
~RenderTarget() noexcept;
RenderTarget(const RenderTarget&) = delete;
@@ -64,7 +65,7 @@ class RenderTarget : public mjrRenderTarget {
private:
void Destroy();
filament::Engine* engine_ = nullptr;
FilamentContext* ctx_ = nullptr;
mjrRenderTargetConfig config_;
filament::RenderTarget* render_target_ = nullptr;
std::unique_ptr<Texture> color_texture_ = nullptr;
@@ -26,6 +26,7 @@
#include <math/mat4.h>
#include <utils/EntityManager.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/mesh.h"
@@ -37,8 +38,8 @@ namespace mujoco {
using filament::math::mat4f;
Renderable::Renderable(ObjectManager* object_mgr, const mjrRenderableParams& params)
: object_mgr_(object_mgr), params_(params) {
Renderable::Renderable(FilamentContext* ctx, const mjrRenderableParams& params)
: object_mgr_(ctx->GetObjectManager()), params_(params) {
mjr_defaultMaterialParams(&material_params_);
mjr_defaultMaterialTextures(&material_textures_);
}
@@ -24,7 +24,7 @@
#include <filament/Scene.h>
#include <math/mat4.h>
#include <utils/Entity.h>
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/object_manager.h"
@@ -52,7 +52,7 @@ class Renderable : public mjrRenderable {
static constexpr std::uint8_t kDefaultPriority = 4;
static constexpr std::uint8_t kDefaultLayerMask = 0x01;
Renderable(ObjectManager* object_mgr, const mjrRenderableParams& params);
Renderable(FilamentContext* ctx, const mjrRenderableParams& params);
~Renderable() noexcept;
Renderable(const Renderable&) = delete;
@@ -40,6 +40,7 @@
#include <utils/EntityManager.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/color_grading_options.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/light.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/render_target.h"
@@ -120,7 +121,8 @@ static void SetupReflectionCamera(const mat4& surface_xform,
reflection_camera->setCustomProjection(oblique, near, far);
}
SceneView::SceneView(filament::Engine* engine) : engine_(engine) {
SceneView::SceneView(FilamentContext* ctx) : ctx_(ctx) {
filament::Engine* engine = ctx_->GetEngine();
scene_ = engine->createScene();
camera_ = engine->createCamera(utils::EntityManager::get().create());
reflect_camera_ = engine->createCamera(utils::EntityManager::get().create());
@@ -153,9 +155,10 @@ SceneView::SceneView(filament::Engine* engine) : engine_(engine) {
}
SceneView::~SceneView() {
filament::Engine* engine = ctx_->GetEngine();
if (skybox_) {
scene_->setSkybox(nullptr);
engine_->destroy(skybox_);
engine->destroy(skybox_);
}
for (auto& light : lights_) {
light->RemoveFromScene(scene_);
@@ -166,15 +169,15 @@ SceneView::~SceneView() {
lights_.clear();
renderables_.clear();
reflect_targets_.clear();
engine_->destroyCameraComponent(reflect_camera_->getEntity());
engine_->destroy(reflect_view_);
engine_->destroyCameraComponent(camera_->getEntity());
engine->destroyCameraComponent(reflect_camera_->getEntity());
engine->destroy(reflect_view_);
engine->destroyCameraComponent(camera_->getEntity());
if (color_grading_) {
engine_->destroy(color_grading_);
engine->destroy(color_grading_);
}
engine_->destroy(scene_);
engine->destroy(scene_);
for (auto& view : views_) {
engine_->destroy(view);
engine->destroy(view);
}
}
@@ -212,13 +215,13 @@ void SceneView::RemoveFromScene(Renderable* renderable) {
void SceneView::SetSkybox(const Texture* skybox_texture) {
if (skybox_) {
scene_->setSkybox(nullptr);
engine_->destroy(skybox_);
GetEngine()->destroy(skybox_);
skybox_ = nullptr;
}
if (skybox_texture) {
filament::Skybox::Builder builder;
builder.environment(skybox_texture->GetFilamentTexture());
skybox_ = builder.build(*engine_);
skybox_ = builder.build(*GetEngine());
scene_->setSkybox(skybox_);
}
}
@@ -292,7 +295,7 @@ void SceneView::AddReflectiveRenderable(Renderable* renderable) {
config.color_format = mjPIXEL_FORMAT_RGBA8;
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
reflect_targets_.push_back(std::make_unique<RenderTarget>(engine_, config));
reflect_targets_.push_back(std::make_unique<RenderTarget>(ctx_, config));
}
// Prepare a render target for the reflective renderable.
@@ -311,10 +314,10 @@ void SceneView::SetColorGradingOptions(const ColorGradingOptions& opts) {
auto tone_mapper = CreateToneMapper(opts.tone_mapper);
auto color_grading = ToBuilder(color_grading_options_)
.toneMapper(tone_mapper.get())
.build(*engine_);
.build(*GetEngine());
views_[mjDRAW_MODE_COLOR]->setColorGrading(color_grading);
if (color_grading_) {
engine_->destroy(color_grading_);
GetEngine()->destroy(color_grading_);
}
color_grading_ = color_grading;
color_grading_options_ = opts;
@@ -364,4 +367,29 @@ ColorGradingOptions SceneView::GetColorGradingOptions() const {
return color_grading_options_;
}
void DoRender(filament::Renderer* renderer, const mjrRenderRequest& request) {
SceneView::RenderRequest scene_view_request;
scene_view_request.draw_mode = request.draw_mode;
scene_view_request.viewport = {0, 0, request.width, request.height};
scene_view_request.camera = request.camera;
SceneView* scene_view = SceneView::downcast(request.scene);
scene_view->Render(renderer, scene_view_request);
}
void DoReadPixels(filament::Renderer* renderer,
const mjrRenderRequest& request,
const mjrReadPixelsRequest& read_request) {
RenderTarget* render_target = RenderTarget::downcast(request.target);
SceneView::RenderRequest scene_view_request;
scene_view_request.draw_mode = request.draw_mode;
scene_view_request.viewport = {0, 0, request.width, request.height};
scene_view_request.camera = request.camera;
scene_view_request.target = render_target;
SceneView* scene_view = SceneView::downcast(request.scene);
scene_view->Render(renderer, scene_view_request);
render_target->ReadColorPixels(renderer, (uint8_t*)read_request.output,
read_request.num_bytes);
}
} // namespace mujoco
@@ -27,6 +27,7 @@
#include <filament/View.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/color_grading_options.h"
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/light.h"
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/render_target.h"
@@ -42,7 +43,7 @@ namespace mujoco {
// (e.g. normal, depth, segmentation, etc.) as well as reflective surfaces.
class SceneView : public mjrScene {
public:
SceneView(filament::Engine* engine);
explicit SceneView(FilamentContext* ctx);
~SceneView();
SceneView(const SceneView&) = delete;
@@ -71,7 +72,7 @@ class SceneView : public mjrScene {
void Render(filament::Renderer* renderer, const RenderRequest& request);
// Returns the filament Engine managing the scene.
filament::Engine* GetEngine() const { return engine_; }
filament::Engine* GetEngine() const { return ctx_->GetEngine(); }
// Enables/disables shadows for the default render view.
void EnableShadows();
@@ -105,7 +106,7 @@ class SceneView : public mjrScene {
// rendered in their own passes to create the reflective texture.
void AddReflectiveRenderable(Renderable* renderable);
filament::Engine* engine_ = nullptr;
FilamentContext* ctx_ = nullptr;
filament::Scene* scene_ = nullptr;
filament::Camera* camera_ = nullptr;
filament::ColorGrading* color_grading_ = nullptr;
@@ -24,6 +24,8 @@
#include <image/Ktx1Bundle.h>
#include <ktxreader/Ktx1Reader.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/render_context_filament.h"
namespace mujoco {
@@ -110,9 +112,9 @@ static filament::Texture::InternalFormat GetTextureInternalFormat(
}
}
Texture::Texture(filament::Engine* engine, const mjrTextureConfig& config,
Texture::Texture(FilamentContext* ctx, const mjrTextureConfig& config,
InternalFlags flags)
: engine_(engine), config_(config) {
: engine_(ctx->GetEngine()), config_(config) {
if (IsCompressed(config_)) {
// We defer creation of compressed textures until Upload() is called. In
// the meantime, we don't really know anything about the texture (e.g.
+2 -3
View File
@@ -18,8 +18,7 @@
#include <filament/Engine.h>
#include <filament/Texture.h>
#include <math/vec3.h>
#include <mujoco/mjmodel.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/render_context_filament.h"
// Functions for creating filament textures.
@@ -36,7 +35,7 @@ class Texture : public mjrTexture {
};
// Creates a texture with the given data.
Texture(filament::Engine* engine, const mjrTextureConfig& config,
Texture(FilamentContext* ctx, const mjrTextureConfig& config,
InternalFlags flags = InternalFlags());
~Texture();