ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX


Цвет и текстуры - часть 23


Загрузка объектов с текстурами ''^Цё- 211

Давайте рассмотрим функцию косвенного вызова, в которой происходит загрузка текстуры:

static HRESULT C3dLoadTextureCallback(char* pszName, void* pArg,

LPDIRECT3DRMTEXTURE* ppITex)

{

C3dShape* pThis = (C3dShape*)•pArg;

ASSERT(pThis) ;

ASSERT (pThis-»IsKindOf (RUNTIME_CLASS (C3dShape) ) ) ;

ASSERT(pszName) ;

// Загрузить текстуру ASSERT(ppITex) ;

C3dTexture* pTex = new C3dTexture;

if ( !pTex-»Load( (const char* ) pszName) ) {

delete pTex;

return E FAIL;

} *ppITex = pTex-»Get!nterface () ;

// Включить текстуру в список изображений фигуры pThis-»m_ImgList .Append (pTex) ;

return NOERROR;

1

Сначала мы преобразуем пользовательский аргумент к типу указателя на класс C3dShape и проверяем его. Далее создается новый объект C3dTexture и вызывается его функция Load для того, чтобы загрузить текстуру из файла. После того как по данным изображения будет создан объект-текстура, указатель на интерфейс текстуры возвращается построителю сеток, чтобы он мог продолжить загрузку объекта.

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

C3dShape::~C3dShape() {

if (m_pIVisual) m_pIVisual-»Release () ;

if (m_pIMeshBld) m_pIMeshBld-»Release () ;

m_ImgList.DeleteAll() ;

}

Возможно, вы только что подумали: «Эй, постойте-ка, ведь у нас уже имеется список изображений для всего макета!» Вы правы. Если среди аргументов функции C3dShape::Load передавать указатель на макет, то наши изображения вполне можно было бы просто занести в список изображений макета. Однако я решил,

/b> Щу Глава 8. Цвет и текстуры

что такая реализация будет выглядеть небрежно — раз текстура относится только к данной фигуре, а не ко всему макету, логичнее следить за ней на уровне фигуры. Если ведение отдельного списка изображений для каждой фигуры кажется вам излишней роскошью, попробуйте самостоятельно найти и реализовать более удачное решение.




Начало  Назад  Вперед



Книжный магазин