Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ================
- create_nodes_by_range
- Сканирует местость вокруг и добавляет узлы в
- границах [w1:w2][h1:h2] (не учитывает высоту).
- Если find = true, то местность сканируется пока
- узлы не найдут find_org или не закончится
- диапазон.
- ================
- */
- void create_nodes_by_range( float *origin, int w1, int w2, int h1, int h2, int range, bool find, float *find_org )
- {
- size_t n, i, j;
- node_t tmp_node;
- float tmp_pos[ 3 ];
- bool found;
- int step = 10; // максимальная высота, на которую игрок может наступить
- float pw[ 4 ] = { -1, 1, 0, 0 };
- float ph[ 4 ] = { 0, 0, -1, 1 };
- // удаляем старые узлы
- if ( !nodes.empty() )
- reset_nodes();
- // выставляем границы
- w1 = (int)origin[ 0 ] + w1;
- w2 = (int)origin[ 0 ] + w2;
- h1 = (int)origin[ 1 ] + h1;
- h2 = (int)origin[ 1 ] + h2;
- // добавляем первый узел
- VectorCopy( origin, tmp_pos );
- tmp_pos[ 2 ] -= MAX_DIST_ROUTE;
- GetPositionBulletTrace( tmp_node.origin, origin, tmp_pos );
- tmp_node.origin[ 2 ] += 20; // увеличиваем высоту узла, для предотвращения застреваний в текстуре
- nodes.push_back( tmp_node );
- // сканируем местность вокруг первого узла
- for ( n = 0; ; n++ )
- {
- // для компилятора nodes.size() автоматически равен 1, исправлем это
- if ( n >= nodes.size() )
- break;
- // расширяем площадь узлов по всем 4 сторонам, учитывая подъемы/лестницы
- // [ С, Ю, З, В ]
- for ( i = 0; i < 4; i++ )
- {
- tmp_pos[ 0 ] = nodes[ n ].origin[ 0 ] + range * pw[ i ];
- tmp_pos[ 1 ] = nodes[ n ].origin[ 1 ] + range * ph[ i ];
- tmp_pos[ 2 ] = nodes[ n ].origin[ 2 ] + 40;
- if ( IsVisible( nodes[ n ].origin, tmp_pos ) )
- {
- VectorCopy( tmp_pos, tmp_node.origin );
- tmp_pos[ 2 ] -= MAX_DIST_ROUTE;
- GetPositionBulletTrace( tmp_pos, tmp_node.origin, tmp_pos );
- tmp_pos[ 2 ] += 10;
- if ( IsVisible( nodes[ n ].origin, tmp_pos ) )
- {
- // фильтруем узел находящийся за границами
- if ( tmp_pos[ 0 ] < w1 || tmp_pos[ 0 ] > w2
- || tmp_pos[ 1 ] < h1 || tmp_pos[ 1 ] > h2 )
- continue;
- if ( tmp_pos[ 2 ] - nodes[ n ].origin[ 2 ] > 30 )
- continue;
- found = false;
- // несколько узлов могут находится на одних и тех же координатах
- // исключаем эту возможность
- for ( j = 0; j < nodes.size(); j++ )
- {
- if ( GetDistance( nodes[ j ].origin, tmp_pos ) < 5 )
- {
- found = true;
- break;
- }
- }
- // если место свободное, то добавляем сюда узел
- if ( !found )
- {
- VectorCopy( tmp_pos, tmp_node.origin );
- tmp_node.num = 0;
- nodes.push_back( tmp_node );
- if ( find && IsVisible( tmp_pos, find_org ) )
- {
- // мы нашли нужную координату и незачем больше создавать узлы
- return;
- }
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement