Skip to content

Commit

Permalink
Added exposure param to EDFs.
Browse files Browse the repository at this point in the history
  • Loading branch information
est77 committed May 26, 2017
1 parent 6871414 commit 2f81827
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/appleseed/renderer/kernel/shading/closures.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ namespace
values->m_radiance.set_intent(Spectrum::Illuminance);
values->m_radiance = weight / max_weight_component;
values->m_radiance_multiplier = max_weight_component;
values->m_exposure = 0.0f;
}
};

Expand Down
21 changes: 17 additions & 4 deletions src/appleseed/renderer/modeling/edf/coneedf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ namespace renderer { class Assembly; }
namespace renderer { class Project; }

using namespace foundation;
using namespace std;

namespace renderer
{
Expand All @@ -75,6 +76,7 @@ namespace
{
m_inputs.declare("radiance", InputFormatSpectralIlluminance);
m_inputs.declare("radiance_multiplier", InputFormatFloat, "1.0");
m_inputs.declare("exposure", InputFormatFloat, "0.0");
m_inputs.declare("angle", InputFormatFloat, "90.0");
}

Expand Down Expand Up @@ -121,7 +123,7 @@ namespace

const InputValues* values = static_cast<const InputValues*>(data);
value = values->m_radiance;
value *= values->m_radiance_multiplier;
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);

probability = sample_cone_uniform_pdf(m_cos_half_angle);
assert(probability > 0.0f);
Expand All @@ -147,7 +149,7 @@ namespace

const InputValues* values = static_cast<const InputValues*>(data);
value = values->m_radiance;
value *= values->m_radiance_multiplier;
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
}

virtual void evaluate(
Expand All @@ -172,7 +174,7 @@ namespace

const InputValues* values = static_cast<const InputValues*>(data);
value = values->m_radiance;
value *= values->m_radiance_multiplier;
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);

probability = sample_cone_uniform_pdf(m_cos_half_angle);
}
Expand All @@ -196,7 +198,7 @@ namespace

virtual float get_uncached_max_contribution() const APPLESEED_OVERRIDE
{
return get_max_contribution("radiance", "radiance_multiplier");
return get_max_contribution("radiance", "radiance_multiplier", "exposure");
}

private:
Expand Down Expand Up @@ -250,6 +252,17 @@ DictionaryArray ConeEDFFactory::get_input_metadata() const
.insert("use", "optional")
.insert("default", "1.0"));

metadata.push_back(
Dictionary()
.insert("name", "exposure")
.insert("label", "Exposure")
.insert("type", "numeric")
.insert("use", "optional")
.insert("default", "0.0")
.insert("min_value", "-64.0")
.insert("max_value", "64.0")
.insert("help", "Exposure"));

metadata.push_back(
Dictionary()
.insert("name", "angle")
Expand Down
1 change: 1 addition & 0 deletions src/appleseed/renderer/modeling/edf/coneedf.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ APPLESEED_DECLARE_INPUT_VALUES(ConeEDFInputValues)
{
Spectrum m_radiance; // emitted radiance in W.m^-2.sr^-1
float m_radiance_multiplier; // emitted radiance multiplier
float m_exposure; // emitted radiance exposure
float m_angle; // cone angle
};

Expand Down
22 changes: 18 additions & 4 deletions src/appleseed/renderer/modeling/edf/diffuseedf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,15 @@

// Standard headers.
#include <cassert>
#include <cmath>

// Forward declarations.
namespace foundation { class IAbortSwitch; }
namespace renderer { class Assembly; }
namespace renderer { class Project; }

using namespace foundation;
using namespace std;

namespace renderer
{
Expand All @@ -74,6 +76,7 @@ namespace
{
m_inputs.declare("radiance", InputFormatSpectralIlluminance);
m_inputs.declare("radiance_multiplier", InputFormatFloat, "1.0");
m_inputs.declare("exposure", InputFormatFloat, "0.0");
}

virtual void release() APPLESEED_OVERRIDE
Expand Down Expand Up @@ -117,7 +120,7 @@ namespace

const InputValues* values = static_cast<const InputValues*>(data);
value = values->m_radiance;
value *= values->m_radiance_multiplier;
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);

probability = wo.y * RcpPi<float>();
assert(probability > 0.0f);
Expand All @@ -144,7 +147,7 @@ namespace

const InputValues* values = static_cast<const InputValues*>(data);
value = values->m_radiance;
value *= values->m_radiance_multiplier;
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
}

virtual void evaluate(
Expand All @@ -170,7 +173,7 @@ namespace

const InputValues* values = static_cast<const InputValues*>(data);
value = values->m_radiance;
value *= values->m_radiance_multiplier;
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);

probability = cos_on * RcpPi<float>();
}
Expand All @@ -195,7 +198,7 @@ namespace

virtual float get_uncached_max_contribution() const APPLESEED_OVERRIDE
{
return get_max_contribution("radiance", "radiance_multiplier");
return get_max_contribution("radiance", "radiance_multiplier", "exposure");
}

private:
Expand Down Expand Up @@ -248,6 +251,17 @@ DictionaryArray DiffuseEDFFactory::get_input_metadata() const
.insert("use", "optional")
.insert("default", "1.0"));

metadata.push_back(
Dictionary()
.insert("name", "exposure")
.insert("label", "Exposure")
.insert("type", "numeric")
.insert("use", "optional")
.insert("default", "0.0")
.insert("min_value", "-64.0")
.insert("max_value", "64.0")
.insert("help", "Exposure"));

add_common_input_metadata(metadata);

return metadata;
Expand Down
1 change: 1 addition & 0 deletions src/appleseed/renderer/modeling/edf/diffuseedf.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ APPLESEED_DECLARE_INPUT_VALUES(DiffuseEDFInputValues)
{
Spectrum m_radiance; // emitted radiance in W.m^-2.sr^-1
float m_radiance_multiplier; // emitted radiance multiplier
float m_exposure; // emitted radiance exposure
};


Expand Down
21 changes: 17 additions & 4 deletions src/appleseed/renderer/modeling/edf/edf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "foundation/utility/arena.h"

// Standard headers.
#include <cmath>
#include <string>

using namespace foundation;
Expand Down Expand Up @@ -158,7 +159,10 @@ float EDF::get_max_contribution_spectrum(const Source* source) const
return max_value(spectrum);
}

float EDF::get_max_contribution(const Source* input, const Source* multiplier) const
float EDF::get_max_contribution(
const Source* input,
const Source* multiplier,
const Source* exposure) const
{
const float max_contribution_input = get_max_contribution_spectrum(input);

Expand All @@ -170,15 +174,24 @@ float EDF::get_max_contribution(const Source* input, const Source* multiplier) c
if (max_contribution_multiplier == numeric_limits<float>::max())
return numeric_limits<float>::max();

return max_contribution_input * max_contribution_multiplier;
const float max_contribution_exposure = get_max_contribution_scalar(exposure);

if (max_contribution_exposure == numeric_limits<float>::max())
return numeric_limits<float>::max();

return max_contribution_input * max_contribution_multiplier * pow(2.0f, max_contribution_exposure);
}

float EDF::get_max_contribution(const char* input_name, const char* multiplier_name) const
float EDF::get_max_contribution(
const char* input_name,
const char* multiplier_name,
const char* exposure_name) const
{
return
get_max_contribution(
m_inputs.source(input_name),
m_inputs.source(multiplier_name));
m_inputs.source(multiplier_name),
m_inputs.source(exposure_name));
}

} // namespace renderer
10 changes: 8 additions & 2 deletions src/appleseed/renderer/modeling/edf/edf.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,14 @@ class APPLESEED_DLLSYMBOL EDF
float get_max_contribution_scalar(const Source* source) const;
float get_max_contribution_spectrum(const Source* source) const;

float get_max_contribution(const Source* source, const Source* multiplier) const;
float get_max_contribution(const char* input_name, const char* multiplier_name) const;
float get_max_contribution(
const Source* source,
const Source* multiplier,
const Source* exposure) const;
float get_max_contribution(
const char* input_name,
const char* multiplier_name,
const char* exposure_name) const;

// Retrieve the approximate contribution.
virtual float get_uncached_max_contribution() const = 0;
Expand Down

0 comments on commit 2f81827

Please sign in to comment.