quads (p, 4, 0, 0, s, t, 0) ;
}
// вывод четырехугольников
void quads(float*v,int nv, float s0=0,float t0=0, float sl=l,float tl=l,float*texc=0, float*norm=0,float*c=0);
// вывод куба
void cube(float 1=1,float s0=0,float t0=0, float sl=l,float t1=1);
// вывод тестовой сцены void scenel(uint list=0)
{
glNewList(list,GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT|GL_POLYGON_BIT);
glMatrixMode(GL_MODELVIEW);
glPolygonMode(GL_FRONT,GL_FILL) ;
glColor3f(0.4,0.4,1);
planeXZ (-100,-300, 100,-1,-5);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK) ;
glColor3f(1,0.5,0.5);
cube(35);
glPushMatrix();
glTranslatef(0,0,-290);
glColor3f(1,0.5,0.5);
glusphere(30);
glPopMatrix();
glPolygonMode(GL_FRONT, GL_LINE) ;
glColor3f(1,0.8,0.8);
cube(35);
glPushMatrix();
glTranslatef(0,0,-290);
glColor3f(1,0.8,0.8);
glusphere(30);
glPopMatrix();
glPopAttrib();
glEndList();
}
};// Models
// is - с какой вершины начинать
// n - число выводимых вершин
// nv - общее число вершин в массиве
// v - массив вершин (по 3 коордм^чты)
// texc - массив текстурных координат (по 2)
// norm - массив нормалей //с - массив цветов (RGB значения) void Models::array(GLenum m,int is,int n,float*v, int nv,float*texc,float*norm,float*c)
{
// сохранение клиентских атрибутов glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS) ; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3,GL_FLOAT,sizeof(float)*3, v);
// есть ли массив текстурных координат s и t if(texc)
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2,GL_FLOAT,sizeof(float)*2, texc) ; }
else
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
// есть ли массив нормалей if(norm)
{
glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT,sizeof(float)*3, norm);
}
else
glDisableClientState(GL_NORMAL_ARRAY);
// есть ли массив цветов if (с)
{
glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT,sizeof(float)*3,c);
}
else
glDisableClientState(GL_COLOR_ARRAY); glDrawArrays(m,is,n); // вывод
glPopClientAttrib(); // восстановление атрибутов }// array(GLenum m…
// вывод четырехугольников
void Models::quads(float*v,int nv,float sO,float tO,
float si,float tl,float*texc, float*norm,float*c)
{
float* tex=texc; if(tex==0)
{
tex=new float[nv*2];
tex[0]=s0; tex[l]=tO; tex[2]=sl; tex[3]=t0; tex[4]=sl; tex[5]=tl; tex[6]=s0; tex[7]=tl; copy(tex,tex+nv*2-8, tex+8) ;
}
array(GL_QUADS,0,nv,v,nv,tex,norm, c); if(texc==0) delete[]tex;
}
void Models::cube(float 1,float sO,
float tO,float si,float tl)
{
1 /=2;
// массив вершин граней float v[24*3]=
{
-1,-1,1,1,-1,1,1,1,1,-1,1,1,
1,-1,-1,-1,-1,-1,-1,1,-1,1, 1,-1,
1, 1,1,1,1,-1,-1,1,-1,-1,1,1,
1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,
1,-1,1,1,-1,-1,1,1,-1,1,1,1,
-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1 };
quads(v,24,s0,t0,si,tl,0,0,0);
}
void Models::glupartdisk(GLdouble ro,GLdouble sa, GLdouble swa,GLdouble ri,int sl,int st)
{
// создаем квадратичный объект GLUquadricObj* obj =gluNewQuadric();
// разрешаем вычисление нормалей gluQuadricNormals(obj,GLU_SMOOTH);
// разрешаем текстурирование gluQuadricTexture(obj,1);
i f(ro<0)
{
// если надо меняем ориентацию объекта gluQuadricOrientation(obj,GLU_INSIDE); ro=-ro; ri=-ri;