Add Update function to LightManager.
PiperOrigin-RevId: 931152006 Change-Id: I6fe5d4ab0dbc8032fe84fd12968666d755d1d7d5
This commit is contained in:
committed by
Copybara-Service
parent
01d5be61e3
commit
2c125dd447
@@ -74,7 +74,7 @@ static UniquePtr<mjrfTexture> CreateFallbackIndirectLightTexture(
|
|||||||
|
|
||||||
LightManager::LightManager(mjrfContext* ctx, mjrfScene* scene,
|
LightManager::LightManager(mjrfContext* ctx, mjrfScene* scene,
|
||||||
ModelObjects* model_objects)
|
ModelObjects* model_objects)
|
||||||
: ctx_(ctx), scene_(scene) {
|
: ctx_(ctx), scene_(scene), model_objects_(model_objects) {
|
||||||
const mjModel* model = model_objects->GetModel();
|
const mjModel* model = model_objects->GetModel();
|
||||||
default_shadow_map_size_ = ReadElement(
|
default_shadow_map_size_ = ReadElement(
|
||||||
model, "filament.shadows.map_size", default_shadow_map_size_);
|
model, "filament.shadows.map_size", default_shadow_map_size_);
|
||||||
@@ -89,7 +89,7 @@ LightManager::LightManager(mjrfContext* ctx, mjrfScene* scene,
|
|||||||
fallback_environment_light_intensity_ =
|
fallback_environment_light_intensity_ =
|
||||||
ReadElement(model, "filament.fallback.environment_light_intensity",
|
ReadElement(model, "filament.fallback.environment_light_intensity",
|
||||||
fallback_environment_light_intensity_);
|
fallback_environment_light_intensity_);
|
||||||
Prepare(model_objects);
|
Prepare();
|
||||||
}
|
}
|
||||||
|
|
||||||
LightManager::~LightManager() {
|
LightManager::~LightManager() {
|
||||||
@@ -103,8 +103,8 @@ LightManager::~LightManager() {
|
|||||||
fallback_ibl_.reset();
|
fallback_ibl_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LightManager::Prepare(ModelObjects* model_objects) {
|
void LightManager::Prepare() {
|
||||||
const mjModel* model = model_objects->GetModel();
|
const mjModel* model = model_objects_->GetModel();
|
||||||
|
|
||||||
bool has_image_based_light = false;
|
bool has_image_based_light = false;
|
||||||
float total_light_intensity = 0.0f;
|
float total_light_intensity = 0.0f;
|
||||||
@@ -115,7 +115,7 @@ void LightManager::Prepare(ModelObjects* model_objects) {
|
|||||||
mjrfLightParams params;
|
mjrfLightParams params;
|
||||||
mjrf_defaultLightParams(¶ms);
|
mjrf_defaultLightParams(¶ms);
|
||||||
params.type = mjLIGHT_IMAGE;
|
params.type = mjLIGHT_IMAGE;
|
||||||
params.texture = model_objects->GetTexture(model->light_texid[i]);
|
params.texture = model_objects_->GetTexture(model->light_texid[i]);
|
||||||
params.intensity = model->light_intensity[i];
|
params.intensity = model->light_intensity[i];
|
||||||
auto light_obj = CreateLight(ctx_, params);
|
auto light_obj = CreateLight(ctx_, params);
|
||||||
mjrf_addLightToScene(scene_, light_obj.get());
|
mjrf_addLightToScene(scene_, light_obj.get());
|
||||||
@@ -201,7 +201,29 @@ void LightManager::Prepare(ModelObjects* model_objects) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mjrf_setSceneSkybox(scene_, model_objects->GetSkyboxTexture());
|
mjrf_setSceneSkybox(scene_, model_objects_->GetSkyboxTexture());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LightManager::Update(const mjData* data) {
|
||||||
|
const mjModel* model = model_objects_->GetModel();
|
||||||
|
for (int i = 0; i <= model->nlight; ++i) {
|
||||||
|
// Light with index nlight is the headlight.
|
||||||
|
mjrfLight* light = lights_[i].get();
|
||||||
|
if (i == model->nlight) {
|
||||||
|
const float3 color = ReadFloat3(model->vis.headlight.diffuse);
|
||||||
|
mjrf_setLightColor(light, color.v);
|
||||||
|
mjrf_setLightEnabled(light, model->vis.headlight.active);
|
||||||
|
} else {
|
||||||
|
const float3 pos = ReadFloat3(data->light_xpos, i);
|
||||||
|
const float3 dir = ReadFloat3(data->light_xdir, i);
|
||||||
|
mjrf_setLightTransform(light, pos.v, dir.v);
|
||||||
|
|
||||||
|
const float3 color = ReadFloat3(model->light_diffuse, i);
|
||||||
|
mjrf_setLightColor(light, color.v);
|
||||||
|
|
||||||
|
mjrf_setLightEnabled(light, model->light_active[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mjrfLight* LightManager::GetLight(int index) {
|
mjrfLight* LightManager::GetLight(int index) {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <mujoco/mujoco.h>
|
||||||
#include "render/filament/mjrfilament.h"
|
#include "render/filament/mjrfilament.h"
|
||||||
#include "render/filament/mjrfilament_cpp.h"
|
#include "render/filament/mjrfilament_cpp.h"
|
||||||
#include "render/filament/support/model_objects.h"
|
#include "render/filament/support/model_objects.h"
|
||||||
@@ -29,6 +30,9 @@ class LightManager {
|
|||||||
LightManager(mjrfContext* ctx, mjrfScene* scene, ModelObjects* model_objects);
|
LightManager(mjrfContext* ctx, mjrfScene* scene, ModelObjects* model_objects);
|
||||||
~LightManager();
|
~LightManager();
|
||||||
|
|
||||||
|
// Updates the state of the lights in the scene.
|
||||||
|
void Update(const mjData* data);
|
||||||
|
|
||||||
// Returns the light with the given index in the mjModel. Note that an extra
|
// Returns the light with the given index in the mjModel. Note that an extra
|
||||||
// headlight is assigned of the index `nlight`.
|
// headlight is assigned of the index `nlight`.
|
||||||
mjrfLight* GetLight(int index);
|
mjrfLight* GetLight(int index);
|
||||||
@@ -37,10 +41,12 @@ class LightManager {
|
|||||||
LightManager& operator=(const LightManager&) = delete;
|
LightManager& operator=(const LightManager&) = delete;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Prepare(ModelObjects* model_objects);
|
void Prepare();
|
||||||
|
|
||||||
mjrfContext* ctx_ = nullptr;
|
mjrfContext* ctx_ = nullptr;
|
||||||
mjrfScene* scene_ = nullptr;
|
mjrfScene* scene_ = nullptr;
|
||||||
|
ModelObjects* model_objects_ = nullptr;
|
||||||
|
|
||||||
UniquePtr<mjrfLight> fallback_ibl_{nullptr, nullptr};
|
UniquePtr<mjrfLight> fallback_ibl_{nullptr, nullptr};
|
||||||
UniquePtr<mjrfTexture> fallback_ibl_texture_{nullptr, nullptr};
|
UniquePtr<mjrfTexture> fallback_ibl_texture_{nullptr, nullptr};
|
||||||
std::vector<UniquePtr<mjrfLight>> lights_;
|
std::vector<UniquePtr<mjrfLight>> lights_;
|
||||||
|
|||||||
Reference in New Issue
Block a user