Beispiel #1
0
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;
}