You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
4.9 KiB
195 lines
4.9 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkActor2DCollection.cxx,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
|
|
#include "vtkActor2DCollection.h"
|
|
#include "vtkObjectFactory.h"
|
|
|
|
vtkCxxRevisionMacro(vtkActor2DCollection, "$Revision: 1.1 $");
|
|
vtkStandardNewMacro(vtkActor2DCollection);
|
|
|
|
// protected function to delete an element. Internal use only.
|
|
void vtkActor2DCollection::DeleteElement(vtkCollectionElement *e)
|
|
{
|
|
vtkCollection::DeleteElement(e);
|
|
}
|
|
|
|
// Desctructor for the vtkActor2DCollection class. This removes all
|
|
// objects from the collection.
|
|
vtkActor2DCollection::~vtkActor2DCollection()
|
|
{
|
|
this->RemoveAllItems();
|
|
}
|
|
|
|
// Sort and then render the collection of 2D actors.
|
|
void vtkActor2DCollection::RenderOverlay(vtkViewport* viewport)
|
|
{
|
|
if (this->NumberOfItems != 0)
|
|
{
|
|
this->Sort();
|
|
vtkActor2D* tempActor;
|
|
vtkCollectionSimpleIterator adit;
|
|
for ( this->InitTraversal(adit);
|
|
(tempActor = this->GetNextActor2D(adit));)
|
|
{
|
|
// Make sure that the actor is visible before rendering
|
|
if (tempActor->GetVisibility() == 1)
|
|
{
|
|
tempActor->RenderOverlay(viewport);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add an actor to the list. The new actor is
|
|
// inserted in the list according to it's layer
|
|
// number.
|
|
void vtkActor2DCollection::AddItem(vtkActor2D *a)
|
|
{
|
|
vtkCollectionElement* indexElem;
|
|
vtkCollectionElement* elem = new vtkCollectionElement;
|
|
|
|
// Check if the top item is NULL
|
|
if (this->Top == NULL)
|
|
{
|
|
vtkDebugMacro(<<"vtkActor2DCollection::AddItem - Adding item to top of the list");
|
|
|
|
this->Top = elem;
|
|
elem->Item = a;
|
|
elem->Next = NULL;
|
|
this->Bottom = elem;
|
|
this->NumberOfItems++;
|
|
a->Register(this);
|
|
return;
|
|
}
|
|
|
|
for (indexElem = this->Top;
|
|
indexElem != NULL;
|
|
indexElem = indexElem->Next)
|
|
{
|
|
|
|
vtkActor2D* tempActor = (vtkActor2D*) indexElem->Item;
|
|
if (a->GetLayerNumber() < tempActor->GetLayerNumber())
|
|
{
|
|
// The indexElem item's layer number is larger, so swap
|
|
// the new item and the indexElem item.
|
|
vtkDebugMacro(<<"vtkActor2DCollection::AddItem - Inserting item");
|
|
elem->Item = indexElem->Item;
|
|
elem->Next = indexElem->Next;
|
|
indexElem->Item = a;
|
|
indexElem->Next = elem;
|
|
this->NumberOfItems++;
|
|
a->Register(this);
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
//End of list found before a larger layer number
|
|
vtkDebugMacro(<<"vtkActor2DCollection::AddItem - Adding item to end of the list");
|
|
elem->Item = a;
|
|
elem->Next = NULL;
|
|
this->Bottom->Next = elem;
|
|
this->Bottom = elem;
|
|
this->NumberOfItems++;
|
|
a->Register(this);
|
|
|
|
}
|
|
|
|
// Sorts the vtkActor2DCollection by layer number. Smaller layer
|
|
// numbers are first. Layer numbers can be any integer value.
|
|
void vtkActor2DCollection::Sort()
|
|
{
|
|
int index;
|
|
|
|
vtkDebugMacro(<<"vtkActor2DCollection::Sort");
|
|
|
|
int numElems = this->GetNumberOfItems();
|
|
|
|
// Create an array of pointers to actors
|
|
vtkActor2D** actorPtrArr = new vtkActor2D* [numElems];
|
|
|
|
vtkDebugMacro(<<"vtkActor2DCollection::Sort - Getting actors from collection");
|
|
|
|
// Start at the beginning of the collection
|
|
vtkCollectionSimpleIterator ait;
|
|
this->InitTraversal(ait);
|
|
|
|
|
|
// Fill the actor array with the items in the collection
|
|
for (index = 0; index < numElems; index++)
|
|
{
|
|
actorPtrArr[index] = this->GetNextActor2D(ait);
|
|
}
|
|
|
|
vtkDebugMacro(<<"vtkActor2DCollection::Sort - Starting selection sort");
|
|
// Start the sorting - selection sort
|
|
int i, j, min;
|
|
vtkActor2D* t;
|
|
|
|
for (i = 0; i < numElems - 1; i++)
|
|
{
|
|
min = i;
|
|
for (j = i + 1; j < numElems ; j++)
|
|
{
|
|
if(actorPtrArr[j]->GetLayerNumber() < actorPtrArr[min]->GetLayerNumber())
|
|
{
|
|
min = j;
|
|
}
|
|
}
|
|
t = actorPtrArr[min];
|
|
actorPtrArr[min] = actorPtrArr[i];
|
|
actorPtrArr[i] = t;
|
|
}
|
|
|
|
vtkDebugMacro(<<"vtkActor2DCollection::Sort - Selection sort done.");
|
|
|
|
for (index = 0; index < numElems; index++)
|
|
{
|
|
vtkDebugMacro(<<"vtkActor2DCollection::Sort - actorPtrArr["<<index<<"] layer: " <<
|
|
actorPtrArr[index]->GetLayerNumber());
|
|
}
|
|
|
|
vtkDebugMacro(<<"vtkActor2DCollection::Sort - Rearraging the linked list.");
|
|
// Now move the items around in the linked list -
|
|
// keep the links the same, but swap around the items
|
|
|
|
vtkCollectionElement* elem = this->Top;
|
|
elem->Item = actorPtrArr[0];
|
|
|
|
for (i = 1; i < numElems; i++)
|
|
{
|
|
elem = elem->Next;
|
|
elem->Item = actorPtrArr[i];
|
|
}
|
|
|
|
delete[] actorPtrArr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|