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