100 lines
3.3 KiB
C++
100 lines
3.3 KiB
C++
/*
|
|
This file is part of Mitsuba, a physically based rendering system.
|
|
|
|
Copyright (c) 2007-2011 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/>.
|
|
*/
|
|
|
|
#include <mitsuba/render/film.h>
|
|
#include <mitsuba/core/plugin.h>
|
|
|
|
MTS_NAMESPACE_BEGIN
|
|
|
|
Film::Film(const Properties &props)
|
|
: ConfigurableObject(props), m_properties(props) {
|
|
/* Horizontal and vertical film resolution in pixels */
|
|
m_size = Vector2i(
|
|
props.getInteger("width", 768),
|
|
props.getInteger("height", 576)
|
|
);
|
|
/* Crop window specified in pixels - by default, this
|
|
matches the full sensor area */
|
|
m_cropOffset = Point2i(
|
|
props.getInteger("cropOffsetX", 0),
|
|
props.getInteger("cropOffsetY", 0)
|
|
);
|
|
m_cropSize = Vector2i(
|
|
props.getInteger("cropWidth", m_size.x),
|
|
props.getInteger("cropHeight", m_size.y)
|
|
);
|
|
if (m_cropOffset.x < 0 || m_cropOffset.y < 0 ||
|
|
m_cropSize.x <= 0 || m_cropSize.y <= 0 ||
|
|
m_cropOffset.x + m_cropSize.x > m_size.x ||
|
|
m_cropOffset.y + m_cropSize.y > m_size.y )
|
|
Log(EError, "Invalid crop window specification!");
|
|
|
|
/* If set to true, regions slightly outside of the film
|
|
plane will also be sampled, which improves the image
|
|
quality at the edges especially with large reconstruction
|
|
filters. */
|
|
m_highQualityEdges = props.getBoolean("highQualityEdges", false);
|
|
}
|
|
|
|
Film::Film(Stream *stream, InstanceManager *manager)
|
|
: ConfigurableObject(stream, manager) {
|
|
m_size = Vector2i(stream);
|
|
m_cropOffset = Point2i(stream);
|
|
m_cropSize = Vector2i(stream);
|
|
m_highQualityEdges = stream->readBool();
|
|
m_filter = static_cast<ReconstructionFilter *>(manager->getInstance(stream));
|
|
m_tabulatedFilter = new TabulatedFilter(m_filter);
|
|
}
|
|
|
|
Film::~Film() {
|
|
}
|
|
|
|
void Film::serialize(Stream *stream, InstanceManager *manager) const {
|
|
ConfigurableObject::serialize(stream, manager);
|
|
m_size.serialize(stream);
|
|
m_cropOffset.serialize(stream);
|
|
m_cropSize.serialize(stream);
|
|
stream->writeBool(m_highQualityEdges);
|
|
manager->serialize(stream, m_filter.get());
|
|
}
|
|
|
|
void Film::addChild(const std::string &name, ConfigurableObject *child) {
|
|
const Class *cClass = child->getClass();
|
|
|
|
if (cClass->derivesFrom(MTS_CLASS(ReconstructionFilter))) {
|
|
Assert(m_filter == NULL);
|
|
m_filter = static_cast<ReconstructionFilter *>(child);
|
|
m_tabulatedFilter = new TabulatedFilter(m_filter);
|
|
} else {
|
|
Log(EError, "Film: Invalid child node! (\"%s\")",
|
|
cClass->getName().c_str());
|
|
}
|
|
}
|
|
|
|
void Film::configure() {
|
|
if (m_filter == NULL) {
|
|
/* No reconstruction filter has been selected. Load a gaussian filter by default */
|
|
m_filter = static_cast<ReconstructionFilter *> (PluginManager::getInstance()->
|
|
createObject(MTS_CLASS(ReconstructionFilter), Properties("gaussian")));
|
|
m_tabulatedFilter = new TabulatedFilter(m_filter);
|
|
}
|
|
}
|
|
|
|
MTS_IMPLEMENT_CLASS(Film, true, ConfigurableObject)
|
|
MTS_NAMESPACE_END
|