Changeset 96


Ignore:
Timestamp:
Aug 11, 2010, 6:18:36 PM (10 years ago)
Author:
sam
Message:

Implement lazy initialisation of TileSet objects.

Location:
trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/asset.h

    r94 r96  
    2323    virtual int Unref();
    2424
    25 private:
     25protected:
    2626    int index, ref, destroy;
    2727};
  • trunk/src/editor.cpp

    r93 r96  
    55
    66#include "gtkvideo.h"
     7#include "ticker.h"
    78#include "game.h"
    89
     
    5758    gtk_widget_show(GTK_WIDGET(window));
    5859
    59 while (g_main_context_iteration(NULL, FALSE));
    60 if (gtk_gl_area_make_current(GTK_GL_AREA(glarea))) fprintf(stderr, "OK\n");
    6160    Game *game = new Game("maps/testmap.tmx");
    6261
     
    6968            break;
    7069
     70        game->SetMouse(0, 0);
     71        Ticker::TickGame(33.33333f);
     72
    7173        video->PreRender();
    72         game->SetMouse(0, 0);
     74        Ticker::TickRender(33.33333f);
     75
    7376        game->Render();
    7477        video->PostRender(33.33333f);
  • trunk/src/gtkvideo.cpp

    r93 r96  
    2727
    2828private:
     29    void SetupView()
     30    {
     31        glViewport(0, 0, widget->allocation.width,
     32                         widget->allocation.height);
     33
     34        glMatrixMode(GL_PROJECTION);
     35        glLoadIdentity();
     36        glOrtho(0, widget->allocation.width,
     37                   widget->allocation.height, 0, -1, 10);
     38        glMatrixMode(GL_MODELVIEW);
     39        glLoadIdentity();
     40
     41        glEnable(GL_TEXTURE_2D);
     42        glShadeModel(GL_SMOOTH);
     43        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
     44        glClearDepth(1.0);
     45        glEnable(GL_DEPTH_TEST);
     46        glDepthFunc(GL_LEQUAL);
     47        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
     48
     49        glEnable(GL_BLEND);
     50        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     51    }
     52
    2953    static gint init(GtkWidget *widget)
    3054    {
     
    3559        if (gtk_gl_area_make_current(GTK_GL_AREA(widget)))
    3660        {
    37             glViewport(0, 0, widget->allocation.width,
    38                              widget->allocation.height);
    39             glMatrixMode(GL_PROJECTION);
    40             glLoadIdentity();
    41             glOrtho(0,100, 100,0, -1,1);
    42             glMatrixMode(GL_MODELVIEW);
    43             glLoadIdentity();
    44 
    45     glMatrixMode(GL_PROJECTION);
    46     glLoadIdentity();
    47     glOrtho(0, data->widget->allocation.width,
    48                data->widget->allocation.height, 0, -1, 10);
    49     glMatrixMode(GL_MODELVIEW);
    50     glLoadIdentity();
    51 
    52     glEnable(GL_TEXTURE_2D);
    53     glShadeModel(GL_SMOOTH);
    54     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    55     glClearDepth(1.0);
    56     glEnable(GL_DEPTH_TEST);
    57     glDepthFunc(GL_LEQUAL);
    58     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    59 
    60     glEnable(GL_BLEND);
    61     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    62 
     61            data->SetupView();
    6362        }
    6463        return TRUE;
     
    7372             && gtk_gl_area_make_current(GTK_GL_AREA(widget)))
    7473        {
    75 #if 0
    76             /* Draw simple triangle */
    77             glClearColor(0,0,0,1);
    78             glClear(GL_COLOR_BUFFER_BIT);
    79             glColor3f(1,1,1);
    80             glBegin(GL_TRIANGLES);
    81             glVertex2f(10,10);
    82             glVertex2f(10,90);
    83             glVertex2f(90,90);
    84             glEnd();
    85 #endif
    86 
    8774            data->drawing = 0;
    8875
     
    10188        if (gtk_gl_area_make_current(GTK_GL_AREA(widget)))
    10289        {
    103             glViewport(0,0, widget->allocation.width,
    104                             widget->allocation.height);
    105 
    106     glMatrixMode(GL_PROJECTION);
    107     glLoadIdentity();
    108     glOrtho(0, data->widget->allocation.width,
    109                data->widget->allocation.height, 0, -1, 10);
    110     glMatrixMode(GL_MODELVIEW);
    111     glLoadIdentity();
    112 
    113     glEnable(GL_TEXTURE_2D);
    114     glShadeModel(GL_SMOOTH);
    115     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    116     glClearDepth(1.0);
    117     glEnable(GL_DEPTH_TEST);
    118     glDepthFunc(GL_LEQUAL);
    119     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    120 
    121     glEnable(GL_BLEND);
    122     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    123 
     90            data->SetupView();
    12491        }
    12592        return TRUE;
     
    170137
    171138    // FIXME: is this needed?
    172     gtk_widget_set_usize(GTK_WIDGET(data->widget), 100, 100);
    173 
    174     /* Initialise OpenGL */
    175     glViewport(0, 0, data->widget->allocation.width,
    176                      data->widget->allocation.height);
    177     glMatrixMode(GL_PROJECTION);
    178     glLoadIdentity();
    179     glOrtho(0, data->widget->allocation.width,
    180                data->widget->allocation.height, 0, -1, 10);
    181     glMatrixMode(GL_MODELVIEW);
    182     glLoadIdentity();
    183 
    184     glEnable(GL_TEXTURE_2D);
    185     glShadeModel(GL_SMOOTH);
    186     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    187     glClearDepth(1.0);
    188     glEnable(GL_DEPTH_TEST);
    189     glDepthFunc(GL_LEQUAL);
    190     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    191 
    192     glEnable(GL_BLEND);
    193     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     139    gtk_widget_set_usize(GTK_WIDGET(data->widget), 400, 300);
    194140}
    195141
     
    211157void GtkVideo::PreRender()
    212158{
    213 /// XXX: is this right?
    214 gtk_gl_area_make_current(GTK_GL_AREA(data->widget));
     159    /// XXX: is this right?
     160    gtk_gl_area_make_current(GTK_GL_AREA(data->widget));
    215161
    216162    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • trunk/src/test-map.cpp

    r93 r96  
    88#include "sdlvideo.h"
    99#include "game.h"
     10#include "ticker.h"
    1011
    1112int main(int argc, char **argv)
     
    1617    for (int done = 0; !done; )
    1718    {
    18         video->PreRender();
    19 
    2019        /* Test stuff */
    2120        int mx, my;
     
    2322        game->SetMouse(mx * (640 - 32) / 640, my * (480 - 32) / 480);
    2423
     24        Ticker::TickGame(33.33333f);
     25
     26        video->PreRender();
     27        Ticker::TickRender(33.33333f);
    2528        game->Render();
    2629        video->PostRender(33.33333f);
  • trunk/src/tileset.cpp

    r95 r96  
    3232
    3333    SDL_Surface *img;
    34     GLuint texture[1];
     34    GLuint texture;
    3535};
    3636
     
    4646    data->ntiles = 0;
    4747    data->img = NULL;
     48    data->texture = 0;
    4849
    4950    for (char const *name = path; *name; name++)
     
    5657        exit(1);
    5758    }
    58 
    59     glGenTextures(1, data->texture);
    60     glBindTexture(GL_TEXTURE_2D, data->texture[0]);
    61 
    62     glTexImage2D(GL_TEXTURE_2D, 0, 4, data->img->w, data->img->h, 0,
    63                  GL_RGBA, GL_UNSIGNED_BYTE, data->img->pixels);
    64 
    65     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    66     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    6759}
    6860
    6961TileSet::~TileSet()
    7062{
    71     glDeleteTextures(1, data->texture);
    72 
    7363    free(data->tiles);
    7464    free(data->name);
    7565    delete data;
     66}
     67
     68void TileSet::TickRender(float delta_time)
     69{
     70    Asset::TickRender(delta_time);
     71
     72    if (data->img)
     73    {
     74        glGenTextures(1, &data->texture);
     75        glBindTexture(GL_TEXTURE_2D, data->texture);
     76
     77        glTexImage2D(GL_TEXTURE_2D, 0, 4, data->img->w, data->img->h, 0,
     78                     GL_RGBA, GL_UNSIGNED_BYTE, data->img->pixels);
     79
     80        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     81        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     82
     83        SDL_FreeSurface(data->img);
     84        data->img = NULL;
     85    }
     86    else if (ref == 0)
     87    {
     88        glDeleteTextures(1, &data->texture);
     89        destroy = 1;
     90    }
    7691}
    7792
     
    86101    float ty = .0625f * ((id >> 4) & 0xf);
    87102
    88     glBindTexture(GL_TEXTURE_2D, data->texture[0]);
    89     glBegin(GL_QUADS);
    90         glTexCoord2f(tx, ty);
    91         glVertex2f(x, y);
    92         glTexCoord2f(tx + .0625f, ty);
    93         glVertex2f(x + 32, y);
    94         glTexCoord2f(tx + .0625f, ty + .0625f);
    95         glVertex2f(x + 32, y + 32);
    96         glTexCoord2f(tx, ty + .0625f);
    97         glVertex2f(x, y + 32);
    98     glEnd();
     103    if (!data->img)
     104    {
     105        glBindTexture(GL_TEXTURE_2D, data->texture);
     106        glBegin(GL_QUADS);
     107            glTexCoord2f(tx, ty);
     108            glVertex2f(x, y);
     109            glTexCoord2f(tx + .0625f, ty);
     110            glVertex2f(x + 32, y);
     111            glTexCoord2f(tx + .0625f, ty + .0625f);
     112            glVertex2f(x + 32, y + 32);
     113            glTexCoord2f(tx, ty + .0625f);
     114            glVertex2f(x, y + 32);
     115        glEnd();
     116    }
    99117}
    100118
  • trunk/src/tileset.h

    r95 r96  
    1717public:
    1818    TileSet(char const *path);
    19     ~TileSet();
     19    virtual ~TileSet();
    2020
     21    /* Inherited from Asset */
     22    virtual void TickRender(float delta_time);
     23
     24    /* New implementations */
    2125    char const *GetName();
    2226
Note: See TracChangeset for help on using the changeset viewer.