void Pathfinder::BuildPath(PathNode * lastNode) { m_finalPath.clear(); m_edgesPath.clear(); //iterate over all node parents to get the full path PathNode * node = lastNode; USVec2D edgeDir; USVec2D edgePos; float edgeLength; while (node->GetParent()) { m_finalPath.push_back(node); for (std::vector<Polygon::Edge>::iterator itr = node->GetPolygon()->m_edges.begin(); itr != node->GetPolygon()->m_edges.end(); ++itr) { if (itr->m_neighbour == node->GetParent()->GetPolygon()) { edgeDir = node->GetPolygon()->m_vertices[itr->m_verticesID[1]] - node->GetPolygon()->m_vertices[itr->m_verticesID[0]]; edgeLength = edgeDir.Length(); edgePos = node->GetPolygon()->m_vertices[itr->m_verticesID[0]] + (edgeDir.NormVector() * (edgeLength / 2)); m_edgesPath.push_back(edgePos); } } node = node->GetParent(); } node = node; }
Pathfinder::Pathfinder(): MOAIEntity2D(), m_navmesh{navmeshFilename} { RTTI_BEGIN RTTI_EXTEND(MOAIEntity2D) RTTI_END m_pathfinder = this; //fill m_nodes uint16_t numPolygons = m_navmesh.GetNumPolygons(); float cost = 0; USVec2D diagonal; float centreDist; for (uint16_t index = 0; index < numPolygons; ++index) { cost = rand() % 3000 + 500; PathNode node(m_navmesh.GetPolygon(index), cost, 0.f); diagonal = node.GetPolygon()->m_vertices[2] - node.GetPolygon()->m_vertices[0]; centreDist = diagonal.Length() / 2; node.SetCentrePos(node.GetPolygon()->m_vertices[0] + (diagonal.NormVector() * centreDist)); m_nodes.push_back(node); } }