glShadeModel ( shadeModel );
}

Здесь используются функции OpenGL для работы с вершинными массивами.

Однако если объект уже имеет собственный массив цветов в вершинах, и переданный цвет отличается от (1,1,1,1), то мы уже не можем использовать массив colors в том виде, в каком он есть. Но мы также не можем умножить его на переданное значение цвета, поскольку это значение может со временем измениться (например, за счет анимации), и тогда нам понадобится восстановить исходный массив. Поэтому удобнее всего будет завести вспомогательный массив (tempColors), и в случае, если массив цветов для модели задан и переданный цвет отличается от (1, 1, 1, 1), мы можем занести в этот массив умноженные значения цветов для вершин и передать его в функцию glColorPointer.

Чтобы не делать это умножение каждый раз, удобно использовать ке-ширование: при умножении запоминается, на какое значение был умножен вспомогательный массив, и проверять, можно ли использовать его или надо произвести его построение заново. Это значение мы будем запоминать в переменной cachedColor.

Реализация этого подхода приводится ниже.

ом.

void Mesh3D :: draw ( Views view, const Cameras camera,
const Vector4D& color, Fog * fog, Texture * txt, bool transparent ) const
{
if ( lisOk () )
return;
int shadeModel; Vector4D * colorArray = colors;
if ( txt != NULL )
view.bindTexture ( txt ) ; else
view.bindTexture ( texture );
glGetlntegerv ( GL_SHADE_MODEL, SshadeModel ); glColor4fv ( color );
if ( smooth )
glShadeModel ( GL_SMOOTH ) ; else
glShadeModel ( GL_FLAT ) ;

// check whether we need to update tempColors array if ( colors != NULL && ( color.x !=1 )) color.у != 1 || color.z != -1 II color.w != 1 II color != cachedColor ) )

{
for ( int i = 0; i < numVertices; i++ )
tempColors [i] = color * colors [i];
cachedColor = color; colorArray = tempColors;
}
glEnableClientState ( GL_VERTEX_ARRAY ); glVertexPointer ( 3, GL_FLOAT, 0, vertices );
if ( colors != NULL ) {

⇐ Предыдущая| |Следующая ⇒