/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkProp.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 "vtkProp.h" #include "vtkObjectFactory.h" #include "vtkAssemblyPaths.h" #include "vtkCommand.h" vtkCxxRevisionMacro(vtkProp, "$Revision: 1.25 $"); // Creates an Prop with the following defaults: visibility on. vtkProp::vtkProp() { this->Visibility = 1; // ON this->Pickable = 1; this->Dragable = 1; this->AllocatedRenderTime = 10.0; this->EstimatedRenderTime = 0.0; this->RenderTimeMultiplier = 1.0; this->Paths = NULL; this->NumberOfConsumers = 0; this->Consumers = 0; } vtkProp::~vtkProp() { if ( this->Paths ) { this->Paths->Delete(); } if (this->Consumers) { delete [] this->Consumers; } } // This method is invoked if the prop is picked. void vtkProp::Pick() { this->InvokeEvent(vtkCommand::PickEvent,NULL); } // Shallow copy of vtkProp. void vtkProp::ShallowCopy(vtkProp *prop) { this->Visibility = prop->GetVisibility(); this->Pickable = prop->GetPickable(); this->Dragable = prop->GetDragable(); } void vtkProp::InitPathTraversal() { if ( this->Paths == NULL ) { this->Paths = vtkAssemblyPaths::New(); vtkAssemblyPath *path = vtkAssemblyPath::New(); path->AddNode(this,NULL); this->BuildPaths(this->Paths,path); path->Delete(); } this->Paths->InitTraversal(); } vtkAssemblyPath *vtkProp::GetNextPath() { if ( ! this->Paths) { return NULL; } return this->Paths->GetNextItem(); } // This method is used in conjunction with the assembly object to build a copy // of the assembly hierarchy. This hierarchy can then be traversed for // rendering, picking or other operations. void vtkProp::BuildPaths(vtkAssemblyPaths *paths, vtkAssemblyPath *path) { // This is a leaf node in the assembly hierarchy so we // copy the path in preparation to assingning it to paths. vtkAssemblyPath *childPath = vtkAssemblyPath::New(); childPath->ShallowCopy(path); // We can add this path to the list of paths paths->AddItem(childPath); childPath->Delete(); //okay, reference counting } void vtkProp::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os,indent); os << indent << "Dragable: " << (this->Dragable ? "On\n" : "Off\n"); os << indent << "Pickable: " << (this->Pickable ? "On\n" : "Off\n"); os << indent << "AllocatedRenderTime: " << this->AllocatedRenderTime << endl; os << indent << "EstimatedRenderTime: " << this->EstimatedRenderTime << endl; os << indent << "NumberOfConsumers: " << this->NumberOfConsumers << endl; os << indent << "RenderTimeMultiplier: " << this->RenderTimeMultiplier << endl; os << indent << "Visibility: " << (this->Visibility ? "On\n" : "Off\n"); } void vtkProp::AddConsumer(vtkObject *c) { // make sure it isn't already there if (this->IsConsumer(c)) { return; } // add it to the list, reallocate memory vtkObject **tmp = this->Consumers; this->NumberOfConsumers++; this->Consumers = new vtkObject* [this->NumberOfConsumers]; for (int i = 0; i < (this->NumberOfConsumers-1); i++) { this->Consumers[i] = tmp[i]; } this->Consumers[this->NumberOfConsumers-1] = c; // free old memory delete [] tmp; } void vtkProp::RemoveConsumer(vtkObject *c) { // make sure it is already there if (!this->IsConsumer(c)) { return; } // remove it from the list, reallocate memory vtkObject **tmp = this->Consumers; this->NumberOfConsumers--; this->Consumers = new vtkObject* [this->NumberOfConsumers]; int cnt = 0; int i; for (i = 0; i <= this->NumberOfConsumers; i++) { if (tmp[i] != c) { this->Consumers[cnt] = tmp[i]; cnt++; } } // free old memory delete [] tmp; } int vtkProp::IsConsumer(vtkObject *c) { int i; for (i = 0; i < this->NumberOfConsumers; i++) { if (this->Consumers[i] == c) { return 1; } } return 0; } vtkObject *vtkProp::GetConsumer(int i) { if (i >= this->NumberOfConsumers) { return 0; } return this->Consumers[i]; }