From db51b3af81dbfd9ca8c92c4422b2a0bb009d3371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Sun, 16 Jun 2013 15:23:37 +0200 Subject: [PATCH] Fixed terrain paint brush 'flatten' - Now taking scaling into account - Added unit tests on the brush --- src/editing/terrain/paintingbrush.cpp | 2 +- src/testing/test_terrain_painting.c | 186 +++++++++++++++++++++++++- 2 files changed, 186 insertions(+), 2 deletions(-) diff --git a/src/editing/terrain/paintingbrush.cpp b/src/editing/terrain/paintingbrush.cpp index de1cf40..c24c396 100644 --- a/src/editing/terrain/paintingbrush.cpp +++ b/src/editing/terrain/paintingbrush.cpp @@ -133,7 +133,7 @@ void PaintingBrush::applyToTerrain(TerrainDefinition* terrain, double x, double case PAINTING_BRUSH_FLATTEN: if (reverse) { - _height = terrainGetInterpolatedHeight(terrain, x, z, 0, 1); + _height = terrainGetInterpolatedHeight(terrain, x * terrain->scaling, z * terrain->scaling, 0, 1); } else { diff --git a/src/testing/test_terrain_painting.c b/src/testing/test_terrain_painting.c index c7750a7..8ad85b5 100644 --- a/src/testing/test_terrain_painting.c +++ b/src/testing/test_terrain_painting.c @@ -91,5 +91,189 @@ START_TEST(test_terrain_painting_grid) } END_TEST -TEST_CASE(terrain_painting, test_terrain_painting_grid) +START_TEST(test_terrain_painting_brush_elevation) +{ + /* Set up */ + TerrainDefinition* terrain = _setUpDefinition(); + + /* Test */ + /* TODO */ + + /* Tear down */ + _tearDownDefinition(terrain); +} +END_TEST + +START_TEST(test_terrain_painting_brush_noise) +{ + /* Set up */ + TerrainDefinition* terrain = _setUpDefinition(); + + /* Test */ + /* TODO */ + + /* Tear down */ + _tearDownDefinition(terrain); +} + +END_TEST + +START_TEST(test_terrain_painting_brush_smooth) +{ + /* Set up */ + TerrainDefinition* terrain = _setUpDefinition(); + + /* Test */ + /* TODO */ + + /* Tear down */ + _tearDownDefinition(terrain); +} + +END_TEST + +START_TEST(test_terrain_painting_brush_flatten) +{ + /* Set up */ + TerrainDefinition* terrain = _setUpDefinition(); + TerrainBrush brush; + terrain->height = 1.0; + terrain->scaling = 1.0; + noiseForceValue(terrain->_height_noise, 0.0); + + /* Test flattening center at 0.5 */ + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + brush.relative_x = 0.0; + brush.relative_z = 0.0; + brush.hard_radius = 2.0; + brush.smoothed_size = 2.0; + brush.total_radius = 4.0; + terrainBrushFlatten(terrain->height_map, &brush, 0.5, 1.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.5); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.5); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.5); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.5); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.25); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + + /* Test brush strength */ + terrainClearPainting(terrain->height_map); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + brush.relative_x = 0.0; + brush.relative_z = 0.0; + brush.hard_radius = 2.0; + brush.smoothed_size = 2.0; + brush.total_radius = 4.0; + terrainBrushFlatten(terrain->height_map, &brush, 0.5, 0.01); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.005); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.005); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.005); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.005); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.0025); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + + /* Test cumulative effect */ + brush.relative_x = 0.0; + brush.relative_z = 0.0; + brush.hard_radius = 2.0; + brush.smoothed_size = 2.0; + brush.total_radius = 4.0; + terrainBrushFlatten(terrain->height_map, &brush, 0.5, 0.01); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.00995); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.00995); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.00995); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.00995); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.0049875); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + + /* Test with height modifier */ + terrain->height = 10.0; + terrainClearPainting(terrain->height_map); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + brush.relative_x = 0.0; + brush.relative_z = 0.0; + brush.hard_radius = 2.0; + brush.smoothed_size = 2.0; + brush.total_radius = 4.0; + terrainBrushFlatten(terrain->height_map, &brush, 0.5, 1.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.025); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + + /* Test with scaling modifier */ + terrain->height = 10.0; + terrain->scaling = 2.0; + terrainClearPainting(terrain->height_map); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + brush.relative_x = 0.0; + brush.relative_z = 0.0; + brush.hard_radius = 2.0; + brush.smoothed_size = 2.0; + brush.total_radius = 4.0; + terrainBrushFlatten(terrain->height_map, &brush, 0.5, 1.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, -1, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 0, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 1, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 2, 0, 1), 0.05); + ck_assert_double_eq(terrainGetGridHeight(terrain, 3, 0, 1), 0.025); + ck_assert_double_eq(terrainGetGridHeight(terrain, 4, 0, 1), 0.0); + ck_assert_double_eq(terrainGetGridHeight(terrain, 5, 0, 1), 0.0); + + /* Tear down */ + _tearDownDefinition(terrain); +} + +END_TEST + +START_TEST(test_terrain_painting_brush_reset) +{ + /* Set up */ + TerrainDefinition* terrain = _setUpDefinition(); + + /* Test */ + /* TODO */ + + /* Tear down */ + _tearDownDefinition(terrain); +} +END_TEST + +TEST_CASE(terrain_painting, + test_terrain_painting_grid, + test_terrain_painting_brush_elevation, + test_terrain_painting_brush_noise, + test_terrain_painting_brush_smooth, + test_terrain_painting_brush_flatten, + test_terrain_painting_brush_reset)