From: <jo...@hr...> - 2000-09-28 10:40:23
|
Hi All, I detected a problem in near_persp_textured_triangle defined in triangle.c. Below I reprinted the INNER_LOOP to show what goes wrong: The INNER_LOOP is started for one case with ss=dsdx=0 tt=vv and thus dx_tex=dy_tex=0.0. For these values the path leads to the point where I inserted the print of "test4". Than it crashes while it tries to divide by dx_tex which is zero. What is intended here for this special case? Jouk excerpt from triangle.c (procedure near_persp_textured_triangle): #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint i = 0; \ const GLint n = RIGHT-LEFT; \ GLdepth zspan[MAX_WIDTH]; \ GLubyte rgba[MAX_WIDTH][4]; \ (void)uu; /* please GCC */ \ if (n > 0) { /* called with ss=dsdx=0 , tt=vv */ \ GLfloat SS = ss * sscale; \ GLfloat TT = tt * tscale; \ GLfloat dSdx = dsdx * sscale; \ GLfloat dTdx = dtdx * tscale; \ GLfloat x_tex = SS / vv; \ GLfloat y_tex = TT / vv; \ GLfloat dx_tex = (SS + n * dSdx) / (vv + n * dvdx) - x_tex; \ GLfloat dy_tex = (TT + n * dTdx) / (vv + n * dvdx) - y_tex; \ GLubyte *dest = rgba[0]; \ x_tex += BIAS; \ y_tex += BIAS; \ printf( "dx_tex , dy_tex , n : %f %f %d\n" , dx_tex , dy_tex , n );\ if (FABSF(dx_tex) < n && FABSF(dy_tex) < n) { \ if (FABSF(dx_tex) > FABSF(dy_tex)) { \ GLfloat nominator = - SS - vv * BIAS; \ GLfloat denominator = dvdx * BIAS + dSdx; \ GLfloat dy_dx = dy_tex / dx_tex; \ GLfloat dx_dy; \ printf( "test1\n" );\ if (dy_dx != 0.0f) \ dx_dy= 1.0f/dy_dx; \ if (dx_tex > 0.0f) { \ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN1(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN1(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN1(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN2(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN2(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN2(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ } \ else { /* dx_tex < 0.0f */ \ printf( "test2\n" );\ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN3(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN3(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN3(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ printf( "test3\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN4(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN4(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN4(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ } \ } \ else { \ GLfloat swap; \ GLfloat dy_dx; \ GLfloat dx_dy; \ GLfloat nominator, denominator; \ /* swap some x-values and y-values */ \ SS = TT; \ dSdx = dTdx; \ swap = x_tex, x_tex = y_tex, y_tex = swap; \ swap = dx_tex, dx_tex = dy_tex, dy_tex = swap; \ printf( "test4\n" ); /*and BANG on the next statement */ \ dy_dx = dy_tex / dx_tex; \ nominator = - SS - vv * BIAS; \ denominator = dvdx * BIAS + dSdx; \ if (dy_dx != 0.0f) \ dx_dy= 1.0f/dy_dx; \ if (dx_tex > 0.0f) { \ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN1(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN1(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN1(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ printf( "test5\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN2(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN2(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN2(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ } \ else { /* dx_tex < 0.0f */ \ printf( "test6\n" );\ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN3(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN3(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN3(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ printf( "test7\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN4(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN4(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN4(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ } \ } \ } \ else { \ printf( "test8\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ OLD_SPAN(NEAREST_RGB;MODULATE,3); \ break; \ case GL_DECAL: \ case GL_REPLACE: \ OLD_SPAN(NEAREST_RGB_REPLACE,3); \ break; \ case GL_BLEND: \ OLD_SPAN(NEAREST_RGB;BLEND,3); \ break; \ case GL_ADD: \ OLD_SPAN(NEAREST_RGB;ADD,3); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ OLD_SPAN(NEAREST_RGBA;MODULATE,4); \ break; \ case GL_DECAL: \ OLD_SPAN(NEAREST_RGBA;DECAL,4); \ break; \ case GL_BLEND: \ OLD_SPAN(NEAREST_RGBA;BLEND,4); \ break; \ case GL_ADD: \ OLD_SPAN(NEAREST_RGBA;ADD,4); \ break; \ case GL_REPLACE: \ OLD_SPAN(NEAREST_RGBA_REPLACE,4); \ break; \ default: \ abort(); \ } \ break; \ } \ } \ gl_write_rgba_span( ctx, n, LEFT, Y, zspan, rgba, GL_POLYGON );\ ffr = ffg = ffb = ffa = 0; \ } \ } \ #include "tritemp.h" #undef OLD_SPAN #undef SPAN1 #undef SPAN2 #undef SPAN3 #undef SPAN4 #undef X_Y_TEX_COORD #undef Y_X_TEX_COORD #undef DRAW_LINE #undef BIAS } Ceterum censeo tertium millennium post Christum natum anno MMI incepturum esse >------------------------------------------------------------------------------< Jouk Jansen jo...@hr... Technische Universiteit Delft tttttttttt uu uu ddddddd Nationaal centrum voor HREM tttttttttt uu uu dd dd Rotterdamseweg 137 tt uu uu dd dd 2628 AL Delft tt uu uu dd dd Nederland tt uu uu dd dd tel. 31-15-2781536 tt uuuuuuu ddddddd >------------------------------------------------------------------------------< |