本文整理汇总了C++中Drawable::SetVertexBufferSegment方法的典型用法代码示例。如果您正苦于以下问题:C++ Drawable::SetVertexBufferSegment方法的具体用法?C++ Drawable::SetVertexBufferSegment怎么用?C++ Drawable::SetVertexBufferSegment使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Drawable
的用法示例。
在下文中一共展示了Drawable::SetVertexBufferSegment方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: operator
void operator() (Drawable & drawable)
{
Model * mo = drawable.GetModel();
assert(mo);
// early out if model already bound
Segment & sg = mo->GetVertexBufferSegment();
if (sg.age == ctx.age_static)
{
drawable.SetVertexBufferSegment(sg);
return;
}
const VertexArray & va = mo->GetVertexArray();
const VertexFormat::Enum vf = va.GetVertexFormat();
const unsigned int vsize = VertexFormat::Get(vf).stride;
const unsigned int vcount = va.GetNumVertices();
const unsigned int icount = va.GetNumIndices();
assert(vcount > 0);
// get object (first object is reserved for dynamic vertex data)
std::vector<Object> & obs = ctx.objects[vf];
if (obs.size() < 2 || (obs.back().vcount + vcount) * vsize > max_buffer_size)
{
obs.push_back(Object());
assert(obs.size() <= 256);
}
const unsigned int obindex = obs.size() - 1;
Object & ob = obs[obindex];
// gen object buffers
if (ob.vbuffer == 0)
{
glGenBuffers(1, &ob.ibuffer);
glGenBuffers(1, &ob.vbuffer);
if (ctx.use_vao)
{
glGenVertexArrays(1, &ob.varray);
if (ob.varray == 0)
ctx.use_vao = ctx.good_vao = false;
}
ob.vformat = vf;
}
// set segment
sg.ioffset = ob.icount * sizeof(unsigned int);
sg.icount = icount;
sg.voffset = ob.vcount;
sg.vcount = vcount;
sg.vbuffer = ob.varray ? ob.varray : ob.vbuffer;
sg.vformat = vf;
sg.object = obindex;
sg.age = ctx.age_static;
drawable.SetVertexBufferSegment(sg);
// store va for vertex data upload and update buffer counts
varrays[vf].push_back(&va);
ob.icount += icount;
ob.vcount += vcount;
}