/*
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 .
*/
#include
#include
#include
#include
MTS_NAMESPACE_BEGIN
AbstractEmitter::AbstractEmitter(const Properties &props)
: ConfigurableObject(props), m_shape(NULL), m_type(0) {
m_worldTransform = props.getAnimatedTransform("toWorld", Transform());
}
AbstractEmitter::AbstractEmitter(Stream *stream, InstanceManager *manager)
: ConfigurableObject(stream, manager) {
m_worldTransform = new AnimatedTransform(stream);
m_medium = static_cast(manager->getInstance(stream));
m_shape = static_cast(manager->getInstance(stream));
m_type = stream->readUInt();
}
AbstractEmitter::~AbstractEmitter() {
}
void AbstractEmitter::serialize(Stream *stream, InstanceManager *manager) const {
ConfigurableObject::serialize(stream, manager);
m_worldTransform->serialize(stream);
manager->serialize(stream, m_medium.get());
manager->serialize(stream, m_shape);
stream->writeUInt(m_type);
}
void AbstractEmitter::addChild(const std::string &name, ConfigurableObject *child) {
if (child->getClass()->derivesFrom(MTS_CLASS(Medium))) {
Assert(m_medium == NULL);
m_medium = static_cast(child);
} else {
ConfigurableObject::addChild(name, child);
}
}
ref AbstractEmitter::createShape(const Scene *scene) {
return NULL;
}
Spectrum AbstractEmitter::samplePosition(PositionSamplingRecord &pRec,
const Point2 &sample, const Point2 *extra) const {
NotImplementedError("samplePosition");
}
Spectrum AbstractEmitter::sampleDirection(DirectionSamplingRecord &dRec,
PositionSamplingRecord &pRec, const Point2 &sample,
const Point2 *extra) const {
NotImplementedError("sampleDirection");
}
Spectrum AbstractEmitter::sampleDirect(DirectSamplingRecord &dRec, const Point2 &sample) const {
NotImplementedError("sampleDirect");
}
Spectrum AbstractEmitter::evalPosition(const PositionSamplingRecord &pRec) const {
NotImplementedError("evalPosition");
}
Spectrum AbstractEmitter::evalDirection(const DirectionSamplingRecord &dRec,
const PositionSamplingRecord &pRec) const {
NotImplementedError("evalDirection");
}
Float AbstractEmitter::pdfPosition(const PositionSamplingRecord &pRec) const {
NotImplementedError("pdfPosition");
}
Float AbstractEmitter::pdfDirection(const DirectionSamplingRecord &dRec,
const PositionSamplingRecord &pRec) const {
NotImplementedError("pdfDirection");
}
Float AbstractEmitter::pdfDirect(const DirectSamplingRecord &dRec) const {
NotImplementedError("pdfDirect");
}
Emitter::Emitter(const Properties &props)
: AbstractEmitter(props) {
// Importance sampling weight (used by the luminaire sampling code in \ref Scene)
m_samplingWeight = props.getFloat("samplingWeight", 1.0f);
}
Emitter::Emitter(Stream *stream, InstanceManager *manager)
: AbstractEmitter(stream, manager) {
m_samplingWeight = stream->readFloat();
}
void Emitter::serialize(Stream *stream, InstanceManager *manager) const {
AbstractEmitter::serialize(stream, manager);
stream->writeFloat(m_samplingWeight);
}
Spectrum Emitter::sampleRay(Ray &ray,
const Point2 &spatialSample,
const Point2 &directionalSample,
Float time) const {
NotImplementedError("sampleRay");
}
Spectrum Emitter::eval(const Intersection &its, const Vector &d) const {
NotImplementedError("eval");
}
Spectrum Emitter::evalEnvironment(const RayDifferential &ray) const {
NotImplementedError("evalEnvironment");
}
bool Emitter::fillDirectSamplingRecord(DirectSamplingRecord &dRec,
const Ray &ray) const {
NotImplementedError("fillDirectSamplingRecord");
}
Emitter::~Emitter() { }
Emitter *Emitter::getElement(size_t index) {
return NULL;
}
bool Emitter::isCompound() const {
return false;
}
MTS_IMPLEMENT_CLASS(Emitter, false, AbstractEmitter)
MTS_IMPLEMENT_CLASS(AbstractEmitter, true, ConfigurableObject)
MTS_NAMESPACE_END