| #include "framework.h" |
| |
| /* |
| * GL_ARB_multitexture |
| */ |
| #ifndef GL_ARB_multitexture |
| PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB; |
| PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB; |
| #endif |
| |
| /* |
| * GL_ARB_shader_objects |
| */ |
| PFNGLDELETEOBJECTARBPROC glDeleteObjectARB; |
| PFNGLGETHANDLEARBPROC glGetHandleARB; |
| PFNGLDETACHOBJECTARBPROC glDetachObjectARB; |
| PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB; |
| PFNGLSHADERSOURCEARBPROC glShaderSourceARB; |
| PFNGLCOMPILESHADERARBPROC glCompileShaderARB; |
| PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB; |
| PFNGLATTACHOBJECTARBPROC glAttachObjectARB; |
| PFNGLLINKPROGRAMARBPROC glLinkProgramARB; |
| PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB; |
| PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; |
| PFNGLGETINFOLOGARBPROC glGetInfoLogARB; |
| PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB; |
| |
| /* |
| * GL_ARB_vertex_shader |
| */ |
| PFNGLVERTEXATTRIB4FVARBPROC glVertexAttrib4fvARB; |
| PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB; |
| PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB; |
| PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB; |
| PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB; |
| PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; |
| |
| /* |
| * GL_EXT_fog_coord |
| */ |
| PFNGLFOGCOORDFVEXTPROC glFogCoordfvEXT; |
| PFNGLFOGCOORDPOINTEREXTPROC glFogCoordPointerEXT; |
| |
| /* |
| * GL_EXT_secondary_color |
| */ |
| PFNGLSECONDARYCOLOR3FVEXTPROC glSecondaryColor3fvEXT; |
| PFNGLSECONDARYCOLORPOINTEREXTPROC glSecondaryColorPointerEXT; |
| |
| static void Display (void) |
| { |
| glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| RenderScene (); |
| glutSwapBuffers (); |
| } |
| |
| static void Idle (void) |
| { |
| glutPostRedisplay (); |
| } |
| |
| void InitFramework (int *argc, char *argv[]) |
| { |
| glutInit (argc, argv); |
| glutInitWindowPosition (0, 0); |
| glutInitWindowSize (200, 200); |
| glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); |
| glutCreateWindow (argv[0]); |
| |
| #ifndef GL_ARB_multitexture |
| GETPROCADDR(glClientActiveTextureARB, PFNGLCLIENTACTIVETEXTUREARBPROC); |
| GETPROCADDR(glMultiTexCoord4fvARB, PFNGLMULTITEXCOORD4FVARBPROC); |
| #endif |
| |
| GETPROCADDR(glDeleteObjectARB, PFNGLDELETEOBJECTARBPROC); |
| GETPROCADDR(glGetHandleARB, PFNGLGETHANDLEARBPROC); |
| GETPROCADDR(glDetachObjectARB, PFNGLDETACHOBJECTARBPROC); |
| GETPROCADDR(glCreateShaderObjectARB, PFNGLCREATESHADEROBJECTARBPROC); |
| GETPROCADDR(glShaderSourceARB, PFNGLSHADERSOURCEARBPROC); |
| GETPROCADDR(glCompileShaderARB, PFNGLCOMPILESHADERARBPROC); |
| GETPROCADDR(glCreateProgramObjectARB, PFNGLCREATEPROGRAMOBJECTARBPROC); |
| GETPROCADDR(glAttachObjectARB, PFNGLATTACHOBJECTARBPROC); |
| GETPROCADDR(glLinkProgramARB, PFNGLLINKPROGRAMARBPROC); |
| GETPROCADDR(glUseProgramObjectARB, PFNGLUSEPROGRAMOBJECTARBPROC); |
| GETPROCADDR(glGetObjectParameterivARB, PFNGLGETOBJECTPARAMETERIVARBPROC); |
| GETPROCADDR(glGetInfoLogARB, PFNGLGETINFOLOGARBPROC); |
| GETPROCADDR(glGetUniformLocationARB, PFNGLGETUNIFORMLOCATIONARBPROC); |
| |
| GETPROCADDR(glVertexAttrib4fvARB, PFNGLVERTEXATTRIB4FVARBPROC); |
| GETPROCADDR(glVertexAttribPointerARB, PFNGLVERTEXATTRIBPOINTERARBPROC); |
| GETPROCADDR(glEnableVertexAttribArrayARB, PFNGLENABLEVERTEXATTRIBARRAYARBPROC); |
| GETPROCADDR(glDisableVertexAttribArrayARB, PFNGLDISABLEVERTEXATTRIBARRAYARBPROC); |
| GETPROCADDR(glBindAttribLocationARB, PFNGLBINDATTRIBLOCATIONARBPROC); |
| GETPROCADDR(glGetAttribLocationARB, PFNGLGETATTRIBLOCATIONARBPROC); |
| |
| GETPROCADDR(glFogCoordfvEXT, PFNGLFOGCOORDFVEXTPROC); |
| GETPROCADDR(glFogCoordPointerEXT, PFNGLFOGCOORDPOINTEREXTPROC); |
| |
| GETPROCADDR(glSecondaryColor3fvEXT, PFNGLSECONDARYCOLOR3FVEXTPROC); |
| GETPROCADDR(glSecondaryColorPointerEXT, PFNGLSECONDARYCOLORPOINTEREXTPROC); |
| |
| printf ("VENDOR: %s\n", glGetString (GL_VENDOR)); |
| printf ("RENDERER: %s\n", glGetString (GL_RENDERER)); |
| |
| InitScene (); |
| |
| glutDisplayFunc (Display); |
| glutIdleFunc (Idle); |
| glutMainLoop (); |
| } |
| |
| GLboolean CheckObjectStatus (GLhandleARB handle) |
| { |
| GLint type, status, length; |
| GLcharARB *infolog; |
| |
| glGetObjectParameterivARB (handle, GL_OBJECT_TYPE_ARB, &type); |
| if (type == GL_SHADER_OBJECT_ARB) |
| glGetObjectParameterivARB (handle, GL_OBJECT_COMPILE_STATUS_ARB, &status); |
| else if (type == GL_PROGRAM_OBJECT_ARB) |
| glGetObjectParameterivARB (handle, GL_OBJECT_LINK_STATUS_ARB, &status); |
| else { |
| assert (0); |
| return GL_FALSE; |
| } |
| |
| if (status) |
| return GL_TRUE; |
| |
| printf ("\n%s FAILED. INFO LOG FOLLOWS:\n", |
| type == GL_SHADER_OBJECT_ARB ? "SHADER COMPILE" : "PROGRAM LINK"); |
| |
| glGetObjectParameterivARB (handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); |
| infolog = (GLcharARB *) (malloc (length)); |
| if (infolog != NULL) { |
| glGetInfoLogARB (handle, length, NULL, infolog); |
| printf ("%s", infolog); |
| free (infolog); |
| } |
| |
| printf ("\n"); |
| |
| return GL_FALSE; |
| } |
| |