Use RenderableParams for creating Renderables.
PiperOrigin-RevId: 902569516 Change-Id: Id233a5ef7fe86ce5902ce2552d8d0fec6ce860b7
This commit is contained in:
committed by
Copybara-Service
parent
508e581ba9
commit
86ad41b9c2
@@ -268,8 +268,11 @@ void ImguiBridge::Update() {
|
|||||||
|
|
||||||
void ImguiBridge::PrepareRenderables(int count) {
|
void ImguiBridge::PrepareRenderables(int count) {
|
||||||
while (renderables_.size() < count) {
|
while (renderables_.size() < count) {
|
||||||
|
RenderableParams config;
|
||||||
|
DefaultRenderableParams(&config);
|
||||||
|
config.shading_model = ShadingModel::Ux;
|
||||||
auto& r = renderables_.emplace_back(
|
auto& r = renderables_.emplace_back(
|
||||||
std::make_unique<Renderable>(Renderable::Usage::Ux, object_mgr_));
|
std::make_unique<Renderable>(object_mgr_, config));
|
||||||
r->SetCastShadows(false);
|
r->SetCastShadows(false);
|
||||||
r->SetReceiveShadows(false);
|
r->SetReceiveShadows(false);
|
||||||
r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size()));
|
r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size()));
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include <filament/Engine.h>
|
#include <filament/Engine.h>
|
||||||
#include <filament/Material.h>
|
#include <filament/Material.h>
|
||||||
@@ -31,8 +30,12 @@
|
|||||||
|
|
||||||
namespace mujoco {
|
namespace mujoco {
|
||||||
|
|
||||||
Renderable::Renderable(Usage usage, ObjectManager* object_mgr)
|
void DefaultRenderableParams(RenderableParams* params) {
|
||||||
: usage_(usage), object_mgr_(object_mgr) {}
|
params->shading_model = ShadingModel::SceneObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
Renderable::Renderable(ObjectManager* object_mgr, const RenderableParams& params)
|
||||||
|
: object_mgr_(object_mgr), params_(params) {}
|
||||||
|
|
||||||
Renderable::~Renderable() noexcept {
|
Renderable::~Renderable() noexcept {
|
||||||
while (!entities_.empty()) {
|
while (!entities_.empty()) {
|
||||||
@@ -188,18 +191,19 @@ void Renderable::RemoveFromScene(filament::Scene* scene) {
|
|||||||
|
|
||||||
void Renderable::UpdateMaterial(const MaterialParams& params,
|
void Renderable::UpdateMaterial(const MaterialParams& params,
|
||||||
const MaterialTextures& textures) {
|
const MaterialTextures& textures) {
|
||||||
params_ = params;
|
material_params_ = params;
|
||||||
textures_ = textures;
|
material_textures_ = textures;
|
||||||
|
|
||||||
AssignMaterial(DrawMode::Color, GetColorMaterialType());
|
AssignMaterial(DrawMode::Color, GetColorMaterialType());
|
||||||
if (usage_ == Usage::SceneObject) {
|
if (params_.shading_model == ShadingModel::SceneObject) {
|
||||||
AssignMaterial(DrawMode::Depth, ObjectManager::kUnlitDepth);
|
AssignMaterial(DrawMode::Depth, ObjectManager::kUnlitDepth);
|
||||||
AssignMaterial(DrawMode::Segmentation, ObjectManager::kUnlitSegmentation);
|
AssignMaterial(DrawMode::Segmentation, ObjectManager::kUnlitSegmentation);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < kNumDrawModes; ++i) {
|
for (int i = 0; i < kNumDrawModes; ++i) {
|
||||||
if (instances_[i]) {
|
if (instances_[i]) {
|
||||||
UpdateMaterialInstance(instances_[i], params_, textures_, object_mgr_);
|
UpdateMaterialInstance(instances_[i], material_params_,
|
||||||
|
material_textures_, object_mgr_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetDrawMode(draw_mode_);
|
SetDrawMode(draw_mode_);
|
||||||
@@ -225,16 +229,16 @@ void Renderable::AssignMaterial(DrawMode mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const MaterialParams& Renderable::GetMaterialParams() const {
|
const MaterialParams& Renderable::GetMaterialParams() const {
|
||||||
return params_;
|
return material_params_;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MaterialTextures& Renderable::GetMaterialTextures() const {
|
const MaterialTextures& Renderable::GetMaterialTextures() const {
|
||||||
return textures_;
|
return material_textures_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderable::SetDrawMode(DrawMode mode) {
|
void Renderable::SetDrawMode(DrawMode mode) {
|
||||||
// Only SceneObjects support non-color draw modes.
|
// Only SceneObjects support non-color draw modes.
|
||||||
if (usage_ != Usage::SceneObject) {
|
if (params_.shading_model != ShadingModel::SceneObject) {
|
||||||
mode = DrawMode::Color;
|
mode = DrawMode::Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,21 +337,21 @@ void Renderable::SetWireframe(bool wireframe) {
|
|||||||
|
|
||||||
|
|
||||||
ObjectManager::MaterialType Renderable::GetColorMaterialType() const {
|
ObjectManager::MaterialType Renderable::GetColorMaterialType() const {
|
||||||
if (usage_ == Usage::DecorLines) {
|
if (params_.shading_model == ShadingModel::DecorLines) {
|
||||||
return ObjectManager::kUnlitLine;
|
return ObjectManager::kUnlitLine;
|
||||||
} else if (usage_ == Usage::Decor) {
|
} else if (params_.shading_model == ShadingModel::Decor) {
|
||||||
return ObjectManager::kUnlitSegmentation;
|
return ObjectManager::kUnlitDecor;
|
||||||
} else if (usage_ == Usage::Ux) {
|
} else if (params_.shading_model == ShadingModel::Ux) {
|
||||||
return ObjectManager::kUnlitUi;
|
return ObjectManager::kUnlitUi;
|
||||||
} else if (textures_.orm) {
|
} else if (material_textures_.orm) {
|
||||||
return ObjectManager::kPbrPacked;
|
return ObjectManager::kPbrPacked;
|
||||||
} else if (textures_.metallic) {
|
} else if (material_textures_.metallic) {
|
||||||
return ObjectManager::kPbr;
|
return ObjectManager::kPbr;
|
||||||
} else if (textures_.roughness) {
|
} else if (material_textures_.roughness) {
|
||||||
return ObjectManager::kPbr;
|
return ObjectManager::kPbr;
|
||||||
} else if (params_.metallic >= 0) {
|
} else if (material_params_.metallic >= 0) {
|
||||||
return ObjectManager::kPbr;
|
return ObjectManager::kPbr;
|
||||||
} else if (params_.roughness >= 0) {
|
} else if (material_params_.roughness >= 0) {
|
||||||
return ObjectManager::kPbr;
|
return ObjectManager::kPbr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,35 +367,35 @@ ObjectManager::MaterialType Renderable::GetColorMaterialType() const {
|
|||||||
has_texcoords = (it != attribs.end());
|
has_texcoords = (it != attribs.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (textures_.color == nullptr) {
|
if (material_textures_.color == nullptr) {
|
||||||
if (params_.color.a < 1.0f) {
|
if (material_params_.color.a < 1.0f) {
|
||||||
return ObjectManager::kPhongColorFade;
|
return ObjectManager::kPhongColorFade;
|
||||||
} else if (params_.reflective) {
|
} else if (material_params_.reflective) {
|
||||||
return ObjectManager::kPhongColorReflect;
|
return ObjectManager::kPhongColorReflect;
|
||||||
} else {
|
} else {
|
||||||
return ObjectManager::kPhongColor;
|
return ObjectManager::kPhongColor;
|
||||||
}
|
}
|
||||||
} else if (textures_.color->GetFilamentTexture()->getTarget() ==
|
} else if (material_textures_.color->GetFilamentTexture()->getTarget() ==
|
||||||
filament::Texture::Sampler::SAMPLER_CUBEMAP) {
|
filament::Texture::Sampler::SAMPLER_CUBEMAP) {
|
||||||
if (params_.color.a < 1.0f) {
|
if (material_params_.color.a < 1.0f) {
|
||||||
return ObjectManager::kPhongCubeFade;
|
return ObjectManager::kPhongCubeFade;
|
||||||
} else if (params_.reflective) {
|
} else if (material_params_.reflective) {
|
||||||
return ObjectManager::kPhongCubeReflect;
|
return ObjectManager::kPhongCubeReflect;
|
||||||
} else {
|
} else {
|
||||||
return ObjectManager::kPhongCube;
|
return ObjectManager::kPhongCube;
|
||||||
}
|
}
|
||||||
} else if (has_texcoords) {
|
} else if (has_texcoords) {
|
||||||
if (params_.color.a < 1.0f) {
|
if (material_params_.color.a < 1.0f) {
|
||||||
return ObjectManager::kPhong2dUvFade;
|
return ObjectManager::kPhong2dUvFade;
|
||||||
} else if (params_.reflective) {
|
} else if (material_params_.reflective) {
|
||||||
return ObjectManager::kPhong2dUvReflect;
|
return ObjectManager::kPhong2dUvReflect;
|
||||||
} else {
|
} else {
|
||||||
return ObjectManager::kPhong2dUv;
|
return ObjectManager::kPhong2dUv;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (params_.color.a < 1.0f) {
|
if (material_params_.color.a < 1.0f) {
|
||||||
return ObjectManager::kPhong2dFade;
|
return ObjectManager::kPhong2dFade;
|
||||||
} else if (params_.reflective) {
|
} else if (material_params_.reflective) {
|
||||||
return ObjectManager::kPhong2dReflect;
|
return ObjectManager::kPhong2dReflect;
|
||||||
} else {
|
} else {
|
||||||
return ObjectManager::kPhong2d;
|
return ObjectManager::kPhong2d;
|
||||||
|
|||||||
@@ -28,6 +28,21 @@
|
|||||||
|
|
||||||
namespace mujoco {
|
namespace mujoco {
|
||||||
|
|
||||||
|
// The shading model (material) for a Renderable.
|
||||||
|
enum class ShadingModel {
|
||||||
|
SceneObject,
|
||||||
|
Decor,
|
||||||
|
DecorLines,
|
||||||
|
Ux,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Configuration parameters for a Renderable.
|
||||||
|
struct RenderableParams {
|
||||||
|
ShadingModel shading_model;
|
||||||
|
};
|
||||||
|
|
||||||
|
void DefaultRenderableParams(RenderableParams* params);
|
||||||
|
|
||||||
// A collection of meshes and a material that, together, define an object that
|
// A collection of meshes and a material that, together, define an object that
|
||||||
// can be rendered in a scene.
|
// can be rendered in a scene.
|
||||||
//
|
//
|
||||||
@@ -38,19 +53,11 @@ namespace mujoco {
|
|||||||
// assigns the same material instance to all of them.
|
// assigns the same material instance to all of them.
|
||||||
class Renderable {
|
class Renderable {
|
||||||
public:
|
public:
|
||||||
// How the material is to be used for rendering.
|
|
||||||
enum class Usage {
|
|
||||||
SceneObject,
|
|
||||||
Decor,
|
|
||||||
DecorLines,
|
|
||||||
Ux,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Default filament values for priority and layer mask.
|
// Default filament values for priority and layer mask.
|
||||||
static constexpr std::uint8_t kDefaultPriority = 4;
|
static constexpr std::uint8_t kDefaultPriority = 4;
|
||||||
static constexpr std::uint8_t kDefaultLayerMask = 0x01;
|
static constexpr std::uint8_t kDefaultLayerMask = 0x01;
|
||||||
|
|
||||||
Renderable(Usage usage, ObjectManager* object_mgr);
|
Renderable(ObjectManager* object_mgr, const RenderableParams& params);
|
||||||
~Renderable() noexcept;
|
~Renderable() noexcept;
|
||||||
|
|
||||||
Renderable(const Renderable&) = delete;
|
Renderable(const Renderable&) = delete;
|
||||||
@@ -145,11 +152,11 @@ class Renderable {
|
|||||||
|
|
||||||
ObjectManager::MaterialType GetColorMaterialType() const;
|
ObjectManager::MaterialType GetColorMaterialType() const;
|
||||||
|
|
||||||
Usage usage_;
|
|
||||||
ObjectManager* object_mgr_;
|
ObjectManager* object_mgr_;
|
||||||
|
RenderableParams params_;
|
||||||
filament::MaterialInstance* instances_[kNumDrawModes] = {nullptr};
|
filament::MaterialInstance* instances_[kNumDrawModes] = {nullptr};
|
||||||
MaterialParams params_;
|
MaterialParams material_params_;
|
||||||
MaterialTextures textures_;
|
MaterialTextures material_textures_;
|
||||||
DrawMode draw_mode_ = DrawMode::Color;
|
DrawMode draw_mode_ = DrawMode::Color;
|
||||||
filament::Scene* assigned_scene_ = nullptr;
|
filament::Scene* assigned_scene_ = nullptr;
|
||||||
std::vector<utils::Entity> entities_;
|
std::vector<utils::Entity> entities_;
|
||||||
|
|||||||
@@ -459,14 +459,17 @@ static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom,
|
|||||||
std::unique_ptr<Renderable> CreateGeomRenderable(
|
std::unique_ptr<Renderable> CreateGeomRenderable(
|
||||||
const mjvGeom& geom, const mjvScene* scene, ObjectManager* object_mgr,
|
const mjvGeom& geom, const mjvScene* scene, ObjectManager* object_mgr,
|
||||||
ModelObjects* model_objs, const float headpos[3]) {
|
ModelObjects* model_objs, const float headpos[3]) {
|
||||||
Renderable::Usage usage = Renderable::Usage::SceneObject;
|
ShadingModel shading_model = ShadingModel::SceneObject;
|
||||||
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
|
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
|
||||||
usage = Renderable::Usage::DecorLines;
|
shading_model = ShadingModel::DecorLines;
|
||||||
} else if (geom.category == mjCAT_DECOR) {
|
} else if (geom.category == mjCAT_DECOR) {
|
||||||
usage = Renderable::Usage::Decor;
|
shading_model = ShadingModel::Decor;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto renderable = std::make_unique<Renderable>(usage, object_mgr);
|
RenderableParams config;
|
||||||
|
DefaultRenderableParams(&config);
|
||||||
|
config.shading_model = shading_model;
|
||||||
|
auto renderable = std::make_unique<Renderable>(object_mgr, config);
|
||||||
|
|
||||||
// The order of these calls is important. e.g. We need to create the filament
|
// The order of these calls is important. e.g. We need to create the filament
|
||||||
// renderable entities before we can set their transform.
|
// renderable entities before we can set their transform.
|
||||||
|
|||||||
Reference in New Issue
Block a user