paysages : Added edge scrolling to terrain painting + restore to original.
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@530 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
737ba2a4d1
commit
a78fecdae7
4 changed files with 58 additions and 10 deletions
|
@ -77,6 +77,7 @@ DialogHeightMap::DialogHeightMap(QWidget* parent, TerrainDefinition* terrain) :
|
||||||
combobox = new QComboBox(panel);
|
combobox = new QComboBox(panel);
|
||||||
combobox->addItem(tr("Raise / lower"));
|
combobox->addItem(tr("Raise / lower"));
|
||||||
combobox->addItem(tr("Add noise / smooth"));
|
combobox->addItem(tr("Add noise / smooth"));
|
||||||
|
combobox->addItem(tr("Restore to original"));
|
||||||
connect(combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(brushModeChanged(int)));
|
connect(combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(brushModeChanged(int)));
|
||||||
panel->layout()->addWidget(combobox);
|
panel->layout()->addWidget(combobox);
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
|
#include <qt4/QtGui/qwidget.h>
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define HEIGHTMAP_RESOLUTION 256
|
#define HEIGHTMAP_RESOLUTION 256
|
||||||
|
#define CAMERA_DISTANCE 200.0
|
||||||
|
|
||||||
WidgetHeightMap::WidgetHeightMap(QWidget *parent, TerrainDefinition* terrain):
|
WidgetHeightMap::WidgetHeightMap(QWidget *parent, TerrainDefinition* terrain):
|
||||||
QGLWidget(parent)
|
QGLWidget(parent)
|
||||||
|
@ -37,7 +39,7 @@ WidgetHeightMap::WidgetHeightMap(QWidget *parent, TerrainDefinition* terrain):
|
||||||
_position_x = 0;
|
_position_x = 0;
|
||||||
_position_z = 0;
|
_position_z = 0;
|
||||||
_angle_h = 0.0;
|
_angle_h = 0.0;
|
||||||
_angle_v = 0.3;
|
_angle_v = 0.8;
|
||||||
|
|
||||||
_brush_x = 0.0;
|
_brush_x = 0.0;
|
||||||
_brush_z = 0.0;
|
_brush_z = 0.0;
|
||||||
|
@ -181,13 +183,18 @@ void WidgetHeightMap::timerEvent(QTimerEvent*)
|
||||||
double duration = 0.001 * (double)_last_time.msecsTo(new_time);
|
double duration = 0.001 * (double)_last_time.msecsTo(new_time);
|
||||||
_last_time = new_time;
|
_last_time = new_time;
|
||||||
|
|
||||||
|
if (not underMouse())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_last_brush_action != 0)
|
if (_last_brush_action != 0)
|
||||||
{
|
{
|
||||||
double brush_strength;
|
double brush_strength;
|
||||||
TerrainBrush brush;
|
TerrainBrush brush;
|
||||||
|
|
||||||
brush.relative_x = _brush_x;
|
brush.relative_x = _brush_x + (double)_position_x;
|
||||||
brush.relative_z = _brush_z;
|
brush.relative_z = _brush_z + (double)_position_z;
|
||||||
brush.hard_radius = _brush_size * (1.0 - _brush_smoothing);
|
brush.hard_radius = _brush_size * (1.0 - _brush_smoothing);
|
||||||
brush.smoothed_size = _brush_size * _brush_smoothing;
|
brush.smoothed_size = _brush_size * _brush_smoothing;
|
||||||
brush.total_radius = brush.hard_radius + brush.smoothed_size;
|
brush.total_radius = brush.hard_radius + brush.smoothed_size;
|
||||||
|
@ -209,6 +216,9 @@ void WidgetHeightMap::timerEvent(QTimerEvent*)
|
||||||
terrainBrushAddNoise(_terrain->height_map, &brush, _brush_noise, brush_strength * 10.0);
|
terrainBrushAddNoise(_terrain->height_map, &brush, _brush_noise, brush_strength * 10.0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case HEIGHTMAP_BRUSH_RESTORE:
|
||||||
|
terrainBrushReset(_terrain->height_map, &brush, brush_strength);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -217,6 +227,42 @@ void WidgetHeightMap::timerEvent(QTimerEvent*)
|
||||||
_dirty = true;
|
_dirty = true;
|
||||||
updateGL();
|
updateGL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Edge scrolling
|
||||||
|
// TODO Apply scrolling to vertex info and dirty only needed area
|
||||||
|
double edge_length = 10.0;
|
||||||
|
if (_brush_x > HEIGHTMAP_RESOLUTION / 2.0 - edge_length)
|
||||||
|
{
|
||||||
|
double dx = HEIGHTMAP_RESOLUTION / 2.0 - edge_length - _brush_x;
|
||||||
|
_position_x -= (int)ceil(dx);
|
||||||
|
|
||||||
|
_dirty = true;
|
||||||
|
updateGL();
|
||||||
|
}
|
||||||
|
if (_brush_x < -HEIGHTMAP_RESOLUTION / 2.0 + edge_length)
|
||||||
|
{
|
||||||
|
double dx = -HEIGHTMAP_RESOLUTION / 2.0 + edge_length - _brush_x;
|
||||||
|
_position_x -= (int)ceil(dx);
|
||||||
|
|
||||||
|
_dirty = true;
|
||||||
|
updateGL();
|
||||||
|
}
|
||||||
|
if (_brush_z > HEIGHTMAP_RESOLUTION / 2.0 - edge_length)
|
||||||
|
{
|
||||||
|
double dz = HEIGHTMAP_RESOLUTION / 2.0 - edge_length - _brush_z;
|
||||||
|
_position_z -= (int)ceil(dz);
|
||||||
|
|
||||||
|
_dirty = true;
|
||||||
|
updateGL();
|
||||||
|
}
|
||||||
|
if (_brush_z < -HEIGHTMAP_RESOLUTION / 2.0 + edge_length)
|
||||||
|
{
|
||||||
|
double dz = -HEIGHTMAP_RESOLUTION / 2.0 + edge_length - _brush_z;
|
||||||
|
_position_z -= (int)ceil(dz);
|
||||||
|
|
||||||
|
_dirty = true;
|
||||||
|
updateGL();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetHeightMap::initializeGL()
|
void WidgetHeightMap::initializeGL()
|
||||||
|
@ -319,7 +365,7 @@ void WidgetHeightMap::paintGL()
|
||||||
// Place camera
|
// Place camera
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluLookAt(50.0 * cos(_angle_h) * cos(_angle_v), 50.0 * sin(_angle_v), -50.0 * sin(_angle_h) * cos(_angle_v), 0.0, 0.0, 0.0, -cos(_angle_h) * sin(_angle_v), cos(_angle_v), sin(_angle_h) * sin(_angle_v));
|
gluLookAt(CAMERA_DISTANCE * cos(_angle_h) * cos(_angle_v), CAMERA_DISTANCE * sin(_angle_v), -CAMERA_DISTANCE * sin(_angle_h) * cos(_angle_v), 0.0, 0.0, 0.0, -cos(_angle_h) * sin(_angle_v), cos(_angle_v), sin(_angle_h) * sin(_angle_v));
|
||||||
|
|
||||||
// Place lights
|
// Place lights
|
||||||
GLfloat light_position[] = { 40.0, 40.0, 40.0, 0.0 };
|
GLfloat light_position[] = { 40.0, 40.0, 40.0, 0.0 };
|
||||||
|
@ -342,8 +388,8 @@ void WidgetHeightMap::paintGL()
|
||||||
_VertexInfo* vertex = _vertices + z * rx + x + dx;
|
_VertexInfo* vertex = _vertices + z * rx + x + dx;
|
||||||
double diff_x, diff_z, diff;
|
double diff_x, diff_z, diff;
|
||||||
|
|
||||||
diff_x = vertex->point.x - _brush_x;
|
diff_x = vertex->point.x - (double)_position_x - _brush_x;
|
||||||
diff_z = vertex->point.z - _brush_z;
|
diff_z = vertex->point.z - (double)_position_z - _brush_z;
|
||||||
diff = sqrt(diff_x * diff_x + diff_z * diff_z);
|
diff = sqrt(diff_x * diff_x + diff_z * diff_z);
|
||||||
if (diff > _brush_size)
|
if (diff > _brush_size)
|
||||||
{
|
{
|
||||||
|
@ -359,7 +405,7 @@ void WidgetHeightMap::paintGL()
|
||||||
}
|
}
|
||||||
glColor3f(0.8 + diff, vertex->painted ? 1.0 : 0.8, 0.8);
|
glColor3f(0.8 + diff, vertex->painted ? 1.0 : 0.8, 0.8);
|
||||||
glNormal3f(vertex->normal.x, vertex->normal.y, vertex->normal.z);
|
glNormal3f(vertex->normal.x, vertex->normal.y, vertex->normal.z);
|
||||||
glVertex3f(vertex->point.x, vertex->point.y, vertex->point.z);
|
glVertex3f(vertex->point.x - (double)_position_x, vertex->point.y, vertex->point.z - (double)_position_z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
|
@ -17,7 +17,8 @@ typedef struct
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
HEIGHTMAP_BRUSH_RAISE = 0,
|
HEIGHTMAP_BRUSH_RAISE = 0,
|
||||||
HEIGHTMAP_BRUSH_SMOOTH = 1
|
HEIGHTMAP_BRUSH_SMOOTH = 1,
|
||||||
|
HEIGHTMAP_BRUSH_RESTORE = 2
|
||||||
} HeightMapBrushMode;
|
} HeightMapBrushMode;
|
||||||
|
|
||||||
class WidgetHeightMap : public QGLWidget
|
class WidgetHeightMap : public QGLWidget
|
||||||
|
|
|
@ -436,13 +436,13 @@ static double _applyBrushReset(TerrainHeightMap* heightmap, TerrainBrush* brush,
|
||||||
UNUSED(brush);
|
UNUSED(brush);
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
|
|
||||||
double ideal = terrainGetInterpolatedHeight(heightmap->terrain, x, z, 1);
|
double ideal = terrainGetInterpolatedHeight(heightmap->terrain, x, z, 0);
|
||||||
return basevalue + (ideal - basevalue) * influence * force;
|
return basevalue + (ideal - basevalue) * influence * force;
|
||||||
}
|
}
|
||||||
|
|
||||||
void terrainBrushReset(TerrainHeightMap* heightmap, TerrainBrush* brush, double value)
|
void terrainBrushReset(TerrainHeightMap* heightmap, TerrainBrush* brush, double value)
|
||||||
{
|
{
|
||||||
/* No need to prepare the floating data, it can't grow here */
|
_prepareBrushStroke(heightmap, brush);
|
||||||
_applyBrush(heightmap, brush, value, NULL, _applyBrushReset);
|
_applyBrush(heightmap, brush, value, NULL, _applyBrushReset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue