X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=gl_backend.c;h=d56bc790671244933ba5a94e2aa94cf0fa6e9181;hp=b3c44d2784c60a50a7f0d384e04de48ba2ea3862;hb=a31c7f6abe972870ba5753513adcf2f58b6c561a;hpb=af2e0fc692961fc3b04c6fdd49dd9931f13d73b6 diff --git a/gl_backend.c b/gl_backend.c index b3c44d27..d56bc790 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -83,8 +83,7 @@ static matrix4x4_t backend_modelviewmatrix; static matrix4x4_t backend_glmodelviewmatrix; static matrix4x4_t backend_projectmatrix; -static int backendunits, backendimageunits, backendarrayunits, backendactive; -static mempool_t *gl_backend_mempool; +static unsigned int backendunits, backendimageunits, backendarrayunits, backendactive; /* note: here's strip order for a terrain row: @@ -146,15 +145,12 @@ static void R_Mesh_CacheArray_Startup(void); static void R_Mesh_CacheArray_Shutdown(void); void GL_Backend_AllocArrays(void) { - if (!gl_backend_mempool) - gl_backend_mempool = Mem_AllocPool("GL_Backend", 0, NULL); R_Mesh_CacheArray_Startup(); } void GL_Backend_FreeArrays(void) { R_Mesh_CacheArray_Shutdown(); - Mem_FreePool(&gl_backend_mempool); } static void gl_backend_start(void) @@ -433,7 +429,7 @@ gl_state; void GL_SetupTextureState(void) { - int i; + unsigned int i; gltextureunit_t *unit; CHECKGLERROR gl_state.unit = -1; @@ -876,35 +872,35 @@ void GL_Backend_RenumberElements(int *out, int count, const int *in, int offset) // renders triangles using vertices from the active arrays int paranoidblah = 0; -void R_Mesh_Draw(int numverts, int numtriangles, const int *elements) +void R_Mesh_Draw(int firstvertex, int numvertices, int numtriangles, const int *elements) { - int numelements = numtriangles * 3; - if (numverts == 0 || numtriangles == 0) + unsigned int numelements = numtriangles * 3; + if (numvertices < 3 || numtriangles < 1) { - Con_Printf("R_Mesh_Draw(%d, %d, %08p);\n", numverts, numtriangles, elements); + Con_Printf("R_Mesh_Draw(%d, %d, %d, %08p);\n", firstvertex, numvertices, numtriangles, elements); return; } - CHECKGLERROR + //CHECKGLERROR if (r_showtrispass) { - R_Mesh_Draw_ShowTris(numverts, numtriangles, elements); + R_Mesh_Draw_ShowTris(firstvertex, numvertices, numtriangles, elements); return; } c_meshs++; c_meshelements += numelements; if (gl_paranoid.integer) { - int i, j, size; + unsigned int i, j, size; const int *p; if (!qglIsEnabled(GL_VERTEX_ARRAY)) Con_Print("R_Mesh_Draw: vertex array not enabled\n"); - for (j = 0, size = numverts * (int)sizeof(float[3]), p = gl_state.pointer_vertex;j < size;j += sizeof(int), p++) + for (j = 0, size = numvertices * 3, p = (int *)((float *)gl_state.pointer_vertex + firstvertex * 3);j < size;j++, p++) paranoidblah += *p; if (gl_state.pointer_color) { if (!qglIsEnabled(GL_COLOR_ARRAY)) Con_Print("R_Mesh_Draw: color array set but not enabled\n"); - for (j = 0, size = numverts * (int)sizeof(float[4]), p = gl_state.pointer_color;j < size;j += sizeof(int), p++) + for (j = 0, size = numvertices * 4, p = (int *)((float *)gl_state.pointer_color + firstvertex * 4);j < size;j++, p++) paranoidblah += *p; } for (i = 0;i < backendarrayunits;i++) @@ -914,15 +910,15 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements) GL_ClientActiveTexture(i); if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY)) Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n"); - for (j = 0, size = numverts * ((gl_state.units[i].t3d || gl_state.units[i].tcubemap) ? (int)sizeof(float[3]) : (int)sizeof(float[2])), p = gl_state.units[i].pointer_texcoord;j < size;j += sizeof(int), p++) + for (j = 0, size = numvertices * gl_state.units[i].arraycomponents, p = (int *)((float *)gl_state.units[i].pointer_texcoord + firstvertex * gl_state.units[i].arraycomponents);j < size;j++, p++) paranoidblah += *p; } } - for (i = 0;i < numtriangles * 3;i++) + for (i = 0;i < (unsigned int) numtriangles * 3;i++) { - if (elements[i] < 0 || elements[i] >= numverts) + if (elements[i] < firstvertex || elements[i] >= firstvertex + numvertices) { - Con_Printf("R_Mesh_Draw: invalid vertex index %i (outside range 0 - %i) in elements list\n", elements[i], numverts); + Con_Printf("R_Mesh_Draw: invalid vertex index %i (outside range %i - %i) in elements list\n", elements[i], firstvertex, firstvertex + numvertices); return; } } @@ -933,10 +929,10 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements) CHECKGLERROR if (gl_mesh_testmanualfeeding.integer) { - int i, j; + unsigned int i, j; const GLfloat *p; qglBegin(GL_TRIANGLES); - for (i = 0;i < numtriangles * 3;i++) + for (i = 0;i < (unsigned int) numtriangles * 3;i++) { for (j = 0;j < backendarrayunits;j++) { @@ -1014,20 +1010,21 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements) } else if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL) { - qglDrawRangeElements(GL_TRIANGLES, 0, numverts, numelements, GL_UNSIGNED_INT, elements);CHECKGLERROR + qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices, numelements, GL_UNSIGNED_INT, elements); + CHECKGLERROR } else { - qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, elements);CHECKGLERROR + qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, elements); + CHECKGLERROR } - CHECKGLERROR } } // restores backend state, used when done with 3D rendering void R_Mesh_Finish(void) { - int i; + unsigned int i; BACKENDACTIVECHECK CHECKGLERROR GL_LockArrays(0, 0); @@ -1047,14 +1044,14 @@ void R_Mesh_Finish(void) qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);CHECKGLERROR } } - for (i = backendarrayunits - 1;i >= 0;i--) + for (i = 0;i < backendarrayunits;i++) { - GL_ActiveTexture(i); + GL_ActiveTexture(backendarrayunits - 1 - i); qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR } - for (i = backendunits - 1;i >= 0;i--) + for (i = 0;i < backendunits;i++) { - GL_ActiveTexture(i); + GL_ActiveTexture(backendunits - 1 - i); qglDisable(GL_TEXTURE_1D);CHECKGLERROR qglDisable(GL_TEXTURE_2D);CHECKGLERROR if (gl_texture3d) @@ -1162,7 +1159,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co } } -void R_Mesh_TexBindAll(unsigned int unitnum, unsigned int tex1d, unsigned int tex2d, unsigned int tex3d, unsigned int texcubemap) +void R_Mesh_TexBindAll(unsigned int unitnum, int tex1d, int tex2d, int tex3d, int texcubemap) { gltextureunit_t *unit = gl_state.units + unitnum; if (unitnum >= backendunits) @@ -1253,7 +1250,7 @@ void R_Mesh_TexBindAll(unsigned int unitnum, unsigned int tex1d, unsigned int te } } -void R_Mesh_TexBind1D(unsigned int unitnum, unsigned int texnum) +void R_Mesh_TexBind1D(unsigned int unitnum, int texnum) { gltextureunit_t *unit = gl_state.units + unitnum; if (unitnum >= backendunits) @@ -1308,7 +1305,7 @@ void R_Mesh_TexBind1D(unsigned int unitnum, unsigned int texnum) } } -void R_Mesh_TexBind(unsigned int unitnum, unsigned int texnum) +void R_Mesh_TexBind(unsigned int unitnum, int texnum) { gltextureunit_t *unit = gl_state.units + unitnum; if (unitnum >= backendunits) @@ -1363,7 +1360,7 @@ void R_Mesh_TexBind(unsigned int unitnum, unsigned int texnum) } } -void R_Mesh_TexBind3D(unsigned int unitnum, unsigned int texnum) +void R_Mesh_TexBind3D(unsigned int unitnum, int texnum) { gltextureunit_t *unit = gl_state.units + unitnum; if (unitnum >= backendunits) @@ -1418,7 +1415,7 @@ void R_Mesh_TexBind3D(unsigned int unitnum, unsigned int texnum) } } -void R_Mesh_TexBindCubeMap(unsigned int unitnum, unsigned int texnum) +void R_Mesh_TexBindCubeMap(unsigned int unitnum, int texnum) { gltextureunit_t *unit = gl_state.units + unitnum; if (unitnum >= backendunits) @@ -1558,7 +1555,7 @@ void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, i void R_Mesh_State(const rmeshstate_t *m) { - int i; + unsigned int i; BACKENDACTIVECHECK @@ -1591,7 +1588,7 @@ void R_Mesh_State(const rmeshstate_t *m) } } -void R_Mesh_Draw_ShowTris(int numverts, int numtriangles, const int *elements) +void R_Mesh_Draw_ShowTris(int firstvertex, int numvertices, int numtriangles, const int *elements) { qglBegin(GL_LINES); for (;numtriangles;numtriangles--, elements += 3) @@ -1796,7 +1793,7 @@ void SCR_UpdateLoadingScreen (void) R_Mesh_Start(); R_Mesh_Matrix(&r_identitymatrix); // draw the loading plaque - pic = Draw_CachePic("gfx/loading.lmp"); + pic = Draw_CachePic("gfx/loading.lmp", false); x = (vid_conwidth.integer - pic->width)/2; y = (vid_conheight.integer - pic->height)/2; GL_Color(1,1,1,1); @@ -1816,7 +1813,7 @@ void SCR_UpdateLoadingScreen (void) varray_texcoord2f[0][4] = 1;varray_texcoord2f[0][5] = 1; varray_texcoord2f[0][6] = 0;varray_texcoord2f[0][7] = 1; GL_LockArrays(0, 4); - R_Mesh_Draw(4, 2, polygonelements); + R_Mesh_Draw(0, 4, 2, polygonelements); GL_LockArrays(0, 0); R_Mesh_Finish(); // refresh