diff --git a/gui_qt/formterraincanvas.cpp b/gui_qt/formterraincanvas.cpp index 757a6d2..b90e620 100644 --- a/gui_qt/formterraincanvas.cpp +++ b/gui_qt/formterraincanvas.cpp @@ -11,8 +11,8 @@ public: //addOsd(QString("geolocation")); - configScaling(0.5, 200.0, 3.0, 50.0); - configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0); + configScaling(1.0, 1.0, 1.0, 1.0); + //configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0); } ~PreviewTerrainCanvasHeight() @@ -22,18 +22,37 @@ public: protected: QColor getColor(double x, double y) { + Color col, mask; double height; - height = 0.0; // TODO - return QColor((int)(255.0 * height), (int)(255.0 * height), (int)(255.0 * height)); + if (_max - _min < 0.000001) + { + return Qt::black; + } + else + { + height = heightmapGetValue(&_preview_canvas->height_map, x + 0.5, y + 0.5); + col.r = col.g = col.b = (height - _min) / (_max - _min); + col.a = 1.0; + + mask.r = 0.3; + mask.g = 0.0; + mask.b = 0.0; + mask.a = 1.0 - terrainCanvasGetMaskValue(_preview_canvas, x + 0.5, y + 0.5); + colorMask(&col, &mask); + + return colorToQColor(col); + } } void updateData() { terrainCanvasCopy(_base_canvas, _preview_canvas); + heightmapGetLimits(&_preview_canvas->height_map, &_min, &_max); } private: TerrainCanvas* _base_canvas; TerrainCanvas* _preview_canvas; + double _max, _min; }; /**************** Form ****************/ diff --git a/lib_paysages/terraincanvas.c b/lib_paysages/terraincanvas.c index 3bb0aaa..2bf4595 100644 --- a/lib_paysages/terraincanvas.c +++ b/lib_paysages/terraincanvas.c @@ -126,8 +126,7 @@ Vector3 terrainCanvasApply(TerrainCanvas* canvas, Vector3 location) double height, distance; /* Get height map displacement */ - inside_x = (location.x - canvas->area.location_x) / canvas->area.size_x; - inside_z = (location.z - canvas->area.location_z) / canvas->area.size_z; + geoareaToLocal(&canvas->area, location.x, location.z, &inside_x, &inside_z); height = heightmapGetValue(&canvas->height_map, inside_x, inside_z); /* Apply factor */ @@ -137,28 +136,41 @@ Vector3 terrainCanvasApply(TerrainCanvas* canvas, Vector3 location) height += noiseGet2DTotal(canvas->detail_noise, location.x / canvas->detail_scaling, location.z / canvas->detail_scaling) * canvas->detail_height_factor; /* Apply integration mask */ - inside_x = (inside_x - 0.5) * 2.0; - inside_z = (inside_z - 0.5) * 2.0; - if (canvas->mask.mode == INTEGRATIONMASK_MODE_SQUARE) - { - inside_x = fabs(inside_x); - inside_z = fabs(inside_z); - distance = inside_x > inside_z ? inside_x : inside_z; - } - else - { - distance = sqrt(inside_x * inside_x + inside_z * inside_z); - } - if (distance <= 1.0 - canvas->mask.smoothing) - { - location.y = height; - } - else if (distance <= 1.0) - { - double influence = (1.0 - distance) / canvas->mask.smoothing; - location.y = influence * height + (1.0 - influence) * location.y; - } + double influence = terrainCanvasGetMaskValue(canvas, inside_x, inside_z); + location.y = influence * height + (1.0 - influence) * location.y; } return location; } + +double terrainCanvasGetMaskValue(TerrainCanvas* canvas, double local_x, double local_z) +{ + double distance; + + local_x = (local_x - 0.5) * 2.0; + local_z = (local_z - 0.5) * 2.0; + + if (canvas->mask.mode == INTEGRATIONMASK_MODE_SQUARE) + { + local_x = fabs(local_x); + local_z = fabs(local_z); + distance = local_x > local_z ? local_x : local_z; + } + else + { + distance = sqrt(local_x * local_x + local_z * local_z); + } + + if (distance <= 1.0 - canvas->mask.smoothing) + { + return 1.0; + } + else if (distance <= 1.0) + { + return (1.0 - distance) / canvas->mask.smoothing; + } + else + { + return 0.0; + } +} diff --git a/lib_paysages/terraincanvas.h b/lib_paysages/terraincanvas.h index e61c8d2..45488ac 100644 --- a/lib_paysages/terraincanvas.h +++ b/lib_paysages/terraincanvas.h @@ -47,6 +47,7 @@ void terrainCanvasLoad(PackStream* stream, TerrainCanvas* canvas); void terrainCanvasGetLimits(TerrainCanvas* canvas, double* ymin, double* ymax); void terrainCanvasRevertToTerrain(TerrainCanvas* canvas); Vector3 terrainCanvasApply(TerrainCanvas* canvas, Vector3 location); +double terrainCanvasGetMaskValue(TerrainCanvas* canvas, double local_x, double local_z); #ifdef __cplusplus }