void Attribute::add(const char *data) { size_t size = data_sizeof(); for(size_t i = 0; i < size; i++) buffer.push_back(data[i]); }
size_t Attribute::element_size(Mesh *mesh, AttributePrimitive prim) const { if(flags & ATTR_FINAL_SIZE) { return buffer.size() / data_sizeof(); } size_t size; switch(element) { case ATTR_ELEMENT_OBJECT: case ATTR_ELEMENT_MESH: case ATTR_ELEMENT_VOXEL: size = 1; break; case ATTR_ELEMENT_VERTEX: size = mesh->verts.size() + mesh->num_ngons; if(prim == ATTR_PRIM_SUBD) { size -= mesh->num_subd_verts; } break; case ATTR_ELEMENT_VERTEX_MOTION: size = (mesh->verts.size() + mesh->num_ngons) * (mesh->motion_steps - 1); if(prim == ATTR_PRIM_SUBD) { size -= mesh->num_subd_verts * (mesh->motion_steps - 1); } break; case ATTR_ELEMENT_FACE: if(prim == ATTR_PRIM_TRIANGLE) { size = mesh->num_triangles(); } else { size = mesh->subd_faces.size() + mesh->num_ngons; } break; case ATTR_ELEMENT_CORNER: case ATTR_ELEMENT_CORNER_BYTE: if(prim == ATTR_PRIM_TRIANGLE) { size = mesh->num_triangles()*3; } else { size = mesh->subd_face_corners.size() + mesh->num_ngons; } break; case ATTR_ELEMENT_CURVE: size = mesh->num_curves(); break; case ATTR_ELEMENT_CURVE_KEY: size = mesh->curve_keys.size(); break; case ATTR_ELEMENT_CURVE_KEY_MOTION: size = mesh->curve_keys.size() * (mesh->motion_steps - 1); break; default: size = 0; break; } return size; }
size_t Attribute::buffer_size(int numverts, int numtris) { return element_size(numverts, numtris)*data_sizeof(); }
size_t Attribute::buffer_size(int numverts, int numtris, int numcurves, int numkeys) const { return element_size(numverts, numtris, numcurves, numkeys)*data_sizeof(); }
void Attribute::resize(size_t num_elements) { buffer.resize(num_elements * data_sizeof(), 0); }
void Attribute::zero_data(void* dst) { memset(dst, 0, data_sizeof()); }
size_t Attribute::buffer_size(Mesh *mesh, AttributePrimitive prim) const { return element_size(mesh, prim)*data_sizeof(); }