моделі, представленої у вигляді дерева з коренем this */
{(this- gt; n_children == 0)/* ознака листового вузла */
{
/* саме в листових вузлах зберігаються корисні дані (відомості про полігонах) */
/* щоб накладалося потрібне нам зображення */
glEnable (GL_TEXTURE_2D); (GL_TEXTURE_2D, TEXTURE_ID + this- gt; texture_type);
/* а тут накладаємо це зображення на полігон, малюємо його */(GL_QUADS);
/* пов'язуємо кути зображення і вершини полігону; малюємо полігон з картинкою на ньому */
glTexCoord2f (0.0f, 0.0f); this- gt; Square [0] .Vertex (); f (0.0f, 1.0f); this- gt; Square [1] .Vertex (); f (1.0f, 1.0f); this- gt; Square [3] .Vertex (); f (1.0f, 0.0f); this- gt; Square [2] .Vertex (); (); (GL_TEXTURE_2D);
return;
}
/* цей код виконується тільки якщо вузол внутрішній;
тут рекурсивно викликаємо функцію отрисовки для нащадків вузла */
for (int i=0; i lt; this- gt; n_children; i ++) gt; Children [i] - gt; Draw ();
}
Додаток Б
Ефект снігопаду
Генерація випадкової колекції «сніжинок» може бути виконана таким чином.
Тут xmin, xmax, ymin, ymax, zmin, zmax описують підпростір, в якому генеруються «сніжинки» («Верхній шар атмосфери» в розділі 3.4).
/* генерація випадкової цілої величини на [xmin; xmax] */
int RandomF (int xmin, int xmax) {return xmin + rand ()% (xmax - xmin + 1); }
/* генерація сніжинок випадковим чином в заданому підпросторі */
void SetSnow (int snow_x [], int snow_y [], int snow_z [], int n, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
{(int i=0; i lt; n; i ++)
{
/* координати сніжинки задаються випадковим чином */
snow_x [i]=RandomF (xmin, xmax); _ y [i]=RandomF (ymin, ymax); _ z [i]=RandomF (zmin, zmax);
}
}
Наступні функції виконують відповідно отрисовку і за перерахунок координат «сніжинок» при падінні.
/* отрисовка сніжинок; малюються тільки ті, у яких Y знаходиться в [min_y; max_y] */
void Draw (int snow_x [], int snow_y [], int snow_z [], int n, int min_y, int max_y)
{
/* якщо Y поза [min_y; max_y], щось не отрісовиваємих сніжинку;
це потрібно, щоб не малювати ті сніжинки, які свідомо вище нашого огляду */
for (int i=0; i lt; n; i ++) (snow_y [i] gt;=min_y amp; amp; snow_y [i] lt;=max_y) f (snow_x [i] , snow_y [i], snow_z [i]);
}
/* імітація падіння сніжинок */Fall (int snow_y [], int n, int min_y, int max_y)
{(int i=0; i lt; n; i ++)
{_ y [i] -=15;/* Зменшуємо висоту сніжинки */
/* якщо сніжинка досягла землі raquo ;, то вона знову починає падати з неба - Коли їх багато, користувач не побачить такої деталі */
if (snow_y [i] lt;=min_y) snow_y [i]=max_y;
}
}
Колекція генерується в функції вікна програми при отриманні повідомлення WM_CREATE і сообщеня від пункту меню, що включає ефект снігопаду. Падіння імітується за тиками таймера (повідомлення WM_TIMER).
Для отрисовки «сніжинок» в обробнику повідомлення WM_PAINT передбачений наступний фрагмент коду:
glColor3f (1, 1, 1), (2); (GL_POINTS); (snow_x, snow_y, snow_z, nSnow, - 200, 400);
glEnd ();