Программирование графики с использованием Direct3D

         

Функция CreateScene()


Функция CreateScene() представлена в листинге 10.10.

Листинг 10.10. Функция CreateScene()

BOOL FullScreenWin::CreateScene() { //-------- ПОВЕРХНОСТИ МЕНЮ И FPS -------- selectmode = GetCurDisplayMode(); CreateMenuSurface(); UpdateMenuSurface(); CreateFPSSurface(); // ------- СЕТКА -------- D3DRMLOADRESOURCE resinfo; resinfo.hModule = 0; resinfo.lpName = MAKEINTRESOURCE(IDR_SWIRLMESH); resinfo.lpType = "MESH"; d3drm->CreateMeshBuilder(&meshbuilder); meshbuilder->Load(&resinfo, 0, D3DRMLOAD_FROMRESOURCE, 0, 0); ScaleMesh(meshbuilder, D3DVALUE(15)); //------- ФРЕЙМ СЕТКИ -------- LPDIRECT3DRMFRAME meshframe; d3drm->CreateFrame(scene, &meshframe); meshframe->AddVisual(meshbuilder); meshframe->SetRotation(scene, D3DVALUE(0), D3DVALUE(1), D3DVALUE(0), D3DVALUE(.1)); meshframe->AddMoveCallback(UpdateAnimation, 0); //-------- АНИМАЦИЯ -------- d3drm->CreateAnimation(&animation); for (int i = 0; i < 11; i++) { D3DRMQUATERNION quat; D3DRMQuaternionFromRotation(&quat, &vect[i], rot[i]); animation->AddRotateKey(D3DVALUE(i), &quat); animation->AddPositionKey(D3DVALUE(i), trans[i].x, trans[i].y, trans[i].z); } animation->SetOptions(D3DRMANIMATION_SPLINEPOSITION | D3DRMANIMATION_CLOSED | D3DRMANIMATION_POSITION | D3DRMANIMATION_SCALEANDROTATION); animation->SetFrame(meshframe); meshframe->Release(); meshframe = 0; // -------- НАПРАВЛЕННЫЙ СВЕТ -------- LPDIRECT3DRMFRAME dlightframe; LPDIRECT3DRMLIGHT dlight; d3drm->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVALUE(1.00), D3DVALUE(1.00), D3DVALUE(1.00), &dlight); d3drm->CreateFrame(scene, &dlightframe); dlightframe->SetOrientation(scene, D3DVALUE(0), D3DVALUE(-1), D3DVALUE(1), D3DVALUE(0), D3DVALUE(1), D3DVALUE(0)); dlightframe->AddLight(dlight); dlightframe->Release(); dlightframe = 0; dlight->Release(); dlight = 0; //------ КАМЕРА ---------- d3drm->CreateFrame(scene, &camera); camera->SetPosition(scene, D3DVALUE(0), D3DVALUE(0), D3DVALUE(-50)); d3drm->CreateViewport(device, camera, 0, 0, device->GetWidth(), device->GetHeight(), &viewport); return TRUE; }

Функция CreateScene() выполняет следующие шесть действий:

  1. Инициализация и отображение поверхностей меню и счетчика FPS.
  2. Создание и загрузка сетки.
  3. Создание фрейма для сетки.
  4. Создание и настройка анимационной последовательности с использованием интерфейса Direct3DRMAnimation.
  5. Создание источника света.
  6. Создание порта просмотра.

Мы не будем обсуждать этапы со 2 по 6, поскольку они неоднократно рассматривались в предыдущих главах. Сейчас для нас более интересен первый этап, на котором осуществляется инициализация поверхностей для меню видеорежимов и счетчика FPS. Поверхности инициализируются следующими вызовами функций:

selectmode = GetCurDisplayMode(); CreateMenuSurface(); UpdateMenuSurface(); CreateFPSSurface();

Функция GetCurDisplayMode() используется для инициализации переменной selectmode. Это делается для того, чтобы в меню был выделен текущий видеорежим. Функция CreateMenuSurface() создает поверхность, которая будет использована для отображения меню видеорежимов. Функция UpdateMenuSurface() формирует содержимое для поверхности меню видеорежимов. Функция CreateFPSSurface() создает поверхность для счетчика FPS, но само значение FPS пока не рассчитывается, поскольку еще не было выведено ни одного кадра.



Содержание раздела