- if(args.empty())
- {
- const GlState::BufferMap &buffers = gldbg.get_glstate().get_buffers();
- IO::print("%d buffers:\n", buffers.size());
- for(GlState::BufferMap::const_iterator i=buffers.begin(); i!=buffers.end(); ++i)
- IO::print(" %d: %s\n", i->first, i->second.describe());
- }
- else
- {
- unsigned id = lexical_cast<unsigned>(args);
- const BufferState &buf = gldbg.get_glstate().get_buffer(id);
- IO::print("Buffer %d:\n", id);
- IO::print(" Size: %d bytes\n", buf.size);
- IO::print(" Usage: %s\n", describe_enum(buf.usage, ""));
- if(buf.content.stride)
- {
- IO::print(" Stride: %d bytes\n", buf.content.stride);
-
- IO::print(" Arrays:\n");
- const vector<BufferContent::Array> &arrays = buf.content.arrays;
- for(vector<BufferContent::Array>::const_iterator i=arrays.begin(); i!=arrays.end(); ++i)
- {
- if(i->kind)
- IO::print(" %2d: %s, %d %s\n", i->offset,
- describe_enum(i->kind, ""), i->size, describe_enum(i->type, "DataType"));
- else
- IO::print(" %2d: Attrib %d, %d %s\n", i->offset,
- i->index, i->size, describe_enum(i->type, "DataType"));
- }
-
- IO::print(" Data:\n");
- string header;
- for(vector<BufferContent::Array>::const_iterator i=arrays.begin(); i!=arrays.end(); ++i)
- {
- if(!header.empty())
- header += " | ";
-
- string label;
- if(i->kind==GL_VERTEX_ARRAY)
- label = "Vertex";
- else if(i->kind==GL_NORMAL_ARRAY)
- label = "Normal";
- else if(i->kind==GL_COLOR_ARRAY)
- label = "Color";
- else if(i->kind==GL_TEXTURE_COORD_ARRAY)
- {
- if(i->size==1)
- label = "TexC";
- else
- label = "TexCoord";
- }
- else if(!i->kind)
- {
- if(i->size==1)
- label = format("A %d", i->index);
- else
- label = format("Attrib %d", i->index);
- }
-
- unsigned width = i->size;
- if(i->type==GL_FLOAT)
- width *= 5;
- else if(i->type==GL_UNSIGNED_BYTE)
- width *= 3;
- width += i->size-1;
-
- header.append((width-label.size())/2, ' ');
- header += label;
- header.append((width-label.size()+1)/2, ' ');
- }
- IO::print(" %s\n", header);
-
- unsigned n_verts = buf.size/buf.content.stride;
- for(unsigned i=0; i<n_verts; ++i)
- {
- const char *vertex = buf.data+i*buf.content.stride;
-
- string line;
- for(vector<BufferContent::Array>::const_iterator j=arrays.begin(); j!=arrays.end(); ++j)
- {
- if(!line.empty())
- line += " |";
-
- const char *base = vertex+j->offset;
- for(unsigned k=0; k<j->size; ++k)
- {
- if(j->type==GL_FLOAT)
- line += format(" %5.2f", *(reinterpret_cast<const float *>(base)+k));
- else if(j->type==GL_UNSIGNED_BYTE)
- line += format(" %3u", *(reinterpret_cast<const unsigned char *>(base)+k));
- }
- }
-
- IO::print("%3d:%s\n", i, line);
- }
- }
- }