paysages: Started heavy lighting refactoring (WIP - Broken).
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@230 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
6b9b813753
commit
e265be6105
20 changed files with 592 additions and 180 deletions
|
@ -21,7 +21,7 @@ public:
|
||||||
_noise = noise;
|
_noise = noise;
|
||||||
_level = -1;
|
_level = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLevel(int row)
|
void setLevel(int row)
|
||||||
{
|
{
|
||||||
_level = row;
|
_level = row;
|
||||||
|
@ -76,7 +76,7 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value):
|
||||||
QWidget* form;
|
QWidget* form;
|
||||||
QWidget* buttons;
|
QWidget* buttons;
|
||||||
QPushButton* button;
|
QPushButton* button;
|
||||||
|
|
||||||
_base = value;
|
_base = value;
|
||||||
_current = noiseCreateGenerator();
|
_current = noiseCreateGenerator();
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value):
|
||||||
previews = new QWidget(this);
|
previews = new QWidget(this);
|
||||||
previews->setLayout(new QVBoxLayout());
|
previews->setLayout(new QVBoxLayout());
|
||||||
layout()->addWidget(previews);
|
layout()->addWidget(previews);
|
||||||
|
|
||||||
previewLevel = new PreviewLevel(previews, _current);
|
previewLevel = new PreviewLevel(previews, _current);
|
||||||
previews->layout()->addWidget(new QLabel("Level preview"));
|
previews->layout()->addWidget(new QLabel("Level preview"));
|
||||||
previews->layout()->addWidget(previewLevel);
|
previews->layout()->addWidget(previewLevel);
|
||||||
|
@ -98,16 +98,16 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value):
|
||||||
form = new QWidget(this);
|
form = new QWidget(this);
|
||||||
form->setLayout(new QVBoxLayout());
|
form->setLayout(new QVBoxLayout());
|
||||||
layout()->addWidget(form);
|
layout()->addWidget(form);
|
||||||
|
|
||||||
form->layout()->addWidget(new QLabel("Noise components"));
|
form->layout()->addWidget(new QLabel("Noise components"));
|
||||||
levels = new QListWidget(form);
|
levels = new QListWidget(form);
|
||||||
form->layout()->addWidget(levels);
|
form->layout()->addWidget(levels);
|
||||||
QObject::connect(levels, SIGNAL(currentRowChanged(int)), this, SLOT(levelChanged(int)));
|
QObject::connect(levels, SIGNAL(currentRowChanged(int)), this, SLOT(levelChanged(int)));
|
||||||
|
|
||||||
buttons = new QWidget(form);
|
buttons = new QWidget(form);
|
||||||
buttons->setLayout(new QHBoxLayout());
|
buttons->setLayout(new QHBoxLayout());
|
||||||
form->layout()->addWidget(buttons);
|
form->layout()->addWidget(buttons);
|
||||||
|
|
||||||
button = new QPushButton("Add component", buttons);
|
button = new QPushButton("Add component", buttons);
|
||||||
buttons->layout()->addWidget(button);
|
buttons->layout()->addWidget(button);
|
||||||
QObject::connect(button, SIGNAL(clicked()), this, SLOT(addLevel()));
|
QObject::connect(button, SIGNAL(clicked()), this, SLOT(addLevel()));
|
||||||
|
@ -139,11 +139,11 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value):
|
||||||
slider_scaling->setTickPosition(QSlider::TicksBelow);
|
slider_scaling->setTickPosition(QSlider::TicksBelow);
|
||||||
form->layout()->addWidget(slider_scaling);
|
form->layout()->addWidget(slider_scaling);
|
||||||
QObject::connect(slider_scaling, SIGNAL(valueChanged(int)), this, SLOT(scalingChanged(int)));
|
QObject::connect(slider_scaling, SIGNAL(valueChanged(int)), this, SLOT(scalingChanged(int)));
|
||||||
|
|
||||||
buttons = new QWidget(form);
|
buttons = new QWidget(form);
|
||||||
buttons->setLayout(new QHBoxLayout());
|
buttons->setLayout(new QHBoxLayout());
|
||||||
form->layout()->addWidget(buttons);
|
form->layout()->addWidget(buttons);
|
||||||
|
|
||||||
button = new QPushButton("Validate", buttons);
|
button = new QPushButton("Validate", buttons);
|
||||||
buttons->layout()->addWidget(button);
|
buttons->layout()->addWidget(button);
|
||||||
QObject::connect(button, SIGNAL(clicked()), this, SLOT(accept()));
|
QObject::connect(button, SIGNAL(clicked()), this, SLOT(accept()));
|
||||||
|
@ -157,7 +157,7 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value):
|
||||||
QObject::connect(button, SIGNAL(clicked()), this, SLOT(reject()));
|
QObject::connect(button, SIGNAL(clicked()), this, SLOT(reject()));
|
||||||
|
|
||||||
setWindowTitle("Paysages 3D - Noise editor");
|
setWindowTitle("Paysages 3D - Noise editor");
|
||||||
|
|
||||||
revert();
|
revert();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ DialogNoise::~DialogNoise()
|
||||||
{
|
{
|
||||||
delete previewLevel;
|
delete previewLevel;
|
||||||
delete previewTotal;
|
delete previewTotal;
|
||||||
|
|
||||||
noiseDeleteGenerator(_current);
|
noiseDeleteGenerator(_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,14 +202,14 @@ void DialogNoise::revert()
|
||||||
void DialogNoise::revertToCurrent()
|
void DialogNoise::revertToCurrent()
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
levels->clear();
|
levels->clear();
|
||||||
n = noiseGetLevelCount(_current);
|
n = noiseGetLevelCount(_current);
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
levels->addItem("Level");
|
levels->addItem(QString("Component %1").arg(i + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
previewLevel->redraw();
|
previewLevel->redraw();
|
||||||
previewTotal->redraw();
|
previewTotal->redraw();
|
||||||
}
|
}
|
||||||
|
@ -217,20 +217,22 @@ void DialogNoise::revertToCurrent()
|
||||||
void DialogNoise::addLevel()
|
void DialogNoise::addLevel()
|
||||||
{
|
{
|
||||||
NoiseLevel level;
|
NoiseLevel level;
|
||||||
|
|
||||||
level.height = 0.1;
|
level.height = 0.1;
|
||||||
level.scaling = 0.1;
|
level.scaling = 0.1;
|
||||||
level.xoffset = 0.0;
|
level.xoffset = 0.0;
|
||||||
level.yoffset = 0.0;
|
level.yoffset = 0.0;
|
||||||
level.zoffset = 0.0;
|
level.zoffset = 0.0;
|
||||||
noiseAddLevel(_current, level);
|
noiseAddLevel(_current, level);
|
||||||
|
|
||||||
revertToCurrent();
|
revertToCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogNoise::removeLevel()
|
void DialogNoise::removeLevel()
|
||||||
{
|
{
|
||||||
// TODO
|
noiseRemoveLevel(_current, _current_level);
|
||||||
|
|
||||||
|
revertToCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogNoise::levelChanged(int row)
|
void DialogNoise::levelChanged(int row)
|
||||||
|
@ -239,7 +241,7 @@ void DialogNoise::levelChanged(int row)
|
||||||
{
|
{
|
||||||
_current_level = row;
|
_current_level = row;
|
||||||
((PreviewLevel*)previewLevel)->setLevel(row);
|
((PreviewLevel*)previewLevel)->setLevel(row);
|
||||||
|
|
||||||
slider_height->setValue(_current_level_params.height * 1000.0);
|
slider_height->setValue(_current_level_params.height * 1000.0);
|
||||||
slider_scaling->setValue(_current_level_params.scaling * 1000.0);
|
slider_scaling->setValue(_current_level_params.scaling * 1000.0);
|
||||||
}
|
}
|
||||||
|
|
75
gui_qt/formterrain.cpp
Normal file
75
gui_qt/formterrain.cpp
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
#include "formterrain.h"
|
||||||
|
|
||||||
|
#include "tools.h"
|
||||||
|
#include <QColor>
|
||||||
|
#include <QSlider>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "../lib_paysages/terrain.h"
|
||||||
|
#include "../lib_paysages/shared/functions.h"
|
||||||
|
#include "../lib_paysages/shared/constants.h"
|
||||||
|
|
||||||
|
static TerrainDefinition _definition;
|
||||||
|
|
||||||
|
/**************** Previews ****************/
|
||||||
|
class PreviewTerrainHeight:public Preview
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PreviewTerrainHeight(QWidget* parent):
|
||||||
|
Preview(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
QColor getColor(double x, double y)
|
||||||
|
{
|
||||||
|
double height;
|
||||||
|
|
||||||
|
height = terrainGetHeightNormalized(x, y);
|
||||||
|
return QColor((int)(255.0 * height), (int)(255.0 * height), (int)(255.0 * height));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class PreviewTerrainColor:public Preview
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PreviewTerrainColor(QWidget* parent):
|
||||||
|
Preview(parent)
|
||||||
|
{
|
||||||
|
_environment.toggle_fog = 0;
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
QColor getColor(double x, double y)
|
||||||
|
{
|
||||||
|
return colorToQColor(terrainGetColorCustom(x, y, scaling, &_definition, NULL, &_environment));
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
TerrainEnvironment _environment;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**************** Form ****************/
|
||||||
|
FormTerrain::FormTerrain(QWidget *parent):
|
||||||
|
BaseForm(parent)
|
||||||
|
{
|
||||||
|
_definition = terrainCreateDefinition();
|
||||||
|
|
||||||
|
previewHeight = new PreviewTerrainHeight(this);
|
||||||
|
previewColor = new PreviewTerrainColor(this);
|
||||||
|
addPreview(previewHeight, QString("Height preview"));
|
||||||
|
addPreview(previewColor, QString("Color preview"));
|
||||||
|
|
||||||
|
addInputNoise("Height", _definition.height_noise);
|
||||||
|
|
||||||
|
revertConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormTerrain::revertConfig()
|
||||||
|
{
|
||||||
|
terrainCopyDefinition(terrainGetDefinition(), &_definition);
|
||||||
|
BaseForm::revertConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormTerrain::applyConfig()
|
||||||
|
{
|
||||||
|
terrainSetDefinition(_definition);
|
||||||
|
BaseForm::applyConfig();
|
||||||
|
}
|
24
gui_qt/formterrain.h
Normal file
24
gui_qt/formterrain.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef _PAYSAGES_QT_FORMTERRAIN_H_
|
||||||
|
#define _PAYSAGES_QT_FORMTERRAIN_H_
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include "preview.h"
|
||||||
|
#include "baseform.h"
|
||||||
|
|
||||||
|
class FormTerrain : public BaseForm
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit FormTerrain(QWidget *parent = 0);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
virtual void revertConfig();
|
||||||
|
virtual void applyConfig();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Preview* previewHeight;
|
||||||
|
Preview* previewColor;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,10 +13,10 @@
|
||||||
static WaterDefinition _definition;
|
static WaterDefinition _definition;
|
||||||
|
|
||||||
/**************** Previews ****************/
|
/**************** Previews ****************/
|
||||||
class PreviewCoverage:public Preview
|
class PreviewWaterCoverage:public Preview
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PreviewCoverage(QWidget* parent):
|
PreviewWaterCoverage(QWidget* parent):
|
||||||
Preview(parent)
|
Preview(parent)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -38,10 +38,10 @@ protected:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class PreviewColor:public Preview
|
class PreviewWaterColor:public Preview
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PreviewColor(QWidget* parent):
|
PreviewWaterColor(QWidget* parent):
|
||||||
Preview(parent)
|
Preview(parent)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,7 @@ protected:
|
||||||
environment.toggle_fog = 0;
|
environment.toggle_fog = 0;
|
||||||
environment.toggle_shadows = 0;
|
environment.toggle_shadows = 0;
|
||||||
quality.force_detail = 0.0001;
|
quality.force_detail = 0.0001;
|
||||||
|
quality.detail_boost = 1.0;
|
||||||
|
|
||||||
result = waterGetColorCustom(location, look, &definition, &quality, &environment).final;
|
result = waterGetColorCustom(location, look, &definition, &quality, &environment).final;
|
||||||
return colorToQColor(result);
|
return colorToQColor(result);
|
||||||
|
@ -100,6 +101,7 @@ private:
|
||||||
if (direction.z < 0.0001)
|
if (direction.z < 0.0001)
|
||||||
{
|
{
|
||||||
result.hit_color = COLOR_WHITE;
|
result.hit_color = COLOR_WHITE;
|
||||||
|
result.hit_location = start;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -114,8 +116,10 @@ private:
|
||||||
{
|
{
|
||||||
result.hit_color = COLOR_GREY;
|
result.hit_color = COLOR_GREY;
|
||||||
}
|
}
|
||||||
|
result.hit_location.x = x;
|
||||||
|
result.hit_location.y = y;
|
||||||
|
result.hit_location.z = 0.0;
|
||||||
}
|
}
|
||||||
/* TODO hit_location */
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -127,8 +131,8 @@ FormWater::FormWater(QWidget *parent):
|
||||||
{
|
{
|
||||||
_definition = waterCreateDefinition();
|
_definition = waterCreateDefinition();
|
||||||
|
|
||||||
previewCoverage = new PreviewCoverage(this);
|
previewCoverage = new PreviewWaterCoverage(this);
|
||||||
previewColor = new PreviewColor(this);
|
previewColor = new PreviewWaterColor(this);
|
||||||
addPreview(previewCoverage, QString("Coverage preview"));
|
addPreview(previewCoverage, QString("Coverage preview"));
|
||||||
addPreview(previewColor, QString("Color preview"));
|
addPreview(previewColor, QString("Color preview"));
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <QMenuBar>
|
#include <QMenuBar>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
|
||||||
|
#include "formterrain.h"
|
||||||
#include "formwater.h"
|
#include "formwater.h"
|
||||||
#include "formsky.h"
|
#include "formsky.h"
|
||||||
#include "formrender.h"
|
#include "formrender.h"
|
||||||
|
@ -30,7 +31,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
QMenu* menu;
|
QMenu* menu;
|
||||||
|
|
||||||
tabs = new QTabWidget(this);
|
tabs = new QTabWidget(this);
|
||||||
tabs->addTab(new BaseForm(tabs), "Temp");
|
tabs->addTab(new FormTerrain(tabs), "Terrain");
|
||||||
tabs->addTab(new FormWater(tabs), "Water");
|
tabs->addTab(new FormWater(tabs), "Water");
|
||||||
tabs->addTab(new FormSky(tabs), "Sky");
|
tabs->addTab(new FormSky(tabs), "Sky");
|
||||||
tabs->addTab(new FormRender(tabs), "Render");
|
tabs->addTab(new FormRender(tabs), "Render");
|
||||||
|
|
|
@ -14,34 +14,36 @@ win32:LIBS += ../libpaysages.a -lDevIL -lILU -lILUT -lglib-2.0 -lgthread-2.0
|
||||||
|
|
||||||
# Input
|
# Input
|
||||||
HEADERS += ../lib_paysages/shared/functions.h ../lib_paysages/shared/types.h \
|
HEADERS += ../lib_paysages/shared/functions.h ../lib_paysages/shared/types.h \
|
||||||
mainwindow.h \
|
|
||||||
formwater.h \
|
|
||||||
preview.h \
|
|
||||||
baseform.h \
|
baseform.h \
|
||||||
inputdouble.h \
|
|
||||||
baseinput.h \
|
baseinput.h \
|
||||||
inputcolor.h \
|
|
||||||
formrender.h \
|
|
||||||
inputint.h \
|
|
||||||
dialogrender.h \
|
|
||||||
dialognoise.h \
|
dialognoise.h \
|
||||||
inputcolorgradation.h \
|
dialogrender.h \
|
||||||
|
formrender.h \
|
||||||
formsky.h \
|
formsky.h \
|
||||||
|
formterrain.h \
|
||||||
|
formwater.h \
|
||||||
|
inputcolor.h \
|
||||||
|
inputcolorgradation.h \
|
||||||
|
inputdouble.h \
|
||||||
|
inputint.h \
|
||||||
inputnoise.h \
|
inputnoise.h \
|
||||||
|
mainwindow.h \
|
||||||
|
preview.h \
|
||||||
tools.h
|
tools.h
|
||||||
FORMS +=
|
FORMS +=
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
mainwindow.cpp \
|
|
||||||
formwater.cpp \
|
|
||||||
preview.cpp \
|
|
||||||
baseform.cpp \
|
baseform.cpp \
|
||||||
inputdouble.cpp \
|
|
||||||
baseinput.cpp \
|
baseinput.cpp \
|
||||||
inputcolor.cpp \
|
|
||||||
formrender.cpp \
|
|
||||||
inputint.cpp \
|
|
||||||
dialogrender.cpp \
|
|
||||||
dialognoise.cpp \
|
dialognoise.cpp \
|
||||||
inputcolorgradation.cpp \
|
dialogrender.cpp \
|
||||||
|
formrender.cpp \
|
||||||
formsky.cpp \
|
formsky.cpp \
|
||||||
inputnoise.cpp
|
formterrain.cpp \
|
||||||
|
formwater.cpp \
|
||||||
|
inputcolor.cpp \
|
||||||
|
inputcolorgradation.cpp \
|
||||||
|
inputdouble.cpp \
|
||||||
|
inputint.cpp \
|
||||||
|
inputnoise.cpp \
|
||||||
|
mainwindow.cpp \
|
||||||
|
preview.cpp
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
static QVector<Preview*> _previews;
|
|
||||||
|
|
||||||
class PreviewDrawer:public QThread
|
class PreviewDrawer:public QThread
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -48,15 +46,18 @@ Preview::Preview(QWidget* parent) :
|
||||||
this->xoffset = 0.0;
|
this->xoffset = 0.0;
|
||||||
this->yoffset = 0.0;
|
this->yoffset = 0.0;
|
||||||
this->pixbuf = new QImage(this->size(), QImage::Format_ARGB32);
|
this->pixbuf = new QImage(this->size(), QImage::Format_ARGB32);
|
||||||
|
this->pixbuf->fill(0x00000000);
|
||||||
|
|
||||||
this->alive = true;
|
this->alive = true;
|
||||||
this->need_rerender = false;
|
this->need_rerender = false;
|
||||||
this->need_render = false;
|
this->need_render = true;
|
||||||
|
|
||||||
this->setMinimumSize(256, 256);
|
this->setMinimumSize(256, 256);
|
||||||
this->setMaximumSize(256, 256);
|
this->setMaximumSize(256, 256);
|
||||||
this->resize(256, 256);
|
this->resize(256, 256);
|
||||||
|
|
||||||
|
QObject::connect(this, SIGNAL(contentChange()), this, SLOT(update()));
|
||||||
|
|
||||||
this->updater = new PreviewDrawer(this);
|
this->updater = new PreviewDrawer(this);
|
||||||
this->updater->start();
|
this->updater->start();
|
||||||
}
|
}
|
||||||
|
@ -85,7 +86,7 @@ void Preview::doRender()
|
||||||
}
|
}
|
||||||
if (this->need_render)
|
if (this->need_render)
|
||||||
{
|
{
|
||||||
this->need_render = 0;
|
this->need_render = false;
|
||||||
this->renderPixbuf();
|
this->renderPixbuf();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,7 +95,7 @@ void Preview::doRender()
|
||||||
void Preview::redraw()
|
void Preview::redraw()
|
||||||
{
|
{
|
||||||
//lock->lock();
|
//lock->lock();
|
||||||
need_rerender = 1;
|
need_rerender = true;
|
||||||
//lock->unlock();
|
//lock->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,12 +111,18 @@ void Preview::resizeEvent(QResizeEvent* event)
|
||||||
QImage* image;
|
QImage* image;
|
||||||
|
|
||||||
this->lock->lock();
|
this->lock->lock();
|
||||||
image = this->pixbuf;
|
|
||||||
this->pixbuf = new QImage(this->size(), QImage::Format_ARGB32);
|
|
||||||
delete image;
|
|
||||||
this->lock->unlock();
|
|
||||||
|
|
||||||
this->forceRender();
|
image = this->pixbuf;
|
||||||
|
|
||||||
|
this->pixbuf = new QImage(this->size(), QImage::Format_ARGB32);
|
||||||
|
|
||||||
|
this->pixbuf->fill(0x00000000);
|
||||||
|
this->need_rerender = false;
|
||||||
|
this->need_render = true;
|
||||||
|
|
||||||
|
delete image;
|
||||||
|
|
||||||
|
this->lock->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Preview::paintEvent(QPaintEvent* event)
|
void Preview::paintEvent(QPaintEvent* event)
|
||||||
|
@ -128,8 +135,8 @@ void Preview::forceRender()
|
||||||
{
|
{
|
||||||
this->lock->lock();
|
this->lock->lock();
|
||||||
this->pixbuf->fill(0x00000000);
|
this->pixbuf->fill(0x00000000);
|
||||||
this->need_rerender = 0;
|
this->need_rerender = false;
|
||||||
this->need_render = 1;
|
this->need_render = true;
|
||||||
this->lock->unlock();
|
this->lock->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,14 +171,12 @@ void Preview::renderPixbuf()
|
||||||
}
|
}
|
||||||
if (done && (x == w - 1 || x % 10 == 0))
|
if (done && (x == w - 1 || x % 10 == 0))
|
||||||
{
|
{
|
||||||
this->update();
|
emit contentChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
this->lock->unlock();
|
this->lock->unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//static void _scrollPixbuf(SmallPreview* preview, int dx, int dy)
|
//static void _scrollPixbuf(SmallPreview* preview, int dx, int dy)
|
||||||
//{
|
//{
|
||||||
// int xstart, ystart, xsize, ysize, y;
|
// int xstart, ystart, xsize, ysize, y;
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
static void startUpdater();
|
static void startUpdater();
|
||||||
void doRender();
|
void doRender();
|
||||||
void redraw();
|
void redraw();
|
||||||
|
|
||||||
void setScaling(double scaling);
|
void setScaling(double scaling);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -50,8 +50,12 @@ protected:
|
||||||
bool alive;
|
bool alive;
|
||||||
bool need_rerender;
|
bool need_rerender;
|
||||||
bool need_render;
|
bool need_render;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QThread* updater;
|
QThread* updater;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void contentChange();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "modifiers.h"
|
#include "modifiers.h"
|
||||||
#include "terrain.h"
|
#include "terrain.h"
|
||||||
#include "textures.h"
|
#include "textures.h"
|
||||||
|
#include "lighting.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -47,47 +48,6 @@ void autoInit()
|
||||||
#ifdef _SC_NPROCESSORS_ONLN
|
#ifdef _SC_NPROCESSORS_ONLN
|
||||||
_cpu_count = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
_cpu_count = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
#endif
|
#endif
|
||||||
renderSetBackgroundColor(&COLOR_BLACK);
|
|
||||||
|
|
||||||
terrainInit();
|
|
||||||
waterInit();
|
|
||||||
renderInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void autoSave(char* filepath)
|
|
||||||
{
|
|
||||||
FILE* f = fopen(filepath, "wb");
|
|
||||||
|
|
||||||
texturesSave(f);
|
|
||||||
|
|
||||||
cameraSave(f);
|
|
||||||
cloudsSave(f);
|
|
||||||
fogSave(f);
|
|
||||||
lightingSave(f);
|
|
||||||
renderSave(f);
|
|
||||||
skySave(f);
|
|
||||||
terrainSave(f);
|
|
||||||
waterSave(f);
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void autoLoad(char* filepath)
|
|
||||||
{
|
|
||||||
FILE* f = fopen(filepath, "rb");
|
|
||||||
|
|
||||||
texturesLoad(f);
|
|
||||||
|
|
||||||
cameraLoad(f);
|
|
||||||
cloudsLoad(f);
|
|
||||||
fogLoad(f);
|
|
||||||
lightingLoad(f);
|
|
||||||
renderLoad(f);
|
|
||||||
skyLoad(f);
|
|
||||||
terrainLoad(f);
|
|
||||||
waterLoad(f);
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void autoSetDaytime(int hour, int minute)
|
void autoSetDaytime(int hour, int minute)
|
||||||
|
@ -98,8 +58,8 @@ void autoSetDaytime(int hour, int minute)
|
||||||
void autoSetDaytimeFraction(double daytime)
|
void autoSetDaytimeFraction(double daytime)
|
||||||
{
|
{
|
||||||
SkyDefinition sky;
|
SkyDefinition sky;
|
||||||
ColorGradation grad_sun;
|
/*ColorGradation grad_sun;
|
||||||
Color sun;
|
Color sun;*/
|
||||||
|
|
||||||
daytime = fmod(daytime, 1.0);
|
daytime = fmod(daytime, 1.0);
|
||||||
if (daytime < 0.0)
|
if (daytime < 0.0)
|
||||||
|
@ -107,7 +67,7 @@ void autoSetDaytimeFraction(double daytime)
|
||||||
daytime += 1.0;
|
daytime += 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lightingSetSunAngle(0.0, (daytime + 0.25) * M_PI * 2.0);
|
/*lightingSetSunAngle(0.0, (daytime + 0.25) * M_PI * 2.0);
|
||||||
|
|
||||||
grad_sun = colorGradationCreate();
|
grad_sun = colorGradationCreate();
|
||||||
colorGradationAddRgba(&grad_sun, 0.2, 0.1, 0.1, 0.1, 1.0);
|
colorGradationAddRgba(&grad_sun, 0.2, 0.1, 0.1, 0.1, 1.0);
|
||||||
|
@ -118,7 +78,7 @@ void autoSetDaytimeFraction(double daytime)
|
||||||
colorGradationAddRgba(&grad_sun, 0.75, 0.7, 0.6, 0.5, 1.0);
|
colorGradationAddRgba(&grad_sun, 0.75, 0.7, 0.6, 0.5, 1.0);
|
||||||
colorGradationAddRgba(&grad_sun, 0.8, 0.1, 0.1, 0.1, 1.0);
|
colorGradationAddRgba(&grad_sun, 0.8, 0.1, 0.1, 0.1, 1.0);
|
||||||
sun = colorGradationGet(&grad_sun, daytime);
|
sun = colorGradationGet(&grad_sun, daytime);
|
||||||
lightingSetSunColor(sun);
|
lightingSetSunColor(sun);*/
|
||||||
|
|
||||||
sky = skyGetDefinition();
|
sky = skyGetDefinition();
|
||||||
sky.daytime = daytime;
|
sky.daytime = daytime;
|
||||||
|
@ -163,6 +123,7 @@ void autoGenRealisticLandscape(int seed)
|
||||||
CloudsDefinition cloud;
|
CloudsDefinition cloud;
|
||||||
SkyDefinition sky;
|
SkyDefinition sky;
|
||||||
TextureDefinition texture;
|
TextureDefinition texture;
|
||||||
|
LightingDefinition lighting;
|
||||||
int layer;
|
int layer;
|
||||||
HeightModifier* mod;
|
HeightModifier* mod;
|
||||||
Zone* zone;
|
Zone* zone;
|
||||||
|
@ -249,6 +210,12 @@ void autoGenRealisticLandscape(int seed)
|
||||||
sky.sun_radius = 0.02;
|
sky.sun_radius = 0.02;
|
||||||
skySetDefinition(sky);
|
skySetDefinition(sky);
|
||||||
|
|
||||||
|
/* Lighting */
|
||||||
|
lighting = lightingCreateDefinition();
|
||||||
|
lighting.autosetfromsky = 1;
|
||||||
|
lightingSetDefinition(lighting);
|
||||||
|
|
||||||
|
/* Terrain */
|
||||||
terrain = terrainCreateDefinition();
|
terrain = terrainCreateDefinition();
|
||||||
noiseGenerateBaseNoise(terrain.height_noise, 1048576);
|
noiseGenerateBaseNoise(terrain.height_noise, 1048576);
|
||||||
noiseAddLevelsSimple(terrain.height_noise, 10, 10.0, 1.0);
|
noiseAddLevelsSimple(terrain.height_noise, 10, 10.0, 1.0);
|
||||||
|
@ -275,6 +242,7 @@ void autoGenRealisticLandscape(int seed)
|
||||||
terrainSetDefinition(terrain);
|
terrainSetDefinition(terrain);
|
||||||
terrainDeleteDefinition(terrain);
|
terrainDeleteDefinition(terrain);
|
||||||
|
|
||||||
|
/* Textures */
|
||||||
layer = texturesAddLayer();
|
layer = texturesAddLayer();
|
||||||
texture = texturesCreateDefinition();
|
texture = texturesCreateDefinition();
|
||||||
noiseGenerateBaseNoise(texture.bump_noise, 102400);
|
noiseGenerateBaseNoise(texture.bump_noise, 102400);
|
||||||
|
@ -308,6 +276,7 @@ void autoGenRealisticLandscape(int seed)
|
||||||
texturesSetDefinition(layer, texture);
|
texturesSetDefinition(layer, texture);
|
||||||
texturesDeleteDefinition(texture);*/
|
texturesDeleteDefinition(texture);*/
|
||||||
|
|
||||||
|
/* Fog */
|
||||||
fogSetDistance(20.0, 100.0);
|
fogSetDistance(20.0, 100.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
|
#include "clouds.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "lighting.h"
|
||||||
#include "shared/types.h"
|
#include "shared/types.h"
|
||||||
#include "shared/functions.h"
|
#include "shared/functions.h"
|
||||||
#include "shared/constants.h"
|
#include "shared/constants.h"
|
||||||
#include "shared/globals.h"
|
#include "shared/globals.h"
|
||||||
#include "clouds.h"
|
|
||||||
|
|
||||||
#define MAX_LAYERS 10
|
#define MAX_LAYERS 10
|
||||||
|
|
||||||
|
@ -378,22 +380,26 @@ static int _findSegments(CloudsDefinition* definition, CloudsQuality* quality, V
|
||||||
return segment_count;
|
return segment_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Color _applyLayerLighting(CloudsDefinition* definition, CloudsQuality* quality, Vector3 position, Color base, double detail)
|
typedef struct
|
||||||
|
{
|
||||||
|
CloudsDefinition* definition;
|
||||||
|
CloudsQuality* quality;
|
||||||
|
Color base;
|
||||||
|
double detail;
|
||||||
|
} LightFilterData;
|
||||||
|
|
||||||
|
static Color _lightFilter(Color light, Vector3 location, Vector3 light_location, Vector3 direction_to_light, void* custom_data)
|
||||||
{
|
{
|
||||||
Vector3 direction, normal;
|
|
||||||
double inside_depth, total_depth;
|
double inside_depth, total_depth;
|
||||||
CloudSegment segments[20];
|
CloudSegment segments[20];
|
||||||
Color result;
|
Color result;
|
||||||
|
LightFilterData data;
|
||||||
|
|
||||||
normal = _getNormal(definition, position, 0.5);
|
data = *((LightFilterData*)custom_data);
|
||||||
normal = v3Add(normal, _getNormal(definition, position, 0.2));
|
data.detail = (data.detail < 0.1) ? 0.1 : data.detail;
|
||||||
normal = v3Add(normal, _getNormal(definition, position, 0.1));
|
|
||||||
result = lightingApply(position, normal, 0.0, base, 0.3, 0.1);
|
|
||||||
|
|
||||||
direction = sun_direction_inv;
|
|
||||||
detail = (detail < 0.1) ? 0.1 : detail;
|
|
||||||
/* FIXME Dont hard-code max_total_length */
|
/* FIXME Dont hard-code max_total_length */
|
||||||
_findSegments(definition, quality, position, direction, detail, 20, 50.0, 300.0, &inside_depth, &total_depth, segments);
|
_findSegments(data.definition, data.quality, location, direction_to_light, data.detail, 20, 50.0, 300.0, &inside_depth, &total_depth, segments);
|
||||||
|
|
||||||
inside_depth *= 0.02;
|
inside_depth *= 0.02;
|
||||||
if (inside_depth > 1.0)
|
if (inside_depth > 1.0)
|
||||||
|
@ -401,13 +407,40 @@ static Color _applyLayerLighting(CloudsDefinition* definition, CloudsQuality* qu
|
||||||
inside_depth = 1.0;
|
inside_depth = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
result.r = base.r * sun_color_lum * (0.9 - 0.2 * inside_depth) + result.r * (0.1 + 0.1 * inside_depth) + (0.1 - inside_depth * 0.1) * sun_color_lum;
|
result.r = data.base.r * sun_color_lum * (0.9 - 0.2 * inside_depth) + result.r * (0.1 + 0.1 * inside_depth) + (0.1 - inside_depth * 0.1) * sun_color_lum;
|
||||||
result.g = base.g * sun_color_lum * (0.9 - 0.2 * inside_depth) + result.g * (0.1 + 0.1 * inside_depth) + (0.1 - inside_depth * 0.1) * sun_color_lum;
|
result.g = data.base.g * sun_color_lum * (0.9 - 0.2 * inside_depth) + result.g * (0.1 + 0.1 * inside_depth) + (0.1 - inside_depth * 0.1) * sun_color_lum;
|
||||||
result.b = base.b * sun_color_lum * (0.9 - 0.2 * inside_depth) + result.b * (0.1 + 0.1 * inside_depth) + (0.1 - inside_depth * 0.1) * sun_color_lum;
|
result.b = data.base.b * sun_color_lum * (0.9 - 0.2 * inside_depth) + result.b * (0.1 + 0.1 * inside_depth) + (0.1 - inside_depth * 0.1) * sun_color_lum;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Color _applyLayerLighting(CloudsDefinition* definition, CloudsQuality* quality, Vector3 position, Color base, double detail)
|
||||||
|
{
|
||||||
|
Vector3 normal;
|
||||||
|
ReceiverMaterial material;
|
||||||
|
LightingEnvironment lighting_environment;
|
||||||
|
LightFilterData data;
|
||||||
|
|
||||||
|
normal = _getNormal(definition, position, 0.5);
|
||||||
|
normal = v3Add(normal, _getNormal(definition, position, 0.2));
|
||||||
|
normal = v3Add(normal, _getNormal(definition, position, 0.1));
|
||||||
|
//normal = v3Normalize(normal);
|
||||||
|
|
||||||
|
data.definition = definition;
|
||||||
|
data.quality = quality;
|
||||||
|
data.detail = detail;
|
||||||
|
data.base = base;
|
||||||
|
|
||||||
|
lighting_environment.filter = _lightFilter;
|
||||||
|
lighting_environment.custom_data = &data;
|
||||||
|
|
||||||
|
material.base = base;
|
||||||
|
material.reflection = 0.3;
|
||||||
|
material.shininess = 0.1;
|
||||||
|
|
||||||
|
return lightingApplyCustom(position, normal, material, NULL, NULL, &lighting_environment);
|
||||||
|
}
|
||||||
|
|
||||||
Color cloudsGetColorCustom(Vector3 start, Vector3 end, CloudsDefinition* definition, CloudsQuality* quality, CloudsEnvironment* environment)
|
Color cloudsGetColorCustom(Vector3 start, Vector3 end, CloudsDefinition* definition, CloudsQuality* quality, CloudsEnvironment* environment)
|
||||||
{
|
{
|
||||||
int i, segment_count;
|
int i, segment_count;
|
||||||
|
|
|
@ -1,25 +1,173 @@
|
||||||
|
#include "lighting.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "shared/types.h"
|
#include "shared/types.h"
|
||||||
#include "shared/functions.h"
|
#include "shared/functions.h"
|
||||||
#include "shared/constants.h"
|
#include "shared/constants.h"
|
||||||
#include "shared/globals.h"
|
#include "shared/globals.h"
|
||||||
|
|
||||||
static Color sun_color;
|
static LightingDefinition _definition;
|
||||||
double sun_color_lum;
|
static LightingQuality _quality;
|
||||||
Vector3 sun_direction;
|
static LightingEnvironment _environment;
|
||||||
Vector3 sun_direction_inv;
|
|
||||||
|
static LightDefinition _LIGHT_NULL;
|
||||||
|
|
||||||
|
static Color _standardFilter(Color light, Vector3 location, Vector3 light_location, Vector3 direction_to_light, void* custom_data)
|
||||||
|
{
|
||||||
|
// TODO Find shadows
|
||||||
|
return light;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingInit()
|
||||||
|
{
|
||||||
|
_definition = lightingCreateDefinition();
|
||||||
|
|
||||||
|
_environment.filter = _standardFilter;
|
||||||
|
_environment.custom_data = NULL;
|
||||||
|
|
||||||
|
_LIGHT_NULL.color = COLOR_BLACK;
|
||||||
|
_LIGHT_NULL.direction.x = 0.0;
|
||||||
|
_LIGHT_NULL.direction.y = 1.0;
|
||||||
|
_LIGHT_NULL.direction.z = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
void lightingSave(FILE* f)
|
void lightingSave(FILE* f)
|
||||||
{
|
{
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
void lightingLoad(FILE* f)
|
void lightingLoad(FILE* f)
|
||||||
{
|
{
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
void lightingSetSunDirection(double x, double y, double z)
|
LightingDefinition lightingCreateDefinition()
|
||||||
|
{
|
||||||
|
LightingDefinition definition;
|
||||||
|
|
||||||
|
definition.autosetfromsky = 0;
|
||||||
|
definition.nblights = 0;
|
||||||
|
definition._nbautolights = 0;
|
||||||
|
|
||||||
|
return definition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingDeleteDefinition(LightingDefinition definition)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingCopyDefinition(LightingDefinition source, LightingDefinition* destination)
|
||||||
|
{
|
||||||
|
*destination = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingSetDefinition(LightingDefinition definition)
|
||||||
|
{
|
||||||
|
lightingCopyDefinition(definition, &_definition);
|
||||||
|
}
|
||||||
|
|
||||||
|
LightingDefinition lightingGetDefinition()
|
||||||
|
{
|
||||||
|
return _definition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingValidateDefinition(LightingDefinition* definition)
|
||||||
|
{
|
||||||
|
if (!definition)
|
||||||
|
{
|
||||||
|
lightingValidateDefinition(&_definition);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (definition->autosetfromsky)
|
||||||
|
{
|
||||||
|
// TODO Get lights from sky
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
definition->_nbautolights = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int lightingGetLightCount(LightingDefinition* definition)
|
||||||
|
{
|
||||||
|
return definition->nblights;
|
||||||
|
}
|
||||||
|
|
||||||
|
LightDefinition lightingGetLight(LightingDefinition* definition, int light)
|
||||||
|
{
|
||||||
|
if (light >= 0 && light < definition->nblights)
|
||||||
|
{
|
||||||
|
return definition->lights[light];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _LIGHT_NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int lightingAddLight(LightingDefinition* definition, LightDefinition light)
|
||||||
|
{
|
||||||
|
if (definition->nblights < MAX_LIGHTS)
|
||||||
|
{
|
||||||
|
definition->lights[definition->nblights] = light;
|
||||||
|
return definition->nblights++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingDeleteLight(LightingDefinition* definition, int light)
|
||||||
|
{
|
||||||
|
if (light >= 0 && light < definition->nblights)
|
||||||
|
{
|
||||||
|
if (definition->nblights > 1 && light < definition->nblights - 1)
|
||||||
|
{
|
||||||
|
memmove(definition->lights + light, definition->lights + light + 1, sizeof(LightDefinition) * definition->nblights - light - 1);
|
||||||
|
}
|
||||||
|
definition->nblights--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightingSetQuality(LightingQuality quality)
|
||||||
|
{
|
||||||
|
_quality = quality;
|
||||||
|
}
|
||||||
|
|
||||||
|
LightingQuality lightingGetQuality()
|
||||||
|
{
|
||||||
|
return _quality;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color lightingApplyCustom(Vector3 location, Vector3 normal, ReceiverMaterial material, LightingDefinition* definition, LightingQuality* quality, LightingEnvironment* environment)
|
||||||
|
{
|
||||||
|
if (!definition)
|
||||||
|
{
|
||||||
|
definition = &_definition;
|
||||||
|
}
|
||||||
|
if (!quality)
|
||||||
|
{
|
||||||
|
quality = &_quality;
|
||||||
|
}
|
||||||
|
if (!environment)
|
||||||
|
{
|
||||||
|
environment = &_environment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return COLOR_RED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color lightingApply(Vector3 location, Vector3 normal, ReceiverMaterial material)
|
||||||
|
{
|
||||||
|
return lightingApplyCustom(location, normal, material, &_definition, &_quality, &_environment);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void lightingSetSunDirection(double x, double y, double z)
|
||||||
{
|
{
|
||||||
sun_direction.x = x;
|
sun_direction.x = x;
|
||||||
sun_direction.y = y;
|
sun_direction.y = y;
|
||||||
|
@ -44,15 +192,15 @@ Color lightingApply(Vector3 location, Vector3 normal, double shadowing, Color ba
|
||||||
Color result, light;
|
Color result, light;
|
||||||
double ambient, diffuse, specular;
|
double ambient, diffuse, specular;
|
||||||
Vector3 view, reflect;
|
Vector3 view, reflect;
|
||||||
|
|
||||||
light.r = sun_color.r * (1.0 - 0.4 * shadowing);
|
light.r = sun_color.r * (1.0 - 0.4 * shadowing);
|
||||||
light.g = sun_color.g * (1.0 - 0.4 * shadowing);
|
light.g = sun_color.g * (1.0 - 0.4 * shadowing);
|
||||||
light.b = sun_color.b * (1.0 - 0.4 * shadowing);
|
light.b = sun_color.b * (1.0 - 0.4 * shadowing);
|
||||||
|
|
||||||
normal = v3Normalize(normal);
|
normal = v3Normalize(normal);
|
||||||
view = v3Normalize(v3Sub(location, camera_location));
|
view = v3Normalize(v3Sub(location, camera_location));
|
||||||
reflect = v3Sub(v3Scale(normal, 2.0 * v3Dot(sun_direction_inv, normal)), sun_direction_inv);
|
reflect = v3Sub(v3Scale(normal, 2.0 * v3Dot(sun_direction_inv, normal)), sun_direction_inv);
|
||||||
|
|
||||||
ambient = 0.2;
|
ambient = 0.2;
|
||||||
diffuse = v3Dot(sun_direction_inv, normal);
|
diffuse = v3Dot(sun_direction_inv, normal);
|
||||||
diffuse = pow(diffuse * 0.5 + 0.5, 2.0) * (1.0 - shadowing) + (diffuse * 0.5 + 0.3) * shadowing;
|
diffuse = pow(diffuse * 0.5 + 0.5, 2.0) * (1.0 - shadowing) + (diffuse * 0.5 + 0.3) * shadowing;
|
||||||
|
@ -77,6 +225,6 @@ Color lightingApply(Vector3 location, Vector3 normal, double shadowing, Color ba
|
||||||
result.g = base.g * ambient + base.g * diffuse * light.g + base.g * specular * light.g;
|
result.g = base.g * ambient + base.g * diffuse * light.g + base.g * specular * light.g;
|
||||||
result.b = base.b * ambient + base.b * diffuse * light.b + base.b * specular * light.b;
|
result.b = base.b * ambient + base.b * diffuse * light.b + base.b * specular * light.b;
|
||||||
result.a = base.a;
|
result.a = base.a;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}*/
|
||||||
|
|
75
lib_paysages/lighting.h
Normal file
75
lib_paysages/lighting.h
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
#ifndef _PAYSAGES_LIGHTING_H_
|
||||||
|
#define _PAYSAGES_LIGHTING_H_
|
||||||
|
|
||||||
|
#include "shared/types.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAX_LIGHTS 10
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Vector3 direction;
|
||||||
|
Color color;
|
||||||
|
double maxshadow;
|
||||||
|
} LightDefinition;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int autosetfromsky;
|
||||||
|
int nblights;
|
||||||
|
LightDefinition lights[MAX_LIGHTS];
|
||||||
|
int _nbautolights;
|
||||||
|
LightDefinition _autolights[MAX_LIGHTS];
|
||||||
|
} LightingDefinition;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int unused;
|
||||||
|
} LightingQuality;
|
||||||
|
|
||||||
|
typedef Color (*LightFilter)(Color light, Vector3 location, Vector3 light_location, Vector3 direction_to_light, void* custom_data);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
LightFilter filter;
|
||||||
|
void* custom_data;
|
||||||
|
} LightingEnvironment;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Color base;
|
||||||
|
double reflection;
|
||||||
|
double shininess;
|
||||||
|
} ReceiverMaterial;
|
||||||
|
|
||||||
|
void lightingInit();
|
||||||
|
void lightingSave(FILE* f);
|
||||||
|
void lightingLoad(FILE* f);
|
||||||
|
|
||||||
|
LightingDefinition lightingCreateDefinition();
|
||||||
|
void lightingDeleteDefinition(LightingDefinition definition);
|
||||||
|
void lightingCopyDefinition(LightingDefinition source, LightingDefinition* destination);
|
||||||
|
void lightingSetDefinition(LightingDefinition definition);
|
||||||
|
LightingDefinition lightingGetDefinition();
|
||||||
|
void lightingValidateDefinition(LightingDefinition* definition);
|
||||||
|
|
||||||
|
int lightingGetLightCount(LightingDefinition* definition);
|
||||||
|
LightDefinition lightingGetLight(LightingDefinition* definition, int light);
|
||||||
|
int lightingAddLight(LightingDefinition* definition, LightDefinition light);
|
||||||
|
void lightingDeleteLight(LightingDefinition* definition, int light);
|
||||||
|
|
||||||
|
void lightingSetQuality(LightingQuality quality);
|
||||||
|
LightingQuality lightingGetQuality();
|
||||||
|
|
||||||
|
Color lightingApplyCustom(Vector3 location, Vector3 normal, ReceiverMaterial material, LightingDefinition* definition, LightingQuality* quality, LightingEnvironment* environment);
|
||||||
|
Color lightingApply(Vector3 location, Vector3 normal, ReceiverMaterial material);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,8 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "IL/il.h"
|
#include "IL/il.h"
|
||||||
#include "IL/ilu.h"
|
#include "IL/ilu.h"
|
||||||
|
@ -12,7 +9,13 @@
|
||||||
#include "shared/functions.h"
|
#include "shared/functions.h"
|
||||||
#include "shared/globals.h"
|
#include "shared/globals.h"
|
||||||
#include "shared/system.h"
|
#include "shared/system.h"
|
||||||
|
|
||||||
#include "terrain.h"
|
#include "terrain.h"
|
||||||
|
#include "water.h"
|
||||||
|
#include "lighting.h"
|
||||||
|
#include "textures.h"
|
||||||
|
#include "sky.h"
|
||||||
|
#include "clouds.h"
|
||||||
|
|
||||||
void paysagesInit()
|
void paysagesInit()
|
||||||
{
|
{
|
||||||
|
@ -24,11 +27,17 @@ void paysagesInit()
|
||||||
cameraSetTarget(0.0, 5.0, 0.0);
|
cameraSetTarget(0.0, 5.0, 0.0);
|
||||||
|
|
||||||
autoInit();
|
autoInit();
|
||||||
|
skyInit();
|
||||||
|
terrainInit();
|
||||||
|
texturesInit();
|
||||||
|
waterInit();
|
||||||
|
lightingInit();
|
||||||
|
renderInit();
|
||||||
|
|
||||||
autoSetRenderQuality(5);
|
autoSetRenderQuality(5);
|
||||||
autoGenRealisticLandscape(0);
|
autoGenRealisticLandscape(0);
|
||||||
autoSetDaytime(8, 30);
|
autoSetDaytime(8, 30);
|
||||||
|
|
||||||
// DEBUG
|
// DEBUG
|
||||||
/*double last_height, height, x;
|
/*double last_height, height, x;
|
||||||
last_height = height = 0.0;
|
last_height = height = 0.0;
|
||||||
|
@ -42,3 +51,39 @@ void paysagesInit()
|
||||||
cameraSetLocation(x - 2.0, height, 0.0);
|
cameraSetLocation(x - 2.0, height, 0.0);
|
||||||
cameraSetTarget(x - 1.0, height, 0.0);*/
|
cameraSetTarget(x - 1.0, height, 0.0);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void paysagesSave(char* filepath)
|
||||||
|
{
|
||||||
|
FILE* f = fopen(filepath, "wb");
|
||||||
|
|
||||||
|
cameraSave(f);
|
||||||
|
cloudsSave(f);
|
||||||
|
fogSave(f);
|
||||||
|
renderSave(f);
|
||||||
|
skySave(f);
|
||||||
|
terrainSave(f);
|
||||||
|
texturesSave(f);
|
||||||
|
waterSave(f);
|
||||||
|
|
||||||
|
lightingSave(f);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void paysagesLoad(char* filepath)
|
||||||
|
{
|
||||||
|
FILE* f = fopen(filepath, "rb");
|
||||||
|
|
||||||
|
cameraLoad(f);
|
||||||
|
cloudsLoad(f);
|
||||||
|
fogLoad(f);
|
||||||
|
renderLoad(f);
|
||||||
|
skyLoad(f);
|
||||||
|
terrainLoad(f);
|
||||||
|
texturesLoad(f);
|
||||||
|
waterLoad(f);
|
||||||
|
|
||||||
|
lightingLoad(f);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
|
@ -180,13 +180,13 @@ void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level)
|
||||||
void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double height)
|
void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double height)
|
||||||
{
|
{
|
||||||
NoiseLevel level;
|
NoiseLevel level;
|
||||||
|
|
||||||
level.scaling = scaling;
|
level.scaling = scaling;
|
||||||
level.height = height;
|
level.height = height;
|
||||||
level.xoffset = toolsRandom();
|
level.xoffset = toolsRandom();
|
||||||
level.yoffset = toolsRandom();
|
level.yoffset = toolsRandom();
|
||||||
level.zoffset = toolsRandom();
|
level.zoffset = toolsRandom();
|
||||||
|
|
||||||
noiseAddLevel(generator, level);
|
noiseAddLevel(generator, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,12 +211,24 @@ void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start
|
||||||
void noiseAddLevelsSimple(NoiseGenerator* generator, int level_count, double scaling, double height)
|
void noiseAddLevelsSimple(NoiseGenerator* generator, int level_count, double scaling, double height)
|
||||||
{
|
{
|
||||||
NoiseLevel level;
|
NoiseLevel level;
|
||||||
|
|
||||||
level.scaling = scaling;
|
level.scaling = scaling;
|
||||||
level.height = height;
|
level.height = height;
|
||||||
noiseAddLevels(generator, level_count, level, 0.5, 0.5, 1);
|
noiseAddLevels(generator, level_count, level, 0.5, 0.5, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void noiseRemoveLevel(NoiseGenerator* generator, int level)
|
||||||
|
{
|
||||||
|
if (level >= 0 && level < generator->level_count)
|
||||||
|
{
|
||||||
|
if (generator->level_count > 1 && level < generator->level_count - 1)
|
||||||
|
{
|
||||||
|
memmove(generator->levels + level, generator->levels + level + 1, sizeof(NoiseLevel) * (generator->level_count - level - 1));
|
||||||
|
}
|
||||||
|
generator->level_count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int noiseGetLevel(NoiseGenerator* generator, int level, NoiseLevel* params)
|
int noiseGetLevel(NoiseGenerator* generator, int level, NoiseLevel* params)
|
||||||
{
|
{
|
||||||
if (level >= 0 && level < generator->level_count)
|
if (level >= 0 && level < generator->level_count)
|
||||||
|
@ -241,13 +253,13 @@ void noiseSetLevel(NoiseGenerator* generator, int level, NoiseLevel params)
|
||||||
void noiseSetLevelSimple(NoiseGenerator* generator, int level, double scaling, double height)
|
void noiseSetLevelSimple(NoiseGenerator* generator, int level, double scaling, double height)
|
||||||
{
|
{
|
||||||
NoiseLevel params;
|
NoiseLevel params;
|
||||||
|
|
||||||
params.scaling = scaling;
|
params.scaling = scaling;
|
||||||
params.height = height;
|
params.height = height;
|
||||||
params.xoffset = toolsRandom();
|
params.xoffset = toolsRandom();
|
||||||
params.yoffset = toolsRandom();
|
params.yoffset = toolsRandom();
|
||||||
params.zoffset = toolsRandom();
|
params.zoffset = toolsRandom();
|
||||||
|
|
||||||
noiseSetLevel(generator, level, params);
|
noiseSetLevel(generator, level, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ void renderLoad(FILE* f)
|
||||||
void renderInit()
|
void renderInit()
|
||||||
{
|
{
|
||||||
_lock = mutexCreate();
|
_lock = mutexCreate();
|
||||||
|
renderSetBackgroundColor(&COLOR_BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderSetSize(int width, int height)
|
void renderSetSize(int width, int height)
|
||||||
|
@ -263,12 +264,12 @@ static void _processDirtyPixels()
|
||||||
static void _setAllDirty()
|
static void _setAllDirty()
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
_dirty_left = 0;
|
_dirty_left = 0;
|
||||||
_dirty_right = render_width - 1;
|
_dirty_right = render_width - 1;
|
||||||
_dirty_down = 0;
|
_dirty_down = 0;
|
||||||
_dirty_up = render_height - 1;
|
_dirty_up = render_height - 1;
|
||||||
|
|
||||||
for (y = _dirty_down; y <= _dirty_up; y++)
|
for (y = _dirty_down; y <= _dirty_up; y++)
|
||||||
{
|
{
|
||||||
for (x = _dirty_left; x <= _dirty_right; x++)
|
for (x = _dirty_left; x <= _dirty_right; x++)
|
||||||
|
@ -799,10 +800,10 @@ void renderSetPreviewCallbacks(PreviewCallbackResize resize, PreviewCallbackClea
|
||||||
_cb_preview_clear = clear ? clear : _previewClear;
|
_cb_preview_clear = clear ? clear : _previewClear;
|
||||||
_cb_preview_draw = draw ? draw : _previewDraw;
|
_cb_preview_draw = draw ? draw : _previewDraw;
|
||||||
_cb_preview_update = update ? update : _previewUpdate;
|
_cb_preview_update = update ? update : _previewUpdate;
|
||||||
|
|
||||||
_cb_preview_resize(render_width, render_height);
|
_cb_preview_resize(render_width, render_height);
|
||||||
_cb_preview_clear(background_color);
|
_cb_preview_clear(background_color);
|
||||||
|
|
||||||
_setAllDirty();
|
_setAllDirty();
|
||||||
_processDirtyPixels();
|
_processDirtyPixels();
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@ extern "C" {
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
void paysagesInit();
|
void paysagesInit();
|
||||||
|
void paysagesSave(char* filepath);
|
||||||
|
void paysagesLoad(char* filepath);
|
||||||
|
|
||||||
/* array.c */
|
/* array.c */
|
||||||
void arrayCreate(Array* array, int item_size);
|
void arrayCreate(Array* array, int item_size);
|
||||||
|
@ -21,8 +23,6 @@ void arrayClear(Array* array);
|
||||||
|
|
||||||
/* auto.c */
|
/* auto.c */
|
||||||
void autoInit();
|
void autoInit();
|
||||||
void autoSave(char* filepath);
|
|
||||||
void autoLoad(char* filepath);
|
|
||||||
void autoSetDaytime(int hour, int minute);
|
void autoSetDaytime(int hour, int minute);
|
||||||
void autoSetDaytimeFraction(double daytime);
|
void autoSetDaytimeFraction(double daytime);
|
||||||
void autoSetRenderQuality(int quality);
|
void autoSetRenderQuality(int quality);
|
||||||
|
@ -97,14 +97,6 @@ void fogSetColor(Color col);
|
||||||
void fogSetDistance(double near, double far);
|
void fogSetDistance(double near, double far);
|
||||||
Color fogApplyToLocation(Vector3 location, Color base);
|
Color fogApplyToLocation(Vector3 location, Color base);
|
||||||
|
|
||||||
/* lighting.c */
|
|
||||||
void lightingSave(FILE* f);
|
|
||||||
void lightingLoad(FILE* f);
|
|
||||||
void lightingSetSunDirection(double x, double y, double z);
|
|
||||||
void lightingSetSunAngle(double hor, double ver);
|
|
||||||
void lightingSetSunColor(Color col);
|
|
||||||
Color lightingApply(Vector3 location, Vector3 normal, double shadowing, Color base, double reflection, double shininess);
|
|
||||||
|
|
||||||
/* noise.c */
|
/* noise.c */
|
||||||
NoiseGenerator* noiseCreateGenerator();
|
NoiseGenerator* noiseCreateGenerator();
|
||||||
void noiseDeleteGenerator(NoiseGenerator* generator);
|
void noiseDeleteGenerator(NoiseGenerator* generator);
|
||||||
|
@ -120,6 +112,7 @@ void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level);
|
||||||
void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double height);
|
void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double height);
|
||||||
void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start_level, double scaling_factor, double height_factor, int randomize_offset);
|
void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start_level, double scaling_factor, double height_factor, int randomize_offset);
|
||||||
void noiseAddLevelsSimple(NoiseGenerator* generator, int level_count, double scaling, double height);
|
void noiseAddLevelsSimple(NoiseGenerator* generator, int level_count, double scaling, double height);
|
||||||
|
void noiseRemoveLevel(NoiseGenerator* generator, int level);
|
||||||
int noiseGetLevel(NoiseGenerator* generator, int level, NoiseLevel* params);
|
int noiseGetLevel(NoiseGenerator* generator, int level, NoiseLevel* params);
|
||||||
void noiseSetLevel(NoiseGenerator* generator, int level, NoiseLevel params);
|
void noiseSetLevel(NoiseGenerator* generator, int level, NoiseLevel params);
|
||||||
void noiseSetLevelSimple(NoiseGenerator* generator, int level, double scaling, double height);
|
void noiseSetLevelSimple(NoiseGenerator* generator, int level, double scaling, double height);
|
||||||
|
|
|
@ -20,12 +20,14 @@ void terrainInit()
|
||||||
{
|
{
|
||||||
_definition = terrainCreateDefinition();
|
_definition = terrainCreateDefinition();
|
||||||
_max_height = noiseGetMaxValue(_definition.height_noise);
|
_max_height = noiseGetMaxValue(_definition.height_noise);
|
||||||
|
|
||||||
|
_environment.toggle_fog = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void terrainSave(FILE* f)
|
void terrainSave(FILE* f)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
noiseSave(_definition.height_noise, f);
|
noiseSave(_definition.height_noise, f);
|
||||||
toolsSaveInt(f, _definition.height_modifiers_count);
|
toolsSaveInt(f, _definition.height_modifiers_count);
|
||||||
for (i = 0; i < _definition.height_modifiers_count; i++)
|
for (i = 0; i < _definition.height_modifiers_count; i++)
|
||||||
|
@ -37,7 +39,7 @@ void terrainSave(FILE* f)
|
||||||
void terrainLoad(FILE* f)
|
void terrainLoad(FILE* f)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
noiseLoad(_definition.height_noise, f);
|
noiseLoad(_definition.height_noise, f);
|
||||||
_max_height = noiseGetMaxValue(_definition.height_noise);
|
_max_height = noiseGetMaxValue(_definition.height_noise);
|
||||||
|
|
||||||
|
@ -56,17 +58,17 @@ void terrainLoad(FILE* f)
|
||||||
TerrainDefinition terrainCreateDefinition()
|
TerrainDefinition terrainCreateDefinition()
|
||||||
{
|
{
|
||||||
TerrainDefinition definition;
|
TerrainDefinition definition;
|
||||||
|
|
||||||
definition.height_noise = noiseCreateGenerator();
|
definition.height_noise = noiseCreateGenerator();
|
||||||
definition.height_modifiers_count = 0;
|
definition.height_modifiers_count = 0;
|
||||||
|
|
||||||
return definition;
|
return definition;
|
||||||
}
|
}
|
||||||
|
|
||||||
void terrainDeleteDefinition(TerrainDefinition definition)
|
void terrainDeleteDefinition(TerrainDefinition definition)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
noiseDeleteGenerator(definition.height_noise);
|
noiseDeleteGenerator(definition.height_noise);
|
||||||
for (i = 0; i < definition.height_modifiers_count; i++)
|
for (i = 0; i < definition.height_modifiers_count; i++)
|
||||||
{
|
{
|
||||||
|
@ -77,9 +79,9 @@ void terrainDeleteDefinition(TerrainDefinition definition)
|
||||||
void terrainCopyDefinition(TerrainDefinition source, TerrainDefinition* destination)
|
void terrainCopyDefinition(TerrainDefinition source, TerrainDefinition* destination)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
noiseCopy(source.height_noise, destination->height_noise);
|
noiseCopy(source.height_noise, destination->height_noise);
|
||||||
|
|
||||||
for (i = 0; i < destination->height_modifiers_count; i++)
|
for (i = 0; i < destination->height_modifiers_count; i++)
|
||||||
{
|
{
|
||||||
modifierDelete(destination->height_modifiers[i]);
|
modifierDelete(destination->height_modifiers[i]);
|
||||||
|
@ -138,16 +140,16 @@ static inline double _getHeight(TerrainDefinition* definition, double x, double
|
||||||
{
|
{
|
||||||
Vector3 location;
|
Vector3 location;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
location.x = x;
|
location.x = x;
|
||||||
location.y = noiseGet2DDetail(definition->height_noise, x, z, detail);
|
location.y = noiseGet2DDetail(definition->height_noise, x, z, detail);
|
||||||
location.z = z;
|
location.z = z;
|
||||||
|
|
||||||
for (i = 0; i < definition->height_modifiers_count; i++)
|
for (i = 0; i < definition->height_modifiers_count; i++)
|
||||||
{
|
{
|
||||||
location = modifierApply(definition->height_modifiers[i], location);
|
location = modifierApply(definition->height_modifiers[i], location);
|
||||||
}
|
}
|
||||||
|
|
||||||
return location.y;
|
return location.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,13 +216,15 @@ double terrainGetShadow(Vector3 start, Vector3 direction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Color _getColor(TerrainDefinition* definition, Vector3 point, double precision)
|
static Color _getColor(TerrainDefinition* definition, TerrainEnvironment* environment, Vector3 point, double precision)
|
||||||
{
|
{
|
||||||
Color color;
|
Color color;
|
||||||
|
|
||||||
/* FIXME Environment for textures should be customized */
|
|
||||||
color = texturesGetColor(point);
|
color = texturesGetColor(point);
|
||||||
color = fogApplyToLocation(point, color);
|
if (environment->toggle_fog)
|
||||||
|
{
|
||||||
|
color = fogApplyToLocation(point, color);
|
||||||
|
}
|
||||||
//color = cloudsApplySegmentResult(color, camera_location, point);
|
//color = cloudsApplySegmentResult(color, camera_location, point);
|
||||||
|
|
||||||
return color;
|
return color;
|
||||||
|
@ -248,7 +252,7 @@ int terrainProjectRay(Vector3 start, Vector3 direction, Vector3* hit_point, Colo
|
||||||
{
|
{
|
||||||
start.y = height;
|
start.y = height;
|
||||||
*hit_point = start;
|
*hit_point = start;
|
||||||
*hit_color = _getColor(&_definition, start, inc_value);
|
*hit_color = _getColor(&_definition, &_environment, start, inc_value);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +283,7 @@ static int _postProcessFragment(RenderFragment* fragment)
|
||||||
|
|
||||||
point = _getPoint(&_definition, point.x, point.z, precision);
|
point = _getPoint(&_definition, point.x, point.z, precision);
|
||||||
|
|
||||||
fragment->vertex.color = _getColor(&_definition, point, precision);
|
fragment->vertex.color = _getColor(&_definition, &_environment, point, precision);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -324,7 +328,20 @@ double terrainGetHeightNormalized(double x, double z)
|
||||||
|
|
||||||
Color terrainGetColorCustom(double x, double z, double detail, TerrainDefinition* definition, TerrainQuality* quality, TerrainEnvironment* environment)
|
Color terrainGetColorCustom(double x, double z, double detail, TerrainDefinition* definition, TerrainQuality* quality, TerrainEnvironment* environment)
|
||||||
{
|
{
|
||||||
return _getColor(definition, _getPoint(definition, x, z, detail), detail);
|
if (!definition)
|
||||||
|
{
|
||||||
|
definition = &_definition;
|
||||||
|
}
|
||||||
|
if (!quality)
|
||||||
|
{
|
||||||
|
quality = &_quality;
|
||||||
|
}
|
||||||
|
if (!environment)
|
||||||
|
{
|
||||||
|
environment = &_environment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _getColor(definition, environment, _getPoint(definition, x, z, detail), detail);
|
||||||
}
|
}
|
||||||
|
|
||||||
Color terrainGetColor(double x, double z, double detail)
|
Color terrainGetColor(double x, double z, double detail)
|
||||||
|
@ -351,7 +368,7 @@ void terrainRender(RenderProgressCallback callback)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < chunk_count - 1; i++)
|
for (i = 0; i < chunk_count - 1; i++)
|
||||||
{
|
{
|
||||||
_renderQuad(cx - radius_ext + chunk_size * i, cz - radius_ext, chunk_size);
|
_renderQuad(cx - radius_ext + chunk_size * i, cz - radius_ext, chunk_size);
|
||||||
|
|
|
@ -26,7 +26,7 @@ typedef struct
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int unused;
|
int toggle_fog;
|
||||||
} TerrainEnvironment;
|
} TerrainEnvironment;
|
||||||
|
|
||||||
void terrainInit();
|
void terrainInit();
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "water.h"
|
#include "water.h"
|
||||||
#include "terrain.h"
|
#include "terrain.h"
|
||||||
|
#include "lighting.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
@ -80,6 +81,9 @@ WaterDefinition waterCreateDefinition()
|
||||||
result.main_color = COLOR_BLACK;
|
result.main_color = COLOR_BLACK;
|
||||||
result.depth_color = COLOR_BLACK;
|
result.depth_color = COLOR_BLACK;
|
||||||
result.height = -1000.0;
|
result.height = -1000.0;
|
||||||
|
result.reflection = 0.0;
|
||||||
|
result.transparency = 0.0;
|
||||||
|
result.transparency_depth = 0.0;
|
||||||
result.waves_noise = noiseCreateGenerator();
|
result.waves_noise = noiseCreateGenerator();
|
||||||
result.waves_noise_height = 0.02;
|
result.waves_noise_height = 0.02;
|
||||||
result.waves_noise_scale = 0.2;
|
result.waves_noise_scale = 0.2;
|
||||||
|
@ -181,7 +185,8 @@ WaterResult waterGetColorCustom(Vector3 location, Vector3 look, WaterDefinition*
|
||||||
RayCastingResult refracted;
|
RayCastingResult refracted;
|
||||||
Vector3 normal;
|
Vector3 normal;
|
||||||
Color color;
|
Color color;
|
||||||
double shadowed, detail, depth;
|
ReceiverMaterial material;
|
||||||
|
double detail, depth;
|
||||||
|
|
||||||
if (definition == NULL)
|
if (definition == NULL)
|
||||||
{
|
{
|
||||||
|
@ -231,15 +236,10 @@ WaterResult waterGetColorCustom(Vector3 location, Vector3 look, WaterDefinition*
|
||||||
color.b = definition->main_color.b * (1.0 - definition->transparency) + result.reflected.b * definition->reflection + result.refracted.b * definition->transparency;
|
color.b = definition->main_color.b * (1.0 - definition->transparency) + result.reflected.b * definition->reflection + result.refracted.b * definition->transparency;
|
||||||
color.a = 1.0;
|
color.a = 1.0;
|
||||||
|
|
||||||
if (environment->toggle_shadows)
|
material.base = color;
|
||||||
{
|
material.reflection = 0.8;
|
||||||
shadowed = terrainGetShadow(location, sun_direction_inv);
|
material.shininess = 0.6;
|
||||||
}
|
color = lightingApplyCustom(location, normal, material, environment->lighting_definition, NULL, environment->lighting_environment);
|
||||||
else
|
|
||||||
{
|
|
||||||
shadowed = 0.0;
|
|
||||||
}
|
|
||||||
color = lightingApply(location, normal, shadowed, color, 0.8, 0.6);
|
|
||||||
if (environment->toggle_fog)
|
if (environment->toggle_fog)
|
||||||
{
|
{
|
||||||
color = fogApplyToLocation(location, color);
|
color = fogApplyToLocation(location, color);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define _PAYSAGES_WATER_H_
|
#define _PAYSAGES_WATER_H_
|
||||||
|
|
||||||
#include "shared/types.h"
|
#include "shared/types.h"
|
||||||
|
#include "lighting.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -32,7 +33,8 @@ typedef struct
|
||||||
RayCastingFunction reflection_function;
|
RayCastingFunction reflection_function;
|
||||||
RayCastingFunction refraction_function;
|
RayCastingFunction refraction_function;
|
||||||
int toggle_fog;
|
int toggle_fog;
|
||||||
int toggle_shadows;
|
LightingDefinition* lighting_definition;
|
||||||
|
LightingEnvironment* lighting_environment;
|
||||||
} WaterEnvironment;
|
} WaterEnvironment;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
Loading…
Reference in a new issue