32
quadbuf::quadbuf(int data_size) : data_size(data_size) {
32
quadbuf::quadbuf(int vertex_capacity) : vertex_capacity(vertex_capacity) {
38
data = data_size > 0 ? new quadbuf_vertex[data_size] : 0;
35
data = vertex_capacity > 0 ? new quadbuf_vertex[vertex_capacity] : 0;
40
37
//fprintf(stderr, "size of quadbuf_vertex = %d\n", sizeof(quadbuf_vertex));
44
41
if(data!=0) delete[] data;
44
void quadbuf::unload() {
47
48
void quadbuf::resize(int new_size) {
49
50
quadbuf_vertex* _data = data;
51
52
data = new quadbuf_vertex[new_size];
53
for(int i=0;i<data_size;i++) {
54
for(int i=0;i<vertex_capacity;i++) {
54
55
data[i] = _data[i];
58
vertex_capacity = new_size;
59
60
if(_data != 0) delete[] _data;
71
72
size_t quadbuf::capacity() {
73
return vertex_capacity;
75
76
size_t quadbuf::texture_changes() {
76
77
return textures.size();
79
vec4f quadbuf_default_texcoord(0.0f, 0.0f, 1.0f, 1.0f);
80
vec4 quadbuf_default_texcoord(0.0f, 0.0f, 1.0f, 1.0f);
81
void quadbuf::add(GLuint textureid, const vec2f& pos, const vec2f& dims, const vec4f& colour) {
82
void quadbuf::add(GLuint textureid, const vec2& pos, const vec2& dims, const vec4& colour) {
82
83
add(textureid, pos, dims, colour, quadbuf_default_texcoord);
85
void quadbuf::add(GLuint textureid, const vec2f& pos, const vec2f& dims, const vec4f& colour, const vec4f& texcoord) {
86
void quadbuf::add(GLuint textureid, const vec2& pos, const vec2& dims, const vec4& colour, const vec4& texcoord) {
86
87
//debugLog("%d: %.2f, %.2f, %.2f, %.2f\n", i, pos.x, pos.y, dims.x, dims.y);
88
quadbuf_vertex v1(pos, colour, vec2f(texcoord.x, texcoord.y));
89
quadbuf_vertex v2(pos + vec2f(dims.x, 0.0f), colour, vec2f(texcoord.z, texcoord.y));
90
quadbuf_vertex v3(pos + dims, colour, vec2f(texcoord.z, texcoord.w));
91
quadbuf_vertex v4(pos + vec2f(0.0f, dims.y), colour, vec2f(texcoord.x, texcoord.w));
89
quadbuf_vertex v1(pos, colour, vec2(texcoord.x, texcoord.y));
90
quadbuf_vertex v2(pos + vec2(dims.x, 0.0f), colour, vec2(texcoord.z, texcoord.y));
91
quadbuf_vertex v3(pos + dims, colour, vec2(texcoord.z, texcoord.w));
92
quadbuf_vertex v4(pos + vec2(0.0f, dims.y), colour, vec2(texcoord.x, texcoord.w));
93
94
int i = vertex_count;
97
if(vertex_count > data_size) {
98
if(vertex_count > vertex_capacity) {
98
99
resize(vertex_count*2);
131
132
void quadbuf::update() {
132
133
if(vertex_count==0) return;
134
curr_buffer = (curr_buffer + 1) % buffers.size();
136
quadbuf_buffer* buf = &(buffers[curr_buffer]);
139
glGenBuffers(1, &(buf->id));
142
glBindBuffer(GL_ARRAY_BUFFER, buf->id);
144
137
//recreate buffer if less than the vertex_count
145
if(buf->size < vertex_count) {
146
buf->size = data_size;
147
glBufferData(GL_ARRAY_BUFFER, buf->size*sizeof(quadbuf_vertex), &(data[0].pos.x), GL_DYNAMIC_DRAW);
149
glBufferSubData(GL_ARRAY_BUFFER, 0, vertex_count*sizeof(quadbuf_vertex), &(data[0].pos.x));
152
glBindBuffer(GL_ARRAY_BUFFER, 0);
138
buf.buffer( vertex_count, sizeof(quadbuf_vertex), vertex_capacity, &(data[0].pos.x), GL_DYNAMIC_DRAW );
155
143
void quadbuf::draw() {
156
if(vertex_count==0 || curr_buffer==-1) return;
158
glBindBuffer(GL_ARRAY_BUFFER, buffers[curr_buffer].id);
144
if(vertex_count==0) return;
160
148
glEnableClientState(GL_VERTEX_ARRAY);
161
149
glEnableClientState(GL_COLOR_ARRAY);