Vector Colore(float col) // Calculate the color for the fire effect
{
int ki;
Vector kf;
ki=(int)(col*256);
if(ki<64)
{
kf.x=(float)ki/2;
kf.y=(float)ki/4;
kf.z=0;
}
else
{
if(ki<128)
{
kf.x=(float)ki/1.5;
kf.y=(float)ki/2;
kf.z=0;
}
else
{
if(ki<192)
{
kf.x=(float)ki;
kf.y=(float)ki;
kf.z=(float)ki/2;
}
else
{
kf.x=(float)ki;
kf.y=(float)ki;
kf.z=(float)ki;
}
}
}
return kf;
}
void Fire(void) // Fire effect for the presentation
{
int x,xd,y,z;
float ka;
xd=2+rand()%(BUFAX-62);
for(x=0;x<60;x++)
{
if(rand()%2!=1)
bufB[xd+x][2]=(float)(var.fire+rand()%64)/256;
}
//这个效果的关键是色彩的设定,也就是glColor3f()调用的数值,在图形的低端设置颜色值通过加权平均法,逐渐增加图形上端的颜
//色值,图形上端的颜色将逐渐减弱。
for(y=BUFAZ-2;y>1;y--)
{
for(x=1;x<BUFAX-1;x++)
{
ka=bufB[x][y];
ka+=bufB[x+1][y-1];
ka+=bufB[x-1][y-1];
ka+=bufB[x][y-1];
ka=ka/4-(float)1.5/256;
if(ka<0)
ka=0;
bufB[x][y]=ka;
}
}
}
void Presentazione(void)
{
int x,z;
float fx,fz;
float a,b,c,d,t;
Vector av,bv,cv,dv;
Fire(); // Fire effect
fx=(float)1/BUFAX; // For the texture coordinates
fz=(float)1/BUFAZ;
// Draws the fire
for(z=0;z<BUFAZ-1;z++)
{
for(x=0;x<BUFAX-1;x++)
{
t=bufB[x][z];
av=Colore(t);
t=bufB[x+1][z];
bv=Colore(t);
t=bufB[x+1][z+1];
cv=Colore(t);
t=bufB[x][z+1];
dv=Colore(t);
glBegin(GL_QUADS);
glColor3f(av.x,av.y,av.z);
glVertex3f(bufA[x][z].x,bufA[x][z].y,var.ky*bufB[x][z]);
glColor3f(bv.x,bv.y,bv.z);
glVertex3f(bufA[x+1][z].x,bufA[x+1][z].y,var.ky*bufB[x+1][z]);
glColor3f(cv.x,cv.y,cv.z);
glVertex3f(bufA[x+1][z+1].x,bufA[x+1][z+1].y,var.ky*bufB[x+1][z+1]);
glColor3f(dv.x,dv.y,dv.z);
glVertex3f(bufA[x][z+1].x,bufA[x][z+1].y,var.ky*bufB[x][z+1]);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
var.fire--;
if(var.fire==0)
{
var.fire=1;
}
}