Changeset 26 for trunk/Classes/RenderQueue.cpp
- Timestamp:
- 2010-05-28 07:39:52 (2 years ago)
- File:
-
- 1 edited
-
trunk/Classes/RenderQueue.cpp (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Classes/RenderQueue.cpp
r23 r26 17 17 #include <vector> 18 18 #include <iostream> 19 #include <set> 19 20 20 21 #include "TextureAtlas.h" 22 #include "SDL_image.h" 23 #include "game_config.hpp" 24 #include "video.hpp" 21 25 22 26 #define QUEUE_TYPE_TEXTURE 0 23 27 #define QUEUE_TYPE_FILL 1 24 28 #define QUEUE_TYPE_LINE 2 25 #define QUEUE_TYPE_DONE 5 26 29 30 void cacheTextureMode(bool isTextured); 31 extern void checkUnitTextureAtlas(void); 27 32 28 33 struct renderTextureInfo 29 34 { 30 35 GLshort type; 31 GLshort vertices[ 8];36 GLshort vertices[12]; 32 37 GLfloat texCoords[8]; 33 38 GLuint texture; … … 35 40 unsigned long color; 36 41 float brightness; // 0..2, with 1 being normal, and 0 marked special as greyscale 42 bool done; 37 43 }; 44 45 struct dirtyTile 46 { 47 short x; 48 short y; 49 bool operator<( const dirtyTile& other) const 50 { 51 return (x+y*100) < (other.x + other.y*100); 52 } 53 bool operator==( const dirtyTile& other) const 54 { 55 return (x == other.x && y == other.y); 56 } 57 }; 58 std::set<dirtyTile> mDirtyTiles; 38 59 39 60 std::vector<renderTextureInfo> mTextureQueue; … … 44 65 static const float inv255 = 1.0f / 255.0f; 45 66 67 GLuint gMaskTexture = 0; 68 46 69 void renderQueueInit() 47 70 { 48 71 mIsEnabled = false; 49 72 mTextureQueue.reserve(100); 73 std::string filename = game_config::path; 74 filename += "/data/core/images/terrain/alphamask.png"; 75 glGenTextures(1, &gMaskTexture); 76 cacheBindTexture(GL_TEXTURE_2D, gMaskTexture, true); 77 78 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 79 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 82 SDL_Surface *surf = IMG_Load(filename.c_str()); 83 if (surf == NULL) 84 { 85 std::cerr << "\n\n*** ERROR loading texture altas " << filename.c_str() << "\n\n"; 86 return; 87 } 88 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surf->w, surf->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surf->pixels); 89 SDL_FreeSurface(surf); 50 90 } 51 91 … … 105 145 { 106 146 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); 107 glColor4f(t-1, t-1, t-1, t-1); 147 //glColor4f(t-1, t-1, t-1, t-1); 148 cacheColor4f(t-1, t-1, t-1, t-1); 108 149 } 109 150 else 110 151 { 111 152 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); 112 glColor4f(1-t, 1-t, 1-t, 1-t); 153 //glColor4f(1-t, 1-t, 1-t, 1-t); 154 cacheColor4f(1-t, 1-t, 1-t, 1-t); 113 155 } 114 156 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); … … 131 173 132 174 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 133 glColor4f(1,1,1,1); 175 //glColor4f(1,1,1,1); 176 cacheColor4f(1,1,1,1); 134 177 } 135 178 else 136 179 { 137 180 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 138 glColor4f(1,1,1,1); 181 //glColor4f(1,1,1,1); 182 cacheColor4f(1,1,1,1); 139 183 } 140 184 } … … 147 191 rti.type = QUEUE_TYPE_TEXTURE; 148 192 rti.z = mCurZ; 149 memcpy(&rti.vertices, vertices, sizeof(GLshort)* 8);193 memcpy(&rti.vertices, vertices, sizeof(GLshort)*12); 150 194 memcpy(&rti.texCoords, texCoords, sizeof(GLfloat)*8); 151 195 rti.texture = texture; 152 196 rti.color = color; 153 197 rti.brightness = brightness; 198 rti.done = false; 154 199 mTextureQueue.push_back(rti); 155 200 } … … 161 206 float b = (float)((color&0x000000FF) )*inv255; 162 207 float a = (float)((color&0xFF000000) >> 24)*inv255; 163 glColor4f(r, g, b, a); 164 glBindTexture(GL_TEXTURE_2D, texture); 165 glVertexPointer(2, GL_SHORT, 0, vertices); 208 cacheTextureMode(true); 209 //glColor4f(r, g, b, a); 210 cacheColor4f(r, g, b, a); 211 // glBindTexture(GL_TEXTURE_2D, texture); 212 cacheBindTexture(GL_TEXTURE_2D, texture, 0); 213 glVertexPointer(3, GL_SHORT, 0, vertices); 166 214 glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 167 215 168 216 // special settings 169 217 setupBrightness(brightness); 170 218 171 219 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 172 220 173 cleanupBrightness(brightness); 221 cleanupBrightness(brightness); 174 222 } 175 223 } … … 182 230 rti.type = QUEUE_TYPE_FILL; 183 231 rti.z = mCurZ; 184 memcpy(&rti.vertices, vertices, sizeof(GLshort)* 8);232 memcpy(&rti.vertices, vertices, sizeof(GLshort)*12); 185 233 rti.texCoords[0] = r; 186 234 rti.texCoords[1] = g; 187 235 rti.texCoords[2] = b; 188 236 rti.texCoords[3] = a; 237 rti.done = false; 189 238 mTextureQueue.push_back(rti); 190 239 } … … 192 241 { 193 242 // draw right away 194 glColor4f(r,g,b,a); 195 glVertexPointer(2, GL_SHORT, 0, vertices); 196 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 197 glDisable(GL_TEXTURE_2D); 243 cacheTextureMode(false); 244 //glColor4f(r,g,b,a); 245 cacheColor4f(r,g,b,a); 246 glVertexPointer(3, GL_SHORT, 0, vertices); 247 //glDisableClientState(GL_TEXTURE_COORD_ARRAY); 248 //glDisable(GL_TEXTURE_2D); 198 249 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 199 glEnable(GL_TEXTURE_2D); 200 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 250 //glEnable(GL_TEXTURE_2D); 251 //glEnableClientState(GL_TEXTURE_COORD_ARRAY); 252 } 253 } 254 255 #define TEX_INTERSECTS_DIRTY(verts,dirty) ( !(verts[0] > dirty.x2 || verts[2] < dirty.x1 || verts[1] > dirty.y2 || verts[3] < dirty.y1) ) 256 257 bool gRenderMaskOn = false; 258 int gRenderMaskX = 0; 259 int gRenderMaskY = 0; 260 261 void clearDepthBuffer(void) 262 { 263 glEnable(GL_DEPTH_TEST); 264 glDepthMask(GL_TRUE); // turn on depth writing 265 glDepthFunc(GL_ALWAYS); 266 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // do not write to color buffer 267 268 cacheTextureMode(false); 269 GLfloat verts[12]; 270 verts[0] = 0; 271 verts[1] = 0; 272 verts[2] = 1.0f; 273 verts[3] = CVideo::getx(); 274 verts[4] = 0; 275 verts[5] = 1.0f; 276 verts[6] = 0; 277 verts[7] = CVideo::gety(); 278 verts[8] = 1.0f; 279 verts[9] = CVideo::getx(); 280 verts[10] = CVideo::gety(); 281 verts[11] = 1.0f; 282 glVertexPointer(3, GL_FLOAT, 0, verts); 283 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 284 cacheTextureMode(true); 285 } 286 287 void renderMaskTile(int x, int y) 288 { 289 if (gRenderMaskOn == true && gRenderMaskX == x && gRenderMaskY == y) 290 return; 291 292 if (gMaskTexture == 0) 293 renderQueueInit(); 294 295 // iPhone doesn't have a stencil buffer :( 296 // use the depth buffer instead... 297 298 glDisable(GL_BLEND); 299 glEnable(GL_DEPTH_TEST); 300 glDepthMask(GL_TRUE); // turn on depth writing 301 glDepthFunc(GL_ALWAYS); 302 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // do not write to color buffer 303 304 // this actually took 49% of the cpu when scrolling, so optimize to just clear the last portion 305 //glClearDepthf(1.0f); 306 //glClear(GL_DEPTH_BUFFER_BIT); 307 308 /* 309 // this is slow on device too... 310 glEnable(GL_SCISSOR_TEST); 311 glScissor(CVideo::gety()-gRenderMaskY-72, CVideo::getx()-gRenderMaskX-72, 72, 72); 312 glClear(GL_DEPTH_BUFFER_BIT); 313 glDisable(GL_SCISSOR_TEST); 314 */ 315 316 // this is nice and fast 317 cacheTextureMode(false); 318 cacheColor4f(1, 1, 1, 1); 319 GLfloat clr_verts[12]; 320 clr_verts[0] = gRenderMaskX; 321 clr_verts[1] = gRenderMaskY; 322 clr_verts[2] = -50.0f; 323 clr_verts[3] = gRenderMaskX+72; 324 clr_verts[4] = gRenderMaskY; 325 clr_verts[5] = -50.0f; 326 clr_verts[6] = gRenderMaskX; 327 clr_verts[7] = gRenderMaskY+72; 328 clr_verts[8] = -50.0f; 329 clr_verts[9] = gRenderMaskX+72; 330 clr_verts[10] = gRenderMaskY+72; 331 clr_verts[11] = -50.0f; 332 glVertexPointer(3, GL_FLOAT, 0, clr_verts); 333 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 334 335 336 337 gRenderMaskOn = true; 338 gRenderMaskX = x; 339 gRenderMaskY = y; 340 341 //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 342 343 // draw the mask to the depth buffer 344 glEnable(GL_ALPHA_TEST); // turn on alpha test, so transparent pixels don't write to z buffer 345 glAlphaFunc(GL_GREATER,0.5f); 346 cacheTextureMode(true); 347 cacheBindTexture(GL_TEXTURE_2D, gMaskTexture, true); 348 cacheColor4f(1, 1, 1, 1); 349 GLshort verts[12]; 350 GLfloat uv[8]; 351 uv[0] = 0; 352 uv[1] = 0; 353 uv[2] = 1; 354 uv[3] = 0; 355 uv[4] = 0; 356 uv[5] = 1; 357 uv[6] = 1; 358 uv[7] = 1; 359 glTexCoordPointer(2, GL_FLOAT, 0, uv); 360 verts[0] = x; 361 verts[1] = y; 362 verts[2] = 0; 363 verts[3] = x+72; 364 verts[4] = y; 365 verts[5] = 0; 366 verts[6] = x; 367 verts[7] = y+72; 368 verts[8] = 0; 369 verts[9] = x+72; 370 verts[10] = y+72; 371 verts[11] = 0; 372 glVertexPointer(3, GL_SHORT, 0, verts); 373 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 374 375 /* 376 // draw using simple geometry 377 cacheTextureMode(false); 378 379 // unfortunately, diagonal lines are not too exact... 380 GLshort verts[6*3]; 381 verts[0] = x; 382 verts[1] = y+35; 383 verts[2] = 0; 384 verts[3] = x+18; 385 verts[4] = y; 386 verts[5] = 0; 387 verts[6] = x+18; 388 verts[7] = y+35; 389 verts[8] = 0; 390 verts[9] = x+53; 391 verts[10] = y; 392 verts[11] = 0; 393 verts[12] = x+53; 394 verts[13] = y+35; 395 verts[14] = 0; 396 verts[15] = x+71; 397 verts[16] = y+35; 398 verts[17] = 0; 399 glVertexPointer(3, GL_SHORT, 0, verts); 400 glDrawArrays(GL_TRIANGLE_STRIP, 0, 6); 401 verts[0] = x; 402 verts[1] = y+36; 403 verts[2] = 0; 404 verts[3] = x+18; 405 verts[4] = y+71; 406 verts[5] = 0; 407 verts[6] = x+18; 408 verts[7] = y+36; 409 verts[8] = 0; 410 verts[9] = x+53; 411 verts[10] = y+71; 412 verts[11] = 0; 413 verts[12] = x+53; 414 verts[13] = y+36; 415 verts[14] = 0; 416 verts[15] = x+71; 417 verts[16] = y+36; 418 verts[17] = 0; 419 glVertexPointer(3, GL_SHORT, 0, verts); 420 glDrawArrays(GL_TRIANGLE_STRIP, 0, 6); 421 */ 422 423 /* 424 // this doesn't work, openGL does not like very small rectangles... 425 GLshort verts[12]; 426 427 #define maskHelper(x1, y1, x2, y2) verts[0]=x1; verts[1]=y1; verts[2]=0; verts[3]=x2; verts[4]=y1; verts[5]=0; verts[6]=x1; verts[7]=y2; verts[8]=0; verts[9]=x2; verts[10]=y2; verts[11]=0; glVertexPointer(3, GL_SHORT, 0, verts); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 428 429 maskHelper(x+18, y+0, x+53, y+0); 430 maskHelper(x+17, y+1, x+54, y+2); 431 maskHelper(x+16, y+3, x+55, y+4); 432 maskHelper(x+15, y+5, x+56, y+6); 433 maskHelper(x+14, y+7, x+57, y+8); 434 maskHelper(x+13, y+9, x+58, y+10); 435 maskHelper(x+12, y+11, x+59, y+12); 436 maskHelper(x+11, y+13, x+60, y+14); 437 maskHelper(x+10, y+15, x+61, y+16); 438 maskHelper(x+9, y+17, x+62, y+18); 439 maskHelper(x+8, y+19, x+63, y+20); 440 maskHelper(x+7, y+21, x+64, y+22); 441 maskHelper(x+6, y+23, x+65, y+24); 442 maskHelper(x+5, y+25, x+66, y+26); 443 maskHelper(x+4, y+27, x+67, y+28); 444 maskHelper(x+3, y+29, x+68, y+30); 445 maskHelper(x+2, y+31, x+69, y+32); 446 maskHelper(x+1, y+33, x+70, y+34); 447 maskHelper(x+0, y+35, x+71, y+36); 448 maskHelper(x+1, y+37, x+70, y+38); 449 maskHelper(x+2, y+39, x+69, y+40); 450 maskHelper(x+3, y+41, x+68, y+42); 451 maskHelper(x+4, y+43, x+67, y+44); 452 maskHelper(x+5, y+45, x+66, y+46); 453 maskHelper(x+6, y+47, x+65, y+48); 454 maskHelper(x+7, y+49, x+64, y+50); 455 maskHelper(x+8, y+51, x+63, y+52); 456 maskHelper(x+9, y+53, x+62, y+54); 457 maskHelper(x+10, y+55, x+61, y+56); 458 maskHelper(x+11, y+57, x+60, y+58); 459 maskHelper(x+12, y+59, x+59, y+60); 460 maskHelper(x+13, y+61, x+58, y+62); 461 maskHelper(x+14, y+63, x+57, y+64); 462 maskHelper(x+15, y+65, x+56, y+66); 463 maskHelper(x+16, y+67, x+55, y+68); 464 maskHelper(x+17, y+68, x+54, y+70); 465 maskHelper(x+18, y+71, x+53, y+71); 466 467 cacheTextureMode(true); 468 469 */ 470 471 472 // turn on masking 473 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 474 glDepthMask(GL_FALSE); // turn off depth writing 475 glDepthFunc(GL_EQUAL); 476 glDisable(GL_ALPHA_TEST); 477 //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 478 glEnable(GL_BLEND); 479 } 480 481 void renderMaskOff(void) 482 { 483 if (gRenderMaskOn == true) 484 { 485 glDisable(GL_DEPTH_TEST); 486 gRenderMaskOn = false; 201 487 } 202 488 } … … 204 490 void renderQueueRender(void) 205 491 { 206 glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 492 //glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 493 cacheColor4f(1.0f, 1.0f, 1.0f, 1.0f); 207 494 unsigned long oldColor = 0xFFFFFFFF; 208 495 209 // sort by layer ascending, then texture in order 496 497 std::cerr << " " << mDirtyTiles.size(); 498 /* 499 bool needMask = true; 500 501 if (mDirtyTiles.size() > 20) 502 { 503 needMask = false; 504 } 505 */ 210 506 short renderCount = 0; 211 short curLayer = 0; 212 while (renderCount < mTextureQueue.size()) 213 { 214 for (int i=0; i < mTextureQueue.size(); i++) 507 508 /* 509 if (needMask) 510 { 511 // iPhone doesn't have a stencil buffer :( 512 // use the depth buffer instead... 513 glClearDepthf(1.0f); 514 glEnable(GL_DEPTH_TEST); 515 glDepthMask(GL_TRUE); // turn on depth writing 516 glDepthFunc(GL_ALWAYS); 517 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // do not write to color buffer 518 glAlphaFunc(GL_GREATER,0.5f); 519 glEnable(GL_ALPHA_TEST); // turn on alpha test, so transparent pixels don't write to z buffer 520 glDisable(GL_BLEND); 521 glClear(GL_DEPTH_BUFFER_BIT); //| GL_COLOR_BUFFER_BIT); 522 523 cacheTextureMode(true); 524 cacheBindTexture(GL_TEXTURE_2D, gMaskTexture, 0); 525 GLshort verts[12]; 526 GLfloat uv[8]; 527 uv[0] = 0; 528 uv[1] = 0; 529 uv[2] = 1; 530 uv[3] = 0; 531 uv[4] = 0; 532 uv[5] = 1; 533 uv[6] = 1; 534 uv[7] = 1; 535 glTexCoordPointer(2, GL_FLOAT, 0, uv); 536 for (std::set<dirtyTile>::iterator it = mDirtyTiles.begin(); it != mDirtyTiles.end(); it++) 215 537 { 216 if (mTextureQueue[i].z == curLayer && mTextureQueue[i].type != QUEUE_TYPE_DONE) 538 verts[0] = it->x; 539 verts[1] = it->y; 540 verts[2] = 0; 541 verts[3] = it->x+72; 542 verts[4] = it->y; 543 verts[5] = 0; 544 verts[6] = it->x; 545 verts[7] = it->y+72; 546 verts[8] = 0; 547 verts[9] = it->x+72; 548 verts[10] = it->y+72; 549 verts[11] = 0; 550 glVertexPointer(3, GL_SHORT, 0, verts); 551 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 552 } 553 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 554 glDepthMask(GL_FALSE); // turn off depth writing 555 glDepthFunc(GL_EQUAL); 556 glDisable(GL_ALPHA_TEST); 557 glEnable(GL_BLEND); 558 } 559 */ 560 561 // for (int dirtyI = 0; dirtyI < mDirtyRects.size(); dirtyI++) 562 { 563 564 // sort by layer ascending, then texture in order 565 short curLayer = 0; 566 while (renderCount < mTextureQueue.size()) 567 { 568 for (int i=0; i < mTextureQueue.size(); i++) 217 569 { 218 if (mTextureQueue[i]. type == QUEUE_TYPE_TEXTURE)570 if (mTextureQueue[i].z == curLayer && mTextureQueue[i].done == false) 219 571 { 220 // render all other same textures on this layer 221 GLuint renderTexture = mTextureQueue[i].texture; 222 glBindTexture(GL_TEXTURE_2D, renderTexture); 223 224 for (int j=i; j < mTextureQueue.size(); j++) 572 if (mTextureQueue[i].type == QUEUE_TYPE_TEXTURE) 225 573 { 226 if (mTextureQueue[j].type == QUEUE_TYPE_TEXTURE && mTextureQueue[j].texture == renderTexture && mTextureQueue[j].z == curLayer) 574 // render all other same textures on this layer 575 GLuint renderTexture = mTextureQueue[i].texture; 576 577 for (int j=i; j < mTextureQueue.size(); j++) 227 578 { 228 if (mTextureQueue[j]. color != oldColor)579 if (mTextureQueue[j].done == false && mTextureQueue[j].type == QUEUE_TYPE_TEXTURE && mTextureQueue[j].texture == renderTexture && mTextureQueue[j].z == curLayer) 229 580 { 230 float r = (float)((mTextureQueue[j].color&0x00FF0000) >> 16)*inv255; 231 float g = (float)((mTextureQueue[j].color&0x0000FF00) >> 8)*inv255; 232 float b = (float)((mTextureQueue[j].color&0x000000FF) )*inv255; 233 float a = (float)((mTextureQueue[j].color&0xFF000000) >> 24)*inv255; 234 glColor4f(r, g, b, a); 235 oldColor = mTextureQueue[j].color; 581 // KP: NEW! Clip to all the dirty rects 582 // In some cases this will render it more than once, but 90% of the time it is outside the clip area 583 // for (int dirtyI = 0; dirtyI < mDirtyRects.size(); dirtyI++) 584 { 585 // if (TEX_INTERSECTS_DIRTY(mTextureQueue[j].vertices, mDirtyRects[dirtyI]) == true) 586 { 587 cacheTextureMode(true); 588 cacheBindTexture(GL_TEXTURE_2D, renderTexture, 0); 589 if (mTextureQueue[j].color != oldColor) 590 { 591 float r = (float)((mTextureQueue[j].color&0x00FF0000) >> 16)*inv255; 592 float g = (float)((mTextureQueue[j].color&0x0000FF00) >> 8)*inv255; 593 float b = (float)((mTextureQueue[j].color&0x000000FF) )*inv255; 594 float a = (float)((mTextureQueue[j].color&0xFF000000) >> 24)*inv255; 595 //glColor4f(r, g, b, a); 596 cacheColor4f(r, g, b, a); 597 oldColor = mTextureQueue[j].color; 598 } 599 600 glVertexPointer(3, GL_SHORT, 0, mTextureQueue[j].vertices); 601 glTexCoordPointer(2, GL_FLOAT, 0, mTextureQueue[j].texCoords); 602 603 setupBrightness(mTextureQueue[j].brightness); 604 605 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 606 607 cleanupBrightness(mTextureQueue[j].brightness); 608 renderCount++; 609 } 610 } 611 mTextureQueue[j].done = true; 236 612 } 237 glVertexPointer(2, GL_SHORT, 0, mTextureQueue[j].vertices);238 glTexCoordPointer(2, GL_FLOAT, 0, mTextureQueue[j].texCoords);239 240 setupBrightness(mTextureQueue[j].brightness);241 242 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);243 244 cleanupBrightness(mTextureQueue[j].brightness);245 246 mTextureQueue[j].type = QUEUE_TYPE_DONE;247 renderCount++;248 613 } 249 614 } 250 615 } 251 616 } 617 curLayer++; 618 if (curLayer >= 10) //LAYER_TERRAIN_TMP_BG 619 break; 252 620 } 253 curLayer++; 254 if (curLayer >= 10) //LAYER_TERRAIN_TMP_BG 255 break; 256 } 621 for (int i=0; i < mTextureQueue.size(); i++) 622 { 623 if (mTextureQueue[i].done == false) 624 { 625 if (mTextureQueue[i].type == QUEUE_TYPE_FILL) 626 { 627 // KP: fills now moved outside of stencil mask loop 628 } 629 else 630 { 631 // render textures in order 632 // KP: NEW! Clip to all the dirty rects 633 // In some cases this will render it more than once, but 90% of the time it is outside the clip area 634 // for (int dirtyI = 0; dirtyI < mDirtyRects.size(); dirtyI++) 635 { 636 // if (TEX_INTERSECTS_DIRTY(mTextureQueue[i].vertices, mDirtyRects[dirtyI]) == true) 637 { 638 if (mTextureQueue[i].color != oldColor) 639 { 640 float r = (float)((mTextureQueue[i].color&0x00FF0000) >> 16)*inv255; 641 float g = (float)((mTextureQueue[i].color&0x0000FF00) >> 8)*inv255; 642 float b = (float)((mTextureQueue[i].color&0x000000FF) )*inv255; 643 float a = (float)((mTextureQueue[i].color&0xFF000000) >> 24)*inv255; 644 //std::cerr << "rgba " << r << " " << g << " " << b << " " << a << "\n"; 645 //glColor4f(r, g, b, a); 646 cacheColor4f(r, g, b, a); 647 oldColor = mTextureQueue[i].color; 648 } 649 GLuint renderTexture = mTextureQueue[i].texture; 650 cacheTextureMode(true); 651 //glBindTexture(GL_TEXTURE_2D, renderTexture); 652 cacheBindTexture(GL_TEXTURE_2D, renderTexture, 0); 653 glVertexPointer(3, GL_SHORT, 0, mTextureQueue[i].vertices); 654 glTexCoordPointer(2, GL_FLOAT, 0, mTextureQueue[i].texCoords); 655 setupBrightness(mTextureQueue[i].brightness); 656 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 657 cleanupBrightness(mTextureQueue[i].brightness); 658 renderCount++; 659 } 660 } 661 mTextureQueue[i].done = true; 662 } 663 } 664 } 665 } // END dirty rect loop 666 /* 667 if (needMask) 668 { 669 glDisable(GL_DEPTH_TEST); 670 } 671 */ 672 257 673 for (int i=0; i < mTextureQueue.size(); i++) 258 674 { 259 if (mTextureQueue[i]. type != QUEUE_TYPE_DONE)675 if (mTextureQueue[i].done == false) 260 676 { 261 677 if (mTextureQueue[i].type == QUEUE_TYPE_FILL) 262 678 { 263 679 // render all other fills on this layer 264 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 265 glDisable(GL_TEXTURE_2D); 680 //glDisableClientState(GL_TEXTURE_COORD_ARRAY); 681 //glDisable(GL_TEXTURE_2D); 682 cacheTextureMode(false); 266 683 267 684 for (int j=i; j < mTextureQueue.size(); j++) 268 685 { 269 if (mTextureQueue[j]. type == QUEUE_TYPE_FILL /*&& mTextureQueue[j].z == curLayer*/)686 if (mTextureQueue[j].done == false && mTextureQueue[j].type == QUEUE_TYPE_FILL /*&& mTextureQueue[j].z == curLayer*/) 270 687 { 271 688 float color1, color2, color3, color4; … … 274 691 color3 = mTextureQueue[j].texCoords[2]; 275 692 color4 = mTextureQueue[j].texCoords[3]; 276 glColor4f(color1,color2,color3,color4); 277 // do all of some color together (minimize glColor4f calls too) 693 //glColor4f(color1,color2,color3,color4); 694 cacheColor4f(color1,color2,color3,color4); 695 // do all of same color together (minimize glColor4f calls too) 278 696 for (int k=j; k < mTextureQueue.size(); k++) 279 697 { 280 if (mTextureQueue[k]. type == QUEUE_TYPE_FILL && mTextureQueue[k].texCoords[0] == color1 && mTextureQueue[k].texCoords[1] == color2 && mTextureQueue[k].texCoords[2] == color3 && mTextureQueue[k].texCoords[3] == color4)698 if (mTextureQueue[k].done == false && mTextureQueue[k].type == QUEUE_TYPE_FILL && mTextureQueue[k].texCoords[0] == color1 && mTextureQueue[k].texCoords[1] == color2 && mTextureQueue[k].texCoords[2] == color3 && mTextureQueue[k].texCoords[3] == color4) 281 699 { 282 glVertexPointer( 2, GL_SHORT, 0, mTextureQueue[k].vertices);700 glVertexPointer(3, GL_SHORT, 0, mTextureQueue[k].vertices); 283 701 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 284 285 mTextureQueue[k]. type = QUEUE_TYPE_DONE;702 703 mTextureQueue[k].done = true; 286 704 renderCount++; 287 705 } … … 290 708 } 291 709 292 glEnable(GL_TEXTURE_2D); 293 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 294 glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 710 //glEnable(GL_TEXTURE_2D); 711 //glEnableClientState(GL_TEXTURE_COORD_ARRAY); 712 //glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 713 cacheColor4f(1.0f, 1.0f, 1.0f, 1.0f); 295 714 oldColor = 0xFFFFFFFF; 296 715 } 297 else298 {299 // render textures in order300 if (mTextureQueue[i].color != oldColor)301 {302 float r = (float)((mTextureQueue[i].color&0x00FF0000) >> 16)*inv255;303 float g = (float)((mTextureQueue[i].color&0x0000FF00) >> 8)*inv255;304 float b = (float)((mTextureQueue[i].color&0x000000FF) )*inv255;305 float a = (float)((mTextureQueue[i].color&0xFF000000) >> 24)*inv255;306 //std::cerr << "rgba " << r << " " << g << " " << b << " " << a << "\n";307 glColor4f(r, g, b, a);308 oldColor = mTextureQueue[i].color;309 }310 GLuint renderTexture = mTextureQueue[i].texture;311 glBindTexture(GL_TEXTURE_2D, renderTexture);312 glVertexPointer(2, GL_SHORT, 0, mTextureQueue[i].vertices);313 glTexCoordPointer(2, GL_FLOAT, 0, mTextureQueue[i].texCoords);314 setupBrightness(mTextureQueue[i].brightness);315 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);316 cleanupBrightness(mTextureQueue[i].brightness);317 mTextureQueue[i].type = QUEUE_TYPE_DONE;318 }319 716 } 320 717 } 321 718 322 719 mDirtyTiles.clear(); 323 720 mTextureQueue.clear(); 324 721 mCurZ = 0; 325 722 std::cerr << " (" << renderCount << ") "; 723 } 724 725 void renderQueueClean(void) 726 { 326 727 for (int i=0; i < mTextureDeletes.size(); i++) 327 728 { … … 330 731 } 331 732 mTextureDeletes.clear(); 733 734 // KP: now it is okay to delete textures 735 checkUnitTextureAtlas(); 332 736 } 333 737 … … 348 752 } 349 753 754 // Enabling the render queue means that renders are sorted by texture 755 // Also, only rectangles marked as dirty are rendered, and clipped to that dirty rectangle 350 756 void renderQueueEnable(void) 351 757 { 758 if (gMaskTexture == 0) 759 renderQueueInit(); 760 352 761 mIsEnabled = true; 353 // glEnable(GL_DEPTH_TEST);354 // glDepthFunc(GL_LEQUAL);355 // glClearDepthf(1.0f);356 // glEnable(GL_ALPHA_TEST);357 // glAlphaFunc(GL_NOTEQUAL, 0);358 // glClear(GL_DEPTH_BITS);359 762 } 360 763 … … 363 766 mIsEnabled = false; 364 767 renderQueueRender(); 365 // glDisable(GL_DEPTH_TEST);366 // glDisable(GL_ALPHA_TEST);367 768 } 368 769 … … 372 773 mCurZ = z; 373 774 } 775 776 // KP: no, OpenGL does not cache texture changes, we have to do it ourselves... 777 GLuint gActiveTexture = 0; 778 void cacheBindTexture(GLenum texType, GLuint texture, unsigned char force) 779 { 780 if (texture != gActiveTexture || force == 1) 781 { 782 gActiveTexture = texture; 783 glBindTexture(texType, texture); 784 } 785 } 786 787 GLfloat gActiveR = 0; 788 GLfloat gActiveG = 0; 789 GLfloat gActiveB = 0; 790 GLfloat gActiveA = 0; 791 void cacheColor4f(GLfloat aR, GLfloat aG, GLfloat aB, GLfloat aA) 792 { 793 if (aR != gActiveR || aG != gActiveG || aB != gActiveB || aA != gActiveA) 794 { 795 gActiveR = aR; 796 gActiveG = aG; 797 gActiveB = aB; 798 gActiveA = aA; 799 glColor4f(aR, aG, aB, aA); 800 } 801 } 802 803 bool gIsTextured = false; 804 void cacheTextureMode(bool isTextured) 805 { 806 if (gIsTextured != isTextured) 807 { 808 if (isTextured) 809 { 810 glEnable(GL_TEXTURE_2D); 811 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 812 } 813 else 814 { 815 glDisable(GL_TEXTURE_2D); 816 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 817 } 818 gIsTextured = isTextured; 819 } 820 } 821 822 // Marks a 72x72 tile at screen coords x,y as dirty 823 void renderQueueMarkDirty(int x, int y) 824 { 825 dirtyTile dt = {x, y}; 826 827 // insert a new dirty tile 828 mDirtyTiles.insert(dt); 829 } 830
Note: See TracChangeset
for help on using the changeset viewer.