//================================================================================ // CalcPortalInfo //================================================================================ geBoolean CalcPortalInfo(VIS_Portal *Portal) { geFloat BestDist, Dist; GBSP_Poly *Poly; geVec3d Vect; int32 i; Poly = Portal->Poly; PolyCenter(Poly, &Portal->Center); BestDist = 0.0f; for (i=0; i< Poly->NumVerts; i++) { geVec3d_Subtract(&Poly->Verts[i], &Portal->Center, &Vect); Dist = geVec3d_Length(&Vect); if (Dist > BestDist) BestDist = Dist; } Portal->Radius = BestDist; return GE_TRUE; }
geBoolean TestEdge_r(geFloat Start, geFloat End, int32 p1, int32 p2, int32 StartVert) { int32 j, k; geFloat Dist; geVec3d Delta; geVec3d Exact; geVec3d Off; geFloat Error; geVec3d p; if (p1 == p2) { //GHook.Printf("TestEdge_r: Degenerate Edge.\n"); return GE_TRUE; // degenerate edge } for (k=StartVert ; k<NumEdgeVerts ; k++) { j = EdgeVerts[k]; if (j==p1 || j == p2) continue; p = WeldedVerts[j]; geVec3d_Subtract(&p, &EdgeStart, &Delta); Dist = geVec3d_DotProduct(&Delta, &EdgeDir); if (Dist <= Start || Dist >= End) continue; geVec3d_AddScaled(&EdgeStart, &EdgeDir, Dist, &Exact); geVec3d_Subtract(&p, &Exact, &Off); Error = geVec3d_Length(&Off); if (fabs(Error) > OFF_EPSILON) continue; // break the edge NumTJunctions++; TestEdge_r (Start, Dist, p1, j, k+1); TestEdge_r (Dist, End, j, p2, k+1); return GE_TRUE; } if (NumTempIndexVerts >= MAX_TEMP_INDEX_VERTS) { GHook.Error("Max Temp Index Verts.\n"); return GE_FALSE; } TempIndexVerts[NumTempIndexVerts] = p1; NumTempIndexVerts++; return GE_TRUE; }
/* ------------------------------------------------------------------------------------ */ int CPathFollower::GetRotationToFacePoint(const geVec3d &LookFrom, const geVec3d &LookAt, geVec3d *LookRotation) { geFloat x, l; geVec3d_Subtract(&LookAt, &LookFrom, LookRotation); l = geVec3d_Length(LookRotation); // protect from Div by Zero if(l > 0.0f) { x = LookRotation->X; // changed QD 12/15/05 // LookRotation->X = (geFloat)(GE_PI*0.5f) - (geFloat)acos(LookRotation->Y / l); LookRotation->X = GE_PIOVER2 - (geFloat)acos(LookRotation->Y / l); LookRotation->Y = (geFloat)atan2(x, LookRotation->Z) + GE_PI; LookRotation->Z = 0.0f; // roll is zero - always!!? } return RGF_SUCCESS; }