paysages : Adding OSD to previews (WIP).

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@361 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-06-25 20:11:15 +00:00 committed by ThunderK
parent b6555f822c
commit ba24057b97
10 changed files with 171 additions and 35 deletions

View file

@ -14,6 +14,7 @@ Scenery :
* Added sun halo control. * Added sun halo control.
* New cloud model with 2 noises : one for the global shape and one for edges. * New cloud model with 2 noises : one for the global shape and one for edges.
* Terrain shadows have been improved and are now configurable. * Terrain shadows have been improved and are now configurable.
* New sky model (based on Preetham's work).
Rendering : Rendering :
* New texture model (perpendicular displacement and thickness). * New texture model (perpendicular displacement and thickness).

7
TODO
View file

@ -7,7 +7,6 @@ Technology Preview 2 :
- Keep skydome lights in cache for a render. - Keep skydome lights in cache for a render.
- Disable form fields when no layer is selected. - Disable form fields when no layer is selected.
- Add buttons to restore "auto" default values in tabs and dialogs. - Add buttons to restore "auto" default values in tabs and dialogs.
- Remove color gradations (replace with automatic boolean and simple colors).
- Replace zone ranges with curves (with curve input and curve dialog). - Replace zone ranges with curves (with curve input and curve dialog).
- Interface for textures thickness, slope_range and thickness_transparency (and correct slider ranges). - Interface for textures thickness, slope_range and thickness_transparency (and correct slider ranges).
- Add "hardness to light" and shadow control ("minimum lighting") to material. - Add "hardness to light" and shadow control ("minimum lighting") to material.
@ -35,16 +34,16 @@ Technology Preview 2 :
Technology Preview 3 : Technology Preview 3 :
- Restore render progress. - Restore render progress.
- Implement High Dynamic Range. - Implement High Dynamic Range.
- Implement Sub Surface Scattering for water.
- Use bicubic interpolation for antialiasing. - Use bicubic interpolation for antialiasing.
- Improve large render/antialias memory consumption. - Allow for larger renders/antialias (will need several two-pass chunks).
- Add basic vegetation system ? - Add basic vegetation system ?
- Texture shadowing and self-shadowing ? - Texture shadowing and self-shadowing ?
- Improve sky rendering (colors and light halo).
- Add a progress indicator on previews. - Add a progress indicator on previews.
- Multi threaded first pass. - Multi threaded first pass.
- Mark modified tabs and ask for losing modifications (idem for layers). - Mark modified tabs and ask for losing modifications (idem for layers).
- Fix potential holes in land rendering. - Fix potential holes in land rendering.
- Progressive final render. - Progressive final render (increasing resolution, for second pass only).
- Propose several backgrounds for water preview (grid, sinus...). - Propose several backgrounds for water preview (grid, sinus...).
- Water and terrain LOD moves with the camera, fix it like in the wanderer. - Water and terrain LOD moves with the camera, fix it like in the wanderer.
- Improve 3d explorer - Improve 3d explorer

View file

@ -297,6 +297,11 @@ BasePreview::~BasePreview()
delete lock_drawing; delete lock_drawing;
} }
void BasePreview::addOsd(QString name)
{
_osd.append(PreviewOsd::getInstance(name));
}
void BasePreview::initDrawers() void BasePreview::initDrawers()
{ {
_drawing_manager = new PreviewDrawingManager(); _drawing_manager = new PreviewDrawingManager();
@ -442,6 +447,14 @@ void BasePreview::paintEvent(QPaintEvent* event)
{ {
QPainter painter(this); QPainter painter(this);
painter.drawImage(0, 0, *this->pixbuf); painter.drawImage(0, 0, *this->pixbuf);
QImage osd(pixbuf->size(), pixbuf->format());
osd.fill(0x00000000);
for (int i = 0; i < _osd.size(); i++)
{
_osd[i]->apply(&osd, xoffset, yoffset, scaling);
}
painter.drawImage(0, 0, osd);
} }
void BasePreview::updateScaling() void BasePreview::updateScaling()

View file

@ -7,6 +7,7 @@
#include <QThread> #include <QThread>
#include <QVector> #include <QVector>
#include <QList> #include <QList>
#include "previewosd.h"
class BasePreview : public QWidget { class BasePreview : public QWidget {
Q_OBJECT Q_OBJECT
@ -14,6 +15,8 @@ class BasePreview : public QWidget {
public: public:
BasePreview(QWidget* parent); BasePreview(QWidget* parent);
~BasePreview(); ~BasePreview();
void addOsd(QString name);
static void initDrawers(); static void initDrawers();
static void stopDrawers(); static void stopDrawers();
@ -52,6 +55,7 @@ private:
QMutex* lock_drawing; QMutex* lock_drawing;
QImage* pixbuf; QImage* pixbuf;
QVector<PreviewOsd*> _osd;
int _width; int _width;
int _height; int _height;

View file

@ -107,7 +107,7 @@ FormSky::FormSky(QWidget *parent):
addPreview(previewEast, QString(tr("East preview"))); addPreview(previewEast, QString(tr("East preview")));
addInputEnum(tr("Color model"), (int*)&_definition.model, QStringList(tr("Custom model")) << tr("Rayleigh/Mie scattering") << tr("Preetham/Shirley analytic model")); addInputEnum(tr("Color model"), (int*)&_definition.model, QStringList(tr("Custom model")) << tr("Rayleigh/Mie scattering") << tr("Preetham/Shirley analytic model"));
addInputDouble(tr("Day time"), &_definition.daytime, 0.0, 1.0, 0.002, 0.1); addInputDouble(tr("Day time"), &_definition.daytime, 0.14, 0.86, 0.002, 0.1);
addInputColor(tr("Sun color"), &_definition.sun_color); addInputColor(tr("Sun color"), &_definition.sun_color);
addInputDouble(tr("Sun radius"), &_definition.sun_radius, 0.0, 0.4, 0.004, 0.04); addInputDouble(tr("Sun radius"), &_definition.sun_radius, 0.0, 0.4, 0.004, 0.04);
addInputDouble(tr("Sun halo radius"), &_definition.sun_halo_size, 0.0, 0.4, 0.004, 0.04); addInputDouble(tr("Sun halo radius"), &_definition.sun_halo_size, 0.0, 0.4, 0.004, 0.04);

View file

@ -1,9 +1,9 @@
#include "formterrain.h" #include "formterrain.h"
#include "tools.h" #include <math.h>
#include <QColor> #include <QColor>
#include <QSlider> #include <QSlider>
#include <math.h> #include "tools.h"
#include "../lib_paysages/terrain.h" #include "../lib_paysages/terrain.h"
#include "../lib_paysages/scenery.h" #include "../lib_paysages/scenery.h"
@ -19,6 +19,8 @@ public:
{ {
_preview_definition = terrainCreateDefinition(); _preview_definition = terrainCreateDefinition();
addOsd(QString("geolocation"));
configScaling(0.5, 200.0, 3.0, 50.0); configScaling(0.5, 200.0, 3.0, 50.0);
configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0); configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0);
} }
@ -93,6 +95,8 @@ public:
_renderer.customData[0] = &_terrain; _renderer.customData[0] = &_terrain;
_renderer.customData[1] = &_textures; _renderer.customData[1] = &_textures;
_renderer.customData[2] = &_lighting; _renderer.customData[2] = &_lighting;
addOsd(QString("geolocation"));
configScaling(0.5, 200.0, 3.0, 50.0); configScaling(0.5, 200.0, 3.0, 50.0);
configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0); configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0);

View file

@ -143,11 +143,15 @@ bool MainWindow::event(QEvent* event)
void MainWindow::refreshAll() void MainWindow::refreshAll()
{ {
// Refresh all tabs
QList<BaseForm*> list_forms = this->findChildren<BaseForm*>("_base_form_"); QList<BaseForm*> list_forms = this->findChildren<BaseForm*>("_base_form_");
for (int i = 0; i < list_forms.size(); i++) for (int i = 0; i < list_forms.size(); i++)
{ {
list_forms[i]->revertConfig(); list_forms[i]->revertConfig();
} }
// Refresh preview OSD
//PreviewOsd* osd = PreviewOsd::getInstance(QString("geolocation"));
} }
void MainWindow::fileNew() void MainWindow::fileNew()

75
gui_qt/previewosd.cpp Normal file
View file

@ -0,0 +1,75 @@
#include "previewosd.h"
#include <QHash>
#include <QPainter>
static QHash<QString, PreviewOsd*> _instances;
/*************** PreviewOsdItem ***************/
PreviewOsdItem::PreviewOsdItem(int width, int height) : QImage(width, height, QImage::Format_ARGB32)
{
_xlocation = 0.0;
_ylocation = 0.0;
}
void PreviewOsdItem::setLocation(double x, double y)
{
_xlocation = x;
_ylocation = y;
}
/*************** PreviewOsd ***************/
PreviewOsd::PreviewOsd()
{
newItem(50, 50)->fill(0x88888888);
}
PreviewOsd::~PreviewOsd()
{
for (int i = 0; i < _items.size(); i++)
{
delete _items[i];
}
}
PreviewOsd* PreviewOsd::getInstance(QString name)
{
if (_instances.contains(name))
{
return _instances[name];
}
else
{
PreviewOsd* instance = new PreviewOsd();
_instances.insert(name, instance);
return instance;
}
}
PreviewOsdItem* PreviewOsd::newItem(int width, int height)
{
PreviewOsdItem* item = new PreviewOsdItem(width, height);
_items.append(item);
return item;
}
PreviewOsdItem* PreviewOsd::newItem(QImage image)
{
PreviewOsdItem* item = newItem(image.width(), image.height());
QPainter painter(item);
painter.drawImage(0, 0, image);
return item;
}
void PreviewOsd::apply(QImage* mask, double xoffset, double yoffset, double scaling)
{
QPainter painter(mask);
for (int i = 0; i < _items.size(); i++)
{
PreviewOsdItem* item = _items[i];
int x = (int)(mask->width() / 2 - (xoffset - item->xlocation()) / scaling - item->width() / 2);
int y = (int)(mask->height() / 2 - (yoffset - item->ylocation()) / scaling - item->height() / 2);
painter.drawImage(x, y, *item);
}
}

36
gui_qt/previewosd.h Normal file
View file

@ -0,0 +1,36 @@
#ifndef _PAYSAGES_QT_PREVIEWOSD_H_
#define _PAYSAGES_QT_PREVIEWOSD_H_
#include <QImage>
class PreviewOsdItem:public QImage
{
public:
PreviewOsdItem(int width, int height);
void setLocation(double x, double y);
inline double xlocation() {return _xlocation;};
inline double ylocation() {return _ylocation;};
private:
double _xlocation;
double _ylocation;
};
class PreviewOsd
{
public:
PreviewOsd();
~PreviewOsd();
static PreviewOsd* getInstance(QString name);
PreviewOsdItem* newItem(int width, int height);
PreviewOsdItem* newItem(QImage image);
void apply(QImage* mask, double xoffset, double yoffset, double scaling);
private:
QVector<PreviewOsdItem*> _items;
};
#endif

View file

@ -689,7 +689,7 @@ Maintenir Ctrl : Plus rapide</translation>
<context> <context>
<name>FormTerrain</name> <name>FormTerrain</name>
<message> <message>
<location filename="../gui_qt/formterrain.cpp" line="146"/> <location filename="../gui_qt/formterrain.cpp" line="150"/>
<source>Height preview (normalized)</source> <source>Height preview (normalized)</source>
<translation>Aperçu de la hauteur (normalisée)</translation> <translation>Aperçu de la hauteur (normalisée)</translation>
</message> </message>
@ -698,27 +698,27 @@ Maintenir Ctrl : Plus rapide</translation>
<translation type="obsolete">Aperçu du rendu (sans ombres)</translation> <translation type="obsolete">Aperçu du rendu (sans ombres)</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/formterrain.cpp" line="147"/> <location filename="../gui_qt/formterrain.cpp" line="151"/>
<source>Lighted preview (no texture)</source> <source>Lighted preview (no texture)</source>
<translation>Aperçu éclairé (sans texture)</translation> <translation>Aperçu éclairé (sans texture)</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/formterrain.cpp" line="149"/> <location filename="../gui_qt/formterrain.cpp" line="153"/>
<source>Noise</source> <source>Noise</source>
<translation>Bruit</translation> <translation>Bruit</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/formterrain.cpp" line="150"/> <location filename="../gui_qt/formterrain.cpp" line="154"/>
<source>Height</source> <source>Height</source>
<translation>Hauteur</translation> <translation>Hauteur</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/formterrain.cpp" line="151"/> <location filename="../gui_qt/formterrain.cpp" line="155"/>
<source>Scaling</source> <source>Scaling</source>
<translation>Echelle</translation> <translation>Echelle</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/formterrain.cpp" line="152"/> <location filename="../gui_qt/formterrain.cpp" line="156"/>
<source>Shadow smoothing</source> <source>Shadow smoothing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1007,87 +1007,87 @@ rapide (F5)</translation>
<translation>F5</translation> <translation>F5</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="155"/> <location filename="../gui_qt/mainwindow.cpp" line="159"/>
<source>Do you want to start a new scenery ? Any unsaved changes will be lost.</source> <source>Do you want to start a new scenery ? Any unsaved changes will be lost.</source>
<translation>Voulez-vous commencer un nouveau paysage ? Les modifications non sauvegardées seront perdues.</translation> <translation>Voulez-vous commencer un nouveau paysage ? Les modifications non sauvegardées seront perdues.</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="155"/> <location filename="../gui_qt/mainwindow.cpp" line="159"/>
<source>Paysages 3D - New scenery</source> <source>Paysages 3D - New scenery</source>
<translation>Paysages 3D - Nouvelle scène</translation> <translation>Paysages 3D - Nouvelle scène</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="165"/> <location filename="../gui_qt/mainwindow.cpp" line="169"/>
<source>Paysages 3D - Choose a file to save the scenery</source> <source>Paysages 3D - Choose a file to save the scenery</source>
<translation>Paysages 3D - Choisissez un fichier pour enregistrer la scène</translation> <translation>Paysages 3D - Choisissez un fichier pour enregistrer la scène</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="165"/> <location filename="../gui_qt/mainwindow.cpp" line="169"/>
<location filename="../gui_qt/mainwindow.cpp" line="191"/> <location filename="../gui_qt/mainwindow.cpp" line="195"/>
<source>Paysages 3D Scenery (*.p3d)</source> <source>Paysages 3D Scenery (*.p3d)</source>
<translation>Scène Paysages 3D (*.p3d)</translation> <translation>Scène Paysages 3D (*.p3d)</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="179"/> <location filename="../gui_qt/mainwindow.cpp" line="183"/>
<location filename="../gui_qt/mainwindow.cpp" line="182"/> <location filename="../gui_qt/mainwindow.cpp" line="186"/>
<source>Paysages 3D - File saving error</source> <source>Paysages 3D - File saving error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="179"/> <location filename="../gui_qt/mainwindow.cpp" line="183"/>
<source>Can&apos;t write specified file : %1</source> <source>Can&apos;t write specified file : %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="182"/> <location filename="../gui_qt/mainwindow.cpp" line="186"/>
<source>Unexpected error while saving file : %1</source> <source>Unexpected error while saving file : %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="189"/> <location filename="../gui_qt/mainwindow.cpp" line="193"/>
<source>Do you want to load a scenery from file ? Any unsaved changes will be lost.</source> <source>Do you want to load a scenery from file ? Any unsaved changes will be lost.</source>
<translation>Voulez-vous charger une scène ? Les modifications non sauvegardées seront perdues.</translation> <translation>Voulez-vous charger une scène ? Les modifications non sauvegardées seront perdues.</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="189"/> <location filename="../gui_qt/mainwindow.cpp" line="193"/>
<source>Paysages 3D - Load scenery</source> <source>Paysages 3D - Load scenery</source>
<translation>Paysages 3D - Charger une scène</translation> <translation>Paysages 3D - Charger une scène</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="191"/> <location filename="../gui_qt/mainwindow.cpp" line="195"/>
<source>Paysages 3D - Choose a scenery file to load</source> <source>Paysages 3D - Choose a scenery file to load</source>
<translation>Paysages 3D - Choisissez un fichier de scène à charger</translation> <translation>Paysages 3D - Choisissez un fichier de scène à charger</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="201"/> <location filename="../gui_qt/mainwindow.cpp" line="205"/>
<location filename="../gui_qt/mainwindow.cpp" line="204"/> <location filename="../gui_qt/mainwindow.cpp" line="208"/>
<location filename="../gui_qt/mainwindow.cpp" line="207"/> <location filename="../gui_qt/mainwindow.cpp" line="211"/>
<location filename="../gui_qt/mainwindow.cpp" line="210"/> <location filename="../gui_qt/mainwindow.cpp" line="214"/>
<source>Paysages 3D - File loading error</source> <source>Paysages 3D - File loading error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="201"/> <location filename="../gui_qt/mainwindow.cpp" line="205"/>
<source>Can&apos;t read specified file : %1</source> <source>Can&apos;t read specified file : %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="204"/> <location filename="../gui_qt/mainwindow.cpp" line="208"/>
<source>This file doesn&apos;t look like a Paysages 3D file : %1</source> <source>This file doesn&apos;t look like a Paysages 3D file : %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="207"/> <location filename="../gui_qt/mainwindow.cpp" line="211"/>
<source>This file was created with an incompatible Paysages 3D version : %1</source> <source>This file was created with an incompatible Paysages 3D version : %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="210"/> <location filename="../gui_qt/mainwindow.cpp" line="214"/>
<source>Unexpected error while loading file : %1</source> <source>Unexpected error while loading file : %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="218"/> <location filename="../gui_qt/mainwindow.cpp" line="222"/>
<source>A 3D landscape editing and rendering software. <source>A 3D landscape editing and rendering software.
Authors : Authors :
@ -1197,7 +1197,7 @@ GLib - http://www.gtk.org/
<translation type="obsolete">Voulez-vous charger un paysage ? Les modifications nons sauvegardées seront perdues.</translation> <translation type="obsolete">Voulez-vous charger un paysage ? Les modifications nons sauvegardées seront perdues.</translation>
</message> </message>
<message> <message>
<location filename="../gui_qt/mainwindow.cpp" line="218"/> <location filename="../gui_qt/mainwindow.cpp" line="222"/>
<source>Paysages 3D</source> <source>Paysages 3D</source>
<translation>Paysages 3D</translation> <translation>Paysages 3D</translation>
</message> </message>