diff --git a/src/experimental/filament/filament/drawable.cc b/src/experimental/filament/filament/drawable.cc index fd1abe88..1f90f5e1 100644 --- a/src/experimental/filament/filament/drawable.cc +++ b/src/experimental/filament/filament/drawable.cc @@ -35,6 +35,7 @@ #include "experimental/filament/filament/mesh.h" #include "experimental/filament/filament/model_objects.h" #include "experimental/filament/filament/object_manager.h" +#include "experimental/filament/filament/renderables.h" #include "experimental/filament/filament/texture.h" namespace mujoco { @@ -87,8 +88,7 @@ static bool IsBehind(const float* headpos, const float* pos, const float* mat) { Drawable::Drawable(ModelObjects* model_objects, const mjvScene* scene, const mjvGeom& geom) - : material_(model_objects->GetEngine()), - renderables_(model_objects->GetEngine()) { + : renderables_(model_objects->GetEngine()) { if (geom.category == mjCAT_DECOR) { renderables_.SetCastShadows(false); renderables_.SetReceiveShadows(false); @@ -201,26 +201,6 @@ void Drawable::AddShape(ModelObjects* model_objs, renderables_.Append(mesh); } -void Drawable::AddToScene(filament::Scene* scene) { - renderables_.AddToScene(scene); -} - -void Drawable::RemoveFromScene(filament::Scene* scene) { - renderables_.RemoveFromScene(scene); -} - -void Drawable::SetDrawMode(Material::DrawMode mode) { - renderables_.SetMaterialInstance(material_.GetMaterialInstance(mode)); -} - -Material& Drawable::GetMaterial() { - return material_; -} - -void Drawable::SetLayerMask(std::uint8_t mask) { - renderables_.SetLayerMask(mask); -} - void Drawable::SetTransform(const mjvGeom& geom) { // Flex and skin geometries are in global space. if (geom.type == mjGEOM_FLEX || geom.type == mjGEOM_SKIN) { @@ -371,7 +351,7 @@ void Drawable::UpdateMaterial(const mjModel* model, const mjvGeom& geom, model_objs->GetTexture(geom.matid, mjTEXROLE_ROUGHNESS); textures.occlusion = model_objs->GetTexture(geom.matid, mjTEXROLE_OCCLUSION); - material_.UpdateTextures(textures); + GetMaterial().UpdateTextures(textures); } if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) { @@ -543,6 +523,6 @@ void Drawable::UpdateMaterial(const mjModel* model, const mjvGeom& geom, params.specular *= model_objs->GetSpecularMultiplier(); params.glossiness *= model_objs->GetShininessMultiplier(); - material_.UpdateParams(params); + GetMaterial().UpdateParams(params); } } // namespace mujoco diff --git a/src/experimental/filament/filament/drawable.h b/src/experimental/filament/filament/drawable.h index be830304..b28ef5c3 100644 --- a/src/experimental/filament/filament/drawable.h +++ b/src/experimental/filament/filament/drawable.h @@ -15,9 +15,6 @@ #ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_ #define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_ -#include -#include -#include #include #include #include @@ -39,13 +36,6 @@ class Drawable { Drawable(const Drawable&) = delete; Drawable& operator=(const Drawable&) = delete; - // Adds the Drawable to the given filament Scene. Note that a Drawable can - // only be assigned to a single Scene at any given time. - void AddToScene(filament::Scene* scene); - - // Removes the Drawable from the given filament Scene. - void RemoveFromScene(filament::Scene* scene); - // Updates the transform of the drawable for rendering. void SetTransform(const mjvGeom& geom); @@ -58,17 +48,11 @@ class Drawable { // Returns the transform of the drawable. const filament::math::mat4& GetTransform() const { return transform_; } - // Swaps the MaterialInstance that will be used to render the Drawable (e.g. - // normal, depth, segmentation, etc.). This must be called before the filament - // beginFrame/endFrame. - void SetDrawMode(Material::DrawMode mode); - - // Sets the layer mask for all managed entities. This can be used to show - // or hide the drawable from specific passes. The default layer mask is 0x01. - void SetLayerMask(std::uint8_t mask); + // Returns the renderables for the drawable. + Renderables& GetRenderables() { return renderables_; } // Returns the material for the drawable. - Material& GetMaterial(); + Material& GetMaterial() { return renderables_.GetMaterial(); } private: void AddMesh(ModelObjects* model_objs, int data_id); @@ -77,7 +61,6 @@ class Drawable { void AddHeightField(ModelObjects* model_objs, int hfield_id); void AddShape(ModelObjects* model_objs, ModelObjects::ShapeType shape_type); - Material material_; Renderables renderables_; filament::math::mat4 transform_; }; diff --git a/src/experimental/filament/filament/material.h b/src/experimental/filament/filament/material.h index 1f1c98b6..72024aa9 100644 --- a/src/experimental/filament/filament/material.h +++ b/src/experimental/filament/filament/material.h @@ -94,6 +94,9 @@ class Material { return instances_[mode]; } + // Returns the filament Engine managing the material. + filament::Engine* GetEngine() const { return engine_; } + private: // Updates the material instances based on the currently set parameters and // textures. diff --git a/src/experimental/filament/filament/renderables.cc b/src/experimental/filament/filament/renderables.cc index 19f530de..fa66a5bf 100644 --- a/src/experimental/filament/filament/renderables.cc +++ b/src/experimental/filament/filament/renderables.cc @@ -22,11 +22,12 @@ #include #include #include +#include "experimental/filament/filament/material.h" #include "experimental/filament/filament/mesh.h" namespace mujoco { -Renderables::Renderables(filament::Engine* engine) : engine_(engine) {} +Renderables::Renderables(filament::Engine* engine) : material_(engine) {} Renderables::~Renderables() noexcept { while (!entities_.empty()) { @@ -46,7 +47,7 @@ void Renderables::RemoveLast() { assigned_scene_->remove(entity); } - engine_->destroy(entity); + GetEngine()->destroy(entity); em.destroy(entity); entities_.pop_back(); meshes_.pop_back(); @@ -114,7 +115,7 @@ utils::Entity Renderables::CreateEntity(const Mesh* mesh) { builder.priority(priority_); builder.screenSpaceContactShadows(true);; - builder.build(*engine_, entity); + builder.build(*GetEngine(), entity); if (assigned_scene_) { assigned_scene_->addEntity(entity); } @@ -132,13 +133,14 @@ void Renderables::UpdateEntity(utils::Entity entity, const Mesh* mesh) { mju_error("Invalid (null) index buffer."); } - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); rm.setGeometryAt(rm.getInstance(entity), 0, mesh->GetPrimitiveType(), vertex_buffer, index_buffer, 0, index_buffer->getIndexCount()); } -void Renderables::UpdateMeshes(int index, const Mesh* mesh, MeshPtr owned_mesh) { +void Renderables::UpdateMeshes(int index, const Mesh* mesh, + MeshPtr owned_mesh) { if (index < 0 || index >= meshes_.size()) { mju_error("Invalid index %d for renderable.", index); } @@ -173,7 +175,7 @@ void Renderables::RemoveFromScene(filament::Scene* scene) { void Renderables::SetMaterialInstance( filament::MaterialInstance* instance) { if (instance != material_instance_) { - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (utils::Entity& entity : entities_) { filament::RenderableManager::Instance ri = rm.getInstance(entity); rm.setMaterialInstanceAt(ri, 0, instance); @@ -186,7 +188,7 @@ void Renderables::SetLayerMask(std::uint8_t mask) { if (mask != layer_mask_) { layer_mask_ = mask; - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (utils::Entity& entity : entities_) { rm.setLayerMask(rm.getInstance(entity), 0xff, layer_mask_); } @@ -197,7 +199,7 @@ void Renderables::SetPriority(std::uint8_t priority) { if (priority != priority_) { priority_ = priority; - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (utils::Entity& entity : entities_) { rm.setPriority(rm.getInstance(entity), priority_); } @@ -208,7 +210,7 @@ void Renderables::SetCastShadows(bool cast_shadows) { if (cast_shadows_ != cast_shadows) { cast_shadows_ = cast_shadows; - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (utils::Entity& entity : entities_) { rm.setCastShadows(rm.getInstance(entity), cast_shadows_); } @@ -219,7 +221,7 @@ void Renderables::SetReceiveShadows(bool receive_shadows) { if (receive_shadows_ != receive_shadows) { receive_shadows_ = receive_shadows; - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (utils::Entity& entity : entities_) { rm.setReceiveShadows(rm.getInstance(entity), receive_shadows_); } @@ -233,7 +235,7 @@ void Renderables::SetWireframe(bool wireframe) { if (wireframe != wireframe_) { wireframe_ = wireframe; - filament::RenderableManager& rm = engine_->getRenderableManager(); + filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (int i = 0; i < entities_.size(); ++i) { utils::Entity& entity = entities_[i]; const Mesh* mesh = meshes_[i].mesh; @@ -247,4 +249,10 @@ void Renderables::SetWireframe(bool wireframe) { } } +Material& Renderables::GetMaterial() { return material_; } + +filament::Engine* Renderables::GetEngine() { + return material_.GetEngine(); +} + } // namespace mujoco diff --git a/src/experimental/filament/filament/renderables.h b/src/experimental/filament/filament/renderables.h index 28bca459..9daa544c 100644 --- a/src/experimental/filament/filament/renderables.h +++ b/src/experimental/filament/filament/renderables.h @@ -21,6 +21,7 @@ #include #include #include +#include "experimental/filament/filament/material.h" #include "experimental/filament/filament/mesh.h" namespace mujoco { @@ -79,8 +80,11 @@ class Renderables { // Sets the material instance for all managed entities. void SetMaterialInstance(filament::MaterialInstance* material_instance); - // Returns the filament Engine managing the entities in this collection. - filament::Engine* GetEngine() { return engine_; } + // Returns the material for the renderables. + Material& GetMaterial(); + + // Returns the filament Engine managing the renderables. + filament::Engine* GetEngine(); private: utils::Entity CreateEntity(const Mesh* mesh); @@ -92,7 +96,7 @@ class Renderables { const Mesh* mesh = nullptr; }; - filament::Engine* engine_ = nullptr; + Material material_; filament::Scene* assigned_scene_ = nullptr; filament::MaterialInstance* material_instance_ = nullptr; std::vector entities_; diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index a978554b..5877d831 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -45,6 +45,7 @@ #include "experimental/filament/filament/material.h" #include "experimental/filament/filament/math_util.h" #include "experimental/filament/filament/render_target.h" +#include "experimental/filament/filament/renderables.h" #include "experimental/filament/filament/texture.h" namespace mujoco { @@ -162,7 +163,7 @@ SceneView::~SceneView() { light->RemoveFromScene(scene_); } for (auto& drawable : drawables_) { - drawable->RemoveFromScene(scene_); + drawable->GetRenderables().RemoveFromScene(scene_); } lights_.clear(); drawables_.clear(); @@ -193,7 +194,7 @@ void SceneView::RemoveFromScene(Light* light) { void SceneView::AddToScene(Drawable* drawable) { if (drawables_.insert(drawable).second) { - drawable->AddToScene(scene_); + drawable->GetRenderables().AddToScene(scene_); if (drawable->GetMaterial().GetParams().reflective) { AddReflectiveDrawable(drawable); } @@ -206,7 +207,7 @@ void SceneView::RemoveFromScene(Drawable* drawable) { if (it != reflectives_.end()) { reflectives_.erase(it); } - drawable->RemoveFromScene(scene_); + drawable->GetRenderables().RemoveFromScene(scene_); } } @@ -246,7 +247,10 @@ void SceneView::Render(filament::Renderer* renderer, SetupCamera(request.camera, viewport, camera_); for (auto& iter : drawables_) { - iter->SetDrawMode(request.draw_mode); + Material& material = iter->GetMaterial(); + Renderables& renderables = iter->GetRenderables(); + renderables.SetMaterialInstance( + material.GetMaterialInstance(request.draw_mode)); } filament::View* view = views_[static_cast(request.draw_mode)]; @@ -268,7 +272,7 @@ void SceneView::Render(filament::Renderer* renderer, SetupReflectionCamera(drawable->GetTransform(), camera_, reflect_camera_); // Hide reflective surface from its own reflection pass. - drawable->SetLayerMask(0x00); + drawable->GetRenderables().SetLayerMask(0x00); // Render the reflection to its render target. reflect_view_->setRenderTarget( @@ -276,7 +280,7 @@ void SceneView::Render(filament::Renderer* renderer, renderer->render(reflect_view_); // Unhide the reflective surface. - drawable->SetLayerMask(0x01); + drawable->GetRenderables().SetLayerMask(0x01); } }