#include <gl/glut.h>
#include <gl/glext.h>
int nTex[2];
float s[]={1.0,0.0,0.0,0.0};
float t[]={0.0,1.0,0.0,0.0};
float r[]={0.0,0.0,1.0,0.0};
double Matrix_ModelView[16]={0.0};
double Matrix_Projection[16]={0.0};
int Viewport[4];
double Pos[3]={0.0};
float fang;
void ReProj(void)
{
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.5,0.5,0.5);
glScalef(0.5,0.5,0.5);
gluPerspective(20.0,1.0,1.0,100.0);
gluLookAt(0.0,10.0,10.0,
Pos[0],Pos[1]+0.9,Pos[2],
0.0,1.0,0.0);
}
void SetupRC(void)
{
unsigned char pData[]={
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0,
128,128,128,255,
128,128,128,255,
0,0,0,0,
0,0,0,0,
128,128,128,255,
128,128,128,255,
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0,
};
glClearColor(0.0,0.2,0.4,1.0);
glGenTextures(2,nTex);
glBindTexture(GL_TEXTURE_2D,nTex[0]);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,4,4,0,GL_RGBA,GL_UNSIGNED_BYTE,pData);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glBindTexture(GL_TEXTURE_2D,nTex[1]);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,4,4,0,GL_RGBA,GL_UNSIGNED_BYTE,pData);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_R,GL_CLAMP);
glTexParameteri(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glAlphaFunc(GL_GREATER,0.1);
glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_COLOR);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
}
void DrawWithTex(void)
{
glBegin(GL_QUADS);
glTexCoord2f(1.0,0.0);
glVertex3f(-20.0,-5.0,-20.0);
glTexCoord2f(0.0,0.0);
glVertex3f(-20.0,-5.0,20.0);
glTexCoord2f(0.0,1.0);
glVertex3f(20.0,-5.0,20.0);
glTexCoord2f(1.0,1.0);
glVertex3f(20.0,-5.0,-20.0);
glEnd();
//Teapot
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(Pos[0],Pos[1]+0.9,Pos[2]);
glutSolidTeapot(1.0);
glPopMatrix();
glEnable(GL_TEXTURE_2D);
}
void DrawWithoutTex(void)
{
glBegin(GL_QUADS);
glVertex3f(-20.0,-5.0,-20.0);
glVertex3f(-20.0,-5.0,20.0);
glVertex3f(20.0,-5.0,20.0);
glVertex3f(20.0,-5.0,-20.0);
glEnd();
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(0.0,0.0,-35.0);
glRotatef(fang,0.0,1.0,0.0);
glGetDoublev(GL_MODELVIEW_MATRIX,Matrix_ModelView);
glGetDoublev(GL_PROJECTION_MATRIX,Matrix_Projection);
glGetIntegerv(GL_VIEWPORT,Viewport);
glBindTexture(GL_TEXTURE_2D,nTex[0]);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
DrawWithTex();
glBindTexture(GL_TEXTURE_2D,nTex[1]);
glTexGenfv(GL_S,GL_EYE_PLANE,s);
glTexGenfv(GL_T,GL_EYE_PLANE,t);
glTexGenfv(GL_R,GL_EYE_PLANE,r);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
ReProj();
glPolygonOffset(-0.1,0.0);
glEnable(GL_POLYGON_OFFSET_FILL);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
DrawWithoutTex();
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glPolygonOffset(0.0,0.0);
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glutSwapBuffers();
}
void ChangeSize(GLuint w,GLuint h)
{
if(!h)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(float)w/(float)h,1.0f,300.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Mouse(int key,int up,int x,int y)
{
float Depth;
double Obj[3];
y=Viewport[3]-y;
if(!up)
{
glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&Depth);
gluUnProject(x,y,Depth,Matrix_ModelView,Matrix_Projection,Viewport,Obj,Obj+1,Obj+2);
Pos[0]=Obj[0];
Pos[1]=Obj[1];
Pos[2]=Obj[2];
glutPostRedisplay();
}
}
void Timer(int v)
{
fang+=0.6;
if(fang>360.0)
fang-=360.0;
glutTimerFunc(33,Timer,1);
glutPostRedisplay();
}
void main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Test");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(33,Timer,1);
glutMouseFunc(Mouse);
SetupRC();
glutMainLoop();
}