/* * MultiTex.c * * Written by Nick Triantos * * Copyright (c) 1998, NVIDIA Corporation. All rights reserved * * Draw a single multitextured quad */ #include #include "glext.h" #include #define TEX0_SIZE 128 #define TEX0_COMPONENTS 3 #define TEX1_SIZE 256 #define TEX1_COMPONENTS 4 #define QUAD_SIZE 400.0f #define QUAD_X_OFFSET 100.0f #define QUAD_Y_OFFSET 10.0f #define WINDOW_TITLE "Multitexture test" #define LINE_HEIGHT 15 #define DEG2RAD 0.017453292519943 #define PI 3.141592653589793 typedef struct Vertex { float x, y; float u0, v0; float u1, v1; } Vertex; void InitVertices(void); void Display(void); unsigned char tex0[TEX0_COMPONENTS*TEX0_SIZE*TEX0_SIZE]; unsigned char tex1[TEX1_COMPONENTS*TEX1_SIZE*TEX1_SIZE]; void *font = GLUT_BITMAP_9_BY_15; int windowWidth = 600; int windowHeight = 600; float angle = 135.0f; int multitexturing = 1; int panTexture0 = 0; Vertex vtx[4]; GLuint texNames[2]; PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL; PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL; /* ---------- Build a texture of the specified size ------------------------ */ void MakeTextures() { int i, j; unsigned char *lpTex; glGenTextures(2, texNames); /* Texture 0 is a simple checkerboard */ glBindTexture(GL_TEXTURE_2D, texNames[0]); lpTex = tex0; for (j=0; j 1.0f) fDist = 1.0f; fA = 1.0f - fDist; if ((j < (TEX1_SIZE>>1)) && (i < (TEX1_SIZE>>1))) { lpTex[0] = 0xff; lpTex[1] = 0x00; lpTex[2] = 0x00; } else if (j < (TEX1_SIZE>>1)) { lpTex[0] = 0x00; lpTex[1] = 0xff; lpTex[2] = 0x00; } else if (i < (TEX1_SIZE>>1)) { lpTex[0] = 0x00; lpTex[1] = 0x00; lpTex[2] = 0xff; } else { lpTex[0] = 0xff; lpTex[1] = 0xff; lpTex[2] = 0x00; } lpTex[3] = fA * 255.0f; lpTex += TEX1_COMPONENTS; } } } glTexImage2D(GL_TEXTURE_2D, 0, (TEX1_COMPONENTS==3 ? GL_RGB8 : GL_RGBA8), TEX1_SIZE, TEX1_SIZE, 0, (TEX1_COMPONENTS==3 ? GL_RGB : GL_RGBA), GL_UNSIGNED_BYTE, tex1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } /* ---------- Misc --------------------------------------------------------- */ void Reshape(int w, int h) { glViewport(0, 0, w, h); /* Establish viewing area to cover entire window. */ glMatrixMode(GL_PROJECTION); /* Start modifying the projection matrix. */ glLoadIdentity(); /* Reset project matrix. */ glOrtho(0, w, 0, h, -1, 1); /* Map abstract coords directly to window coords. */ glScalef(1, -1, 1); /* Invert Y axis so increasing Y goes down. */ glTranslatef(0, -h, 0); /* Shift origin up to upper-left corner. */ } void Idle(void) { angle += 2.0f; Display(); } void GetGLProcs() { char *strExtensions; strExtensions = (char*)glGetString(GL_EXTENSIONS); if (strstr(strExtensions, "GL_ARB_multitexture") == 0) { OutputDebugString("GL_ARB_multitexture NOT found.\n"); multitexturing = 0; return; } glActiveTextureARB = (void*)wglGetProcAddress("glActiveTextureARB"); glMultiTexCoord2fARB = (void*)wglGetProcAddress("glMultiTexCoord2fARB"); } /* ---------- Draw the scene ----------------------------------------------- */ void OutputString(int x, int y, char *string) { int len, i; glRasterPos2f(x, y); len = (int)strlen(string); for (i=0; i