C++ (Qt)typedef QSharedPoiinter<QOpenGLBuffer> TBufVBO; struct CVerArray : public QVector<QVector3D> { CBufControl m_control;}; // код рисованияvoid CRenderObject::Draw( ... ){// получаем буфер позиций вертексов CVerArray * ver = GetVerArray(); TBufVBO vbo = ver->m_control.GetBuf(this); // отдаем его шейдеру vbo->bind(); glVertAttribPointer(...); vbo->release(); // то же с др буферами ...}
class CRenderObject { int level; // уровень деталировки std::shared_pointer<QOpenGLBuffer> buffer; // текущий буффер std::shared_pointer<InnerData> data;};struct InnerData{ std::vector<QVector3D> indexes; // сырые данные, не шарю в ОГЛ std::map<int /*level*/, std::weak_pointer<QOpenGLBuffer> buffers; // либо тут тоже shared_pointer};
std::string s1("hello");std::string s2("hello"); // данные не шарятся так как нет возможности узнать что они одинаковые
C++ (Qt)typedef QVector<QVector3D> TVerArray; typedef QVector<int> TIndArray; struct CRenderObject {...// данные рисования, могут шариться любым кол-вом CRenderObject QSharedPointer<CGeometry> m_geometry; // уровень деталировки, 0 = исходная геометрия int m_detailLevel; // Если к объекту применены нелинейные преобразования// то его "личные" вертексы и нормали должны использоваться// (вместо тех же данных в m_geomretry) TVerArray m_vertex, m_normal;}; // класс данных рисованияstruct CGeometry {... TVerArray m_vertex, m_normal, m_color, m_uv0, m_uv1; TIndArray m_indices, m_ver_per_face;};
typedef QVector<QVector3D> TVerArray; typedef QVector<int> TIndArray; struct CRenderObject {...// данные рисования, могут шариться любым кол-вом CRenderObject QSharedPointer<CGeometry> m_geometry; // уровень деталировки, 0 = исходная геометрия int m_detailLevel; // Если к объекту применены нелинейные преобразования// то его "личные" вертексы и нормали должны использоваться// (вместо тех же данных в m_geomretry) bool m_has_own_data; TVerArray m_vertex, m_normal; // если m_has_own_data == false то шарим все буффера из мапы m_buffers_cache // если m_has_own_data == true то храним два своих уникальных буфера, остальные шарим Buffers m_buffers;};struct Buffers{ QSharedPointer<QOpenGLBuffer> m_vertex_buffer; QSharedPointer<QOpenGLBuffer> m_color_buffer; // итд}; // класс данных рисованияstruct CGeometry {... TVerArray m_vertex, m_normal, m_color, m_uv0, m_uv1; TIndArray m_indices, m_ver_per_face; QMap<int /*level*/, Buffers> m_buffers_cache;};
QMap<int /*level*/, Buffers> m_buffers_cache;};
C++ (Qt)m_vertex.clear();// базовые данные изменились, буфер "no longer valid". Кто его прибьет?