Пример #1
0
bool BTri::isAbove3DNow(v2sf v0XY, v2sf v0Z1) const {
	for (int i = 0; i < 3; i++){
		v2sf planeXY = ((v2sf *) &edgePlanes[i])[0];
		v2sf planeZD = ((v2sf *) &edgePlanes[i])[1];

		v2sf dotXY = pfmul(planeXY, v0XY);
		v2sf dotZD = pfmul(planeZD, v0Z1);
		v2sf dot = pfacc(dotXY, dotZD);
		dot = pfacc(dot, dot);

		int d = _m_to_int(dot);
		if (d < 0) return false;
	}

	return true;
}
Пример #2
0
bool BSP::isInOpenSpace3DNow(const vec3 &pos) const {
	if (top != NULL){
		SSENode *node = sseTop;
		femms();

		v2sf posXY, posZ1;
		posXY = *(v2sf *) &pos.x;
		posZ1.m64_f32[0] = pos.z;
		posZ1.m64_f32[1] = 1.0f;

		while (true){
			v2sf planeXY = ((v2sf *) &node->tri.plane)[0];
			v2sf planeZD = ((v2sf *) &node->tri.plane)[1];

			v2sf dotXY = pfmul(planeXY, posXY);
			v2sf dotZD = pfmul(planeZD, posZ1);
			v2sf dot = pfacc(dotXY, dotZD);
			dot = pfacc(dot, dot);

			int d = _m_to_int(dot);

			if (d > 0){
				if (node->front){
					node = node->front;
				} else {
					femms();
					return true;
				}
			} else {
				if (node->back){
					node = node->back;
				} else {
					femms();
					return false;
				}
			}
		}
	}

	return false;
}
Пример #3
0
/* _mag_vect - find the magnitude of a vector
 *      a       - input vector
 *      return  - the magnitude of 'a'
 */
float _mag_vect (float *a)
{
	float r;
	__asm {
		femms
		mov			eax,a
		movq		mm0,[eax]
		movd		mm1,[eax+8]
		pfmul		(mm0,mm0)
		pfmul		(mm1,mm1)
		pfacc		(mm0,mm0)
		pfadd		(mm0,mm1)
		pfrsqrt		(mm1,mm0)
		movq		mm2,mm1
		pfmul		(mm1,mm1)
		pfrsqit1	(mm1,mm0)
		pfrcpit2	(mm1,mm2)
		pfmul		(mm0,mm1)
		movd		r,mm0
		femms
	}
	return r;
}
Пример #4
0
/* _dot_vect - compute the dot product of two vectors
 *      a       - input vector 1
 *      b       - input vector 2
 *      return  - the dot product
 */
float _dot_vect (float *a, float *b)
{
	float r;
	__asm {
		femms
		mov			eax,a
		mov			edx,b
		movq		mm0,[eax]
		movd		mm1,[eax+8]
		pfmul		(mm0,edx)
		pfacc		(mm0,mm0)
		pfmulm		(mm1,edx,0x8)
		pfadd		(mm0,mm1)
		movd		r,mm0
		femms
	}
	return r;
}
Пример #5
0
bool BNode::intersects3DNow(const vec4 &v0, const vec4 &v1, const vec4 &dir) const {
	v2sf planeXY = ((v2sf *) &tri.plane)[0];
	v2sf planeZD = ((v2sf *) &tri.plane)[1];

	v2sf v0XY = ((v2sf *) &v0)[0];
	v2sf v0Z1 = ((v2sf *) &v0)[1];

	v2sf dotXY = pfmul(planeXY, v0XY);
	v2sf dotZD = pfmul(planeZD, v0Z1);
	v2sf dotD = pfacc(dotXY, dotZD);
	dotD = pfacc(dotD, dotD);

	int d = _m_to_int(dotD);

	if (d > 0){
		if (front != NULL && front->intersects3DNow(v0, v1, dir)) return true;

		v2sf dotXY = pfmul(planeXY, ((v2sf *) &v1)[0]);
		v2sf dotZD = pfmul(planeZD, ((v2sf *) &v1)[1]);
		v2sf dot = pfacc(dotXY, dotZD);
		dot = pfacc(dot, dot);

		int d = _m_to_int(dot);
		if (d < 0){
			v2sf dirXY = ((v2sf *) &dir)[0];
			v2sf dirZ0 = ((v2sf *) &dir)[1];

			v2sf dotXY = pfmul(planeXY, dirXY);
			v2sf dotZ0 = pfmul(planeZD, dirZ0);
			v2sf dot = pfacc(dotXY, dotZ0);
			dot = pfacc(dot, dot);
			dot = pfrcp(dot);
			dot = pfmul(dot, dotD);

			dirXY = pfmul(dirXY, dot);
			dirZ0 = pfmul(dirZ0, dot);

			v0XY = pfsub(v0XY, dirXY);
			v0Z1 = pfsub(v0Z1, dirZ0);

			if (tri.isAbove3DNow(v0XY, v0Z1)){
				return true;
			}

			if (back != NULL && back->intersects3DNow(v0, v1, dir)) return true;
		}

	} else {
		if (back != NULL && back->intersects3DNow(v0, v1, dir)) return true;

		v2sf dotXY = pfmul(planeXY, ((v2sf *) &v1)[0]);
		v2sf dotZD = pfmul(planeZD, ((v2sf *) &v1)[1]);
		v2sf dot = pfacc(dotXY, dotZD);
		dot = pfacc(dot, dot);
		
		int d = _m_to_int(dot);
		if (d > 0){
			v2sf dirXY = ((v2sf *) &dir)[0];
			v2sf dirZ0 = ((v2sf *) &dir)[1];

			v2sf dotXY = pfmul(planeXY, dirXY);
			v2sf dotZ0 = pfmul(planeZD, dirZ0);
			v2sf dot = pfacc(dotXY, dotZ0);
			dot = pfacc(dot, dot);
			dot = pfrcp(dot);
			dot = pfmul(dot, dotD);

			dirXY = pfmul(dirXY, dot);
			dirZ0 = pfmul(dirZ0, dot);

			v0XY = pfsub(v0XY, dirXY);
			v0Z1 = pfsub(v0Z1, dirZ0);

			if (tri.isAbove3DNow(v0XY, v0Z1)){
				return true;
			}
			if (front != NULL && front->intersects3DNow(v0, v1, dir)) return true;
		}
	}
	return false;
}