SHARE
TWEET

Untitled

fihten1991 Apr 24th, 2019 (edited) 74 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Index: inc/edMath/osg/BSpline.h
  2. ===================================================================
  3. --- inc/edMath/osg/BSpline.h    (revision 149509)
  4. +++ inc/edMath/osg/BSpline.h    (working copy)
  5. @@ -38,6 +38,19 @@
  6.         double getCurvature(double param) const;
  7.         // Ближайшая точка на дороге (вернет параметр)
  8.         double findClosestPoint(const osg::Vec3d& point, int startSegment = 0, int endSegment = INT_MAX) const;
  9. +
  10. +       // находит ближайшую точку на дороге с заданой точностью
  11. +       double findClosestPoint2(const osg::Vec3d &point, double eps) const;
  12. +
  13. +       // производит поиск по дороге ближайшей точки к заданной
  14. +       // в пределах начального и конечного параметров с заданным шагом
  15. +       // в pointOnPolyline будет находится точка полилинии
  16. +       // метод вернёт параметр сегмента полилинии
  17. +       double findClosestPoint2(const osg::Vec3d &point, double startParam, double endParam, double step, osg::Vec3d* pointOnPolyline) const;
  18. +
  19. +       // считает точки на сегменте, функция вернёт параметр
  20. +       double findClosestPointOnSigment(const osg::Vec3d &vStartToEnd, const osg::Vec3d &vStartToPoint) const;
  21. +
  22.         // Длина между двумя точками
  23.         double getLength(double startParam, double endParam) const;
  24.         /*Сместить параметр на длину
  25. Index: src/edMath/osg/BSpline.cpp
  26. ===================================================================
  27. --- src/edMath/osg/BSpline.cpp  (revision 149509)
  28. +++ src/edMath/osg/BSpline.cpp  (working copy)
  29. @@ -26,7 +26,7 @@
  30.  
  31.     calculateSegmentMatrixes();
  32.  
  33. -   //Длины сегментов, номер сегмента равен вершине слева
  34. +   // Длины сегментов, номер сегмента равен вершине слева
  35.     ed::vector<double> segmentLengths;
  36.     if (!calculateSegmentLengths(segmentLengths))
  37.         return false;
  38. @@ -190,6 +190,80 @@
  39.     return param;
  40.  }
  41.  
  42. +// находит точку с заданной точностью
  43. +double  ed::BSpline::findClosestPoint2(const osg::Vec3d &point, double eps) const
  44. +{
  45. +   double paramOfPolyline = -1;
  46. +
  47. +   double step = 1;
  48. +   osg::Vec3d pointOnPolyline;
  49. +
  50. +   double startParam = getStartParam();
  51. +   double endParam = getEndParam();
  52. +
  53. +   for (int i = 0; i < 100; i++)
  54. +   {
  55. +       paramOfPolyline = findClosestPoint2(point, startParam, endParam, step, &pointOnPolyline);
  56. +
  57. +       osg::Vec3d pointOnSpline = getPoint(paramOfPolyline);
  58. +
  59. +       double length = ed::length2d(pointOnSpline - pointOnPolyline);
  60. +
  61. +       if (length < eps)
  62. +           break;
  63. +
  64. +       startParam = paramOfPolyline - step;
  65. +       endParam = paramOfPolyline + step;
  66. +       step /= 2;
  67. +   }
  68. +   return paramOfPolyline;
  69. +}
  70. +
  71. +// перебирает дорогу по параметру c заданным шагом
  72. +double ed::BSpline::findClosestPoint2(const osg::Vec3d &point, double startParam, double endParam, double step, osg::Vec3d* closestPointOnPolyline) const // тест
  73. +{
  74. +   double closestParam = 0;
  75. +   double closestLength = FLT_MAX;
  76. +
  77. +   while (startParam < endParam)
  78. +   {
  79. +       osg::Vec3d startPoint = getPoint(startParam);
  80. +       osg::Vec3d endPoint = getPoint(startParam + step);
  81. +
  82. +       osg::Vec3d vStartToEnd = endPoint - startPoint;
  83. +       osg::Vec3d vStartToPoint = point - startPoint;
  84. +
  85. +       vStartToEnd.y = 0.0;
  86. +       vStartToPoint.y = 0.0;
  87. +
  88. +       double param = findClosestPointOnSigment(vStartToEnd, vStartToPoint);
  89. +
  90. +       osg::Vec3d pointOnPolyline = startPoint + vStartToEnd * param; /// получили точку на полилинии
  91. +       double length = ed::length2d(point - pointOnPolyline); // нашли расстояние от данного сегмента до точки
  92. +
  93. +       if (length < closestLength)
  94. +       {
  95. +           closestLength = length;
  96. +           closestParam = startParam + param * step;
  97. +           *closestPointOnPolyline = pointOnPolyline;
  98. +       }
  99. +
  100. +       startParam += step;
  101. +   }
  102. +   return closestParam;
  103. +}
  104. +
  105. +// находит параметр сегмента
  106. +double ed::BSpline::findClosestPointOnSigment(const osg::Vec3d &vStartToEnd, const osg::Vec3d &vStartToPoint) const
  107. +{
  108. +   double t = 0;
  109. +   double L2 = vStartToEnd.length2();
  110. +   if (L2 != 0)
  111. +       t = (vStartToPoint*vStartToEnd) / L2;
  112. +   t = ed::clamp(t, 0.0, 1.0);
  113. +   return t;
  114. +}
  115. +
  116.  double ed::BSpline::getLength(double startParam, double endParam) const
  117.  {
  118.     double minParam = std::max(std::min(startParam, endParam), double(0.0f));
  119. Index: src/edterrain4/edterrain/inc/edterrain4/ITerrainImpl4.h
  120. ===================================================================
  121. --- src/edterrain4/edterrain/inc/edterrain4/ITerrainImpl4.h (revision 19061)
  122. +++ src/edterrain4/edterrain/inc/edterrain4/ITerrainImpl4.h (working copy)
  123. @@ -154,50 +154,50 @@
  124.     // dispatcher
  125.     EDTERRAIN4_API landscape4::lTerraDispatch* getDispatcher();
  126.     // openTerrain
  127. -   virtual bool openTerrain(const char* filename, lua_State* options);
  128. +   EDTERRAIN4_API virtual bool openTerrain(const char* filename, lua_State* options);
  129.     // удалить
  130. -   virtual void release();
  131. +   EDTERRAIN4_API virtual void release();
  132.  
  133.  // TerrainContext
  134.  // Все изменения в сценах, дорожных сетях и прочем содержаться в нем
  135.  public:
  136.     // createContext
  137. -   virtual ITerrainContext* createContext() const;
  138. +   EDTERRAIN4_API virtual ITerrainContext* createContext() const;
  139.     // setCurrentContext
  140. -   virtual void setCurrentContext(ITerrainContext*);
  141. +   EDTERRAIN4_API virtual void setCurrentContext(ITerrainContext*);
  142.     // getCurrentContext
  143. -   virtual ITerrainContext* getCurrentContext() const;
  144. +   EDTERRAIN4_API virtual ITerrainContext* getCurrentContext() const;
  145.  
  146.  public:
  147.     // Получение конфига земли
  148. -   virtual lua_State* getTerrainCfg();
  149. +   EDTERRAIN4_API virtual lua_State* getTerrainCfg();
  150.  
  151.     // Инициализация
  152. -   virtual void init(const char* category, edterrain::onProgressCallback_t callback = nullptr) override;
  153. -   virtual void exit(const char* category) override;
  154. +   EDTERRAIN4_API virtual void init(const char* category, edterrain::onProgressCallback_t callback = nullptr) override;
  155. +   EDTERRAIN4_API virtual void exit(const char* category) override;
  156.  
  157.     // дата, для переключения сезонов
  158. -   virtual bool setDate(int day, int month);
  159. -   ed::string getTechSkinByDate(int day, int month) override;
  160. -   osg::Vec2f getTempratureRangeByDate(int day, int month) override;
  161. +   EDTERRAIN4_API virtual bool setDate(int day, int month);
  162. +   EDTERRAIN4_API ed::string getTechSkinByDate(int day, int month) override;
  163. +   EDTERRAIN4_API osg::Vec2f getTempratureRangeByDate(int day, int month) override;
  164.  
  165.     // максимальное/минимальное разрешение текстур
  166. -   virtual bool setTextureMode(bool full);
  167. +   EDTERRAIN4_API virtual bool setTextureMode(bool full);
  168.  public:
  169.     // querySceneObjectsCB
  170. -   virtual enQueryObjectsResult querySceneObjectsCB(const osg::Vec3d& pt1, const osg::Vec3d& pt2, uint32_t mask, OnQuerySceneObjectNdata_t callback)const;
  171. -   virtual enQueryObjectsResult querySceneObjectsCB(const osg::Polytope& polytope, uint32_t mask, OnQuerySceneObject_t callback)const;
  172. -   virtual enQueryObjectsResult querySceneObjectsCB(const osg::Polytope& polytope, uint32_t mask, OnQuerySceneObjectNdata_t callback)const;
  173. -   virtual enQueryObjectsResult querySceneObjectsCB(const osg::BoundingBoxf& box, uint32_t mask, OnQuerySceneObjectNdata_t callback)const;
  174. +   EDTERRAIN4_API virtual enQueryObjectsResult querySceneObjectsCB(const osg::Vec3d& pt1, const osg::Vec3d& pt2, uint32_t mask, OnQuerySceneObjectNdata_t callback)const;
  175. +   EDTERRAIN4_API virtual enQueryObjectsResult querySceneObjectsCB(const osg::Polytope& polytope, uint32_t mask, OnQuerySceneObject_t callback)const;
  176. +   EDTERRAIN4_API virtual enQueryObjectsResult querySceneObjectsCB(const osg::Polytope& polytope, uint32_t mask, OnQuerySceneObjectNdata_t callback)const;
  177. +   EDTERRAIN4_API virtual enQueryObjectsResult querySceneObjectsCB(const osg::BoundingBoxf& box, uint32_t mask, OnQuerySceneObjectNdata_t callback)const;
  178.  
  179.     // Уровень моря
  180. -   virtual double getSeaLevel() const;
  181. +   EDTERRAIN4_API virtual double getSeaLevel() const;
  182.  
  183.     // Получить приблизительную высоту по координате с учётом макс. высот всех площадок в квадрате со стороной dirtySize и центром (x,z)
  184. -   virtual double getDirtyHeight(double x, double z, double dirtySize);
  185. +   EDTERRAIN4_API virtual double getDirtyHeight(double x, double z, double dirtySize);
  186.  
  187.     // Получить координаты объекта по имени
  188. -   osg::Vec3d getGeoPointByName(const ed::string& name) override;
  189. +   EDTERRAIN4_API osg::Vec3d getGeoPointByName(const ed::string& name) override;
  190.  
  191.     // Запрос высоты в точке.
  192.     // Вернет высоту точки на поверхности ниже точки query
  193. @@ -217,34 +217,34 @@
  194.  // Информация об объекте сцены
  195.  public:
  196.     // матрица
  197. -   virtual osg::Matrixd getSceneObjectPosition(SceneObjectId objectId)const;
  198. +   EDTERRAIN4_API virtual osg::Matrixd getSceneObjectPosition(SceneObjectId objectId)const;
  199.     // тип
  200. -   virtual model::IModel* getSceneObjectType(SceneObjectId objectId)const;
  201. +   EDTERRAIN4_API virtual model::IModel* getSceneObjectType(SceneObjectId objectId)const;
  202.     // seed
  203. -   virtual float getSceneObjectSeed(SceneObjectId objectId)const;
  204. +   EDTERRAIN4_API virtual float getSceneObjectSeed(SceneObjectId objectId)const;
  205.     // аргументы анимации объекта
  206. -   virtual edterrain::Arguments getSceneObjectArgs(SceneObjectId objectId)const;
  207. +   EDTERRAIN4_API virtual edterrain::Arguments getSceneObjectArgs(SceneObjectId objectId)const;
  208.     // валидный id объекта?
  209. -   virtual bool isSceneObjectValid(SceneObjectId objectId)const;
  210. +   EDTERRAIN4_API virtual bool isSceneObjectValid(SceneObjectId objectId)const;
  211.     // получить id объекта по мнемоническому id
  212. -   virtual SceneObjectId parseMnemonicId(const char* mnemonicId);
  213. +   EDTERRAIN4_API virtual SceneObjectId parseMnemonicId(const char* mnemonicId);
  214.  
  215.  // Преобразование координат
  216.  public:
  217.     // convert x,y in UTM coords(x-east, y-north), to lat,lon (in degrees, N+, E+)
  218. -   virtual void toLatLon(double x, double y, double& lat, double& lon)const;
  219. +   EDTERRAIN4_API virtual void toLatLon(double x, double y, double& lat, double& lon)const;
  220.     // convert lat,lon (degrees, N+, E+) to UTM coords
  221. -   virtual void fromLatLon(double lat, double lon, double& x, double& y)const;
  222. +   EDTERRAIN4_API virtual void fromLatLon(double lat, double lon, double& x, double& y)const;
  223.     // convert MGRS to lockon
  224. -   virtual bool fromMGRStoLockon(const ed::string mgrs, double& lockon_z, double& lockon_x)const;
  225. +   EDTERRAIN4_API virtual bool fromMGRStoLockon(const ed::string mgrs, double& lockon_z, double& lockon_x)const;
  226.     // convert lockon to MGRS
  227. -   virtual ed::string fromLockonToMGRS(double lockon_z, double lockon_x, int prec=5)const;
  228. +   EDTERRAIN4_API virtual ed::string fromLockonToMGRS(double lockon_z, double lockon_x, int prec=5)const;
  229.     // convert from UTM to lockon
  230. -   virtual osg::Vec3d fromUTMtoLockon( const osg::Vec2d& utm)const;
  231. +   EDTERRAIN4_API virtual osg::Vec3d fromUTMtoLockon( const osg::Vec2d& utm)const;
  232.  
  233.  public:
  234.     // Запрос амбиентных звуковых эффектов по объему
  235. -   void queryAmbientSounds(
  236. +   EDTERRAIN4_API void queryAmbientSounds(
  237.         const osg::Vec3d& center,
  238.         double radius,
  239.         ed::vector<edterrain::AmbientSoundData>& result
  240. @@ -251,16 +251,16 @@
  241.         ) override;
  242.  public:
  243.     // Степень покрытия области цифровыми картами заданного масштаба. 0-0%, 1-100%
  244. -   virtual float getRasterChartCoverage(const osg::BoundingBox& box, enRasterChartScale scale);
  245. +   EDTERRAIN4_API virtual float getRasterChartCoverage(const osg::BoundingBox& box, enRasterChartScale scale);
  246.  
  247.  // поиск путей
  248.    
  249. -   virtual IRoute* createPathCB(const osg::Vec3d& pt1, const osg::Vec3d& pt2, uint32_t flags, edterrain::ITerrain::OnFindPathEdgeWeight callback)const;
  250. -   osg::Vec3d findClosestValidPointCB(const osg::Vec3d& pt, edterrain::ITerrain::OnFindPathEdgeWeight callback)const;
  251. +   EDTERRAIN4_API virtual IRoute* createPathCB(const osg::Vec3d& pt1, const osg::Vec3d& pt2, uint32_t flags, edterrain::ITerrain::OnFindPathEdgeWeight callback)const;
  252. +   EDTERRAIN4_API osg::Vec3d findClosestValidPointCB(const osg::Vec3d& pt, edterrain::ITerrain::OnFindPathEdgeWeight callback)const;
  253.  
  254.     // serialization
  255. -   bool savePath(IRoute* route, const ed::string& filename)const override;
  256. -   IRoute* loadPath(const ed::string& filename)const override;
  257. +   EDTERRAIN4_API bool savePath(IRoute* route, const ed::string& filename)const override;
  258. +   EDTERRAIN4_API IRoute* loadPath(const ed::string& filename)const override;
  259.  
  260.  // дорожная сеть
  261.     virtual IRoadNetwork* getRoadNetwork(const char* name) override;
  262. @@ -268,14 +268,14 @@
  263.     // Гражданский трафик
  264.  public:
  265.     // число маршрутов
  266. -   virtual int getCivilTrafficRouteCount()const override;
  267. +   EDTERRAIN4_API virtual int getCivilTrafficRouteCount()const override;
  268.     // маршрут по индексу
  269. -   virtual const IRoute* getCivilTrafficRoute(int index)const override;
  270. +   EDTERRAIN4_API virtual const IRoute* getCivilTrafficRoute(int index)const override;
  271.  
  272.  // Утилиты
  273.  public:
  274.     // Имя семантики
  275. -   virtual ed::string getSemanticName(int semantic);
  276. +   EDTERRAIN4_API virtual ed::string getSemanticName(int semantic);
  277.  
  278.  
  279.  protected:
  280. Index: src/edterrain4/edterrainEditors/Editors/RoadNetworkViewer.cpp
  281. ===================================================================
  282. --- src/edterrain4/edterrainEditors/Editors/RoadNetworkViewer.cpp   (revision 19061)
  283. +++ src/edterrain4/edterrainEditors/Editors/RoadNetworkViewer.cpp   (working copy)
  284. @@ -228,8 +228,8 @@
  285.  
  286.  bool RoadNetworkViewer::open(const ed::string& filename)
  287.  {
  288. -   if (!_roadNetwork.load(filename))
  289. -       return false;
  290. +   //  if (!_roadNetwork.load(filename))
  291. +   //      return false;
  292.     auto iterrain = edterrain::ITerrain::GetDefaultTerrain();
  293.     if (iterrain)
  294.         iroadNetwork = iterrain->getRoadNetwork(filename.c_str());
  295. @@ -242,13 +242,12 @@
  296.     sinksVariants[2] = new NORUNWAY_FilterSink(iroadNetwork);
  297.     sinksVariants[3] = new CheckRoadSink(iroadNetwork, &removedSceneObjects);
  298.     sinksVariants[4] = new RW_FilterSink(iroadNetwork);
  299. -  
  300.  
  301.     this->updateRoadNetwork();
  302.     return true;
  303.  }
  304.  
  305. -void RoadNetworkViewer::updateRoadNetwork()
  306. +/*void RoadNetworkViewer::updateRoadNetwork()
  307.  {
  308.     roadNetworkSpatial.clear();
  309.     roadNetworkPolylines.clear();
  310. @@ -276,8 +275,120 @@
  311.             break;
  312.     }
  313.     this->box = box;
  314. +}*/
  315. +
  316. +void buildPolylineForRoute(const edterrain::IRoute* route, ed::vector<osg::Vec3d>& polyline, const osg::Matrixd& transform, double h)
  317. +{
  318. +   polyline.clear();
  319. +
  320. +   // Длинна рута
  321. +   double length = route->getLength();
  322. +
  323. +   for (double l = 0; l < length; l += h)
  324. +   {
  325. +       auto ponr = route->getParamByLength(l);
  326. +       auto v = route->getPoint(ponr);
  327. +
  328. +       polyline.push_back(v*transform);
  329. +   }
  330. +
  331. +   auto v = route->getPoint(route->getEndPoint());
  332. +   polyline.push_back(v*transform);
  333.  }
  334.  
  335. +void RoadNetworkViewer::updateRoadNetwork()
  336. +{
  337. +   roadNetworkSpatial.clear();
  338. +   roadNetworkPolylines.clear();
  339. +
  340. +   ED_INFO("RoadNetworkViewer::updateRoadNetwork\n");
  341. +
  342. +   osg::BoundingBox box;
  343. +
  344. +   // Номер последнего элемента в массиве roadNetworkPolylines
  345. +   int n = 0;
  346. +
  347. +   // Рассматриваем дороги, которые не являются внутренними дорогами перекрестков
  348. +   for (int i = 0; i < iroadNetwork->roadsCount(); ++i)
  349. +   {
  350. +       auto road = iroadNetwork->getRoad(i);
  351. +
  352. +       // Строим полилинию для дороги
  353. +       ed::vector<osg::Vec3d> polyline;
  354. +       osg::Matrixd m = osg::Matrixd();
  355. +       buildPolylineForRoute(road, polyline, m, 0.1);
  356. +
  357. +       roadNetworkPolylines.push_back(render::RenderPolyline());
  358. +       roadNetworkPolylines.back().update(&polyline[0], polyline.size());
  359. +
  360. +       n = roadNetworkPolylines.size() - 1;
  361. +
  362. +       auto bb = road->getBoundingBox();
  363. +       roadNetworkSpatial.insert(n, bb);
  364. +       box.expandBy(bb);
  365. +
  366. +       if (n > 5000)
  367. +           break;
  368. +   }
  369. +
  370. +   // Рассматриваем внутренние дороги перекрестков
  371. +   for (int i = 0; i < iroadNetwork->crossroadsCount(); ++i)
  372. +   {
  373. +       if (n > 5000)
  374. +           break;
  375. +
  376. +       auto crossRoad = iroadNetwork->getCrossroad(i);
  377. +       // Колличество дорог примыкающих к перекрестку
  378. +       int N = crossRoad->roadsCount();
  379. +
  380. +       // Находим трансформ матрицу
  381. +
  382. +       // Матрица поворота
  383. +       osg::Matrixd rot = osg::Matrixd();
  384. +       rot.makeRotate(osg::Vec3d(0, 0, 1), crossRoad->getDirection());
  385. +
  386. +       // Матрица переноса
  387. +       osg::Matrixd tr = osg::Matrixd();
  388. +       tr.makeTranslate(crossRoad->getPos());
  389. +
  390. +       // Поворот и перенос
  391. +       osg::Matrixd m = rot * tr;
  392. +
  393. +       // Рассматриваем всевозможные пары примыкающих к перекрестку дорог
  394. +       for (int j = 0; j < N - 1; ++j)
  395. +       {
  396. +           for (int k = j + 1; k < N; ++k)
  397. +           {
  398. +               auto road = crossRoad->getInternalRoute(j, k);
  399. +               if (!road)
  400. +                   continue;
  401. +
  402. +               // Строим полилинию для внутренней дороги
  403. +               ed::vector<osg::Vec3d> polyline;
  404. +               buildPolylineForRoute(road, polyline, m, 1);
  405. +
  406. +               roadNetworkPolylines.push_back(render::RenderPolyline());
  407. +               roadNetworkPolylines.back().update(&polyline[0], polyline.size());
  408. +
  409. +               n = roadNetworkPolylines.size() - 1;
  410. +
  411. +               auto bb = road->getBoundingBox();
  412. +               bb = bb.transform(m);
  413. +               roadNetworkSpatial.insert(n, bb);
  414. +               box.expandBy(bb);
  415. +
  416. +               if (n > 5000)
  417. +                   break;
  418. +           }
  419. +
  420. +           if (n > 5000)
  421. +               break;
  422. +       }
  423. +
  424. +   }
  425. +   this->box = box;
  426. +}
  427. +
  428.  void RoadNetworkViewer::updateParam(edge::obj_param_t* msg)
  429.  {
  430.     edge::StdObject::updateParam(msg);
  431. @@ -907,8 +1018,8 @@
  432.         if (getRoadnetworkPoints(campos, groundpt, closestPoint))
  433.         {
  434.             color = osg::Vec4f(1, 1, 0.5f, 1);
  435. -           osg::Vec3d pt;
  436. -           iroadNetwork->getPoint(closestPoint, pt);
  437. +           osg::Vec3d pt = iroadNetwork->getPointOnSurface(closestPoint, pons);
  438. +//         iroadNetwork->getPoint(closestPoint, pt);
  439.  
  440.             {
  441.                 auto pt = iroadNetwork->getPointOnSurface(closestPoint, pons);
  442. Index: src/edterrain5/edterrain/inc/t5/rn5/rn5file.h
  443. ===================================================================
  444. --- src/edterrain5/edterrain/inc/t5/rn5/rn5file.h   (revision 19061)
  445. +++ src/edterrain5/edterrain/inc/t5/rn5/rn5file.h   (working copy)
  446. @@ -43,6 +43,9 @@
  447.     // Ӯ��⡯𮱲𠭱򢥠஠򮷪塭ࡤﱮ䥍
  448.     EDTERRAIN5_API virtual bool getPoint(const edterrain::PointOnRoad& pointOnRoad, osg::Vec3d& point) const override;
  449.  
  450. +   // get point on road projected to surface
  451. +   EDTERRAIN5_API virtual osg::Vec3d getPointOnSurface(const edterrain::PointOnRoad& ponr, edterrain::PointOnSurface& p) const override;
  452. +
  453.     // «駠깠����
  454.     EDTERRAIN5_API virtual bool findClosestPoint(const osg::Vec3d& point, edterrain::PointOnRoad& closestPoint,
  455.         edterrain::ICheckRoadSink* sink = NULL, double startDistance = 10000.0) const override;
  456. Index: src/edterrain5/edterrain/inc/t5/terrain/ITerrainImpl51.h
  457. ===================================================================
  458. --- src/edterrain5/edterrain/inc/t5/terrain/ITerrainImpl51.h    (nonexistent)
  459. +++ src/edterrain5/edterrain/inc/t5/terrain/ITerrainImpl51.h    (working copy)
  460. @@ -0,0 +1,27 @@
  461. +#pragma once
  462. +
  463. +#include "edterrain4/ITerrainImpl4.h"
  464. +#include "edTerrain/IRoadNetwork.h"
  465. +#include "t5/rn5/rn5file.h"
  466. +#include "ed/unordered_map.h"
  467. +#include "ed/string.h"
  468. +
  469. +using namespace edterrain;
  470. +
  471. +namespace t5
  472. +{
  473. +   class ITerrainImpl51 : public ITerrainImpl4
  474. +   {
  475. +   public:
  476. +       // Constructor
  477. +       ITerrainImpl51(landscape4::lTerraDispatch* terrain) :ITerrainImpl4(terrain) {};
  478. +
  479. +   public:
  480. +       // Get road network
  481. +       virtual IRoadNetwork* getRoadNetwork(const char* name) override;
  482. +
  483. +   private:
  484. +       // Map for optimization
  485. +       ed::unordered_map<ed::string, std::unique_ptr<t5::rn5file>> roadNetworks;
  486. +   };
  487. +}
  488. \ No newline at end of file
  489.  
  490. Property changes on: src/edterrain5/edterrain/inc/t5/terrain/ITerrainImpl51.h
  491. ___________________________________________________________________
  492. Added: svn:eol-style
  493. ## -0,0 +1 ##
  494. +CRLF
  495. \ No newline at end of property
  496. Index: src/edterrain5/edterrain/src/t5/rn5/rn5file.cpp
  497. ===================================================================
  498. --- src/edterrain5/edterrain/src/t5/rn5/rn5file.cpp (revision 19061)
  499. +++ src/edterrain5/edterrain/src/t5/rn5/rn5file.cpp (working copy)
  500. @@ -157,6 +157,18 @@
  501.     return true;
  502.  }
  503.  
  504. +osg::Vec3d rn5file::getPointOnSurface(const edterrain::PointOnRoad& ponr, edterrain::PointOnSurface& p) const
  505. +{
  506. +   osg::Vec3d pt;
  507. +   this->getPoint(ponr, pt);
  508. +   pt[1] = DBL_MAX;
  509. +
  510. +   p.set(pt);
  511. +   pt[1] = p.height();
  512. +
  513. +   return pt;
  514. +}
  515. +
  516.  bool rn5file::findClosestPoint(const osg::Vec3d& point, edterrain::PointOnRoad& closestPoint, edterrain::ICheckRoadSink* sink, double startDistance) const
  517.  {
  518.     if (segmentsTree.size() == 0)
  519. @@ -236,6 +248,12 @@
  520.     if (distance == FLT_MAX)
  521.         return false;
  522.  
  523. +   int roadIndex = closestPoint.getRoad();
  524. +   int crossroadIndex = closestPoint.getCrossroad();
  525. +   double param = roads[closestPoint.getRoad()].spline.findClosestPoint2(point, 0.1);
  526. +
  527. +   closestPoint = edterrain::PointOnRoad(roadIndex, param, crossroadIndex);
  528. +
  529.     return true;
  530.  }
  531.  
  532. Index: src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl5.cpp
  533. ===================================================================
  534. --- src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl5.cpp   (revision 19061)
  535. +++ src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl5.cpp   (working copy)
  536. @@ -10,7 +10,7 @@
  537.  #include "t5/sur5/inl/sur5fileNavGraph.inl"
  538.  
  539.  using namespace t5;
  540. -
  541. +
  542.  ITerrainImpl5::ITerrainImpl5() :L("ITerrainImpl5")
  543.  {
  544.     this->terrainContext = nullptr;
  545. @@ -304,7 +304,7 @@
  546.  }
  547.  
  548.  
  549. -extern "C" EDTERRAIN5_API edterrain::ITerrain* CreateITerrain(double version)
  550. +/*extern "C" EDTERRAIN5_API edterrain::ITerrain* CreateITerrain(double version)
  551.  {
  552.     return new ITerrainImpl5();
  553. -}
  554. +}*/
  555. Index: src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl51.cpp
  556. ===================================================================
  557. --- src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl51.cpp  (nonexistent)
  558. +++ src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl51.cpp  (working copy)
  559. @@ -0,0 +1,27 @@
  560. +#include "StdAfx.h"
  561. +#include "t5/terrain/ITerrainImpl51.h"
  562. +#include "edterrain4/lTerraDispatch.h"
  563. +
  564. +using namespace t5;
  565. +
  566. +// Get road network
  567. +edterrain::IRoadNetwork* ITerrainImpl51::getRoadNetwork(const char* name)
  568. +{
  569. +   auto it = roadNetworks.find(name);
  570. +   if (it != roadNetworks.end())
  571. +       return it->second.get();
  572. +
  573. +   auto roadNetwork = new t5::rn5file();
  574. +   if (!roadNetwork->load(name))
  575. +       return nullptr;
  576. +   roadNetworks[name].reset(roadNetwork);
  577. +
  578. +   return roadNetwork;
  579. +}
  580. +
  581. +// Get terrain
  582. +extern "C" EDTERRAIN5_API edterrain::ITerrain* CreateITerrain(double version)
  583. +{
  584. +   landscape4::lTerraDispatch* terrain = landscape4::CreateTerraDispatch();
  585. +   return new ITerrainImpl51(terrain);
  586. +}
  587. \ No newline at end of file
  588.  
  589. Property changes on: src/edterrain5/edterrain/src/t5/terrain/ITerrainImpl51.cpp
  590. ___________________________________________________________________
  591. Added: svn:eol-style
  592. ## -0,0 +1 ##
  593. +CRLF
  594. \ No newline at end of property
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top