Move Material into Renderables.
PiperOrigin-RevId: 898873853 Change-Id: I3ef13e44c16334c52ea6f08dbc44fde23096ef4c
This commit is contained in:
committed by
Copybara-Service
parent
126d5b67e3
commit
b38aa0fa23
@@ -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
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_
|
||||
#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_
|
||||
|
||||
#include <cstdint>
|
||||
#include <filament/Engine.h>
|
||||
#include <filament/Scene.h>
|
||||
#include <math/mat4.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include <mujoco/mjtnum.h>
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -22,11 +22,12 @@
|
||||
#include <filament/Scene.h>
|
||||
#include <utils/EntityManager.h>
|
||||
#include <mujoco/mujoco.h>
|
||||
#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
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <filament/Engine.h>
|
||||
#include <filament/Scene.h>
|
||||
#include <utils/Entity.h>
|
||||
#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<utils::Entity> entities_;
|
||||
|
||||
@@ -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<int>(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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user