Here's soem of the code that does the aforementioned stuff
Code:
template <class X>
void GenerateVectorCollapsedMatrixFromWaypoints(std::vector<Vector3*> & Waypoints,VectorCollapsedMatrix<X> & output_Mat,
float LOSRadius,BSP*pBSP,float cancel_dist = 999999999999.0f)
{
int s = Waypoints.size();
while(s--)
output_Mat.AddRowToMatrix();
std::vector<Vector3*>::iterator ptr_outside,ptr_inside;
int out_index(0),in_index(0);
for(ptr_outside = Waypoints.begin(); ptr_outside != Waypoints.end(); ptr_outside++,out_index++)
{
Vector3 & outside_vec = (**ptr_outside);
in_index = 0;
for(ptr_inside = Waypoints.begin(); ptr_inside != Waypoints.end(); ptr_inside++, in_index++)
{
if(ptr_outside == ptr_inside)
continue;
Vector3 & inside_vec = (**ptr_inside);
float sep_dist = (inside_vec-outside_vec).GetLength();
if(sep_dist >= cancel_dist)
continue;
HitInfo LOS = TraceSphereToBSPFaces(pBSP,outside_vec,inside_vec,LOSRadius,0.0f);
if(LOS.Time == 1.0f)
{
trace << "outside index can see inside index: " << out_index << " " << in_index << "\n";
output_Mat.AddEntryToRow(out_index,in_index);
}
else
{
trace << "outside index cannot see inside index: " << out_index << " " << in_index << "\n";
}
}
}
output_Mat.EnsureConsecutiveAndUnique();
}
template <class X>
void BuildWaypointPathMatrices(VectorCollapsedMatrix<X> * gMatrices,int num_mats)
{
char msg[1024];
DWORD start = GetTickCount();
gMatrices[0].EnsureConsecutiveAndUnique();
for(int i = 0; i < num_mats-1; i++)
{
memset(msg,0,sizeof(char)*1024);
sprintf(msg,"Matrix: %i out of %i",i+1,num_mats);
R_PrintString(msg);
SwapBuffers(gpNTGLAPI->NT_DEVICE_CONTEXT);
gpNTGLAPI->ntglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
VectorCollapsedMatrixMultiply(gMatrices[0],gMatrices[i],gMatrices[i+1]);
gMatrices[i+1].EnsureConsecutiveAndUnique();
}
float total = (float)(GetTickCount() - start) * .001f;
trace << "TotalTime: " << total << "\n";
memset(msg,0,sizeof(char)*1024);
sprintf(msg,"TotalTime: %i seconds",(int)total);
R_PrintString(msg);
SwapBuffers(gpNTGLAPI->NT_DEVICE_CONTEXT);
gpNTGLAPI->ntglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}