Как создать подкласс vtkActor

Я хотел иметь возможность получить доступ к моей структуре данных, когда я выбираю vtkActor, Класс, полученный из vtkActor хранение ptr в моей структуре данных казалось самым простым подходом.

Я получаю подкласс для компиляции просто отлично, но актер, похоже, не добавляется в рендерер.

Итак, вот мой класс:

//.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();

Больше ничего не меняется в коде. Есть идеи, что не так?

3

Решение

Таким образом, оказывается, что есть множество функций, которые необходимо перегрузить, и пара касаний макро магии, чтобы заставить это работать.

Я вставил ниже пример, который работает для меня сейчас. В основном это из кода 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)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]