2014-01-06 58 views
3

我想在选择vtkActor时能够访问我的底层数据结构。从vtkActor派生出来的类将ptr保存到我的数据结构中似乎是最简单的方法。如何继承vtkActor

我得到的子类编译得很好,但演员似乎并没有被添加到渲染器。

所以,这里是我的课:

//.h 
#include <vtkActor.h> 
#include <vtkObjectFactory.h> 

class Node; 

struct Actor : public vtkActor { 
    static Actor* New(); 
    vtkTypeMacro(Actor, vtkActor) 

    Node* holding_node; 
}; 

//.cpp 
#include "actor.h" 
vtkStandardNewMacro(Actor) 

在我的渲染步骤:如果我发起与vtkActor一切男主角显示为预期,采摘作品,等等

vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New(); 

但是,如果我使用我的话,没有演员加入Actor

vtkSmartPointer<Actor> sphereActor = vtkSmartPointer<Actor>::New(); 

代码中没有其他更改。有什么不对的想法?

回答

2

所以,事实证明,有一些功能需要重载,并且有一些功能需要使用宏魔法才能实现。

我粘贴在现在为我工作的例子下。它主要来自vtkFollower代码(来自vtkActor的派生类)。希望这可以帮助!

#include <vtkSmartPointer.h> 
    #include <vtkRenderer.h> 
    #include <vtkObjectFactory.h> 
    #include <vtkRenderingCoreModule.h> 
    #include <vtkProperty.h> 


    class Node; 

    class VTKRENDERINGCORE_EXPORT NodeActor : public vtkActor { 
     public: 
      vtkTypeMacro(NodeActor, vtkActor); 

     static NodeActor *New(); 

     virtual void ReleaseGraphicsResources(vtkWindow *window) { 
      this->Device->ReleaseGraphicsResources(window); 
      this->Superclass::ReleaseGraphicsResources(window); 
     } 

     virtual int RenderOpaqueGeometry(vtkViewport *viewport){ 
      if (! this->Mapper) { 
       return 0; 
      } 
      if (!this->Property) { 
       this->GetProperty(); 
      } 
      if (this->GetIsOpaque()) { 
       vtkRenderer *ren = static_cast<vtkRenderer *>(viewport); 
       this->Render(ren); 
       return 1; 
      } 
      return 0; 
     } 

     virtual int RenderTranslucentPolygonalGeometry(vtkViewport *viewport){ 
      if (! this->Mapper) { 
       return 0; 
      } 
      if (!this->Property) { 
       this->GetProperty(); 
      } 
      if (!this->GetIsOpaque()) { 
       vtkRenderer *ren = static_cast<vtkRenderer *>(viewport); 
       this->Render(ren); 
       return 1; 
      } 
      return 0; 
     } 

     virtual void Render(vtkRenderer *ren){ 
      this->Property->Render(this, ren); 
      this->Device->SetProperty (this->Property); 
      this->Property->Render(this, ren); 
      if (this->BackfaceProperty) { 
       this->BackfaceProperty->BackfaceRender(this, ren); 
       this->Device->SetBackfaceProperty(this->BackfaceProperty); 
      } 
      if (this->Texture) { 
       this->Texture->Render(ren); 
      } 
      this->ComputeMatrix(); 
      this->Device->SetUserMatrix(this->Matrix); 
      this->Device->Render(ren,this->Mapper); 
     } 

     void ShallowCopy(vtkProp *prop) { 
      NodeActor *f = NodeActor::SafeDownCast(prop); 
      this->vtkActor::ShallowCopy(prop); 
     } 

     //****************************************// 
     //    my member 
     //****************************************// 
     Node* node_i_represent{nullptr}; 

    protected: 
     vtkActor* Device; 

     NodeActor() { 
      this -> Device = vtkActor::New(); 
     } 

     ~NodeActor() { 
      this -> Device -> Delete(); 
     } 
    private: 
}; 

vtkStandardNewMacro(NodeActor)