00001 #include <algorithm>
00002
00003 #include "ControlPointContainer.h"
00004 #include "Nurbs.h"
00005
00006 #include "TerrainGenerator.h"
00007
00008 using namespace VRS;
00009
00010
00011 namespace random_racer
00012 {
00013
00014 TerrainGenerator::TerrainGenerator(
00015 SO<ControlPointContainer> p_container,
00016 double p_size,
00017 double p_spacing,
00018 unsigned int p_lod)
00019 {
00020 m_container = p_container;
00021 m_size = p_size;
00022 m_spacing = p_spacing;
00023 m_lod = p_lod;
00024
00025
00026 m_nurbs = new Nurbs(round(m_size/m_spacing), m_spacing);
00027 }
00028
00029 TerrainGenerator::~TerrainGenerator()
00030 {
00031 }
00032
00033 void
00034 TerrainGenerator::generate(
00035 double p_x, double p_y, std::vector<VRS::Vector>* p_target)
00036 {
00037
00038
00039
00040
00041
00042
00043 double correctX, correctY, offset;
00044
00045 offset = m_size/2.0;
00046 correctX = ((p_x-offset) - floor((p_x-offset)/32.0)*32.0);
00047 correctY = ((p_y-offset) - floor((p_y-offset)/32.0)*32.0);
00048
00049
00050
00051
00052
00053 std::vector<VRS::Vector> temp;
00054
00055 m_container->getPoints(p_x, p_y, &temp);
00056
00057
00058
00059 m_nurbs->clear();
00060 m_nurbs->setCorrection(float(correctX), float(correctY));
00061
00062 m_nurbs->fill(temp.begin(), temp.end(), p_x - offset, p_y - offset);
00063 m_nurbs->evaluate(m_lod, p_target);
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 }
00077
00078 }