コード例 #1
0
ファイル: VIS.CPP プロジェクト: 5432935/genesis3d
//================================================================================
//	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;
}
コード例 #2
0
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;
}
コード例 #3
0
/* ------------------------------------------------------------------------------------ */
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;
}