diff --git a/src/experimental/filament/filament/material.cc b/src/experimental/filament/filament/material.cc index edf205ca..c62733b9 100644 --- a/src/experimental/filament/filament/material.cc +++ b/src/experimental/filament/filament/material.cc @@ -24,11 +24,6 @@ namespace mujoco { -// Various tweakable parameters for mapping mujoco values onto filament. -static constexpr float kSpecularMultiplier = 0.6f; -static constexpr float kShininessMultiplier = 0.1f; -static constexpr float kEmissiveMultiplier = 0.3f; - Material::Material(ObjectManager* object_mgr) : object_mgr_(object_mgr) { instances_[kDepth] = object_mgr->GetMaterial(ObjectManager::kUnlitDepth)->createInstance(); @@ -88,16 +83,16 @@ void Material::UpdateMaterialInstances() { params_.color); } if (material->hasParameter("EmissiveFactor")) { - instance->setParameter("EmissiveFactor", - params_.emissive * kEmissiveMultiplier); + const float multiplier = object_mgr_->GetEmissiveMultiplier(); + instance->setParameter("EmissiveFactor", params_.emissive * multiplier); } if (material->hasParameter("SpecularFactor")) { - instance->setParameter("SpecularFactor", - params_.specular * kSpecularMultiplier); + const float multiplier = object_mgr_->GetSpecularMultiplier(); + instance->setParameter("SpecularFactor", params_.specular * multiplier); } if (material->hasParameter("GlossinessFactor")) { - instance->setParameter("GlossinessFactor", - params_.glossiness * kShininessMultiplier); + const float multiplier = object_mgr_->GetShininessMultiplier(); + instance->setParameter("GlossinessFactor", params_.glossiness * multiplier); } if (material->hasParameter("MetallicFactor")) { instance->setParameter("MetallicFactor", diff --git a/src/experimental/filament/filament/object_manager.cc b/src/experimental/filament/filament/object_manager.cc index 20443c25..28eee711 100644 --- a/src/experimental/filament/filament/object_manager.cc +++ b/src/experimental/filament/filament/object_manager.cc @@ -129,6 +129,13 @@ ObjectManager::ObjectManager(const mjModel* model, filament::Engine* engine, fallback_textures_[mjTEXROLE_ORM] = fallback_orm_; fallback_indirect_light_ = LoadFallbackIndirectLight("ibl.ktx", 1.0f); + + specular_multiplier_ = ReadElement( + model_, "filament.phong.specular_multiplier", specular_multiplier_); + shininess_multiplier_ = ReadElement( + model_, "filament.phong.shininess_multiplier", shininess_multiplier_); + emissive_multiplier_ = ReadElement( + model_, "filament.phong.emissive_multiplier", emissive_multiplier_); } ObjectManager::~ObjectManager() { diff --git a/src/experimental/filament/filament/object_manager.h b/src/experimental/filament/filament/object_manager.h index a9aaf4d1..fd37f526 100644 --- a/src/experimental/filament/filament/object_manager.h +++ b/src/experimental/filament/filament/object_manager.h @@ -104,6 +104,10 @@ class ObjectManager { filament::IndirectLight* LoadFallbackIndirectLight(std::string_view filename, float intensity); + float GetSpecularMultiplier() const { return specular_multiplier_; } + float GetShininessMultiplier() const { return shininess_multiplier_; } + float GetEmissiveMultiplier() const { return emissive_multiplier_; } + const mjModel* GetModel() const { return model_; } ObjectManager(const ObjectManager&) = delete; @@ -129,6 +133,9 @@ class ObjectManager { filament::Texture* fallback_normal_ = nullptr; filament::Texture* fallback_orm_ = nullptr; filament::IndirectLight* fallback_indirect_light_ = nullptr; + float specular_multiplier_ = 0.6f; + float shininess_multiplier_ = 0.1f; + float emissive_multiplier_ = 0.3f; }; } // namespace mujoco