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.
186 lines
4.5 KiB
186 lines
4.5 KiB
/*=========================================================================
|
|
|
|
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];
|
|
}
|
|
|