diff --git a/src/experimental/filament/filament/drawable.cc b/src/experimental/filament/filament/drawable.cc index 2db25b95..9861d032 100644 --- a/src/experimental/filament/filament/drawable.cc +++ b/src/experimental/filament/filament/drawable.cc @@ -238,10 +238,8 @@ void Drawable::SetDrawMode(Material::DrawMode mode) { renderables_.SetMaterialInstance(material_.GetMaterialInstance(mode)); } -void Drawable::UpdateReflectionTexture(const Texture* tex) { - Material::Textures textures = material_.GetTextures(); - textures.reflection = tex; - material_.UpdateTextures(textures); +Material& Drawable::GetMaterial() { + return material_; } void Drawable::SetLayerMask(std::uint8_t mask) { @@ -374,16 +372,17 @@ void Drawable::UpdateMaterial(const mjvGeom& geom, bool use_segid_color, bool enable_reflection, const mjtNum* headpos) { const mjModel* model = model_objs_->GetModel(); - float4 color = ReadFloat4(geom.rgba); + Material::Params params; + params.color = ReadFloat4(geom.rgba); if (geom.type == mjGEOM_PLANE) { if (IsBehind(headpos, geom.pos, geom.mat)) { - color[3] *= 0.3; + params.color[3] *= 0.3; renderables_.SetReceiveShadows(false); - reflective_ = false; + params.reflective = false; } else { renderables_.SetReceiveShadows(true); - reflective_ = - enable_reflection && geom.reflectance > 0 && color.a == 1.0f; + params.reflective = + enable_reflection && geom.reflectance > 0 && params.color.a == 1.0f; } } @@ -434,34 +433,34 @@ void Drawable::UpdateMaterial(const mjvGeom& geom, bool use_segid_color, } if (textures.color == nullptr) { - if (color.a < 1.0f) { + if (params.color.a < 1.0f) { SetNormalMaterial(ObjectManager::kPhongColorFade); - } else if (reflective_) { + } else if (params.reflective) { SetNormalMaterial(ObjectManager::kPhongColorReflect); } else { SetNormalMaterial(ObjectManager::kPhongColor); } } else if (textures.color->GetFilamentTexture()->getTarget() == filament::Texture::Sampler::SAMPLER_CUBEMAP) { - if (color.a < 1.0f) { + if (params.color.a < 1.0f) { SetNormalMaterial(ObjectManager::kPhongCubeFade); - } else if (reflective_) { + } else if (params.reflective) { SetNormalMaterial(ObjectManager::kPhongCubeReflect); } else { SetNormalMaterial(ObjectManager::kPhongCube); } } else if (has_texcoords) { - if (color.a < 1.0f) { + if (params.color.a < 1.0f) { SetNormalMaterial(ObjectManager::kPhong2dUvFade); - } else if (reflective_) { + } else if (params.reflective) { SetNormalMaterial(ObjectManager::kPhong2dUvReflect); } else { SetNormalMaterial(ObjectManager::kPhong2dUv); } } else { - if (color.a < 1.0f) { + if (params.color.a < 1.0f) { SetNormalMaterial(ObjectManager::kPhong2dFade); - } else if (reflective_) { + } else if (params.reflective) { SetNormalMaterial(ObjectManager::kPhong2dReflect); } else { SetNormalMaterial(ObjectManager::kPhong2d); @@ -470,8 +469,6 @@ void Drawable::UpdateMaterial(const mjvGeom& geom, bool use_segid_color, } } - Material::Params params; - params.color = color; params.reflectance = geom.reflectance; params.emissive = geom.emission; params.specular = geom.specular; diff --git a/src/experimental/filament/filament/drawable.h b/src/experimental/filament/filament/drawable.h index 08956903..ab0f6390 100644 --- a/src/experimental/filament/filament/drawable.h +++ b/src/experimental/filament/filament/drawable.h @@ -26,7 +26,6 @@ #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 { @@ -63,13 +62,8 @@ class Drawable { // or hide the drawable from specific passes. The default layer mask is 0x01. void SetLayerMask(std::uint8_t mask); - // Returns true if the drawable is reflective. - bool IsReflective() const { return reflective_; } - - // Sets the reflection texture for the drawable. We have a separate setter - // because we need to render the reflection texture before it can be applied - // to the material. - void UpdateReflectionTexture(const Texture* tex); + // Returns the material for the drawable. + Material& GetMaterial(); private: void AddMesh(int data_id); @@ -90,7 +84,6 @@ class Drawable { ModelObjects* model_objs_ = nullptr; ObjectManager* object_mgr_ = nullptr; Renderables renderables_; - bool reflective_ = false; filament::math::mat4 transform_; }; diff --git a/src/experimental/filament/filament/material.h b/src/experimental/filament/filament/material.h index 03d0ffb8..1f1c98b6 100644 --- a/src/experimental/filament/filament/material.h +++ b/src/experimental/filament/filament/material.h @@ -62,6 +62,7 @@ class Material { float emissive = -1.0f; float reflectance = 0.0f; bool tex_uniform = false; + bool reflective = false; }; explicit Material(filament::Engine* engine); diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index 3cd7f929..a978554b 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -194,7 +194,7 @@ void SceneView::RemoveFromScene(Light* light) { void SceneView::AddToScene(Drawable* drawable) { if (drawables_.insert(drawable).second) { drawable->AddToScene(scene_); - if (drawable->IsReflective()) { + if (drawable->GetMaterial().GetParams().reflective) { AddReflectiveDrawable(drawable); } } @@ -305,7 +305,11 @@ void SceneView::AddReflectiveDrawable(Drawable* drawable) { auto viewport = reflect_view_->getViewport(); auto& target = reflect_targets_[index]; target->Prepare(viewport.width, viewport.height); - drawable->UpdateReflectionTexture(target->GetColorTexture()); + + Material& material = drawable->GetMaterial(); + Material::Textures textures = material.GetTextures(); + textures.reflection = target->GetColorTexture(); + material.UpdateTextures(textures); } void SceneView::SetColorGradingOptions(const ColorGradingOptions& opts) {