Changeset 1329


Ignore:
Timestamp:
May 1, 2012, 8:33:23 PM (9 years ago)
Author:
sam
Message:

core: convert some realloc() calls to our nice dynamic Array class.

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/array.h

    r1328 r1329  
    127127    }
    128128
     129    inline void Empty()
     130    {
     131        Remove(0, m_count);
     132    }
     133
    129134    void Reserve(int toreserve)
    130135    {
  • trunk/src/scene.cpp

    r1325 r1329  
    5757    mat4 m_proj_matrix;
    5858
    59     Tile *tiles;
    60     int ntiles;
     59    Array<Tile> tiles;
    6160
    6261    Shader *m_shader;
    6362    VertexDeclaration *m_vdecl;
    64     VertexBuffer **bufs;
    65     int nbufs;
     63    Array<VertexBuffer *> bufs;
    6664
    6765    static Scene *scene;
     
    8280                                      0, Video::GetSize().y, -1000.f, 1000.f);
    8381
    84     data->tiles = 0;
    85     data->ntiles = 0;
    86 
    8782    data->m_shader = 0;
    88     data->bufs = 0;
    89     data->nbufs = 0;
    90 
    9183    data->m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position),
    9284                                          VertexStream<vec2>(VertexUsage::TexCoord));
     
    114106void Scene::Reset()
    115107{
    116     for (int i = 0; i < data->nbufs; i++)
     108    for (int i = 0; i < data->bufs.Count(); i++)
    117109        delete data->bufs[i];
    118     free(data->bufs);
    119     data->bufs = 0;
    120     data->nbufs = 0;
     110    data->bufs.Empty();
    121111}
    122112
     
    143133void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale)
    144134{
    145     if ((data->ntiles % 1024) == 0)
    146         data->tiles = (Tile *)realloc(data->tiles,
    147                                       (data->ntiles + 1024) * sizeof(Tile));
     135    Tile t;
    148136    /* FIXME: this sorting only works for a 45-degree camera */
    149     data->tiles[data->ntiles].prio = -pos.y - 2 * 32 * pos.z + (o ? 0 : 32);
    150     data->tiles[data->ntiles].tileset = tileset;
    151     data->tiles[data->ntiles].id = id;
    152     data->tiles[data->ntiles].pos = pos;
    153     data->tiles[data->ntiles].o = o;
    154     data->tiles[data->ntiles].scale = scale;
    155     data->ntiles++;
     137    t.prio = -pos.y - 2 * 32 * pos.z + (o ? 0 : 32);
     138    t.tileset = tileset;
     139    t.id = id;
     140    t.pos = pos;
     141    t.o = o;
     142    t.scale = scale;
     143
     144    data->tiles.Push(t);
    156145}
    157146
     
    304293#if 0
    305294    // Randomise, then sort.
    306     for (int i = 0; i < data->ntiles; i++)
     295    for (int i = 0; i < data->tiles.Count(); i++)
    307296    {
    308297        Tile tmp = data->tiles[i];
    309         int j = rand() % data->ntiles;
     298        int j = rand() % data->tiles.Count();
    310299        data->tiles[i] = data->tiles[j];
    311300        data->tiles[j] = tmp;
    312301    }
    313302#endif
    314     qsort(data->tiles, data->ntiles, sizeof(Tile), SceneData::Compare);
     303    qsort(&data->tiles[0], data->tiles.Count(),
     304          sizeof(Tile), SceneData::Compare);
    315305
    316306    // XXX: debug stuff
     
    357347#endif
    358348
    359     for (int buf = 0, i = 0, n; i < data->ntiles; i = n, buf += 2)
     349    for (int buf = 0, i = 0, n; i < data->tiles.Count(); i = n, buf += 2)
    360350    {
    361         /* Generate new vertex / texture coord buffers if necessary */
    362         if (buf + 2 > data->nbufs)
    363         {
    364             data->bufs = (VertexBuffer **)realloc(data->bufs, (buf + 2) * sizeof(VertexBuffer *));
    365             data->nbufs = buf + 2;
    366         }
    367         else
    368         {
    369             delete data->bufs[buf];
    370             delete data->bufs[buf + 1];
    371         }
    372 
    373351        /* Count how many quads will be needed */
    374         for (n = i + 1; n < data->ntiles; n++)
     352        for (n = i + 1; n < data->tiles.Count(); n++)
    375353            if (data->tiles[i].tileset != data->tiles[n].tileset)
    376354                break;
    377355
    378356        /* Create a vertex array object */
    379         data->bufs[buf] = new VertexBuffer(6 * 3 * (n - i) * sizeof(float));
    380         float *vertex = (float *)data->bufs[buf]->Lock(0, 0);
    381         data->bufs[buf + 1] = new VertexBuffer(6 * 2 * (n - i) * sizeof(float));
    382         float *texture = (float *)data->bufs[buf + 1]->Lock(0, 0);
     357        VertexBuffer *vb1 = new VertexBuffer(6 * 3 * (n - i) * sizeof(float));
     358        float *vertex = (float *)vb1->Lock(0, 0);
     359        VertexBuffer *vb2 = new VertexBuffer(6 * 2 * (n - i) * sizeof(float));
     360        float *texture = (float *)vb2->Lock(0, 0);
     361
     362        data->bufs.Push(vb1);
     363        data->bufs.Push(vb2);
    383364
    384365        for (int j = i; j < n; j++)
     
    390371        }
    391372
    392         data->bufs[buf]->Unlock();
    393         data->bufs[buf + 1]->Unlock();
     373        vb1->Unlock();
     374        vb2->Unlock();
    394375
    395376        /* Bind texture */
     
    398379        /* Bind vertex and texture coordinate buffers */
    399380        data->m_vdecl->Bind();
    400         data->m_vdecl->SetStream(data->bufs[buf], attr_pos);
    401         data->m_vdecl->SetStream(data->bufs[buf + 1], attr_tex);
     381        data->m_vdecl->SetStream(vb1, attr_pos);
     382        data->m_vdecl->SetStream(vb2, attr_tex);
    402383
    403384        /* Draw arrays */
     
    407388    }
    408389
    409     free(data->tiles);
    410     data->tiles = 0;
    411     data->ntiles = 0;
     390    data->tiles.Empty();
    412391
    413392    data->m_shader->Unbind();
Note: See TracChangeset for help on using the changeset viewer.