1 // This file may be redistributed and modified only under the terms of
2 // the GNU General Public License (See COPYING for details).
3 // Copyright (C) 2003 Alistair Riddoch
4
5 #include <Mercator/Terrain.h>
6 #include <Mercator/Segment.h>
7 #include <Mercator/TerrainMod.h>
8
9 #include <iostream>
10
11 #include <cassert>
12
terrain_mod_context_test(Mercator::Terrain & terrain)13 int terrain_mod_context_test(Mercator::Terrain & terrain)
14 {
15 const WFMath::Ball<2> circ2(WFMath::Point<2>(0.0,0.0), 12.0);
16 Mercator::TerrainMod * mp = new Mercator::LevelTerrainMod<WFMath::Ball>(10.0f, circ2);
17 terrain.addMod(mp);
18
19 mp->setContext(new Mercator::TerrainMod::Context);
20 mp->context()->setId("foo");
21
22 terrain.removeMod(mp);
23
24 delete mp;
25
26 return 0;
27 }
28
main()29 int main()
30 {
31 Mercator::Terrain terrain(Mercator::Terrain::SHADED);
32
33 terrain.setBasePoint(0, 0, 2.8);
34 terrain.setBasePoint(1, 0, 7.1);
35 terrain.setBasePoint(2, 0, 7.1);
36 terrain.setBasePoint(0, 1, 0.2);
37 terrain.setBasePoint(1, 1, 0.2);
38 terrain.setBasePoint(2, 1, 0.2);
39 terrain.setBasePoint(0, 2, 14.7);
40 terrain.setBasePoint(1, 2, 14.7);
41 terrain.setBasePoint(2, 2, 14.7);
42
43 const WFMath::Ball<2> circ2(WFMath::Point<2>(0.0,0.0), 12.0);
44 Mercator::TerrainMod * mp1 = new Mercator::LevelTerrainMod<WFMath::Ball>(10.0f, circ2);
45 terrain.addMod(mp1);
46
47 const WFMath::RotBox<2> rot(
48 WFMath::Point<2>(-80.,-130.) ,
49 WFMath::Vector<2>(150.0,120.0),
50 WFMath::RotMatrix<2>().rotation(WFMath::numeric_constants<WFMath::CoordType>::pi()/4));
51 Mercator::TerrainMod * mp2 = new Mercator::LevelTerrainMod<WFMath::RotBox>(10.0f, rot);
52 terrain.addMod(mp2);
53
54 const WFMath::Ball<2> ball(WFMath::Point<2>(80, 80), 10);
55 Mercator::CraterTerrainMod<WFMath::Ball> * mp3 = new Mercator::CraterTerrainMod<WFMath::Ball>(-5.f, ball);
56 terrain.addMod(mp3);
57
58 Mercator::Segment * segment = terrain.getSegment(0, 0);
59
60 if (segment == 0) {
61 std::cerr << "Segment not created by addition of required basepoints"
62 << std::endl << std::flush;
63 return 1;
64 }
65
66 segment->populate();
67
68 segment = terrain.getSegment(1, 1);
69
70 if (segment == 0) {
71 std::cerr << "Segment not created by addition of required basepoints"
72 << std::endl << std::flush;
73 return 1;
74 }
75
76 segment->populate();
77
78 assert(segment->isValid());
79
80 terrain.updateMod(mp3);
81
82 assert(!segment->isValid());
83
84 //Check that the stored bbox is correctly updated when calling updateMod().
85 WFMath::AxisBox<2> mp3_rect1 = mp3->bbox();
86 mp3->setShape(-5.f, WFMath::Ball<2>(WFMath::Point<2>(-80, 80), 10));
87 WFMath::AxisBox<2> mp3_rect2 = terrain.updateMod(mp3);
88 assert(mp3_rect1 == mp3_rect2);
89 WFMath::AxisBox<2> mp3_rect3 = mp3->bbox();
90 mp3->setShape(-5.f, WFMath::Ball<2>(WFMath::Point<2>(-80, -80), 10));
91 WFMath::AxisBox<2> mp3_rect4 = terrain.updateMod(mp3);
92 assert(mp3_rect3 == mp3_rect4);
93
94 terrain.removeMod(mp1);
95
96 delete mp1;
97
98 terrain.removeMod(mp2);
99
100 delete mp2;
101
102 terrain.removeMod(mp3);
103
104 delete mp3;
105
106 return terrain_mod_context_test(terrain);
107 }
108