예제 #1
0
void ESceneAIMapTool::UpdateLinks(SAINode* N, bool bIC)
{
	Fvector 	Pos;
    SAINode* 	D;
    // left 
    {
        Pos.set			(N->Pos);
        Pos.x			-=	m_Params.fPatchSize;
        D				= GetNode(Pos,bIC);
        if (bIC||CanTravel(N->Pos, Pos)) 			N->n1 = D;
        if (D&&(bIC||CanTravel(D->Pos, N->Pos))) 	D->n3 = N;
    }
    // fwd
    {
        Pos.set			(N->Pos);
        Pos.z			+=	m_Params.fPatchSize;
        D				= GetNode(Pos,bIC);
        if (bIC||CanTravel(N->Pos, Pos)) 			N->n2 = D;
        if (D&&(bIC||CanTravel(D->Pos, N->Pos))) 	D->n4 = N;
    }
    // right
    {
        Pos.set			(N->Pos);
        Pos.x			+=	m_Params.fPatchSize;
        D				= GetNode(Pos,bIC);
        if (bIC||CanTravel(N->Pos, Pos)) 			N->n3 = D;
        if (D&&(bIC||CanTravel(D->Pos, N->Pos))) 	D->n1 = N;
    }
    // back
    {
        Pos.set			(N->Pos);
        Pos.z			-=	m_Params.fPatchSize;
        D				= GetNode(Pos,bIC);
        if (bIC||CanTravel(N->Pos, Pos)) 			N->n4 = D;
        if (D&&(bIC||CanTravel(D->Pos, N->Pos))) 	D->n2 = N;
    }
}
예제 #2
0
u32 BuildNode(Fvector& vFrom, Fvector& vAt)	// return node's index
{
	// *** Test if we can travel this path
	SnapXZ			(vAt);

	if (!CanTravel(vFrom, vAt))	return InvalidNode;

	// *** set up xr_new<node
	vertex N;
	if (CreateNode(vAt,N)) {
		//*** check if similar node exists
		u32	old		= FindNode(N.Pos);
		if (old==InvalidNode)	
		{
			// register xr_new<node
			RegisterNode(N);
			return g_nodes.size()-1;
		} else {
			// where already was node - return it
			return old;
		}
	} else return InvalidNode;
}
예제 #3
0
SAINode* ESceneAIMapTool::BuildNode(Fvector& vFrom, Fvector& vAt, bool bIC, bool bSuperIC)	// return node's index
{
	// *** Test if we can travel this path
	SnapXZ			(vAt,m_Params.fPatchSize);

	if (!(bIC||CanTravel(vFrom, vAt)))	return 0;

	// *** set up node
	SAINode N;

	BOOL bRes		= CreateNode(vAt,N,bIC);
    if (!bRes&&bIC&&bSuperIC){
    	Fvector D	= {0,1,0};
		N.Plane.build(vAt,D);					// build plane
		N.Plane.intersectRayPoint(vAt,D,N.Pos);	// "project" position
        bRes		= TRUE;
    }
	if (bRes) {
		//*** check if similar node exists
		SAINode* old = FindNode(N.Pos);
		if (!old){
			// register xr_new<node
            AINodeVec* V 		= HashMap(N.Pos);
            if (V){ 
	        	m_Nodes.push_back	(xr_new<SAINode>(N));
                V->push_back		(m_Nodes.back());
                return m_Nodes.back();
            }else return 0;
		}else{
			// where already was node - return it
			return old;
		}
	}else{ 
    	return 0;
    }
}