Thu, 03 Mar 2022 11:42:52 +0200
extract polygon cache out of Model
#include "polygoncache.h" #include "documentmanager.h" PolygonCache::PolygonCache(Model *model) : model{model} { const auto mark = [this](){ this->needRecache = true; }; connect(model, &Model::dataChanged, mark); connect(model, &Model::objectAdded, mark); connect(model, &Model::objectRemoved, mark); } /** * @brief Gets a list of GL polygons that are used to represent this model. * @details Will build polygons if polygons are outdated. * @param documents Documents to use to resolve subfile references * @return vector of GL polygons */ std::vector<gl::Polygon> PolygonCache::getPolygons(DocumentManager* documents) { if (this->needRecache) { this->cachedPolygons.clear(); const std::optional<ModelId> modelId = documents->findIdForModel(this->model); if (modelId.has_value()) { ldraw::GetPolygonsContext context{modelId.value(), documents}; for (int i = 0; i < this->model->size(); i += 1) { this->getObjectPolygons(i, this->cachedPolygons, &context); } } this->needRecache = false; } return this->cachedPolygons; } /** * @brief Gets the GL polygons of the object at the specified position in the model * @param index Index of object in the model * @param polygons_out Vector to add polygons into * @param context Context to use to resolve subfile references */ void PolygonCache::getObjectPolygons( const int index, std::vector<gl::Polygon>& polygons_out, ldraw::GetPolygonsContext* context) const { const ldraw::Object* object = (*this->model)[unsigned_cast(index)]; object->getPolygons(polygons_out, context); }