diff --git a/CMakeLists.txt b/CMakeLists.txt index 68ade3f..7162f9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,7 +124,6 @@ gen_sample(depth_funcs samples/depth_funcs/main.c) gen_sample(depth_funcs_alpha_testing samples/depth_funcs_alpha_testing/main.c samples/depth_funcs_alpha_testing/gl_png.c) gen_sample(depth_funcs_ortho samples/depth_funcs_ortho/main.c) gen_sample(lerabot01 samples/lerabot01/main.c samples/loadbmp.c) -gen_sample(lerabot_blend_test samples/lerabot_blend_test/main.c) gen_sample(lights samples/lights/main.c samples/loadbmp.c) gen_sample(mipmap samples/mipmap/main.c samples/loadbmp.c) gen_sample(multitexture_arrays samples/multitexture_arrays/main.c samples/multitexture_arrays/pvr-texture.c) diff --git a/GL/texture.c b/GL/texture.c index 8a6c701..55b283c 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -1651,3 +1651,11 @@ GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void) { yalloc_defrag_commit(YALLOC_BASE); } + +GLAPI void APIENTRY glGetTexImage(GLenum tex, GLint lod, GLenum format, GLenum type, GLvoid* img) { + _GL_UNUSED(tex); + _GL_UNUSED(lod); + _GL_UNUSED(format); + _GL_UNUSED(type); + _GL_UNUSED(img); +} diff --git a/include/GL/gl.h b/include/GL/gl.h index 8c194ba..1c19df6 100644 --- a/include/GL/gl.h +++ b/include/GL/gl.h @@ -684,6 +684,7 @@ GLAPI void APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLAPI void APIENTRY glPixelStorei(GLenum pname, GLint param); GLAPI void APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask); GLAPI void APIENTRY glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glGetTexImage(GLenum tex, GLint lod, GLenum format, GLenum type, GLvoid* img); __END_DECLS diff --git a/samples/blend_test/main.c b/samples/blend_test/main.c index cd47cc6..6fbb795 100644 --- a/samples/blend_test/main.c +++ b/samples/blend_test/main.c @@ -1,7 +1,8 @@ /* - * This sample is to demonstrate a bug where rendering an unblended - * polygon, before a series of blended ones would result in no blended - * output and incorrect depth testing + * This sample demonstrates blending, and the importance of drawing order, + * depth testing and z-value. + * This is a merge of lerabot_blend_test and blend_test, with 1 added case, + * and with adapted/corrected explanation */ #ifdef __DREAMCAST__ @@ -82,13 +83,13 @@ void DrawGLScene() const float NONE [] = {0, 0, 0, 0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer + + // LEFT UPPER SECTION glLoadIdentity(); // Reset The View - - glTranslatef(-4.0, 0, -10); - - // LEFT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section draw both quad at the same Z value + glTranslatef(-4.0, 2.0, -10); + // This draws 2 quads, a red first, then an overlapping blue one. + // Both quads are drawn at the SAME z-value + // With depth test GL_LEQUAL, this means blending for the overlapping part glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(RED); @@ -96,11 +97,24 @@ void DrawGLScene() DrawQuad(BLUE); glDisable(GL_BLEND); + // RIGHT UPPER SECTION glTranslatef(4.0, 0, 0); + // This draws 2 quads, a red first, then an overlapping blue one. + // The blue quad has a LOWER z-value, so it is behind the red quad. + // With depth test GL_LEQUAL, the blue part is not considered for the overlapping part, so no blending + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + DrawQuad(RED); + glTranslatef(1.0, 0, -0.01); + DrawQuad(BLUE); + glDisable(GL_BLEND); - // RIGHT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section uses a HIGHER Z VALUE(0.01f), so the blue quad should be in FRONT of the red quad. + // LEFT DOWN SECTION + glLoadIdentity(); // Reset The View + glTranslatef(-4.0, -1.0, -10); + // This draws 2 quads, a red first, then an overlapping blue one. + // The blue quad has a HIGHER z-value, so it is in front the red quad. + // With depth test GL_LEQUAL, this means blending for the overlapping part glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(RED); @@ -108,6 +122,20 @@ void DrawGLScene() DrawQuad(BLUE); glDisable(GL_BLEND); + // RIGHT DOWN SECTION + glTranslatef(4.0, 0.0, -0.01); + // This is basically the same as the RIGHT UPPER SECTION, except that the blue quad + // is drawn first. + // With depth test GL_LEQUAL, this means blending for the overlapping part + // <- the order of drawing is important for blending ! + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glTranslatef(1.0, 0.0, -0.01); + DrawQuad(BLUE); + glTranslatef(-1.0, 0.0, 0.01); + DrawQuad(RED); + glDisable(GL_BLEND); + glKosSwapBuffers(); } diff --git a/samples/depth_funcs_alpha_testing/main.c b/samples/depth_funcs_alpha_testing/main.c index 17fc005..60987d6 100644 --- a/samples/depth_funcs_alpha_testing/main.c +++ b/samples/depth_funcs_alpha_testing/main.c @@ -9,8 +9,11 @@ //$KOS_BASE/utils/texconv/texconv --in disk.png --format ARGB4444 --preview disk_preview.png --out disk.dtex +#ifdef __DREAMCAST__ extern uint8_t romdisk[]; KOS_INIT_ROMDISK(romdisk); +#endif + texture t; int blendActive = -1; /* floats for x rotation, y rotation, z rotation */ diff --git a/samples/depth_funcs_ortho/main.c b/samples/depth_funcs_ortho/main.c index ccd88c6..c2703f5 100644 --- a/samples/depth_funcs_ortho/main.c +++ b/samples/depth_funcs_ortho/main.c @@ -82,9 +82,9 @@ void DrawGLScene() glDepthFunc(GL_LEQUAL); //RED over GREEN over BLUE DrawSquare(100.0, 1.0, 0.0, 0.0, 0.0); - glTranslatef(50, 0, 0.03f); + glTranslatef(50, 0, -0.03f); DrawSquare(100, 0, 1, 0, 0); - glTranslatef(50, 0, 0.03f); + glTranslatef(50, 0, -0.03f); DrawSquare(100, 0, 0, 1, 0); // swap buffers to display, since we're double buffered. diff --git a/samples/lerabot01/main.c b/samples/lerabot01/main.c index 8ca2a9e..f3336c1 100644 --- a/samples/lerabot01/main.c +++ b/samples/lerabot01/main.c @@ -223,7 +223,7 @@ void DrawGLScene() DrawTexturedQuad(texture[0], l1_pos[0], l1_pos[1], l1_pos[2]); for (int i = 0; i < 5; i++) - DrawTexturedQuad(texture[0], i * 20, 0.0f, 0.0f); // Draw the textured quad. + DrawTexturedQuad(texture[0], i * 20, 0.0f, 0.1f); // Draw the textured quad. // swap buffers to display, since we're double buffered. glKosSwapBuffers(); diff --git a/samples/lerabot_blend_test/main.c b/samples/lerabot_blend_test/main.c deleted file mode 100644 index fdc21d1..0000000 --- a/samples/lerabot_blend_test/main.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This sample is to demonstrate a bug where rendering an unblended - * polygon, before a series of blended ones would result in no blended - * output and incorrect depth testing - */ - -#ifdef __DREAMCAST__ -#include -#endif - -#include "GL/gl.h" -#include "GL/glu.h" -#include "GL/glkos.h" - -/* A general OpenGL initialization function. Sets all of the initial parameters. */ -void InitGL(int Width, int Height) // We call this right after our OpenGL window is created. -{ - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // This Will Clear The Background Color To Black - glClearDepth(1.0); // Enables Clearing Of The Depth Buffer - glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glEnable(GL_TEXTURE_2D); - glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading - glDisable(GL_BLEND); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); // Reset The Projection Matrix - - gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window - - glMatrixMode(GL_MODELVIEW); -} - -/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */ -void ReSizeGLScene(int Width, int Height) -{ - if (Height == 0) // Prevent A Divide By Zero If The Window Is Too Small - Height = 1; - - glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); - glMatrixMode(GL_MODELVIEW); -} - -int check_start() { -#ifdef __DREAMCAST__ - maple_device_t *cont; - cont_state_t *state; - - cont = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); - - if(cont) { - state = (cont_state_t *)maple_dev_status(cont); - - if(state) - return state->buttons & CONT_START; - } -#endif - - return 0; -} - -void DrawQuad(const float* colour) { - glBegin(GL_QUADS); - glColor4fv(colour); - glVertex3f(-1.0,-1.0, 0.0); - glVertex3f( 1.0,-1.0, 0.0); - glVertex3f( 1.0, 1.0, 0.0); - glVertex3f(-1.0, 1.0, 0.0); - glEnd(); -} - -/* The main drawing function. */ -void DrawGLScene() -{ - const float RED [] = {1.0, 0, 0, 0.5}; - const float BLUE [] = {0.0, 0, 1, 0.5}; - const float NONE [] = {0, 0, 0, 0}; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer - glLoadIdentity(); // Reset The View - - glTranslatef(-4.0, 0, -10); - - // LEFT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section draw both quad at the same Z value - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - DrawQuad(RED); - glTranslatef(1.0, 0, 0); - DrawQuad(BLUE); - glDisable(GL_BLEND); - - glTranslatef(4.0, 0, 0); - - // RIGHT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section uses a LOWER Z VALUE(-0.01f), so the blue quad should be in FRONT of the red quad. - // lerabot's note : changing the z value to positive gives the desired output. - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - DrawQuad(RED); - glTranslatef(1.0, 0, -0.01); - DrawQuad(BLUE); - glDisable(GL_BLEND); - - glKosSwapBuffers(); -} - -int main(int argc, char **argv) -{ - glKosInit(); - - InitGL(640, 480); - ReSizeGLScene(640, 480); - - while(1) { - if(check_start()) - break; - - DrawGLScene(); - } - - return 0; -} diff --git a/samples/lerabot_blend_test/romdisk/PLACEHOLDER b/samples/lerabot_blend_test/romdisk/PLACEHOLDER deleted file mode 100644 index e69de29..0000000 diff --git a/samples/mipmap/main.c b/samples/mipmap/main.c index bb58892..86a1a54 100644 --- a/samples/mipmap/main.c +++ b/samples/mipmap/main.c @@ -11,10 +11,9 @@ #include "GL/glext.h" #include "GL/glkos.h" +#ifdef __DREAMCAST__ extern uint8_t romdisk[]; KOS_INIT_ROMDISK(romdisk); - -#ifdef __DREAMCAST__ #define IMAGE_FILENAME "/rd/NeHe.bmp" #else #define IMAGE_FILENAME "samples/mipmap/romdisk/NeHe.bmp" diff --git a/samples/multitexture_arrays/main.c b/samples/multitexture_arrays/main.c index f104467..13e1d2e 100644 --- a/samples/multitexture_arrays/main.c +++ b/samples/multitexture_arrays/main.c @@ -21,6 +21,8 @@ #include "GL/glext.h" #ifdef __DREAMCAST__ +extern uint8_t romdisk[]; +KOS_INIT_ROMDISK(romdisk); #define IMAGE1_FILENAME "/rd/wp001vq.pvr" #define IMAGE2_FILENAME "/rd/FlareWS_256.pvr" #else @@ -122,9 +124,6 @@ void RenderCallback(GLuint texID0, GLuint texID1) { glDisableClientState(GL_VERTEX_ARRAY); } -extern uint8_t romdisk[]; -KOS_INIT_ROMDISK(romdisk); - int main(int argc, char **argv) { /* Notice we do not init the PVR here, that is handled by Open GL */ glKosInit(); diff --git a/samples/nehe08/main.c b/samples/nehe08/main.c index fb7ff6f..69e5863 100644 --- a/samples/nehe08/main.c +++ b/samples/nehe08/main.c @@ -26,6 +26,11 @@ blending. */ +#ifdef __DREAMCAST__ +extern uint8 romdisk[]; +KOS_INIT_ROMDISK(romdisk); +#endif + static GLfloat xrot; /* X Rotation */ static GLfloat yrot; /* Y Rotation */ static GLfloat xspeed; /* X Rotation Speed */ @@ -115,11 +120,6 @@ void draw_gl(void) { yrot += yspeed; } -#ifdef __DREAMCAST__ -extern uint8 romdisk[]; -KOS_INIT_ROMDISK(romdisk); -#endif - int main(int argc, char **argv) { #ifdef __DREAMCAST__ maple_device_t *cont; diff --git a/samples/paletted/main.c b/samples/paletted/main.c index bd7d4db..b6460e6 100644 --- a/samples/paletted/main.c +++ b/samples/paletted/main.c @@ -12,8 +12,10 @@ #include "GL/glu.h" #include "GL/glkos.h" +#ifdef __DREAMCAST__ extern uint8_t romdisk[]; KOS_INIT_ROMDISK(romdisk); +#endif /* floats for x rotation, y rotation, z rotation */ float xrot, yrot, zrot;