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

         

Функция TextureDriftWin::MoveTexture()


MoveTexture() — это функция обратного вызова, которая при каждом вызове создает и применяет новое наложение текстуры. В самом начале функции должен быть получен интерфейс Direct3DRMMesh, который был добавлен к фрейму в функции CreateScene(). Код функции MoveTexture() показан в листинге 5.6.

Листинг 5.6. Функция TextureDriftWin::MoveTexture()

void TextureDriftWin::MoveTexture(LPDIRECT3DRMFRAME frame, void*, D3DVALUE) { static D3DVALUE xtex; xtex += D3DVALUE(.02); LPDIRECT3DRMVISUALARRAY visualarray; frame->GetVisuals(&visualarray); int nvisuals = visualarray->GetSize(); for ( int i = 0; i < nvisuals; i++ ) { LPDIRECT3DRMVISUAL visual; visualarray->GetElement(i, &visual); LPDIRECT3DRMMESH mesh; if (visual->QueryInterface(IID_IDirect3DRMMesh, (void**)&mesh) == 0) { D3DRMBOX box; mesh->GetBox(&box); D3DVALUE w = box.max.x - box.min.x; D3DVALUE h = box.max.y - box.min.y; LPDIRECT3DRMWRAP wrap; d3drm->CreateWrap(D3DRMWRAP_FLAT, NULL, D3DVALUE(0.0), D3DVALUE(0.0), D3DVALUE(0.0), D3DVALUE(0.0), D3DVALUE(0.0), D3DVALUE(1.0), D3DVALUE(0.0), D3DVALUE(1.0), D3DVALUE(0.0), xtex, D3DVALUE(0.5), // начало координат текстуры D3DDivide(1,w), D3DDivide(1,h), // масштаб текстуры &wrap); wrap->Apply(mesh); wrap->Release(); wrap = 0; mesh->Release(); mesh = 0; } visual->Release(); visual = 0; } visualarray->Release(); visualarray = 0; }

В начале функции MoveTexture() объявляется статическая переменная типа D3DVALUE, которая увеличивается при каждом вызове функции. Значение этой переменной используется как значение координаты X для начала координат текстуры, поэтому увеличение этого значения вызывает эффект перемещения текстуры по сетке.

Затем, для получения массива присоединенных к фрейму визуальных объектов, используется функция GetVisuals() интерфейса Direct3DRMFrame (Direct3D передает указатель frame в первом параметре функции обратного вызова).

Функция GetVisuals() инициализирует указатель на интерфейс Direct3DRMVisualArray. Этот интерфейс поддерживает всего лишь две функции: GetSize() и GetElement().

Для перебора элементов массива визуальных объектов применяется цикл. С помощью функции GetSize() мы определяем количество элементов в массиве, а для получения отдельного элемента используется функция GetElement(). Возвращаемый функцией указатель является указателем на интерфейс Direct3DRMVisual (который не предоставляет никаких функций). Чтобы узнать, поддерживает ли объект интерфейс Direct3DRMMesh, используется функция QueryInterface(). Мы знаем что один и только один из объектов, возвращаемых функцией GetElement() поддерживает интерфейс Direct3DRMMesh, поскольку в функции CreateScene() мы создали и присоединили к данному фрейму только одну сетку.

После получения указателя на интерфейс Direct3DRMMesh создается и применяется к сетке интерфейс Direct3DRMWrap.



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