From e4186a05bfba2ae8bc00e8d4d049ccd1135c6ba7 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Sun, 10 Mar 2019 19:38:47 +0000 Subject: [PATCH] Start working on a test for GL_ALPHA_TEST --- GL/texture.c | 2 +- samples/paletted_pcx/main.c | 45 +++++++++++++++++--- samples/paletted_pcx/romdisk/NeHe-Alpha.pcx | Bin 0 -> 28851 bytes 3 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 samples/paletted_pcx/romdisk/NeHe-Alpha.pcx diff --git a/GL/texture.c b/GL/texture.c index c58b627..eda9642 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -822,7 +822,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, } if(!TEXTURE_UNITS[ACTIVE_TEXTURE]) { - _glKosThrowError(GL_INVALID_OPERATION, "glTexImage2D"); + _glKosThrowError(GL_INVALID_OPERATION, __func__); } GLboolean isPaletted = (internalFormat == GL_COLOR_INDEX8_EXT) ? GL_TRUE : GL_FALSE; diff --git a/samples/paletted_pcx/main.c b/samples/paletted_pcx/main.c index d98c5da..519ca55 100644 --- a/samples/paletted_pcx/main.c +++ b/samples/paletted_pcx/main.c @@ -15,7 +15,7 @@ KOS_INIT_ROMDISK(romdisk); /* floats for x rotation, y rotation, z rotation */ float xrot, yrot, zrot; -int textures[2]; +int textures[3]; typedef struct { unsigned int height; @@ -131,9 +131,13 @@ int LoadPalettedPCX(const char* filename, Image* image) { // Load Bitmaps And Convert To Textures void LoadGLTextures() { // Load Texture - Image image1; + Image image1, image2; - if (!LoadPalettedPCX("/rd/NeHe.pcx", &image1)) { + if(!LoadPalettedPCX("/rd/NeHe.pcx", &image1)) { + exit(1); + } + + if(!LoadPalettedPCX("/rd/NeHe-Alpha.pcx", &image2)) { exit(1); } @@ -154,7 +158,7 @@ void LoadGLTextures() { glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_1_KOS, GL_RGBA8, image1.palette_width, GL_RGB, GL_UNSIGNED_BYTE, inversed_palette); // Create Texture - glGenTextures(2, textures); + glGenTextures(3, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); // 2d texture (x and y size) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); // scale linearly when image bigger than texture @@ -165,7 +169,6 @@ void LoadGLTextures() { glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1.data); glBindTexture(GL_TEXTURE_2D, textures[1]); // 2d texture (x and y size) - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); // scale linearly when image bigger than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); // scale linearly when image smalled than texture @@ -175,6 +178,23 @@ void LoadGLTextures() { // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1.data); + + + glBindTexture(GL_TEXTURE_2D, textures[2]); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + char* new_palette = (char*) malloc(image2.palette_width * 4); + for(i = 0; i < image2.palette_width; ++i) { + new_palette[(i * 4) + 0] = image2.palette[(i * 3) + 0]; + new_palette[(i * 4) + 1] = image2.palette[(i * 3) + 1]; + new_palette[(i * 4) + 2] = image2.palette[(i * 3) + 2]; + new_palette[(i * 4) + 3] = 0; + } + + glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, image2.palette_width, GL_RGBA, GL_UNSIGNED_BYTE, new_palette); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image2.width, image2.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image2.data); } /* A general OpenGL initialization function. Sets all of the initial parameters. */ @@ -262,7 +282,7 @@ void DrawGLScene() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View - glTranslatef(-1.5f,0.0f,-5.0f); // move 5 units into the screen. + glTranslatef(-1.5f,0.0f,-8.0f); // move 5 units into the screen. glPushMatrix(); glRotatef(xrot,1.0f,0.0f,0.0f); // Rotate On The X Axis @@ -283,6 +303,19 @@ void DrawGLScene() glTranslatef(3.0, 0, 0); DrawPolygon(); + static float x = 0.0f; + x += 0.05f; + if(x > 5.0f) { + x = 0.0f; + } + + glAlphaFunc(GL_GREATER, 0.666f); + glEnable(GL_ALPHA_TEST); + glBindTexture(GL_TEXTURE_2D, textures[2]); + glTranslatef(x - 3.0, 0, 3.0); + DrawPolygon(); + glDisable(GL_ALPHA_TEST); + xrot+=1.5f; // X Axis Rotation yrot+=1.5f; // Y Axis Rotation zrot+=1.5f; // Z Axis Rotation diff --git a/samples/paletted_pcx/romdisk/NeHe-Alpha.pcx b/samples/paletted_pcx/romdisk/NeHe-Alpha.pcx new file mode 100644 index 0000000000000000000000000000000000000000..e48956743e52274847aa1021f80923258627d36e GIT binary patch literal 28851 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 RvsHCl*KYa!k3aqG{{kay{dNEV literal 0 HcmV?d00001