bool BSP::intersects3DNow(const vec3 &v0, const vec3 &v1) const { if (top != NULL){ femms(); vec4 v04 = vec4(v0, 1); vec4 v14 = vec4(v1, 1); bool result = top->intersects3DNow(v04, v14, v14 - v04); femms(); return result; } return false; }
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; }
static void blend_func_8_3dnow(uint8_t * t, uint8_t * m, uint8_t * b, uint8_t * dst, int num) { int i; int imax; imax = num / 8; // pxor_r2r(mm7, mm7); for(i = 0; i < imax; i++) { movq_m2r(*t, mm0); // movq_m2r(*m, mm1); // movq_m2r(*b, mm2); pavgbusb_m2r(*b, mm0); pavgbusb_m2r(*m, mm0); MOVQ_R2M(mm0, *dst); m += 8; b += 8; t += 8; dst += 8; } femms(); imax = num % 8; for(i = 0; i < imax; i++) { *(dst++) = (*(t++) + (*(m++) << 1) + *(b++)) >> 2; } }