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; }
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; }
/* _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; }
/* _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; }
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; }