Skip to content

Commit 2f81827

Browse files
committed
Added exposure param to EDFs.
1 parent 6871414 commit 2f81827

File tree

7 files changed

+63
-14
lines changed

7 files changed

+63
-14
lines changed

src/appleseed/renderer/kernel/shading/closures.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ namespace
512512
values->m_radiance.set_intent(Spectrum::Illuminance);
513513
values->m_radiance = weight / max_weight_component;
514514
values->m_radiance_multiplier = max_weight_component;
515+
values->m_exposure = 0.0f;
515516
}
516517
};
517518

src/appleseed/renderer/modeling/edf/coneedf.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ namespace renderer { class Assembly; }
5252
namespace renderer { class Project; }
5353

5454
using namespace foundation;
55+
using namespace std;
5556

5657
namespace renderer
5758
{
@@ -75,6 +76,7 @@ namespace
7576
{
7677
m_inputs.declare("radiance", InputFormatSpectralIlluminance);
7778
m_inputs.declare("radiance_multiplier", InputFormatFloat, "1.0");
79+
m_inputs.declare("exposure", InputFormatFloat, "0.0");
7880
m_inputs.declare("angle", InputFormatFloat, "90.0");
7981
}
8082

@@ -121,7 +123,7 @@ namespace
121123

122124
const InputValues* values = static_cast<const InputValues*>(data);
123125
value = values->m_radiance;
124-
value *= values->m_radiance_multiplier;
126+
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
125127

126128
probability = sample_cone_uniform_pdf(m_cos_half_angle);
127129
assert(probability > 0.0f);
@@ -147,7 +149,7 @@ namespace
147149

148150
const InputValues* values = static_cast<const InputValues*>(data);
149151
value = values->m_radiance;
150-
value *= values->m_radiance_multiplier;
152+
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
151153
}
152154

153155
virtual void evaluate(
@@ -172,7 +174,7 @@ namespace
172174

173175
const InputValues* values = static_cast<const InputValues*>(data);
174176
value = values->m_radiance;
175-
value *= values->m_radiance_multiplier;
177+
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
176178

177179
probability = sample_cone_uniform_pdf(m_cos_half_angle);
178180
}
@@ -196,7 +198,7 @@ namespace
196198

197199
virtual float get_uncached_max_contribution() const APPLESEED_OVERRIDE
198200
{
199-
return get_max_contribution("radiance", "radiance_multiplier");
201+
return get_max_contribution("radiance", "radiance_multiplier", "exposure");
200202
}
201203

202204
private:
@@ -250,6 +252,17 @@ DictionaryArray ConeEDFFactory::get_input_metadata() const
250252
.insert("use", "optional")
251253
.insert("default", "1.0"));
252254

255+
metadata.push_back(
256+
Dictionary()
257+
.insert("name", "exposure")
258+
.insert("label", "Exposure")
259+
.insert("type", "numeric")
260+
.insert("use", "optional")
261+
.insert("default", "0.0")
262+
.insert("min_value", "-64.0")
263+
.insert("max_value", "64.0")
264+
.insert("help", "Exposure"));
265+
253266
metadata.push_back(
254267
Dictionary()
255268
.insert("name", "angle")

src/appleseed/renderer/modeling/edf/coneedf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ APPLESEED_DECLARE_INPUT_VALUES(ConeEDFInputValues)
5959
{
6060
Spectrum m_radiance; // emitted radiance in W.m^-2.sr^-1
6161
float m_radiance_multiplier; // emitted radiance multiplier
62+
float m_exposure; // emitted radiance exposure
6263
float m_angle; // cone angle
6364
};
6465

src/appleseed/renderer/modeling/edf/diffuseedf.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@
4444

4545
// Standard headers.
4646
#include <cassert>
47+
#include <cmath>
4748

4849
// Forward declarations.
4950
namespace foundation { class IAbortSwitch; }
5051
namespace renderer { class Assembly; }
5152
namespace renderer { class Project; }
5253

5354
using namespace foundation;
55+
using namespace std;
5456

5557
namespace renderer
5658
{
@@ -74,6 +76,7 @@ namespace
7476
{
7577
m_inputs.declare("radiance", InputFormatSpectralIlluminance);
7678
m_inputs.declare("radiance_multiplier", InputFormatFloat, "1.0");
79+
m_inputs.declare("exposure", InputFormatFloat, "0.0");
7780
}
7881

7982
virtual void release() APPLESEED_OVERRIDE
@@ -117,7 +120,7 @@ namespace
117120

118121
const InputValues* values = static_cast<const InputValues*>(data);
119122
value = values->m_radiance;
120-
value *= values->m_radiance_multiplier;
123+
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
121124

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

145148
const InputValues* values = static_cast<const InputValues*>(data);
146149
value = values->m_radiance;
147-
value *= values->m_radiance_multiplier;
150+
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
148151
}
149152

150153
virtual void evaluate(
@@ -170,7 +173,7 @@ namespace
170173

171174
const InputValues* values = static_cast<const InputValues*>(data);
172175
value = values->m_radiance;
173-
value *= values->m_radiance_multiplier;
176+
value *= values->m_radiance_multiplier * pow(2.0f, values->m_exposure);
174177

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

196199
virtual float get_uncached_max_contribution() const APPLESEED_OVERRIDE
197200
{
198-
return get_max_contribution("radiance", "radiance_multiplier");
201+
return get_max_contribution("radiance", "radiance_multiplier", "exposure");
199202
}
200203

201204
private:
@@ -248,6 +251,17 @@ DictionaryArray DiffuseEDFFactory::get_input_metadata() const
248251
.insert("use", "optional")
249252
.insert("default", "1.0"));
250253

254+
metadata.push_back(
255+
Dictionary()
256+
.insert("name", "exposure")
257+
.insert("label", "Exposure")
258+
.insert("type", "numeric")
259+
.insert("use", "optional")
260+
.insert("default", "0.0")
261+
.insert("min_value", "-64.0")
262+
.insert("max_value", "64.0")
263+
.insert("help", "Exposure"));
264+
251265
add_common_input_metadata(metadata);
252266

253267
return metadata;

src/appleseed/renderer/modeling/edf/diffuseedf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ APPLESEED_DECLARE_INPUT_VALUES(DiffuseEDFInputValues)
5959
{
6060
Spectrum m_radiance; // emitted radiance in W.m^-2.sr^-1
6161
float m_radiance_multiplier; // emitted radiance multiplier
62+
float m_exposure; // emitted radiance exposure
6263
};
6364

6465

src/appleseed/renderer/modeling/edf/edf.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "foundation/utility/arena.h"
4242

4343
// Standard headers.
44+
#include <cmath>
4445
#include <string>
4546

4647
using namespace foundation;
@@ -158,7 +159,10 @@ float EDF::get_max_contribution_spectrum(const Source* source) const
158159
return max_value(spectrum);
159160
}
160161

161-
float EDF::get_max_contribution(const Source* input, const Source* multiplier) const
162+
float EDF::get_max_contribution(
163+
const Source* input,
164+
const Source* multiplier,
165+
const Source* exposure) const
162166
{
163167
const float max_contribution_input = get_max_contribution_spectrum(input);
164168

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

173-
return max_contribution_input * max_contribution_multiplier;
177+
const float max_contribution_exposure = get_max_contribution_scalar(exposure);
178+
179+
if (max_contribution_exposure == numeric_limits<float>::max())
180+
return numeric_limits<float>::max();
181+
182+
return max_contribution_input * max_contribution_multiplier * pow(2.0f, max_contribution_exposure);
174183
}
175184

176-
float EDF::get_max_contribution(const char* input_name, const char* multiplier_name) const
185+
float EDF::get_max_contribution(
186+
const char* input_name,
187+
const char* multiplier_name,
188+
const char* exposure_name) const
177189
{
178190
return
179191
get_max_contribution(
180192
m_inputs.source(input_name),
181-
m_inputs.source(multiplier_name));
193+
m_inputs.source(multiplier_name),
194+
m_inputs.source(exposure_name));
182195
}
183196

184197
} // namespace renderer

src/appleseed/renderer/modeling/edf/edf.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,14 @@ class APPLESEED_DLLSYMBOL EDF
153153
float get_max_contribution_scalar(const Source* source) const;
154154
float get_max_contribution_spectrum(const Source* source) const;
155155

156-
float get_max_contribution(const Source* source, const Source* multiplier) const;
157-
float get_max_contribution(const char* input_name, const char* multiplier_name) const;
156+
float get_max_contribution(
157+
const Source* source,
158+
const Source* multiplier,
159+
const Source* exposure) const;
160+
float get_max_contribution(
161+
const char* input_name,
162+
const char* multiplier_name,
163+
const char* exposure_name) const;
158164

159165
// Retrieve the approximate contribution.
160166
virtual float get_uncached_max_contribution() const = 0;

0 commit comments

Comments
 (0)