1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
bool TileLayerBuffered::Load (Stream* str)
{
if (!TileLayer::Load (str))
return false;
vboID=Framework->GetNewBufferID ();
glBindBufferARB(GL_ARRAY_BUFFER_ARB,vboID);
glEnableClientState(GL_VERTEX_ARRAY);
uint len=(uint)size.x*(uint)size.y*20*sizeof(float);
glBufferDataARB(GL_ARRAY_BUFFER_ARB,len,0,GL_STATIC_DRAW);
if (glGetError ()==GL_OUT_OF_MEMORY) {
cout << "Couldn't allocate " << len << "Bytes for tilelayer graphic buffer!" << endl;
return false;
}
float* tiles=(float*)(glMapBufferARB(GL_ARRAY_BUFFER,GL_WRITE_ONLY_ARB));
byte* dataPtr=data;
float w=size.x*16.0f;
float h=size.y*16.0f;
FPoint oneTile(1.0f/image->tileCount.x,1.0f/image->tileCount.y);
for (float y=h;y>=0.0f;y-=16.0f) {
for (float x=0.0f;x<w;x+=16.0f,dataPtr++,tiles+=20) {
tiles[0]=(*dataPtr%image->tileCount.x)*oneTile.x; //0.0f,1.0f x,y
tiles[1]=(*dataPtr/image->tileCount.y+1)*oneTile.y;
tiles[2]=x;
tiles[3]=y-16.0f;
tiles[4]=0.0f;
tiles[5]=(*dataPtr%image->tileCount.x+1)*oneTile.x; //1.0f,1.0f w,y
tiles[6]=(*dataPtr/image->tileCount.y+1)*oneTile.x;
tiles[7]=x+16.0f;
tiles[8]=y-16.0f;
tiles[9]=0.0f;
tiles[10]=(*dataPtr%image->tileCount.x+1)*oneTile.x; //1.0f,0.0f w,h
tiles[11]=(*dataPtr/image->tileCount.y)*oneTile.x;
tiles[12]=x+16.0f;
tiles[13]=y;
tiles[14]=0.0f;
tiles[15]=(*dataPtr%image->tileCount.x)*oneTile.x; //0.0f,0.0f x,h
tiles[16]=(*dataPtr/image->tileCount.y)*oneTile.x;
tiles[17]=x;
tiles[18]=y;
tiles[19]=0.0f;
}
}
glUnmapBufferARB (GL_ARRAY_BUFFER_ARB);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
return true;
}
void TileLayerBuffered::Render ()
{
uint len=5*((uint)size.x)*((uint)size.y);
glTranslatef(pos.x,pos.y,0.0f);
glBindTexture(GL_TEXTURE_2D,image->texture.id);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,vboID);
glEnableClientState(GL_VERTEX_ARRAY);
glInterleavedArrays(GL_T2F_V3F,5*sizeof(float),0);
glDrawArrays(GL_QUADS,0,len);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
glTranslatef(-pos.x,-pos.y,0.0f);
}
|