netlib.narod.ru< Назад | Оглавление | Далее >

Вспомогательные функции

Некоторые из упомянутых нами ранее функций не относятся к функциям Win32, MFC или Direct3D. Это вспомогательные функции, предоставляемые классом RMWin. Теперь мы рассмотрим эти функции подробнее.

Функция ScaleMesh()

В функции CreateScene() после создания и загрузки объекта meshbuilder вызывается функция ScaleMesh(), гарантирующая, что сетка будет иметь требуемый размер. Ниже снова приведен соответствующий фрагмент кода:

d3drm->CreateMeshBuilder(&meshbuilder);
r = meshbuilder->Load(meshname, NULL, D3DRMLOAD_FROMFILE, NULL, NULL);
if (r != D3DRM_OK)
{
    CString msg;
    msg.Format("Failed to load file '%s'\n", meshname);
    AfxMessageBox(msg);
    return FALSE;
}
ScaleMesh(meshbuilder, D3DVALUE(25));

Функция ScaleMesh() получает два аргумента: указатель на объект meshbuilder и значение размера. Значение размера — это не коэффициент масштабирования, а, скорее, указание идеального размера объекта. Функция ScaleMesh() вычисляет коэффициент масштабирования таким образом, чтобы наибольший размер объекта был максимально близким к указанному предельному значению. В приведенном выше фрагменте функция ScaleMesh() масштабирует объект так, чтобы наибольший из его размеров был равен 25 единицам. Код функции ScaleMesh() выглядит следующим образом:

void RMWin::ScaleMesh(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE dim)
{
    D3DRMBOX box;
    mesh->GetBox(&box);
    D3DVALUE sizex = box.max.x - box.min.x;
    D3DVALUE sizey = box.max.y - box.min.y;
    D3DVALUE sizez = box.max.z - box.min.z;
    D3DVALUE largedim = D3DVALUE(0);
    if (sizex > largedim)
        largedim = sizex;
    if (sizey > largedim)
        largedim = sizey;
    if (sizez > largedim)
        largedim = sizez;
    D3DVALUE scalefactor = dim/largedim;
    mesh->Scale(scalefactor, scalefactor, scalefactor);
}

Для получения размеров сетки данная функция использует функцию GetBox() интерфейса Direct3DRMMeshBuilder. Полученные данные используются для нахождения максимального размера сетки и вычисления коэффициента масштабирования, обеспечивающего требуемое изменение размера. После проведения вычислений функция осуществляет масштабирование объекта.

Функция GetMouse()

Мышь — это неотъемлемая часть интерфейса Windows и пользователи ожидают, что программа будет поддерживать работу с мышью так же, как она поддерживает работу с клавиатурой. Функции GetMouseX() и GetMouseY(), предоставляемые классом RMWin, позволяют в любой момент времени определить текущие координаты указателя мыши. Обе функции возвращают значение соответствующей координаты в пикселях. Функции объявлены как статические и могут использоваться функциями обратного вызова.

Преобразования типов COLORREF и D3DCOLOR

Для представления цветов Windows использует значения типа COLORREF. В Direct3D для той же цели применяется тип D3DCOLOR. Эти два типа несовместимы, и поэтому класс RMWin предоставляет функции преобразования типов. Функция COLORREF_2_D3DCOLOR() преобразует тип, используемый в Windows, в тип, понятный Direct3D. Функция D3DCOLOR_2_COLORREF() выполняет обратное преобразование. Код этих функций выглядит так:

inline D3DCOLOR RMWin::COLORREF_2_D3DCOLOR(COLORREF cref)
{
    D3DVALUE r = D3DVALUE(GetRValue(cref))/D3DVALUE(255);
    D3DVALUE g = D3DVALUE(GetGValue(cref))/D3DVALUE(255);
    D3DVALUE b = D3DVALUE(GetBValue(cref))/D3DVALUE(255);
    return D3DRMCreateColorRGB(r, g, b);
}

inline COLORREF RMWin::D3DCOLOR_2_COLORREF(D3DCOLOR d3dclr)
{
    D3DVALUE red   = D3DVALUE(255) * D3DRMColorGetRed(d3dclr);
    D3DVALUE green = D3DVALUE(255) * D3DRMColorGetGreen(d3dclr);
    D3DVALUE blue  = D3DVALUE(255) * D3DRMColorGetBlue(d3dclr);
    return RGB((int)red, (int)green, (int)blue);
}

Для улучшения производительности обе функции объявлены как inline.


СОВЕТ


?Вопросы быстродействия. В общем случае, беспокойство о производительности приложений, использующих такие пакеты, как Direct3D подобно перестановке кресел на Титанике. Девяносто девять процентов работы в использующей Direct3D программе, выполняется непосредственно Direct3D. Код приложения составляет незначительную часть общей картины, и чтобы он сильно ухудшил производительность, его надо действительно очень плохо написать.



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz