Beispiel #1
0
// 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;
}