DWORD x1, y1, z1,  x2, y2, z2, XX, YY, ZZ;
DWORD nx1, ny1, nz1, nx2, ny2, nz2;
//освещения  -------------------------------------------------
//задания положения источника света GL_LIGHT0
float lightpos[3]= { 250.0f, 250.0f, 0.0f, 1.0f } ; // x, y, z, w - мировые координаты источника света     
//задания направления действия источника света
float lightdirection [3]= { 0.0f, 0.0f, 0.0f }; //координаты радиус-вектора в относительных еденицах x, y, z направленного от источника света


//
BOOLEAN FORMULA1()
{




//ReturnCurrentTime();
//x1 + t * (x2 - x1)
$	FLD	x2;
$	FSUB	x1;
$	FMUL	t;
$	FADD	x1;
$	FSTP	XX;
//y1 + t * (y2 - y1)
$	FLD	y2;
$	FSUB	y1;
$	FMUL	t;
$	FADD	y1;
$	FSTP	YY;
//t * (z2 - z1)
$	FLD	z2;
$	FSUB	z1;
$	FMUL	t;
$	FADD	z1;
$	FSTP	ZZ;
RETURN TRUE;
}

//Рендер 3D объекта
//LpVertexAnimation - указатель на вершины текущего кадра
BOOLEAN render(DWORD LpVertexAnimation, LpNextVertexAnimation)
{
//static DWORD test1, test2, test3;
static DWORD LpIndex, Index, Index2;
static DWORD LpIndexTexture, IndexTexture, S, T;
static float Xtex, Ytex;
static DWORD OffSet;



//адрес текстурных координат
/*
struct md2_textureCoordinate_t
{
   short s, t;
};
*/
LpIndexTexture=md2_model.texCoords;




/*
struct md2_triangle_t
{
   short vertexIndices[3];  //2 байта WORD
   short textureIndices[3]; //индекс к т
};
*/
LpIndex=md2_model.triangles;   //Адрес к индексам треугольников






//test1= LpVertexAnimation;

//===========================================================
//заполнение буфера GL_COLOR_BUFFER_BIT фоновым цветом и
//очистка z-буфера (или буфера глубины GL_DEPTH_BUFFER_BIT):
glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);


//освещения  --------------------------------------------------
//задаем положение источника света в мировых координатах
glLightfv(GL_LIGHT0,GL_POSITION,#lightpos);   
//задания направления света
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,#lightdirection); 
//распределение интенсивности. Целое число и значения с плавающей точкой отображены непосредственно. Только значения в диапазоне [0,128] приняты.
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT, 128.0f);      
//задания угла распространения света 
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF, 180.0f);       //угол  до 180
//включение нулевого источника света, их может быть несколько
glEnable(GL_LIGHT0);
//говорим OpenGL,  что нужно изображать объекты в соответствии 
//с моделью освещения
glEnable(GL_LIGHTING);
//для корректного расчета взаимного расположения векторов нормалей 
//и направлений источников света при различных ракурсах показа 
//устанавливаем режим нормализации векторов 
glEnable(GL_NORMALIZE);

//сохранение в стеке положения начала системы координат
glPushMatrix(); 



//Позиция камеры
gluLookAt(lo_d(float 0.0),hi_d(float 0.0), 
          lo_d(float 0.0),hi_d(float 0.0),
          lo_d(float 90.0),hi_d(float 90.0),

          lo_d(float 0.0),hi_d(float 0.0),
          lo_d(float 0.0),hi_d(float 0.0),
          lo_d(float 0.0),hi_d(float 0.0),

          lo_d(float 0.0),hi_d(float 0.0),
          lo_d(float 1.0),hi_d(float 1.0),
          lo_d(float 0.0),hi_d(float 0.0));

//Вращение объекта
glRotatef(X, 0.0f, 1.0f, 0.0f);
glRotatef(Y, 0.0f, 0.0f, 1.0f);



//        glTranslatef(0.0f, 0.0f, -1.0f);

//Вывод модели без текстуры, только линии
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);




//test1= LpVertexAnimation;

glEnable(GL_COLOR_MATERIAL);
//все цвета отражаются с max интенсивностью;
glColor3f(1.0f, 1.0f, 1.0f);



//======================================================================
glBegin(GL_TRIANGLES);
for (i=0; i<md2_model.header.numTriangles; i++)   {       

   OffSet=0;
   for (j=0; j<3; j++)  {

//Вычиcляем по индексу нужные координаты вершин
/*
struct md2_triangle_t
{
   short vertexIndices[3];   //short это 2 байта
   short textureIndices[3];
};
*/

//берем два байта  textureIndices[1], потом  textureIndices[2] и textureIndices[3]
IndexTexture=DSWORD[LpIndex+#md2_triangle_t.vertexIndices+OffSet+2+2+2];            //индекс для поиска нужных координат текстуры 
/*
struct md2_textureCoordinate_t
{
   short s, t;
};
*/

IndexTexture=IndexTexture*sizeof(md2_textureCoordinate_t);
IndexTexture+=LpIndexTexture;
S=DSWORD[IndexTexture];
T=DSWORD[IndexTexture+2];

Xtex=S/md2_model.header.skinWidth; //width of the texture
Ytex=T/md2_model.header.skinHeight; //height of the texture


glTexCoord2f(Xtex, Ytex);

//находим координаты вершин ------------------------------------------
Index=DSWORD[LpIndex+#md2_triangle_t.vertexIndices+OffSet]; //Адрес к индексам треугольников
/*
struct md2_triangleVertex_t
{
   float vertex[3];
   float normal[3];
};
*/
Index=Index*sizeof(md2_triangleVertex_t);
Index2=Index;
Index+=LpVertexAnimation;      //+ указатель на вершины текущего кадра
Index2+=LpNextVertexAnimation;

//glNormal3f( nx1 + pol * (nx2 - nx1), ny1 + pol * (ny2 - ny1), nz1 + pol * (nz2 - nz1) );

nx1=DSDWORD[Index+4+4+4];
ny1=DSDWORD[Index+4+4+4+4];
nz1=DSDWORD[Index+4+4+4+4+4];
                 
nx2=DSDWORD[Index2+4+4+4];
ny2=DSDWORD[Index2+4+4+4+4];
nz2=DSDWORD[Index2+4+4+4+4+4];

FORMULA1();
glNormal3f(XX, YY, ZZ);

x1=DSDWORD[Index];
y1=DSDWORD[Index+4];
z1=DSDWORD[Index+4+4];

x2=DSDWORD[Index2];
y2=DSDWORD[Index2+4];
z2=DSDWORD[Index2+4+4];

FORMULA1();
glVertex3f(XX, YY, ZZ);
//glVertex3f(x1, y1, z1);

//glVertex3f( x1 + t * (x2 - x1), y1 + t * (y2 - y1), z1 + t * (z2 - z1) );
//glVertex3fv(Index);


                        OffSet+=2;   //На два байта смещение

                        }

LpIndex+=sizeof(md2_triangle_t);

                      }
glEnd();      
//===========================================================================


//восстановление из стека положения начала системы координат
glPopMatrix();
//glFlush();
//======================================================================

RETURN TRUE;
}

