BOOL Bounds::OutsidePlane(const Plane &p) const { Vect vmin; vmin.x = (*(DWORD*)&p.Dir.x & 0x80000000) ? Max.x : Min.x; vmin.y = (*(DWORD*)&p.Dir.y & 0x80000000) ? Max.y : Min.y; vmin.z = (*(DWORD*)&p.Dir.z & 0x80000000) ? Max.z : Min.z; return (vmin.Dot(p.Dir) > p.Dist); }
void RotationManipulator::ProcessMouseRay(const Vect &cameraDir, float scale, const Vect &rayOrig, const Vect &rayDir) { traceIn(RotationManipulator::ProcessMouseRay); activeAxis = -1; curCameraDir = cameraDir; Matrix mat; mat.SetIdentity(); mat.Translate(GetWorldPos()); mat.Scale(scale, scale, scale); bManipulating = false; DWORD i,j; for(i=0; i<3; i++) { for(j=0; j<30; j++) { DWORD jp1 = (j == 29) ? 0 : j+1; Vect norm = axisNorms[i][j]; if(norm.Dot(cameraDir) > 0.01f) continue; Vect v1 = axisLines[i][j]; Vect v2 = axisLines[i][jp1]; v1.TransformPoint(mat); v2.TransformPoint(mat); Vect lineVec = (v2-v1); float lineLen = lineVec.Len(); Vect lineDir = lineVec*(1.0f/lineLen); float fT1, fT2; if(ClosestLinePoints(rayOrig, rayDir, v1, lineDir, fT1, fT2)) { if((fT2 < 0.0f) || (fT2 > lineLen)) continue; Vect closestPoint1 = rayOrig+(rayDir*fT1); Vect closestPoint2 = v1+(lineDir*fT2); if(closestPoint1.Dist(closestPoint2) < (0.4f*scale)) { Vect axis(0.0f, 0.0f, 0.0f); axis.ptr[i] = 1.0f; activeAxis = i; clickDir = cameraDir.Cross(axis.Cross(norm)).Cross(cameraDir).Norm(); clickOrig = closestPoint1; bManipulating = true; return; } } } } mat.SetIdentity(); mat.Translate(GetWorldPos()); mat.Rotate(Quat().SetLookDirection(cameraDir)); mat.Scale(scale*1.25f, scale*1.25f, scale*1.25f); for(j=0; j<30; j++) { DWORD jp1 = (j == 29) ? 0 : j+1; Vect norm = axisNorms[2][j]; Vect v1 = axisLines[2][j]; Vect v2 = axisLines[2][jp1]; v1.TransformPoint(mat); v2.TransformPoint(mat); norm.TransformVector(mat); Vect lineVec = (v2-v1); float lineLen = lineVec.Len(); Vect lineDir = lineVec*(1.0f/lineLen); float fT1, fT2; if(ClosestLinePoints(rayOrig, rayDir, v1, lineDir, fT1, fT2)) { if((fT2 < 0.0f) || (fT2 > lineLen)) continue; Vect closestPoint1 = rayOrig+(rayDir*fT1); Vect closestPoint2 = v1+(lineDir*fT2); if(closestPoint1.Dist(closestPoint2) < (0.6f*scale)) { activeAxis = 4; clickDir = cameraDir.Cross(norm); clickOrig = closestPoint1; curCameraDir = cameraDir; bManipulating = true; return; } } } traceOut; }