Example #1
0
//----------------------------------------------------------------------------
void Castle::AdjustVerticalDistance ()
{
    // Retain vertical distance above "ground".
    APoint pos = mCamera->GetPosition();
    AVector dir = -AVector::UNIT_Z;
    mPicker.Execute(mScene, pos, dir, 0.0f, Mathf::MAX_REAL);
    if (mPicker.Records.size() > 0)
    {
        const PickRecord& record = mPicker.GetClosestNonnegative();
        TriMesh* mesh = DynamicCast<TriMesh>(record.Intersected);
        APoint tri[3];
        mesh->GetWorldTriangle(record.Triangle, tri);
        APoint closest = record.Bary[0]*tri[0] + record.Bary[1]*tri[1] +
            record.Bary[2]*tri[2];

        closest[2] += mVerticalDistance;
        mCamera->SetPosition(closest);
    }
}
//----------------------------------------------------------------------------
void FreeFormDeformation::OnMouseDown (int x, int y)
{
    // Change to right-handed coordinates.
    y = GetHeight() - 1 - y;

    // The current selected control point is deactivated.
    if (mSelected)
    {
        mSelected->SetEffectInstance(mControlInactive);
        mSelected = 0;
    }

    // Determine which control point has been selected (if any).
    APoint origin;
    AVector direction;
    if (mRenderer->GetPickRay(x, y, origin, direction))
    {
        mPicker.Execute(mControlRoot, origin, direction, 0.0f,
            Mathf::MAX_REAL);

        if (mPicker.Records.size() > 0)
        {
            const PickRecord& record = mPicker.GetClosestNonnegative();
            TriMesh* box = DynamicCast<TriMesh>(record.Intersected);
            if (box)
            {
                APoint vertex[3];
                box->GetWorldTriangle(record.Triangle, vertex);
                mOldWorldPos =
                    vertex[0]*record.Bary[0] +
                    vertex[1]*record.Bary[1] +
                    vertex[2]*record.Bary[2];

                mSelected = box;
                mSelected->SetEffectInstance(mControlActive);
            }
        }
    }
}