Функция MoleculeWin::CreateScene()
Начальная сцена приложения Molecule создается в функции CreateScene(). Код этой функции представлен в листинге 7.1.
Листинг 7.1. Функция MoleculeWin::CreateScene()
| |
BOOL MoleculeWin::CreateScene() { // ------- SRAND -------- srand((unsigned)time(NULL));
// ------- СЕТКИ -------- D3DRMLOADRESOURCE resinfo; resinfo.hModule = NULL; resinfo.lpName = MAKEINTRESOURCE(IDR_SPHEREMESH); resinfo.lpType = "MESH"; LPDIRECT3DRMMESHBUILDER meshbuilder; d3drm->CreateMeshBuilder(&meshbuilder); meshbuilder->Load(&resinfo, NULL, D3DRMLOAD_FROMRESOURCE, NULL, NULL);
for (int i = 0; i < MAXDEPTH; i++) { ScaleMesh(meshbuilder, D3DVALUE(MAXDEPTH - i)); D3DCOLOR clr = meshcolor[i]; D3DVALUE r = D3DRMColorGetRed(clr); D3DVALUE g = D3DRMColorGetGreen(clr); D3DVALUE b = D3DRMColorGetBlue(clr); meshbuilder->SetColorRGB(r, g, b); LPDIRECT3DRMMESH m; meshbuilder->CreateMesh(&m); mesh[i] = m; }
meshbuilder->Release(); meshbuilder = 0;
// -------- ИЕРАРХИЯ ФРЕЙМОВ ------ CreateHierarchy();
// --------НАПРАВЛЕННЫЙ СВЕТ-------- LPDIRECT3DRMLIGHT dlight; d3drm->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVALUE(1.00), D3DVALUE(1.00), D3DVALUE(1.00), &dlight);
LPDIRECT3DRMFRAME dlightframe; d3drm->CreateFrame(scene, &dlightframe); dlightframe->AddLight(dlight); dlightframe->SetOrientation(scene, D3DVALUE(0), D3DVALUE(-1), D3DVALUE(1), D3DVALUE(0), D3DVALUE(1), D3DVALUE(0)); dlight->Release(); dlight = 0; dlightframe->Release(); dlightframe = 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() выполняет следующие действия:
Инициализирует генератор случайных чисел.
Создает шесть сеток.
Создает иерархию фреймов с присоединенными к ним сетками.
Создает источник света.
Создает порт просмотра.
В начале вызывается функция srand() и ей в качестве аргумента передается значение, возвращаемое функцией time(). Таким образом выполняется инициализация генератора случайных чисел. Приложение Molecule использует функцию rand() чтобы добавлять к иерархии фреймов случайные характеристики. Поскольку для инициализации генератора случайных чисел используется число, которое изменяется при каждом запуске приложения, атрибуты иерархии фреймов (такие, как оси вращения и скорость) будут меняться при каждом запуске программы.
На втором этапе создается шесть сеток. Сначала выполняется загрузка сферической сетки:
D3DRMLOADRESOURCE resinfo; resinfo.hModule = NULL; resinfo.lpName = MAKEINTRESOURCE(IDR_SPHEREMESH); resinfo.lpType = "MESH"; LPDIRECT3DRMMESHBUILDER meshbuilder; d3drm->CreateMeshBuilder(&meshbuilder); meshbuilder->Load(&resinfo, NULL, D3DRMLOAD_FROMRESOURCE, NULL, NULL);
Для загрузки сетки из ресурсов программы используется экземпляр интерфейса Direct3DRMMeshBuilder. В дальнейшем для доступа к новой сетке используется указатель meshbuilder. Потом создаются шесть экземпляров интерфейса Direct3DRMMesh:
for (int i = 0; i < MAXDEPTH; i++) { ScaleMesh(meshbuilder, D3DVALUE(MAXDEPTH - i)); D3DCOLOR clr = meshcolor[i]; D3DVALUE r = D3DRMColorGetRed(clr); D3DVALUE g = D3DRMColorGetGreen(clr); D3DVALUE b = D3DRMColorGetBlue(clr); meshbuilder->SetColorRGB(r, g, b); meshbuilder->CreateMesh(&mesh[i]); }
Для создания сеток используется цикл. Масштаб и цвет сетки зависит от итерации цикла. Цвета каждой из создаваемых сеток содержатся в массиве meshcolor. Сразу после назначения цвета выполняется создание экземпляра интерфейса Direct3DRMMesh с помощью функции CreateMesh() интерфейса Direct3DRMMeshBuilder.
Третьим шагом является создание иерархии фреймов:
CreateHierarchy();
Функция CreateHierarchy() при создании иерархии фреймов основывается на значениях переменных класса curdepth и numchildren. Эти переменные получают свои начальные значения в конструкторе MoleculeWin, но могут быть изменены с помощью команд меню
Depth и
Children.
На двух заключительных этапах создается источник света и порт просмотра. Мы опустим обсуждение этих фрагментов кода, поскольку источники света были подробно рассмотрены в главе 6, а этап создания порта просмотра обсуждался в главе 4 и будет более подробно рассмотрен в главе 9.
Содержание раздела