Skip to content

Commit

Permalink
Make Emitters' members opaque
Browse files Browse the repository at this point in the history
  • Loading branch information
njroussel committed Mar 3, 2023
1 parent 50e1fc4 commit df940c1
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 34 deletions.
2 changes: 2 additions & 0 deletions include/mitsuba/render/endpoint.h
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,8 @@ class MI_EXPORT_LIB Endpoint : public Object {

void traverse(TraversalCallback *callback) override;

void parameters_changed(const std::vector<std::string> &keys = {}) override;

DRJIT_VCALL_REGISTER(Float, mitsuba::Endpoint)
MI_DECLARE_CLASS()
protected:
Expand Down
5 changes: 3 additions & 2 deletions src/emitters/directional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,9 @@ MI_VARIANT class DirectionalEmitter final : public Emitter<Float, Spectrum> {
}

void traverse(TraversalCallback *callback) override {
callback->put_object("irradiance", m_irradiance.get(), +ParamFlags::Differentiable);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
Base::traverse(callback);
callback->put_object("irradiance", m_irradiance.get(), +ParamFlags::Differentiable);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
}

void set_scene(const Scene *scene) override {
Expand Down
1 change: 1 addition & 0 deletions src/emitters/directionalarea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class DirectionalArea final : public Emitter<Float, Spectrum> {
void set_shape(Shape *shape) override {
Base::set_shape(shape);
m_area = m_shape->surface_area();
dr::make_opaque(m_area);
}

std::pair<Ray3f, Spectrum> sample_ray(Float time, Float wavelength_sample,
Expand Down
6 changes: 4 additions & 2 deletions src/emitters/envmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,9 @@ class EnvironmentMapEmitter final : public Emitter<Float, Spectrum> {
}

void traverse(TraversalCallback *callback) override {
callback->put_parameter("scale", m_scale, +ParamFlags::Differentiable);
callback->put_parameter("data", m_data, ParamFlags::Differentiable | ParamFlags::Discontinuous);
Base::traverse(callback);
callback->put_parameter("scale", m_scale, +ParamFlags::Differentiable);
callback->put_parameter("data", m_data, ParamFlags::Differentiable | ParamFlags::Discontinuous);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
}

Expand Down Expand Up @@ -304,6 +305,7 @@ class EnvironmentMapEmitter final : public Emitter<Float, Spectrum> {

m_warp = Warp(luminance.get(), res);
}
Base::parameters_changed(keys);
}

void set_scene(const Scene *scene) override {
Expand Down
35 changes: 21 additions & 14 deletions src/emitters/projector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,12 @@ MI_VARIANT class Projector final : public Emitter<Float, Spectrum> {
MI_IMPORT_TYPES(Texture)

Projector(const Properties &props) : Base(props) {
m_intensity_scale = props.get<ScalarFloat>("scale", 1.f);
m_intensity_scale = dr::opaque<Float>(props.get<ScalarFloat>("scale", 1.f));

m_irradiance = props.texture_d65<Texture>("irradiance", 1.f);

ScalarVector2i size = m_irradiance->resolution();
m_x_fov = (ScalarFloat) parse_fov(props, size.x() / (double) size.y());
m_x_fov = parse_fov(props, size.x() / (double) size.y());

parameters_changed();

Expand All @@ -135,27 +135,34 @@ MI_VARIANT class Projector final : public Emitter<Float, Spectrum> {
}

void traverse(TraversalCallback *callback) override {
callback->put_parameter("scale", m_intensity_scale, +ParamFlags::Differentiable);
callback->put_object("irradiance", m_irradiance.get(), +ParamFlags::Differentiable);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
Base::traverse(callback);
callback->put_parameter("scale", m_intensity_scale, +ParamFlags::Differentiable);
callback->put_object("irradiance", m_irradiance.get(), +ParamFlags::Differentiable);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
}

void parameters_changed(const std::vector<std::string> &keys = {}) override {
if (keys.empty() || string::contains(keys, "irradiance")) {
ScalarVector2i size = m_irradiance->resolution();

m_camera_to_sample = perspective_projection(size, size, 0, m_x_fov,
(ScalarFloat) 1e-4f,
(ScalarFloat) 1e4f);
ScalarFloat(1e-4f),
ScalarFloat(1e4f));
m_sample_to_camera = m_camera_to_sample.inverse();

// Compute
ScalarPoint3f pmin(m_sample_to_camera * ScalarPoint3f(0.f, 0.f, 0.f)),
pmax(m_sample_to_camera * ScalarPoint3f(1.f, 1.f, 0.f));
ScalarBoundingBox2f image_rect(ScalarPoint2f(pmin.x(), pmin.y()) / pmin.z());
image_rect.expand(ScalarPoint2f(pmax.x(), pmax.y()) / pmax.z());
Point3f pmin(m_sample_to_camera * Point3f(0.f, 0.f, 0.f)),
pmax(m_sample_to_camera * Point3f(1.f, 1.f, 0.f));
BoundingBox2f image_rect(Point2f(pmin.x(), pmin.y()) / pmin.z());
image_rect.expand(Point2f(pmax.x(), pmax.y()) / pmax.z());
m_sensor_area = image_rect.volume();

dr::make_opaque(m_camera_to_sample, m_sample_to_camera,
m_intensity_scale, m_sensor_area);
}
dr::make_opaque(m_intensity_scale);

Base::parameters_changed(keys);
}

std::pair<Ray3f, Spectrum> sample_ray(Float time, Float wavelength_sample,
Expand Down Expand Up @@ -291,10 +298,10 @@ MI_VARIANT class Projector final : public Emitter<Float, Spectrum> {
protected:
ref<Texture> m_irradiance;
Float m_intensity_scale;
ScalarTransform4f m_camera_to_sample;
ScalarTransform4f m_sample_to_camera;
Transform4f m_camera_to_sample;
Transform4f m_sample_to_camera;
ScalarFloat m_x_fov;
ScalarFloat m_sensor_area;
Float m_sensor_area;
};

MI_IMPLEMENT_CLASS_VARIANT(Projector, Emitter)
Expand Down
29 changes: 13 additions & 16 deletions src/emitters/spot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,29 +102,26 @@ class SpotLight final : public Emitter<Float, Spectrum> {
}
dr::set_attr(this, "flags", m_flags);

m_cutoff_angle = props.get<ScalarFloat>("cutoff_angle", 20.0f);
m_beam_width = props.get<ScalarFloat>("beam_width", m_cutoff_angle * 3.0f / 4.0f);
m_cutoff_angle = dr::deg_to_rad(m_cutoff_angle);
ScalarFloat cutoff_angle = props.get<ScalarFloat>("cutoff_angle", 20.0f);
m_beam_width = props.get<ScalarFloat>("beam_width", cutoff_angle * 3.0f / 4.0f);
m_cutoff_angle = dr::deg_to_rad(cutoff_angle);
m_beam_width = dr::deg_to_rad(m_beam_width);
m_inv_transition_width = 1.0f / (m_cutoff_angle - m_beam_width);
m_cos_cutoff_angle = dr::cos(m_cutoff_angle);
m_cos_beam_width = dr::cos(m_beam_width);
Assert(m_cutoff_angle >= m_beam_width);
m_uv_factor = dr::tan(m_cutoff_angle);
}

void traverse(TraversalCallback *callback) override {
callback->put_object("intensity", m_intensity.get(), +ParamFlags::Differentiable);
callback->put_object("texture", m_texture.get(), +ParamFlags::Differentiable);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
dr::make_opaque(m_beam_width, m_cutoff_angle, m_uv_factor,
m_cos_beam_width, m_cos_cutoff_angle,
m_inv_transition_width);
}

void parameters_changed(const std::vector<std::string> &keys) override {
if (keys.empty() || string::contains(keys, "to_world")) {
// Update the scalar value of the matrix
m_to_world = m_to_world.value();
}
Base::parameters_changed();
void traverse(TraversalCallback *callback) override {
Base::traverse(callback);
callback->put_object("intensity", m_intensity.get(), +ParamFlags::Differentiable);
callback->put_object("texture", m_texture.get(), +ParamFlags::Differentiable);
callback->put_parameter("to_world", *m_to_world.ptr(), +ParamFlags::NonDifferentiable);
}

/**
Expand Down Expand Up @@ -279,8 +276,8 @@ class SpotLight final : public Emitter<Float, Spectrum> {
private:
ref<Texture> m_intensity;
ref<Texture> m_texture;
ScalarFloat m_beam_width, m_cutoff_angle, m_uv_factor;
ScalarFloat m_cos_beam_width, m_cos_cutoff_angle, m_inv_transition_width;
Float m_beam_width, m_cutoff_angle, m_uv_factor;
Float m_cos_beam_width, m_cos_cutoff_angle, m_inv_transition_width;
};


Expand Down
8 changes: 8 additions & 0 deletions src/render/endpoint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ NAMESPACE_BEGIN(mitsuba)
MI_VARIANT Endpoint<Float, Spectrum>::Endpoint(const Properties &props) : m_id(props.id()) {
m_to_world = (ScalarTransform4f) props.get<ScalarTransform4f>(
"to_world", ScalarTransform4f());
dr::make_opaque(m_to_world);

for (auto &[name, obj] : props.objects(false)) {
Medium *medium = dynamic_cast<Medium *>(obj.get());
Expand Down Expand Up @@ -115,6 +116,13 @@ MI_VARIANT void Endpoint<Float, Spectrum>::traverse(TraversalCallback *callback)
callback->put_object("medium", m_medium.get(), +ParamFlags::Differentiable);
}

MI_VARIANT void Endpoint<Float, Spectrum>::parameters_changed(const std::vector<std::string> &keys) {
if (keys.empty() || string::contains(keys, "to_world")) {
// Update the scalar value of the matrix
m_to_world = m_to_world.value();
}
}

MI_IMPLEMENT_CLASS_VARIANT(Endpoint, Object)
MI_INSTANTIATE_CLASS(Endpoint)
NAMESPACE_END(mitsuba)

0 comments on commit df940c1

Please sign in to comment.