diff options
Diffstat (limited to 'code/qcommon')
| -rw-r--r-- | code/qcommon/q_math.c | 330 | 
1 files changed, 15 insertions, 315 deletions
| diff --git a/code/qcommon/q_math.c b/code/qcommon/q_math.c index 80c9f8e..d2e0187 100644 --- a/code/qcommon/q_math.c +++ b/code/qcommon/q_math.c @@ -647,50 +647,14 @@ void SetPlaneSignbits (cplane_t *out) {  BoxOnPlaneSide  Returns 1, 2, or 1 + 2 - -// this is the slow, general version -int BoxOnPlaneSide2 (vec3_t emins, vec3_t emaxs, struct cplane_s *p) -{ -	int		i; -	float	dist1, dist2; -	int		sides; -	vec3_t	corners[2]; - -	for (i=0 ; i<3 ; i++) -	{ -		if (p->normal[i] < 0) -		{ -			corners[0][i] = emins[i]; -			corners[1][i] = emaxs[i]; -		} -		else -		{ -			corners[1][i] = emins[i]; -			corners[0][i] = emaxs[i]; -		} -	} -	dist1 = DotProduct (p->normal, corners[0]) - p->dist; -	dist2 = DotProduct (p->normal, corners[1]) - p->dist; -	sides = 0; -	if (dist1 >= 0) -		sides = 1; -	if (dist2 < 0) -		sides |= 2; - -	return sides; -} -  ==================  */ - -#if !id386 - -int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p) +int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, struct cplane_s *p)  { -	float	dist1, dist2; -	int		sides; +	float	dist[2]; +	int		sides, b, i; -// fast axial cases +	// fast axial cases  	if (p->type < 3)  	{  		if (p->dist <= emins[p->type]) @@ -700,291 +664,27 @@ int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p)  		return 3;  	} -// general case -	switch (p->signbits) +	// general case +	dist[0] = dist[1] = 0; +	if (p->signbits < 8) // >= 8: default case is original code (dist[0]=dist[1]=0)  	{ -	case 0: -		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; -		dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; -		break; -	case 1: -		dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; -		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; -		break; -	case 2: -		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; -		dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; -		break; -	case 3: -		dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; -		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; -		break; -	case 4: -		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; -		dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; -		break; -	case 5: -		dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; -		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; -		break; -	case 6: -		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; -		dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; -		break; -	case 7: -		dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; -		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; -		break; -	default: -		dist1 = dist2 = 0;		// shut up compiler -		break; +		for (i=0 ; i<3 ; i++) +		{ +			b = (p->signbits >> i) & 1; +			dist[ b] += p->normal[i]*emaxs[i]; +			dist[!b] += p->normal[i]*emins[i]; +		}  	}  	sides = 0; -	if (dist1 >= p->dist) +	if (dist[0] >= p->dist)  		sides = 1; -	if (dist2 < p->dist) +	if (dist[1] < p->dist)  		sides |= 2;  	return sides;  } -#elif __GNUC__ -// use matha.s -#else -#pragma warning( disable: 4035 ) - -__declspec( naked ) int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p) -{ -	static int bops_initialized; -	static int Ljmptab[8]; - -	__asm { - -		push ebx -			 -		cmp bops_initialized, 1 -		je  initialized -		mov bops_initialized, 1 -		 -		mov Ljmptab[0*4], offset Lcase0 -		mov Ljmptab[1*4], offset Lcase1 -		mov Ljmptab[2*4], offset Lcase2 -		mov Ljmptab[3*4], offset Lcase3 -		mov Ljmptab[4*4], offset Lcase4 -		mov Ljmptab[5*4], offset Lcase5 -		mov Ljmptab[6*4], offset Lcase6 -		mov Ljmptab[7*4], offset Lcase7 -			 -initialized: - -		mov edx,dword ptr[4+12+esp] -		mov ecx,dword ptr[4+4+esp] -		xor eax,eax -		mov ebx,dword ptr[4+8+esp] -		mov al,byte ptr[17+edx] -		cmp al,8 -		jge Lerror -		fld dword ptr[0+edx] -		fld st(0) -		jmp dword ptr[Ljmptab+eax*4] -Lcase0: -		fmul dword ptr[ebx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ebx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ebx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ecx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase1: -		fmul dword ptr[ecx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ebx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ebx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ecx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase2: -		fmul dword ptr[ebx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ecx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ebx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ecx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase3: -		fmul dword ptr[ecx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ecx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ebx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ecx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase4: -		fmul dword ptr[ebx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ebx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ecx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ebx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase5: -		fmul dword ptr[ecx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ebx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ecx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ebx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase6: -		fmul dword ptr[ebx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ecx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ecx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ecx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ebx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -		jmp LSetSides -Lcase7: -		fmul dword ptr[ecx] -		fld dword ptr[0+4+edx] -		fxch st(2) -		fmul dword ptr[ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[4+ecx] -		fld dword ptr[0+8+edx] -		fxch st(2) -		fmul dword ptr[4+ebx] -		fxch st(2) -		fld st(0) -		fmul dword ptr[8+ecx] -		fxch st(5) -		faddp st(3),st(0) -		fmul dword ptr[8+ebx] -		fxch st(1) -		faddp st(3),st(0) -		fxch st(3) -		faddp st(2),st(0) -LSetSides: -		faddp st(2),st(0) -		fcomp dword ptr[12+edx] -		xor ecx,ecx -		fnstsw ax -		fcomp dword ptr[12+edx] -		and ah,1 -		xor ah,1 -		add cl,ah -		fnstsw ax -		and ah,1 -		add ah,ah -		add cl,ah -		pop ebx -		mov eax,ecx -		ret -Lerror: -		int 3 -	} -} -#pragma warning( default: 4035 ) -#endif  /*  ================= | 
