ESceneAIMapTool::ESceneAIMapTool():ESceneToolBase(OBJCLASS_AIMAP) { m_Shader = 0; m_Flags.zero(); m_AIBBox.invalidate (); // m_Header.size_y = m_Header.aabb.max.y-m_Header.aabb.min.y+EPS_L; hash_Initialize(); m_VisRadius = 30.f; m_SmoothHeight = 0.5f; m_BrushSize = 1; m_CFModel = 0; }
void xrBuildNodes() { // begin XRC.box_options (CDB::OPT_FULL_TEST); XRC.ray_options (CDB::OPT_CULL | CDB::OPT_ONLYNEAREST); g_nodes.reserve (1024*1024); // Initialize hash hash_Initialize (); for (u32 em=0; em<Emitters.size(); em++) { // Align emitter Fvector Pos = Emitters[em]; SnapXZ (Pos); Pos.y +=1; Fvector Dir; Dir.set(0,-1,0); XRC.ray_query (&Level,Pos,Dir,3); if (XRC.r_count()==0) { Msg ("Can't align emitter"); abort (); } else { CDB::RESULT& R = *XRC.r_begin(); Pos.y = Pos.y - R.range; } // Build first node int oldcount = g_nodes.size(); int start = BuildNode (Pos,Pos); if (start==InvalidNode) continue; if (start<oldcount) continue; // Estimate nodes Fvector LevelSize; LevelBB.getsize (LevelSize); u32 estimated_nodes = iFloor(LevelSize.x/g_params.fPatchSize)*iFloor(LevelSize.z/g_params.fPatchSize); // General cycle for (u32 i=0; i<g_nodes.size(); i++) { // left if (g_nodes[i].n1==UnkonnectedNode) { Pos.set (g_nodes[i].Pos); Pos.x -= g_params.fPatchSize; int id = BuildNode(g_nodes[i].Pos,Pos); g_nodes[i].n1 = id; } // fwd if (g_nodes[i].n2==UnkonnectedNode) { Pos.set (g_nodes[i].Pos); Pos.z += g_params.fPatchSize; int id = BuildNode(g_nodes[i].Pos,Pos); g_nodes[i].n2 = id; } // right if (g_nodes[i].n3==UnkonnectedNode) { Pos.set (g_nodes[i].Pos); Pos.x += g_params.fPatchSize; int id = BuildNode(g_nodes[i].Pos,Pos); g_nodes[i].n3 = id; } // back if (g_nodes[i].n4==UnkonnectedNode) { Pos.set (g_nodes[i].Pos); Pos.z -= g_params.fPatchSize; int id = BuildNode(g_nodes[i].Pos,Pos); g_nodes[i].n4 = id; } if (i%512==0) { Status("%d / %d nodes created.",g_nodes.size()-i,g_nodes.size()); float p1 = float(i)/float(g_nodes.size()); float p2 = float(g_nodes.size())/estimated_nodes; float p = 0.1f*p1+0.9f*p2; clamp (p,0.f,1.f); Progress(p); } } } Msg("Freeing memory..."); hash_Destroy (); }