#include <iostream>
//VTK_MODULE_INITに必要
#include <vtkAutoInit.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
// コールバック関数を使用するのに必要
#include <vtkCallbackCommand.h>
//必須
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
// コールバック関数に渡すデータ
struct MyData
{
std::string text;
int counter;
};
// タイマーのコールバック関数
void MyTimerCallbackFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData)
{
MyData* data = static_cast<MyData*>(clientData);
// タイマーイベントが発生したことを確認する
std::cout << data->text << " " << data->counter << std::endl;
data->counter++;
// 画面更新
auto interactor = static_cast<vtkRenderWindowInteractor*>(caller);
interactor->Render();
}
int main(int /*argc*/, char** /*argv*/)
{
//////////////////////////////////////
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->ResetCamera();
//////////////////////////////////////
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetInteractor(interactor);
renderWindow->Render();
//////////////////////////////////////
// タイマーに渡す構造体の作成
MyData callbackData{ "Counter:",0 };
// タイマー作成
auto timerCallback = vtkSmartPointer<vtkCallbackCommand>::New();
timerCallback->SetCallback(MyTimerCallbackFunction); // コールバック関数を設定
timerCallback->SetClientData(&callbackData); // コールバック関数に渡すデータを設定
interactor->AddObserver(vtkCommand::TimerEvent, timerCallback); // タイマーイベントにコールバック関数を設定
interactor->Initialize();
interactor->CreateRepeatingTimer(100); // 100msごとにタイマーイベントを発生させる
//////////////////////////////////////
interactor->Start(); //イベントループへ入る
return 0;
}