Advertisement
BratokHR

Untitled

Apr 9th, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. /*
  2. ================
  3. create_nodes_by_range
  4.  
  5. Сканирует  местость  вокруг  и  добавляет  узлы  в
  6. границах [w1:w2][h1:h2] (не учитывает высоту).
  7.  
  8. Если  find = true, то  местность  сканируется пока
  9. узлы   не   найдут   find_org  или  не  закончится
  10. диапазон.
  11. ================
  12. */
  13. void create_nodes_by_range( float *origin, int w1, int w2, int h1, int h2, int range, bool find, float *find_org )
  14. {
  15.     size_t n, i, j;
  16.     node_t tmp_node;
  17.     float tmp_pos[ 3 ];
  18.     bool found;
  19.  
  20.     int step = 10; // максимальная высота, на которую игрок может наступить
  21.  
  22.     float pw[ 4 ] = { -1, 1, 0, 0 };
  23.     float ph[ 4 ] = { 0, 0, -1, 1 };
  24.  
  25.     // удаляем старые узлы
  26.     if ( !nodes.empty() )
  27.         reset_nodes();
  28.  
  29.     // выставляем границы
  30.     w1 = (int)origin[ 0 ] + w1;
  31.     w2 = (int)origin[ 0 ] + w2;
  32.     h1 = (int)origin[ 1 ] + h1;
  33.     h2 = (int)origin[ 1 ] + h2;
  34.  
  35.     // добавляем первый узел
  36.     VectorCopy( origin, tmp_pos );
  37.     tmp_pos[ 2 ] -= MAX_DIST_ROUTE;
  38.     GetPositionBulletTrace( tmp_node.origin, origin, tmp_pos );
  39.     tmp_node.origin[ 2 ] += 20; // увеличиваем высоту узла, для предотвращения застреваний в текстуре
  40.     nodes.push_back( tmp_node );
  41.  
  42.     // сканируем местность вокруг первого узла
  43.     for ( n = 0; ; n++ )
  44.     {
  45.         // для компилятора nodes.size() автоматически равен 1, исправлем это
  46.         if ( n >= nodes.size() )
  47.             break;
  48.  
  49.         // расширяем площадь узлов по всем 4 сторонам, учитывая подъемы/лестницы
  50.         // [ С, Ю, З, В ]
  51.         for ( i = 0; i < 4; i++ )
  52.         {
  53.             tmp_pos[ 0 ] = nodes[ n ].origin[ 0 ] + range * pw[ i ];
  54.             tmp_pos[ 1 ] = nodes[ n ].origin[ 1 ] + range * ph[ i ];
  55.             tmp_pos[ 2 ] = nodes[ n ].origin[ 2 ] + 40;
  56.  
  57.             if ( IsVisible( nodes[ n ].origin, tmp_pos ) )
  58.             {
  59.                 VectorCopy( tmp_pos, tmp_node.origin );
  60.                 tmp_pos[ 2 ] -= MAX_DIST_ROUTE;
  61.  
  62.                 GetPositionBulletTrace( tmp_pos, tmp_node.origin, tmp_pos );
  63.                 tmp_pos[ 2 ] += 10;
  64.  
  65.                 if ( IsVisible( nodes[ n ].origin, tmp_pos ) )
  66.                 {
  67.                     // фильтруем узел находящийся за границами
  68.                     if ( tmp_pos[ 0 ] < w1 || tmp_pos[ 0 ] > w2
  69.                         || tmp_pos[ 1 ] < h1 || tmp_pos[ 1 ] > h2 )
  70.                         continue;
  71.  
  72.                     if ( tmp_pos[ 2 ] - nodes[ n ].origin[ 2 ] > 30 )
  73.                         continue;
  74.  
  75.                     found = false;
  76.  
  77.                     // несколько узлов могут находится на одних и тех же координатах
  78.                     // исключаем эту возможность
  79.                     for ( j = 0; j < nodes.size(); j++ )
  80.                     {
  81.                         if ( GetDistance( nodes[ j ].origin, tmp_pos ) < 5 )
  82.                         {
  83.                             found = true;
  84.                             break;
  85.                         }
  86.                     }
  87.  
  88.                     // если место свободное, то добавляем сюда узел
  89.                     if ( !found )
  90.                     {
  91.                         VectorCopy( tmp_pos, tmp_node.origin );
  92.                         tmp_node.num = 0;
  93.  
  94.                         nodes.push_back( tmp_node );
  95.  
  96.                         if ( find && IsVisible( tmp_pos, find_org ) )
  97.                         {
  98.                             // мы нашли нужную координату и незачем больше создавать узлы
  99.                             return;
  100.                         }
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement