// Update and send primitive void TargetPrimitive::updateAndSendPrimitive(const Axes& axes, bool forceUpdate, bool pushAndPop, const QOpenGLContext* context) { // Check collection validity if (!Collection::objectValid(collection_, "collection in TargetPrimitive::updateAndSendPrimitive")) return; // Check whether the primitive for this collection needs updating bool upToDate = true; if (forceUpdate) upToDate = false; else if (primitiveAxesUsedAt_ != axes.displayVersion()) upToDate = false; else if (primitiveColourUsedAt_ != collection_->colourVersion()) upToDate = false; else if (primitiveDataUsedAt_ != collection_->dataVersion()) upToDate = false; else if (primitiveStyleUsedAt_ != collection_->displayStyleVersion()) upToDate = false; // If the primitive is out of date, recreate it's data. if (!upToDate) { // Recreate primitive depending on current style switch (collection_->displayStyle()) { case (Collection::LineXYStyle): Surface::constructLineXY(primitive_, axes, collection_->displayAbscissa(), collection_->displayData(), collection_->colourScale()); break; case (Collection::LineZYStyle): Surface::constructLineZY(primitive_, axes, collection_->displayAbscissa(), collection_->displayData(), collection_->colourScale()); break; case (Collection::GridStyle): Surface::constructGrid(primitive_, axes, collection_->displayAbscissa(), collection_->displayData(), collection_->colourScale()); break; case (Collection::SurfaceStyle): case (Collection::UnlitSurfaceStyle): Surface::constructFull(primitive_, axes, collection_->displayAbscissa(), collection_->displayData(), collection_->colourScale()); break; default: printf("Internal Error: Display style %i not accounted for in TargetPrimitive::updateAndSendPrimitive().\n", collection_->displayStyle()); break; } // Pop old primitive instance (unless flagged not to) if ((!pushAndPop) && (primitive_.nInstances() != 0)) primitive_.popInstance(context); // Push a new instance to create the new display list / vertex array primitive_.pushInstance(context); } // Send primitive sendToGL(); // Pop current instance (if flagged) if (pushAndPop) primitive_.popInstance(context); // Store version points for the up-to-date primitive primitiveAxesUsedAt_ = axes.displayVersion(); primitiveColourUsedAt_ = collection_->colourVersion(); primitiveDataUsedAt_ = collection_->dataVersion(); primitiveStyleUsedAt_ = collection_->displayStyleVersion(); return; }