Expose Drawable Material allowing users to manipulate it directly.

PiperOrigin-RevId: 897079632
Change-Id: Iec51ab30dc087562b8e6a464e122525f144e73a9
This commit is contained in:
Haroon Qureshi
2026-04-09 06:34:05 -07:00
committed by Copybara-Service
parent f6baacfa86
commit 26fb65c7a7
4 changed files with 25 additions and 30 deletions
+16 -19
View File
@@ -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;
@@ -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_;
};
@@ -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);
@@ -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) {