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



Проверка попадания - часть 4


ASSERT(pThis) ;

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

if (pShape) {

// Убедиться, что попадание пришлось

Выделение всего пбъеш-а тТО 1&7

// не в рамку выделения и не в фигуру-указатель if ( !pShape-»IsPartOЈ (pThis-»m_pSelBox)

&& !pShape-»IsPartOf (pThis-»m_pHitPtr) ) {

// Определить грань, в которую мы попали

C3dViewport* pViewport =

pThis-»m_wnd3d.GetStage() -»GetViewport

p3hape-»HitTest (pt, pViewport,

&pThis-»m_iHitFace, &pThis-»m_vHitPoint) ;

1 .'. i ^ i * \

pShape = NULL;

}

i

I / Сделать выделенную фигуру текущей pThis-»MakeCurrent (pShape) ;

}

Выделенный объект передается функции MakeCurrent, которая рисует вокруг него рамку, чтобы отличить от других объектов (мы подробнее рассмотрим функцию MakeCurrent на стр. 177). Самая важная особенность этого фрагмента заключается в том, что 41ункция OnSelChange является статической, и потому, как было сказано выше, не имеет указателя this. Мы справились с данным затруднением, передавая адрес объекта C++ в качестве аргумента функции, разрешившей выделение объектов мышью (EnableMouseSelection). Значение, полученное уведомляющей функцией, преобразуется к типу указателя на наш класс. Хитро, не правда ли? Реализация косвенного вызова (callback) функции класса требует несколько больших усилий, поэтому уведомляющая функция была сделана статической для упрощения программы.

Теперь давайте более подробно рассмотрим, как же происходит проверка попадания. Функция C3dWnd::HitTest просто передает запрос ракурсу:

// Проверить на попадание в видимый объект C3dShape* C3dWnd::HitTest(CPoint pt) (

ASSERT(m_p3tage) ;

return m_pStage-»GetViewport ()-»HitTest (pt) ;

}

Фактическая проверка попадания производится в классе ракурса (код которого находится в файле 3dStage.cpp):

C3dShape* C3dViewport::HitTest(CPoint pt) {

IDirect3DRMPickedArray* pIPickArray = NULL;

/b> ЯНУ Глава 7. Поовеока попадания

ASSERT(m_pIViewport) ;

m_hr = m_pIViewport-»Pick(pt.x, pt.y, SpIPickArray);




Содержание  Назад  Вперед