Fixed CanvasPortion using the same temp files across processes
This commit is contained in:
parent
6166031c8b
commit
10f8f46ca6
7 changed files with 42 additions and 3 deletions
1
TODO
1
TODO
|
@ -6,7 +6,6 @@ Technlology Preview 2 :
|
||||||
- Refactor medium traversal to unify clouds, atmosphere and god rays.
|
- Refactor medium traversal to unify clouds, atmosphere and god rays.
|
||||||
- Fix potential holes in land rendering (OpenGL and software).
|
- Fix potential holes in land rendering (OpenGL and software).
|
||||||
- Fix sun size not being consistent between opengl and software
|
- Fix sun size not being consistent between opengl and software
|
||||||
- Fix CanvasPortion saves colliding on disk when running several instances
|
|
||||||
|
|
||||||
Technology Preview 3 :
|
Technology Preview 3 :
|
||||||
- Alter aerial perspective using estimation of the amount of light left after cloud layers traversal.
|
- Alter aerial perspective using estimation of the amount of light left after cloud layers traversal.
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
#include "CanvasPortion.h"
|
#include "CanvasPortion.h"
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "CanvasPixel.h"
|
#include "CanvasPixel.h"
|
||||||
#include "CanvasPreview.h"
|
#include "CanvasPreview.h"
|
||||||
#include "PackStream.h"
|
#include "PackStream.h"
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
|
#include "System.h"
|
||||||
|
|
||||||
#define CHECK_COORDINATES() \
|
#define CHECK_COORDINATES() \
|
||||||
assert(x >= 0); \
|
assert(x >= 0); \
|
||||||
|
@ -14,6 +17,15 @@
|
||||||
assert(y < height); \
|
assert(y < height); \
|
||||||
assert(pixels != NULL)
|
assert(pixels != NULL)
|
||||||
|
|
||||||
|
// Keep track of created files to erase them at program exit
|
||||||
|
static std::vector<std::string> _files;
|
||||||
|
static void clean_all_files() {
|
||||||
|
for (auto &filepath : _files) {
|
||||||
|
FileSystem::removeFile(filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static int _atexit = std::atexit(clean_all_files);
|
||||||
|
|
||||||
CanvasPortion::CanvasPortion(int index, CanvasPreview *preview) : index(index), preview(preview) {
|
CanvasPortion::CanvasPortion(int index, CanvasPreview *preview) : index(index), preview(preview) {
|
||||||
width = 1;
|
width = 1;
|
||||||
height = 1;
|
height = 1;
|
||||||
|
@ -73,7 +85,9 @@ void CanvasPortion::discardPixels(bool save) {
|
||||||
|
|
||||||
void CanvasPortion::saveToDisk() {
|
void CanvasPortion::saveToDisk() {
|
||||||
if (pixels) {
|
if (pixels) {
|
||||||
filepath = FileSystem::getTempFile("paysages_portion_" + std::to_string(index) + ".dat");
|
auto pid = System::getProcessId();
|
||||||
|
filepath =
|
||||||
|
FileSystem::getTempFile("paysages_portion_" + std::to_string(index) + "_" + std::to_string(pid) + ".dat");
|
||||||
PackStream stream;
|
PackStream stream;
|
||||||
stream.bindToFile(filepath, true);
|
stream.bindToFile(filepath, true);
|
||||||
stream.write(&width);
|
stream.write(&width);
|
||||||
|
@ -83,6 +97,7 @@ void CanvasPortion::saveToDisk() {
|
||||||
pixels[y * width + x].getComposite().save(&stream);
|
pixels[y * width + x].getComposite().save(&stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_files.push_back(filepath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
std::string FileSystem::getTempFile(const std::string &filename) {
|
std::string FileSystem::getTempFile(const std::string &filename) {
|
||||||
return QDir::temp().filePath(QString::fromStdString(filename)).toStdString();
|
return QDir::temp().filePath(QString::fromStdString(filename)).toStdString();
|
||||||
|
@ -10,3 +11,9 @@ std::string FileSystem::getTempFile(const std::string &filename) {
|
||||||
bool FileSystem::isFile(const std::string &filepath) {
|
bool FileSystem::isFile(const std::string &filepath) {
|
||||||
return QFileInfo(QString::fromStdString(filepath)).exists();
|
return QFileInfo(QString::fromStdString(filepath)).exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FileSystem::removeFile(const std::string &filepath) {
|
||||||
|
if (FileSystem::isFile(filepath)) {
|
||||||
|
remove(filepath.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,11 @@ class SYSTEMSHARED_EXPORT FileSystem {
|
||||||
* Returns true if the given path points to a file.
|
* Returns true if the given path points to a file.
|
||||||
*/
|
*/
|
||||||
static bool isFile(const std::string &filepath);
|
static bool isFile(const std::string &filepath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a file by its absolute path.
|
||||||
|
*/
|
||||||
|
static bool removeFile(const std::string &filepath);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,6 @@ void PackStream::skip(const double &value, int count) {
|
||||||
stream->skipRawData(sizeof(value) * count);
|
stream->skipRawData(sizeof(value) * count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void paysages::system::PackStream::skipBytes(int bytes) {
|
void PackStream::skipBytes(int bytes) {
|
||||||
stream->skipRawData(bytes);
|
stream->skipRawData(bytes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
|
||||||
static int core_count = -1;
|
static int core_count = -1;
|
||||||
|
|
||||||
|
@ -18,3 +19,7 @@ int System::getCoreCount() {
|
||||||
}
|
}
|
||||||
return core_count;
|
return core_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int System::getProcessId() {
|
||||||
|
return QCoreApplication::applicationPid();
|
||||||
|
}
|
||||||
|
|
|
@ -11,7 +11,15 @@ namespace system {
|
||||||
*/
|
*/
|
||||||
class SYSTEMSHARED_EXPORT System {
|
class SYSTEMSHARED_EXPORT System {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Get the number of CPU cores available on current system.
|
||||||
|
*/
|
||||||
static int getCoreCount();
|
static int getCoreCount();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an identifying number for the current process.
|
||||||
|
*/
|
||||||
|
static int getProcessId();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue