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 < n; i++)(snow_y[i] >= min_y && snow_y[i] <= 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 < n; i++)
{_y[i]-=15; /* уменьшаем высоту снежинки */
/* если снежинка "достигла земли", то она опять начинает падать с "неба" - когда их много, пользователь не увидит такой детали */
if(snow_y[i] <= 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();