merge with default branch

metadata
Wenzel Jakob 2010-10-07 18:57:44 +02:00
commit 05266a5033
20 changed files with 217 additions and 101 deletions

View File

@ -11,8 +11,9 @@
.*moc_.*\.cc$
.*qrc_.*\.cc$
# SCons-related
# Build-related
^\.sconf_temp/.*$
^debian/.*$
^.sconsign.dblite$
^config.py$
^config.log$

View File

@ -52,11 +52,11 @@ using another distribution.
First, run
\begin{shell}
$\text{\$}$ apt-get install build-essential scons qt4-dev-tools scons libpng12-dev libjpeg62-dev libilmbase-dev libopenexr-dev libxerces-c-dev libboost-dev libglewmx1.5-dev libxxf86vm-dev libboost-system-dev libboost-filesystem-dev
$\text{\$}$ sudo apt-get install build-essential scons qt4-dev-tools scons libpng12-dev libjpeg62-dev libilmbase-dev libopenexr-dev libxerces-c-dev libboost-dev libglewmx1.5-dev libxxf86vm-dev libboost-system-dev libboost-filesystem-dev
\end{shell}
To get COLLADA support, you will also need to install the \texttt{collada-dom} packages or build them from scratch. Here, we install the \code{x86\_64} binaries and development headers included with Mitsuba:
\begin{shell}
$\text{\$}$ dpkg --install tools/linux/collada-dom2.2_2.2-1_amd64.deb tools/linux/collada-dom-dev_2.2-1_amd64.deb
$\text{\$}$ sudo dpkg --install tools/linux/collada-dom2.2_2.2-1_amd64.deb tools/linux/collada-dom-dev_2.2-1_amd64.deb
\end{shell}
Afterwards, simply run
\begin{shell}
@ -82,7 +82,38 @@ First, run
\begin{shell}
$\text{\$}$ yum install mercurial gcc-c++ scons boost-devel qt4-devel OpenEXR-devel xerces-c-devel
\end{shell}
You will also need the \texttt{glew-mx} and \texttt{collada-dom} packages, which are not included in the Fedora package repository. You can grab source and \texttt{i386} binary \texttt{RPM} files here: \texttt{http://www.mitsuba-renderer.org/releases}.
You will also need the \texttt{glew-mx} and \texttt{collada-dom} packages, which are not included in the Fedora package repository.
You can grab source, \texttt{i386}, and \text{x86\_64} \texttt{RPM} files here: \texttt{http://www.mitsuba-renderer.org/releases}.
Afterwards, simply run
\begin{shell}
$\text{\$}$ scons
\end{shell}
inside the Mitsuba directory. In the case that you have multiple processors, you might want to parallelize the build by appending \code{-j }\emph{core count} to the command.
If all goes well, SCons should finish successfully within a few minutes:
\begin{shell}
scons: $\texttt{done}$ building targets.
\end{shell}
To be able to run the renderer from the command line, you will also have to import it into your path:
\begin{shell}
$\text{\$}$ . setpath.sh
\end{shell}
(note the period at the beginning -- this assumes that you are using \code{bash}).
\subsection{Building on Arch Linux}
You'll first need to install a number of dependencies.
First, run
\begin{shell}
$\text{\$}$ pacman -S mercurial openexr gcc xerces-c boost libjpeg libpng qt libxmu libxi mesa pcre libxml2 scons
\end{shell}
Some of the extra dependencies must be built manually:
\begin{shell}
$\text{\$}$ wget https://www.mitsuba-renderer.org/releases/contrib/archlinux/glewmx/PKGBUILD
$\text{\$}$ makepkg
$\text{\$}$ sudo pacman -U glewmx-*.xz
\end{shell}
and similar for \texttt{https://www.mitsuba-renderer.org/releases/contrib/archlin}-
\texttt{ux/collada-dom/PKGBUILD}.
Afterwards, simply run
\begin{shell}
$\text{\$}$ scons

View File

@ -270,6 +270,21 @@ template<typename T, typename U> inline T union_cast(const U &val) {
return caster.t;
}
/// Return a string representation of a list of objects
template<class T> std::string listToString(const std::vector<T> &vec) {
std::ostringstream oss;
oss << "{" << endl;
for (size_t i=0; i<vec.size(); ++i) {
oss << " " << indent(vec[i]->toString());
if (i != vec.size()-1)
oss << "," << endl;
else
oss << endl;
}
oss << "}";
return oss.str();
}
MTS_NAMESPACE_END
#endif /* __UTIL_H */

View File

@ -356,7 +356,7 @@ void Bitmap::loadPNG(Stream *stream) {
}
/* Error handling */
if (setjmp(png_ptr->jmpbuf)) {
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL);
if (rows)
delete[] rows;
@ -379,7 +379,8 @@ void Bitmap::loadPNG(Stream *stream) {
png_set_expand(png_ptr); // expand indexed files
newDepth = 8;
} else if (colortype == PNG_COLOR_TYPE_GRAY && bitdepth < 8) {
png_set_gray_1_2_4_to_8(png_ptr); // convert grayscale to 8bit
png_set_expand_gray_1_2_4_to_8(png_ptr); // convert grayscale to 8bit
newDepth = 8;
} else if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
png_set_expand(png_ptr); // transparency
@ -590,7 +591,7 @@ void Bitmap::savePNG(Stream *stream) const {
}
/* Error handling */
if (setjmp(png_ptr->jmpbuf)) {
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_write_struct(&png_ptr, &info_ptr);
Log(EError, "Error writing the PNG file");
}

View File

@ -14,7 +14,7 @@ FileResolver::FileResolver() {
addPath(MTS_RESOURCE_DIR);
#elif defined(__OSX__)
MTS_AUTORELEASE_BEGIN()
Thread::getThread()->getFileResolver()->addPath(__ubi_bundlepath());
addPath(__ubi_bundlepath());
MTS_AUTORELEASE_END()
#elif defined(WIN32)
char lpFilename[1024];

View File

@ -238,6 +238,10 @@ std::string Thread::toString() const {
}
void Thread::staticInitialization() {
#if defined(__OSX__)
__ubi_autorelease_init();
#endif
m_self = new ThreadLocal<Thread>();
#if defined(__LINUX__) || defined(__OSX__)
m_idMutex = new Mutex();
@ -252,7 +256,6 @@ void Thread::staticInitialization() {
m_self->set(mainThread);
#if defined(__OSX__)
mainThread->m_id = 0;
__ubi_autorelease_init();
#elif defined(__LINUX__)
m_id = 0;
#endif

View File

@ -359,8 +359,6 @@ void GLRenderer::endDrawingMeshes() {
}
void GLRenderer::drawAll() {
if (true)
return;
GLRenderer::beginDrawingMeshes(true);
std::map<const TriMesh *, GPUGeometry *>::iterator it;
if (m_capabilities->isSupported(RendererCapabilities::EBindless)) {

View File

@ -620,20 +620,6 @@ void Scene::serialize(Stream *stream, InstanceManager *manager) const {
manager->serialize(stream, m_netObjects[i]);
}
template<class T> std::string listToString(const std::vector<T> &vec) {
std::ostringstream oss;
oss << "{" << endl;
for (size_t i=0; i<vec.size(); ++i) {
oss << " " << indent(vec[i]->toString());
if (i != vec.size()-1)
oss << "," << endl;
else
oss << endl;
}
oss << "}";
return oss.str();
}
std::string Scene::toString() const {
std::ostringstream oss;

View File

@ -332,29 +332,42 @@ public:
Log(EInfo, " eigs(M) = %s", vecToString(eigs).c_str());
Log(EInfo, " P = %s", mtxToString(m_P).c_str());
#endif
m_kdTree = new KDTree();
}
FlakeMedium(Stream *stream, InstanceManager *manager)
: Medium(stream, manager) {
m_shape = static_cast<Shape *>(manager->getInstance(stream));
m_kdTree = new KDTree();
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
size_t shapeCount = stream->readUInt();
for (size_t i=0; i<shapeCount; ++i)
addChild("", static_cast<Shape *>(manager->getInstance(stream)));
m_D = SHVector(stream);
m_sigmaS = SHVector(stream);
m_sigmaT = SHVector(stream);
m_area = stream->readFloat();
m_rho = stream->readFloat();
m_frame = Frame(stream);
configure();
}
virtual ~FlakeMedium() {
for (size_t i=0; i<m_shapes.size(); ++i)
m_shapes[i]->decRef();
}
void configure() {
Medium::configure();
if (m_shapes.size() == 0)
Log(EError, "This medium requires one or more Shape instance as a child");
m_kdTree->build();
m_aabb = m_kdTree->getAABB();
}
void serialize(Stream *stream, InstanceManager *manager) const {
Medium::serialize(stream, manager);
manager->serialize(stream, m_shape.get());
stream->writeUInt((uint32_t) m_shapes.size());
for (size_t i=0; i<m_shapes.size(); ++i)
manager->serialize(stream, m_shapes[i]);
m_D.serialize(stream);
m_sigmaS.serialize(stream);
m_sigmaT.serialize(stream);
@ -478,17 +491,25 @@ public:
void setParent(ConfigurableObject *parent) {
if (parent->getClass()->derivesFrom(Shape::m_theClass))
Log(EError, "Medium shape cannot be part of the scene");
Log(EError, "Medium cannot be a parent of a shape");
}
void addChild(const std::string &name, ConfigurableObject *child) {
if (child->getClass()->derivesFrom(Shape::m_theClass)) {
Assert(m_shape == NULL);
m_shape = static_cast<Shape *>(child);
m_kdTree = new KDTree();
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
m_aabb = m_kdTree->getAABB();
Shape *shape = static_cast<Shape *>(child);
if (shape->isCompound()) {
int ctr = 0;
while (true) {
ref<Shape> childShape = shape->getElement(ctr++);
if (!childShape)
break;
addChild("", childShape);
}
} else {
m_kdTree->addShape(shape);
shape->incRef();
m_shapes.push_back(shape);
}
} else {
Medium::addChild(name, child);
}
@ -499,15 +520,15 @@ public:
oss << "FlakeMedium[" << endl
<< " area = " << m_area << "," << std::endl
<< " rho = " << m_rho << "," << std::endl
<< " shape = " << indent(m_shape->toString()) << std::endl
<< " shapes = " << indent(listToString(m_shapes)) << std::endl
<< "]";
return oss.str();
}
MTS_DECLARE_CLASS()
private:
ref<Shape> m_shape;
ref<KDTree> m_kdTree;
std::vector<Shape *> m_shapes;
SHVector m_D, m_sigmaS, m_sigmaT;
Float m_area, m_rho;
Frame m_frame;

View File

@ -203,12 +203,16 @@ public:
m_sigmaT.convolve(absCos);
m_sigmaT *= 2;
Assert(m_sigmaT.isAzimuthallyInvariant());
m_kdTree = new KDTree();
}
/* Unserialize from a binary data stream */
HeterogeneousFlakeMedium(Stream *stream, InstanceManager *manager)
: Medium(stream, manager) {
m_shape = static_cast<Shape *>(manager->getInstance(stream));
m_kdTree = new KDTree();
size_t shapeCount = stream->readUInt();
for (size_t i=0; i<shapeCount; ++i)
addChild("", static_cast<Shape *>(manager->getInstance(stream)));
m_densities = static_cast<VolumeDataSource *>(manager->getInstance(stream));
m_albedo = static_cast<VolumeDataSource *>(manager->getInstance(stream));
m_orientations = static_cast<VolumeDataSource *>(manager->getInstance(stream));
@ -220,21 +224,20 @@ public:
m_sigmaT = SHVector(stream);
m_phaseExpansion = SHVector4D(stream);
m_samplingRecursions = stream->readInt();
m_kdTree = new KDTree();
if (m_shape != NULL) {
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
}
configure();
}
virtual ~HeterogeneousFlakeMedium() {
for (size_t i=0; i<m_shapes.size(); ++i)
m_shapes[i]->decRef();
}
/* Serialize the volume to a binary data stream */
void serialize(Stream *stream, InstanceManager *manager) const {
Medium::serialize(stream, manager);
manager->serialize(stream, m_shape.get());
stream->writeUInt((uint32_t) m_shapes.size());
for (size_t i=0; i<m_shapes.size(); ++i)
manager->serialize(stream, m_shapes[i]);
manager->serialize(stream, m_densities.get());
manager->serialize(stream, m_albedo.get());
manager->serialize(stream, m_orientations.get());
@ -270,19 +273,36 @@ public:
m_phaseFunction = new FlakePhaseFunction(m_sigmaT, m_samplingRecursions,
&m_phaseExpansion, m_exponent, m_normalization, m_fiber, this);
if (m_shape != NULL)
if (m_shapes.size() > 0) {
m_kdTree->build();
m_aabb = m_kdTree->getAABB();
else
} else {
m_aabb = m_densities->getAABB();
}
}
void setParent(ConfigurableObject *parent) {
if (parent->getClass()->derivesFrom(Shape::m_theClass))
Log(EError, "Medium cannot be a parent of a shape");
}
void addChild(const std::string &name, ConfigurableObject *child) {
if (child->getClass()->derivesFrom(Shape::m_theClass)) {
Assert(m_shape == NULL);
m_shape = static_cast<Shape *>(child);
m_kdTree = new KDTree();
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
Shape *shape = static_cast<Shape *>(child);
if (shape->isCompound()) {
int ctr = 0;
while (true) {
ref<Shape> childShape = shape->getElement(ctr++);
if (!childShape)
break;
addChild("", childShape);
}
} else {
m_kdTree->addShape(shape);
shape->incRef();
m_shapes.push_back(shape);
}
} else if (child->getClass()->derivesFrom(VolumeDataSource::m_theClass)) {
VolumeDataSource *volume = static_cast<VolumeDataSource *>(child);
@ -302,7 +322,7 @@ public:
}
Float distanceToMediumEntry(const Ray &ray) const {
if (m_shape != NULL) {
if (m_shapes.size() != 0) {
Ray r(ray, Epsilon, std::numeric_limits<Float>::infinity());
Intersection its;
if (!m_kdTree->rayIntersect(r, its))
@ -320,7 +340,7 @@ public:
}
Float distanceToMediumExit(const Ray &ray) const {
if (m_shape != NULL) {
if (m_shapes.size() != 0) {
Ray r(ray, Epsilon, std::numeric_limits<Float>::infinity());
Intersection its;
if (!m_kdTree->rayIntersect(r, its))
@ -528,10 +548,10 @@ public:
std::string toString() const {
std::ostringstream oss;
oss << "HeterogeneousFlakeMedium[" << endl
<< " albedo=" << indent(m_albedo.toString()) << endl
<< " orientations=" << indent(m_orientations.toString()) << endl
<< " densities=" << indent(m_densities.toString()) << endl
<< " shape =" << indent(m_shape.toString()) << endl
<< " albedo=" << indent(m_albedo.toString()) << "," << endl
<< " orientations=" << indent(m_orientations.toString()) << "," << endl
<< " densities=" << indent(m_densities.toString()) << "," << endl
<< " shapes = " << indent(listToString(m_shapes)) << endl
<< "]";
return oss.str();
}
@ -540,8 +560,8 @@ private:
ref<VolumeDataSource> m_densities;
ref<VolumeDataSource> m_albedo;
ref<VolumeDataSource> m_orientations;
ref<Shape> m_shape;
ref<KDTree> m_kdTree;
std::vector<Shape *> m_shapes;
Float m_stepSize;
/* Flake model-related */
SHVector m_D, m_sigmaT;

View File

@ -34,32 +34,35 @@ class HeterogeneousStencilMedium : public Medium {
public:
HeterogeneousStencilMedium(const Properties &props)
: Medium(props) {
m_kdTree = new KDTree();
m_stepSize = props.getFloat("stepSize", 0);
}
/* Unserialize from a binary data stream */
HeterogeneousStencilMedium(Stream *stream, InstanceManager *manager)
: Medium(stream, manager) {
m_shape = static_cast<Shape *>(manager->getInstance(stream));
m_kdTree = new KDTree();
size_t shapeCount = stream->readUInt();
for (size_t i=0; i<shapeCount; ++i)
addChild("", static_cast<Shape *>(manager->getInstance(stream)));
m_densities = static_cast<VolumeDataSource *>(manager->getInstance(stream));
m_albedo = static_cast<VolumeDataSource *>(manager->getInstance(stream));
m_orientations = static_cast<VolumeDataSource *>(manager->getInstance(stream));
m_stepSize = stream->readFloat();
m_kdTree = new KDTree();
if (m_shape != NULL) {
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
}
configure();
}
virtual ~HeterogeneousStencilMedium() {
for (size_t i=0; i<m_shapes.size(); ++i)
m_shapes[i]->decRef();
}
/* Serialize the volume to a binary data stream */
void serialize(Stream *stream, InstanceManager *manager) const {
Medium::serialize(stream, manager);
manager->serialize(stream, m_shape.get());
stream->writeUInt((uint32_t) m_shapes.size());
for (size_t i=0; i<m_shapes.size(); ++i)
manager->serialize(stream, m_shapes[i]);
manager->serialize(stream, m_densities.get());
manager->serialize(stream, m_albedo.get());
manager->serialize(stream, m_orientations.get());
@ -75,11 +78,12 @@ public:
if (m_orientations.get() == NULL)
Log(EError, "No orientations specified!");
if (m_shape != NULL)
if (m_shapes.size() != 0) {
m_kdTree->build();
m_aabb = m_kdTree->getAABB();
else
} else {
m_aabb = m_densities->getAABB();
}
if (m_stepSize == 0) {
m_stepSize = std::min(std::min(
@ -94,11 +98,20 @@ public:
void addChild(const std::string &name, ConfigurableObject *child) {
if (child->getClass()->derivesFrom(Shape::m_theClass)) {
Assert(m_shape == NULL);
m_shape = static_cast<Shape *>(child);
m_kdTree = new KDTree();
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
Shape *shape = static_cast<Shape *>(child);
if (shape->isCompound()) {
int ctr = 0;
while (true) {
ref<Shape> childShape = shape->getElement(ctr++);
if (!childShape)
break;
addChild("", childShape);
}
} else {
m_kdTree->addShape(shape);
shape->incRef();
m_shapes.push_back(shape);
}
} else if (child->getClass()->derivesFrom(VolumeDataSource::m_theClass)) {
VolumeDataSource *volume = static_cast<VolumeDataSource *>(child);
@ -118,7 +131,7 @@ public:
}
Float distanceToMediumEntry(const Ray &ray) const {
if (m_shape != NULL) {
if (m_shapes.size() != 0) {
Ray r(ray, Epsilon, std::numeric_limits<Float>::infinity());
Intersection its;
if (!m_kdTree->rayIntersect(r, its))
@ -136,7 +149,7 @@ public:
}
Float distanceToMediumExit(const Ray &ray) const {
if (m_shape != NULL) {
if (m_shapes.size() != 0) {
Ray r(ray, Epsilon, std::numeric_limits<Float>::infinity());
Intersection its;
if (!m_kdTree->rayIntersect(r, its))
@ -322,8 +335,7 @@ public:
oss << "HeterogeneousStencilMedium[" << endl
<< " albedo=" << indent(m_albedo.toString()) << endl
<< " orientations=" << indent(m_orientations.toString()) << endl
<< " densities=" << indent(m_densities.toString()) << endl
<< " shape =" << indent(m_shape.toString()) << endl
<< " densities=" << indent(m_densities.toString())
<< "]";
return oss.str();
}
@ -332,8 +344,8 @@ private:
ref<VolumeDataSource> m_densities;
ref<VolumeDataSource> m_albedo;
ref<VolumeDataSource> m_orientations;
ref<Shape> m_shape;
ref<KDTree> m_kdTree;
std::vector<Shape *> m_shapes;
Float m_stepSize;
};

View File

@ -66,14 +66,15 @@ public:
coeffs[i] = m_sigmaT[i];
m_maxExpDist = new MaxExpDist(coeffs);
m_kdTree = new KDTree();
}
HomogeneousMedium(Stream *stream, InstanceManager *manager)
: Medium(stream, manager) {
m_shape = static_cast<Shape *>(manager->getInstance(stream));
m_kdTree = new KDTree();
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
size_t shapeCount = stream->readUInt();
for (size_t i=0; i<shapeCount; ++i)
addChild("", static_cast<Shape *>(manager->getInstance(stream)));
m_channel = stream->readInt();
m_strategy = (ESamplingStrategy) stream->readInt();
m_sigma = stream->readFloat();
@ -82,16 +83,21 @@ public:
for (int i=0; i<SPECTRUM_SAMPLES; ++i)
coeffs[i] = m_sigmaT[i];
configure();
m_maxExpDist = new MaxExpDist(coeffs);
}
virtual ~HomogeneousMedium() {
for (size_t i=0; i<m_shapes.size(); ++i)
m_shapes[i]->decRef();
delete m_maxExpDist;
}
void serialize(Stream *stream, InstanceManager *manager) const {
Medium::serialize(stream, manager);
manager->serialize(stream, m_shape.get());
stream->writeUInt((uint32_t) m_shapes.size());
for (size_t i=0; i<m_shapes.size(); ++i)
manager->serialize(stream, m_shapes[i]);
stream->writeInt(m_channel);
stream->writeInt(m_strategy);
stream->writeFloat(m_sigma);
@ -99,8 +105,10 @@ public:
void configure() {
Medium::configure();
if (m_shape.get() == NULL)
Log(EError, "This medium requires a Shape instance as a child ");
if (m_shapes.size() == 0)
Log(EError, "This medium requires one or more Shape instance as a child");
m_kdTree->build();
m_aabb = m_kdTree->getAABB();
}
bool isInside(const Ray &r) const {
@ -267,17 +275,25 @@ public:
void setParent(ConfigurableObject *parent) {
if (parent->getClass()->derivesFrom(Shape::m_theClass))
Log(EError, "Medium shape cannot be part of the scene");
Log(EError, "Medium cannot be a parent of a shape");
}
void addChild(const std::string &name, ConfigurableObject *child) {
if (child->getClass()->derivesFrom(Shape::m_theClass)) {
Assert(m_shape == NULL);
m_shape = static_cast<Shape *>(child);
m_kdTree = new KDTree();
m_kdTree->addShape(m_shape.get());
m_kdTree->build();
m_aabb = m_kdTree->getAABB();
Shape *shape = static_cast<Shape *>(child);
if (shape->isCompound()) {
int ctr = 0;
while (true) {
ref<Shape> childShape = shape->getElement(ctr++);
if (!childShape)
break;
addChild("", childShape);
}
} else {
m_kdTree->addShape(shape);
shape->incRef();
m_shapes.push_back(shape);
}
} else {
Medium::addChild(name, child);
}
@ -290,15 +306,15 @@ public:
<< " sigmaS = " << m_sigmaS.toString() << "," << std::endl
<< " sigmaT = " << m_sigmaT.toString() << "," << std::endl
<< " phase = " << indent(m_phaseFunction->toString()) << "," << std::endl
<< " shape = " << indent(m_shape->toString()) << std::endl
<< " shapes = " << indent(listToString(m_shapes)) << std::endl
<< "]";
return oss.str();
}
MTS_DECLARE_CLASS()
private:
ref<Shape> m_shape;
ref<KDTree> m_kdTree;
std::vector<Shape *> m_shapes;
int m_channel;
Float m_sigma;
ESamplingStrategy m_strategy;

View File

@ -54,7 +54,8 @@ void ImportDialog::changeEvent(QEvent *e) {
void ImportDialog::on_inputBrowse_clicked(bool checked) {
QFileDialog dialog(this);
dialog.setNameFilter(tr("COLLADA 1.4 scenes (*.dae *.zae);; Wavefront OBJ scenes (*.obj)"));
dialog.setNameFilter(tr("All supported formats (*.dae *.zae *.obj);;"
"COLLADA 1.4 scenes (*.dae *.zae);; Wavefront OBJ scenes (*.obj)"));
dialog.setAcceptMode(QFileDialog::AcceptOpen);
dialog.setViewMode(QFileDialog::Detail);
dialog.setWindowModality(Qt::ApplicationModal);

View File

@ -225,7 +225,7 @@ MainWindow::MainWindow(QWidget *parent) :
/* Submit crash reports on OSX */
QDir crashDir = QDir::home();
crashDir.cd("Library/Logs/CrashReporter");
QFileInfoList crashReports = crashDir.entryInfoList(QStringList("qtgui_*"),
QFileInfoList crashReports = crashDir.entryInfoList(QStringList("mtsgui_*"),
QDir::Files, QDir::Name);
if (crashReports.size() > 0) {
@ -292,6 +292,15 @@ MainWindow::MainWindow(QWidget *parent) :
QMessageBox::information(this, tr("Crash reporter"),
tr("All crash reports have been submitted. Thank you!"),
QMessageBox::Ok);
} else {
for (int i=0; i<crashReports.size(); ++i) {
QFile file(crashReports[i].absoluteFilePath());
if (!file.remove()) {
QMessageBox::critical(this, tr("Unable to submitted crash report"),
tr("Unable to delete a crash report -- please check the file permissions in ~/Library/Logs/CrashReporter."), QMessageBox::Ok);
break;
}
}
}
}
#endif
@ -534,7 +543,8 @@ void MainWindow::onProgressMessage(const RenderJob *job, const QString &name,
void MainWindow::on_actionOpen_triggered() {
QFileDialog *dialog = new QFileDialog(this, Qt::Sheet);
dialog->setNameFilter(tr("Mitsuba scenes (*.xml);;EXR images (*.exr)"));
dialog->setNameFilter(tr("All supported formats (*.xml *.exr);;"
"Mitsuba scenes (*.xml);;EXR images (*.exr)"));
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setAcceptMode(QFileDialog::AcceptOpen);
dialog->setViewMode(QFileDialog::Detail);
@ -1208,7 +1218,8 @@ inline float toSRGB(float value) {
void MainWindow::on_actionExportImage_triggered() {
SceneContext *ctx = m_context[ui->tabBar->currentIndex()];
QFileDialog dialog(this, tr("Export image .."),
"", tr("Linear EXR Image (*.exr);; Tonemapped 8-bit PNG Image (*.png)"));
"", tr("All supported formats (*.exr *.png);;Linear EXR Image (*.exr)"
";; Tonemapped 8-bit PNG Image (*.png)"));
QSettings settings("mitsuba-renderer.org", "qtgui");
dialog.setViewMode(QFileDialog::Detail);

Binary file not shown.

Binary file not shown.

Binary file not shown.