Esempio n. 1
0
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;
}
Esempio n. 2
0
void D3D10System::DrawSpriteExRotate(Texture *texture, DWORD color, float x, float y, float x2, float y2, float degrees, float u, float v, float u2, float v2, float texDegrees)
{
    if(!curPixelShader)
        return;

    if(!texture)
    {
        AppWarning(TEXT("Trying to draw a sprite with a NULL texture"));
        return;
    }

    HANDLE hColor = curPixelShader->GetParameterByName(TEXT("outputColor"));

    if(hColor)
        curPixelShader->SetColor(hColor, color);

    //------------------------------
    // crop positional values

    Vect2 totalSize = Vect2(x2-x, y2-y);
    Vect2 invMult   = Vect2(totalSize.x < 0.0f ? -1.0f : 1.0f, totalSize.y < 0.0f ? -1.0f : 1.0f);
    totalSize.Abs();

    if(y2-y < 0) {
        float tempFloat = curCropping[1];
        curCropping[1] = curCropping[3];
        curCropping[3] = tempFloat;
    }

    if(x2-x < 0) {
        float tempFloat = curCropping[0];
        curCropping[0] = curCropping[2];
        curCropping[2] = tempFloat;
    }

    x  += curCropping[0] * invMult.x;
    y  += curCropping[1] * invMult.y;
    x2 -= curCropping[2] * invMult.x;
    y2 -= curCropping[3] * invMult.y;

    //------------------------------
    // crop texture coordinate values

    float cropMult[4];
    cropMult[0] = curCropping[0]/totalSize.x;
    cropMult[1] = curCropping[1]/totalSize.y;
    cropMult[2] = curCropping[2]/totalSize.x;
    cropMult[3] = curCropping[3]/totalSize.y;

    Vect2 totalUVSize = Vect2(u2-u, v2-v);
    u  += cropMult[0] * totalUVSize.x;
    v  += cropMult[1] * totalUVSize.y;
    u2 -= cropMult[2] * totalUVSize.x;
    v2 -= cropMult[3] * totalUVSize.y;

    //------------------------------
    // draw

    VBData *data = spriteVertexBuffer->GetData();
    data->VertList[0].Set(x,  y,  0.0f);
    data->VertList[1].Set(x,  y2, 0.0f);
    data->VertList[2].Set(x2, y,  0.0f);
    data->VertList[3].Set(x2, y2, 0.0f);

    if (!CloseFloat(degrees, 0.0f)) {
        List<Vect> &coords = data->VertList;

        Vect2 center(x+totalSize.x/2, y+totalSize.y/2);

        Matrix rotMatrix;
        rotMatrix.SetIdentity();
        rotMatrix.Rotate(AxisAngle(0.0f, 0.0f, 1.0f, RAD(degrees)));

        for (int i = 0; i < 4; i++) {
            Vect val = coords[i]-Vect(center);
            val.TransformVector(rotMatrix);
            coords[i] = val;
            coords[i] += Vect(center);
        }
    }

    List<UVCoord> &coords = data->UVList[0];
    coords[0].Set(u,  v);
    coords[1].Set(u,  v2);
    coords[2].Set(u2, v);
    coords[3].Set(u2, v2);

    if (!CloseFloat(texDegrees, 0.0f)) {
        Matrix rotMatrix;
        rotMatrix.SetIdentity();
        rotMatrix.Rotate(AxisAngle(0.0f, 0.0f, 1.0f, -RAD(texDegrees)));

        Vect2 minVal = Vect2(0.0f, 0.0f);
        for (int i = 0; i < 4; i++) {
            Vect val = Vect(coords[i]);
            val.TransformVector(rotMatrix);
            coords[i] = val;
            minVal.ClampMax(coords[i]);
        }

        for (int i = 0; i < 4; i++)
            coords[i] -= minVal;
    }

    spriteVertexBuffer->FlushBuffers();

    LoadVertexBuffer(spriteVertexBuffer);
    LoadTexture(texture);

    Draw(GS_TRIANGLESTRIP);
}