Ignore:
Timestamp:
2010-05-28 07:39:52 (2 years ago)
Author:
kpoole
Message:

Episode 5

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Classes/RenderQueue.cpp

    r23 r26  
    1717#include <vector> 
    1818#include <iostream> 
     19#include <set> 
    1920 
    2021#include "TextureAtlas.h" 
     22#include "SDL_image.h" 
     23#include "game_config.hpp" 
     24#include "video.hpp" 
    2125 
    2226#define QUEUE_TYPE_TEXTURE  0 
    2327#define QUEUE_TYPE_FILL     1 
    2428#define QUEUE_TYPE_LINE     2 
    25 #define QUEUE_TYPE_DONE     5 
    26  
     29 
     30void cacheTextureMode(bool isTextured); 
     31extern void checkUnitTextureAtlas(void); 
    2732 
    2833struct renderTextureInfo 
    2934{ 
    3035    GLshort type; 
    31     GLshort vertices[8]; 
     36    GLshort vertices[12]; 
    3237    GLfloat texCoords[8]; 
    3338    GLuint texture; 
     
    3540    unsigned long color; 
    3641    float brightness;   // 0..2, with 1 being normal, and 0 marked special as greyscale 
     42    bool done; 
    3743}; 
     44 
     45struct 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}; 
     58std::set<dirtyTile> mDirtyTiles; 
    3859 
    3960std::vector<renderTextureInfo> mTextureQueue; 
     
    4465static const float inv255 = 1.0f / 255.0f; 
    4566 
     67GLuint gMaskTexture = 0; 
     68 
    4669void renderQueueInit() 
    4770{ 
    4871    mIsEnabled = false; 
    4972    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); 
    5090} 
    5191 
     
    105145        { 
    106146            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); 
    108149        } 
    109150        else 
    110151        { 
    111152            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); 
    113155        } 
    114156        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE); 
     
    131173         
    132174        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); 
    134177    } 
    135178    else 
    136179    { 
    137180        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); 
    139183    } 
    140184} 
     
    147191        rti.type = QUEUE_TYPE_TEXTURE; 
    148192        rti.z = mCurZ; 
    149         memcpy(&rti.vertices, vertices, sizeof(GLshort)*8); 
     193        memcpy(&rti.vertices, vertices, sizeof(GLshort)*12); 
    150194        memcpy(&rti.texCoords, texCoords, sizeof(GLfloat)*8); 
    151195        rti.texture = texture; 
    152196        rti.color = color; 
    153197        rti.brightness = brightness; 
     198        rti.done = false; 
    154199        mTextureQueue.push_back(rti); 
    155200    } 
     
    161206        float b = (float)((color&0x000000FF)      )*inv255; 
    162207        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); 
    166214        glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    167215         
    168216        // special settings 
    169217        setupBrightness(brightness); 
    170          
     218                 
    171219        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);       
    172220 
    173         cleanupBrightness(brightness); 
     221        cleanupBrightness(brightness);       
    174222    } 
    175223} 
     
    182230        rti.type = QUEUE_TYPE_FILL; 
    183231        rti.z = mCurZ; 
    184         memcpy(&rti.vertices, vertices, sizeof(GLshort)*8); 
     232        memcpy(&rti.vertices, vertices, sizeof(GLshort)*12); 
    185233        rti.texCoords[0] = r; 
    186234        rti.texCoords[1] = g; 
    187235        rti.texCoords[2] = b; 
    188236        rti.texCoords[3] = a; 
     237        rti.done = false; 
    189238        mTextureQueue.push_back(rti);        
    190239    } 
     
    192241    { 
    193242        // 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); 
    198249        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 
     257bool gRenderMaskOn = false; 
     258int gRenderMaskX = 0; 
     259int gRenderMaskY = 0; 
     260 
     261void 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 
     287void 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 
     481void renderMaskOff(void) 
     482{ 
     483    if (gRenderMaskOn == true) 
     484    { 
     485        glDisable(GL_DEPTH_TEST); 
     486        gRenderMaskOn = false; 
    201487    } 
    202488} 
     
    204490void renderQueueRender(void) 
    205491{ 
    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); 
    207494    unsigned long oldColor = 0xFFFFFFFF; 
    208495 
    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*/   
    210506    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++) 
    215537        { 
    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++) 
    217569            { 
    218                 if (mTextureQueue[i].type == QUEUE_TYPE_TEXTURE) 
     570                if (mTextureQueue[i].z == curLayer && mTextureQueue[i].done == false) 
    219571                { 
    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) 
    225573                    { 
    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++) 
    227578                        { 
    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) 
    229580                            { 
    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; 
    236612                            } 
    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++; 
    248613                        } 
    249614                    } 
    250615                } 
    251616            } 
     617            curLayer++; 
     618            if (curLayer >= 10) //LAYER_TERRAIN_TMP_BG 
     619                break; 
    252620        } 
    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     
    257673    for (int i=0; i < mTextureQueue.size(); i++) 
    258674    { 
    259         if (mTextureQueue[i].type != QUEUE_TYPE_DONE) 
     675        if (mTextureQueue[i].done == false) 
    260676        { 
    261677            if (mTextureQueue[i].type == QUEUE_TYPE_FILL) 
    262678            { 
    263679                // 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); 
    266683                 
    267684                for (int j=i; j < mTextureQueue.size(); j++) 
    268685                { 
    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*/) 
    270687                    { 
    271688                        float color1, color2, color3, color4; 
     
    274691                        color3 = mTextureQueue[j].texCoords[2]; 
    275692                        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) 
    278696                        for (int k=j; k < mTextureQueue.size(); k++) 
    279697                        { 
    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) 
    281699                            { 
    282                                 glVertexPointer(2, GL_SHORT, 0, mTextureQueue[k].vertices); 
     700                                glVertexPointer(3, GL_SHORT, 0, mTextureQueue[k].vertices); 
    283701                                glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    284                          
    285                                 mTextureQueue[k].type = QUEUE_TYPE_DONE; 
     702                                 
     703                                mTextureQueue[k].done = true; 
    286704                                renderCount++; 
    287705                            } 
     
    290708                } 
    291709                 
    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); 
    295714                oldColor = 0xFFFFFFFF; 
    296715            } 
    297             else 
    298             { 
    299                 // render textures in order 
    300                 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             } 
    319716        } 
    320717    } 
    321718     
    322      
     719    mDirtyTiles.clear(); 
    323720    mTextureQueue.clear(); 
    324721    mCurZ = 0; 
    325      
     722    std::cerr << " (" << renderCount << ") "; 
     723} 
     724 
     725void renderQueueClean(void) 
     726{ 
    326727    for (int i=0; i < mTextureDeletes.size(); i++) 
    327728    { 
     
    330731    } 
    331732    mTextureDeletes.clear(); 
     733     
     734    // KP: now it is okay to delete textures 
     735    checkUnitTextureAtlas(); 
    332736} 
    333737 
     
    348752} 
    349753 
     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 
    350756void renderQueueEnable(void) 
    351757{ 
     758    if (gMaskTexture == 0) 
     759        renderQueueInit(); 
     760     
    352761    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); 
    359762} 
    360763 
     
    363766    mIsEnabled = false; 
    364767    renderQueueRender(); 
    365 //  glDisable(GL_DEPTH_TEST); 
    366 //  glDisable(GL_ALPHA_TEST); 
    367768} 
    368769 
     
    372773    mCurZ = z; 
    373774} 
     775 
     776// KP: no, OpenGL does not cache texture changes, we have to do it ourselves... 
     777GLuint gActiveTexture = 0; 
     778void 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 
     787GLfloat gActiveR = 0; 
     788GLfloat gActiveG = 0; 
     789GLfloat gActiveB = 0; 
     790GLfloat gActiveA = 0; 
     791void 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 
     803bool gIsTextured = false; 
     804void 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 
     823void 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.