mitsuba/src/subsurface/irrproc.h

235 lines
5.5 KiB
C++

/*
This file is part of Mitsuba, a physically based rendering system.
Copyright (c) 2007-2012 by Wenzel Jakob and others.
Mitsuba is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License Version 3
as published by the Free Software Foundation.
Mitsuba is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(__DIPOLE_PROC_H)
#define __DIPOLE_PROC_H
#include <mitsuba/render/scene.h>
MTS_NAMESPACE_BEGIN
/**
* Data structure representing position samples for
* which irradiance values should be computed
*/
class PositionSample {
public:
/// Default (empty) constructor
inline PositionSample() { }
/// Unserialize an Position sample from a binary data stream
inline PositionSample(Stream *stream) {
p = Point(stream);
n = Normal(stream);
shapeIndex = stream->readInt();
}
inline PositionSample(const Point &p, const Normal &n, int shapeIndex)
: p(p), n(n), shapeIndex(shapeIndex) { }
/// Serialize an position sample to a binary data stream
inline void serialize(Stream *stream) const {
p.serialize(stream);
n.serialize(stream);
stream->writeInt(shapeIndex);
}
Point p;
Normal n;
int shapeIndex;
};
/**
* \brief This class stores a number of position samples, which can be sent
* over the wire as needed.
*
* Used to implement parallel irradiance sampling for the dipole BSSRDF.
*/
class PositionSampleVector : public WorkUnit {
public:
PositionSampleVector() { }
inline void put(const PositionSample &rec) {
m_samples.push_back(rec);
}
inline size_t size() const {
return m_samples.size();
}
inline void clear() {
m_samples.clear();
}
inline std::vector<PositionSample> &get() {
return m_samples;
}
inline void reserve(size_t size) {
m_samples.reserve(size);
}
inline const PositionSample &operator[](size_t index) const {
return m_samples[index];
}
/* WorkUnit interface */
void load(Stream *stream);
void save(Stream *stream) const;
void set(const WorkUnit *workUnit);
std::string toString() const;
MTS_DECLARE_CLASS()
protected:
// Virtual destructor
virtual ~PositionSampleVector() { }
private:
std::vector<PositionSample> m_samples;
};
/**
* Data structure for representing irradiance samples on
* translucent surfaces
*/
class IrradianceSample {
public:
/// Default (empty) constructor
inline IrradianceSample() { }
/// Unserialize an irradiance sample from a binary data stream
inline IrradianceSample(Stream *stream) {
p = Point(stream);
E = Spectrum(stream);
}
/**
* \param p The sample point on the surface
* \param E The irradiance value at this position
*/
inline IrradianceSample(const Point &p, const Spectrum &E)
: p(p), E(E) { }
/// Serialize an irradiance sample to a binary data stream
inline void serialize(Stream *stream) const {
p.serialize(stream);
E.serialize(stream);
}
/// Return the position (used by the octree code)
inline const Point &getPosition() const {
return p;
}
Point p;
Spectrum E;
Float area; //!< total surface area represented by this sample
uint8_t label; //!< used by the octree construction code
};
/**
* \brief This class stores a number of irradiance samples, which can be sent
* over the wire as needed.
*
* Used to implement parallel irradiance sampling for the dipole BSSRDF.
*/
class IrradianceSampleVector : public WorkResult {
public:
IrradianceSampleVector() { }
inline void put(const IrradianceSample &rec) {
m_samples.push_back(rec);
}
inline size_t size() const {
return m_samples.size();
}
inline void clear() {
m_samples.clear();
}
inline std::vector<IrradianceSample> &get() {
return m_samples;
}
inline void reserve(size_t size) {
m_samples.reserve(size);
}
inline const IrradianceSample &operator[](size_t index) const {
return m_samples[index];
}
/* WorkUnit interface */
void load(Stream *stream);
void save(Stream *stream) const;
std::string toString() const;
MTS_DECLARE_CLASS()
protected:
// Virtual destructor
virtual ~IrradianceSampleVector() { }
private:
std::vector<IrradianceSample> m_samples;
};
/**
* Parallel process for performing distributed irradiance sampling
*/
class IrradianceSamplingProcess : public ParallelProcess {
public:
IrradianceSamplingProcess(PositionSampleVector *positions,
size_t granularity, int irrSamples, bool irrIndirect,
Float time, const void *data);
inline IrradianceSampleVector *getIrradianceSampleVector() {
return m_irradianceSamples.get();
}
inline PositionSampleVector *getPositionSampleVector() {
return m_positionSamples.get();
}
inline const AABB &getAABB() const {
return m_aabb;
}
/* ParallelProcess implementation */
ref<WorkProcessor> createWorkProcessor() const;
void processResult(const WorkResult *wr, bool cancelled);
ParallelProcess::EStatus generateWork(WorkUnit *unit, int worker);
MTS_DECLARE_CLASS()
protected:
/// Virtual destructor
virtual ~IrradianceSamplingProcess();
private:
ref<PositionSampleVector> m_positionSamples;
ref<IrradianceSampleVector> m_irradianceSamples;
size_t m_samplesRequested, m_granularity;
int m_irrSamples;
bool m_irrIndirect;
Float m_time;
ref<Mutex> m_resultMutex;
ProgressReporter *m_progress;
AABB m_aabb;
};
MTS_NAMESPACE_END
#endif /* __DIPOLE_PROC_H */