2014-01-06 1 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) 
Смежные вопросы