00001 #include "DefOrgViewer.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 DefOrgViewer
00027 ::DefOrgViewer()
00028 : DefOrgViewerGUI()
00029 {
00030 orgNotSet = true;
00031 geomLayerPointer = new GeometricType();
00032 mainWindow->show();
00033 display->show();
00034
00035 isVolumeRenderingOn = false;
00036
00037 scheduleFileName = "data\\testSchedule3d.txt";
00038
00039
00040 renderer = RendererType::New();
00041 renderer->SetBackground(0.0, 0.0, 0.0);
00042
00043 renderWindow = vtkRenderWindow::New();
00044 renderWindow->AddRenderer( renderer );
00045
00046
00047 display->SetRenderWindow( renderWindow );
00048
00049 image = NULL;
00050
00051 planeX = vtkImagePlaneWidget::New();
00052
00053
00054
00055
00056
00057
00058
00059 opacityTransferFunction = vtkPiecewiseFunction::New();
00060 colorTransferFunction = vtkColorTransferFunction::New();
00061 compositeFunction = vtkVolumeRayCastCompositeFunction::New();
00062 volumeProperty = vtkVolumeProperty::New();
00063 volumeMapper = vtkVolumeRayCastMapper::New();
00064
00065
00066
00067 opacityTransferFunction->AddPoint( 20, 0.7 );
00068 opacityTransferFunction->AddPoint( 255, 1.0 );
00069 opacityTransferFunction->AddSegment( 100, 0.8, 150, 0.2 );
00070
00071 colorTransferFunction->AddRGBPoint( 0.0, 0.0, 0.0, 0.0 );
00072 colorTransferFunction->AddRGBPoint( 64.0, 1.0, 0.0, 0.0 );
00073 colorTransferFunction->AddRGBPoint( 128.0, 0.0, 0.0, 1.0 );
00074
00075 colorTransferFunction->AddRGBPoint( 255.0, 255.0, 255.0, 255.0 );
00076
00077
00078
00079
00080 volumeProperty->SetColor( colorTransferFunction );
00081 volumeProperty->SetScalarOpacity( opacityTransferFunction );
00082 volumeProperty->SetInterpolationTypeToLinear();
00083
00084
00085
00086 volumeMapper->SetVolumeRayCastFunction( compositeFunction );
00087
00088
00089 volume = vtkVolume::New();
00090 volume->SetMapper( volumeMapper );
00091 volume->SetProperty( volumeProperty );
00092
00093 meshMapper = vtkDataSetMapper::New();
00094
00095 axes = vtkCubeAxesActor2D::New();
00096
00097 display->Initialize();
00098
00099
00100
00101 return;
00102 }
00103
00104
00105 DefOrgViewer
00106 ::DefOrgViewer( MeshTypePointer itkMesh )
00107 {
00108 orgNotSet=true;
00109 geomLayerPointer = new GeometricType();
00110 mainWindow->show();
00111 display->show();
00112
00113
00114 renderer = RendererType::New();
00115 renderer->SetBackground(0.0, 0.0, 0.0);
00116
00117 renderWindow = vtkRenderWindow::New();
00118 renderWindow->AddRenderer( renderer );
00119
00120
00121 display->SetRenderWindow( renderWindow );
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00142
00143
00144
00145
00146 vtkUnstructuredGrid* vtkGrid = MeshToUnstructuredGrid( itkMesh );
00147
00148
00149
00150
00151 typedef itk::ImageFileReader< ImageType > ImageReaderType;
00152 ImageReaderType::Pointer imageReader = ImageReaderType::New();
00153 itk::MetaImageIOFactory::RegisterOneFactory();
00154
00155 char* inputImageFileName = fl_file_chooser("Pick an image file to load", "*.*", 0, 0);
00156
00157 imageReader->SetFileName( inputImageFileName );
00158
00159
00160
00161
00162
00163
00164 image = imageReader->GetOutput();
00165
00166
00167
00168
00169
00170
00171
00172
00173 itkExporter = itkImageExportType::New();
00174 itkExporter->SetInput( image );
00175
00176 vtkImporter = vtkImageImportType::New();
00177
00178 std::cout << "Starting to connect ITK pipeline->VTK pipeline..." << std::endl;
00179 ConnectPipelines( itkExporter, vtkImporter );
00180 std::cout << "Finished connecting ITK pipeline->VTK pipeline..." << std::endl;
00181
00182 itkExporter->Update();
00183 vtkImporter->Update();
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 itk::Size< N_DIMS > imageSize = image->GetLargestPossibleRegion().GetSize();
00198
00199 vtkImagePlaneWidget* planeX = vtkImagePlaneWidget::New();
00200 planeX->RestrictPlaneToVolumeOn();
00201 planeX->SetResliceInterpolateToCubic();
00202 planeX->SetInput( static_cast<vtkDataSet*>(vtkImporter->GetOutput()) );
00203 planeX->SetPlaneOrientationToXAxes();
00204 planeX->SetSliceIndex( floor(static_cast<double>(imageSize[0]/2)) );
00205 planeX->SetInteractor( display );
00206
00207 vtkImagePlaneWidget* planeY = vtkImagePlaneWidget::New();
00208 planeY->RestrictPlaneToVolumeOn();
00209 planeY->SetResliceInterpolateToCubic();
00210 planeY->SetInput( static_cast<vtkDataSet*>(vtkImporter->GetOutput()) );
00211 planeY->SetPlaneOrientationToYAxes();
00212 planeY->SetSliceIndex( floor(static_cast<double>(imageSize[1]/2)) );
00213 planeY->SetInteractor( display );
00214
00215 vtkImagePlaneWidget* planeZ = vtkImagePlaneWidget::New();
00216 planeZ->RestrictPlaneToVolumeOn();
00217 planeZ->SetResliceInterpolateToCubic();
00218 planeZ->SetInput( static_cast<vtkDataSet*>(vtkImporter->GetOutput()) );
00219 planeZ->SetPlaneOrientationToZAxes();
00220 planeZ->SetSliceIndex( floor(static_cast<double>(imageSize[2]/2)) );
00221 planeZ->SetInteractor( display );
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 opacityTransferFunction = vtkPiecewiseFunction::New();
00233 colorTransferFunction = vtkColorTransferFunction::New();
00234 compositeFunction = vtkVolumeRayCastCompositeFunction::New();
00235 volumeProperty = vtkVolumeProperty::New();
00236 volumeMapper = vtkVolumeRayCastMapper::New();
00237
00238
00239
00240
00241
00242 opacityTransferFunction->AddSegment( 0, 0.2, 150, 0.8 );
00243
00244 colorTransferFunction->AddRGBPoint( 0.0, 0.0, 0.0, 0.0 );
00245 colorTransferFunction->AddRGBPoint( 64.0, 1.0, 0.0, 0.0 );
00246 colorTransferFunction->AddRGBPoint( 128.0, 0.0, 0.0, 1.0 );
00247
00248 colorTransferFunction->AddRGBPoint( 255.0, 255.0, 255.0, 255.0 );
00249
00250
00251
00252
00253 volumeProperty->SetColor( colorTransferFunction );
00254 volumeProperty->SetScalarOpacity( opacityTransferFunction );
00255 volumeProperty->SetInterpolationTypeToLinear();
00256
00257
00258
00259 volumeMapper->SetVolumeRayCastFunction( compositeFunction );
00260 volumeMapper->SetInput( vtkImporter->GetOutput() );
00261
00262 volume = vtkVolume::New();
00263 volume->SetMapper( volumeMapper );
00264 volume->SetProperty( volumeProperty );
00265 volume->VisibilityOn();
00266
00267 renderer->AddVolume( volume );
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 vtkDataSetMapper* mapper = vtkDataSetMapper::New();
00282 mapper->SetInput( vtkGrid );
00283 vtkActor* actor = vtkActor::New();
00284 actor->SetMapper( mapper );
00285
00286 renderer->AddActor( actor );
00287
00288
00289 planeX->On();
00290 planeY->On();
00291 planeZ->On();
00292
00293
00294
00295
00296 display->Initialize();
00297
00298 renderWindow->Render();
00299
00300 return;
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324 void
00325 DefOrgViewer
00326 ::Quit()
00327 {
00328 this->Hide();
00329 exit( 0 );
00330 }
00331
00332 void
00333 DefOrgViewer
00334 ::Show()
00335 {
00336 mainWindow->show();
00337 }
00338
00339 void
00340 DefOrgViewer
00341 ::Update()
00342 {
00343
00344 }
00345
00346 void
00347 DefOrgViewer
00348 ::LoadImage()
00349 {
00350 imageReader = ImageReaderType::New();
00351
00352
00353 char* inputImageFileName = fl_file_chooser("Pick an image file to load", "*.mh*", 0, 0);
00354 if( inputImageFileName == NULL){ return; };
00355
00356 imageReader->SetFileName( inputImageFileName );
00357
00358 image = imageReader->GetOutput();
00359
00360 itkExporter = itkImageExportType::New();
00361 itkExporter->SetInput( image );
00362
00363 vtkImporter = vtkImageImportType::New();
00364
00365 std::cout << "Starting to connect ITK pipeline->VTK pipeline..." << std::endl;
00366 ConnectPipelines( itkExporter, vtkImporter );
00367 std::cout << "Finished connecting ITK pipeline->VTK pipeline..." << std::endl;
00368
00369 itkExporter->Update();
00370 vtkImporter->Update();
00371
00372 itk::Size< N_DIMS > imageSize = image->GetLargestPossibleRegion().GetSize();
00373 planeX->RestrictPlaneToVolumeOn();
00374 planeX->SetInput( static_cast<vtkDataSet*>(vtkImporter->GetOutput()) );
00375 planeX->SetSliceIndex( floor(static_cast<double>( imageSize[2] / 2 )) );
00376 planeX->SetPlaneOrientationToZAxes();
00377 planeX->SetInteractor( display );
00378
00379 planeX->On();
00380
00381 volumeMapper->SetInput( vtkImporter->GetOutput() );
00382 isVolumeRenderingOn ? volume->VisibilityOn() : volume->VisibilityOff();
00383
00384 renderer->AddVolume( volume );
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 axes->SetInput( vtkImporter->GetOutput() );
00399 axes->SetCamera( renderer->GetActiveCamera() );
00400 axes->SetLabelFormat( "%4.3g" );
00401 axes->SetFlyModeToOuterEdges();
00402 axes->SetFontFactor( 0.8 );
00403 axes->GetProperty()->SetColor( 1.0, 1.0, 1.0 );
00404
00405 renderer->ResetCamera();
00406
00407 renderWindow->Render();
00408
00409 return;
00410 }
00411
00412 void
00413 DefOrgViewer
00414 ::LoadMeta()
00415 {
00416 char* fcResult = fl_file_chooser("Pick a mesh file to load", "*.{meta,BYU}", 0, 0);
00417 if( fcResult == NULL){ return; };
00418 std::string choiceStr = fcResult;
00419 std::string inputTopologyFileName;
00420
00421 std::string prefix = choiceStr.substr( 0, choiceStr.length()-4 );
00422 std::string suffix = choiceStr.substr( choiceStr.length()-4, 4 );
00423 if( suffix == ".BYU" || suffix == ".byu" )
00424 {
00425 inputTopologyFileName = prefix+".meta";
00426 int converted = BYUToMeta( choiceStr, inputTopologyFileName );
00427 if( converted < 0 )
00428 {
00429 std::cerr << "Error attempting to convert BYU file to meta format. Do you have write permissions in the directory containing "
00430 << choiceStr << "?" << std::endl;
00431 return;
00432 }
00433 }
00434 else if( suffix == "META" || suffix == "meta" )
00435 {
00436 inputTopologyFileName = choiceStr;
00437 }
00438 else
00439 {
00440 std::cerr << "Error loading mesh. Currently only .meta and .BYU files are supported." << std::endl;
00441 }
00442
00443 geomLayerPointer->readTopologyFromFile( inputTopologyFileName );
00444 std::cout << "Topology read from '" << inputTopologyFileName << "'..." << std::endl;
00445
00446 vtkUnstructuredGrid* vtkGrid = MeshToUnstructuredGrid( geomLayerPointer->theMesh );
00447
00448 meshMapper->SetInput( vtkGrid );
00449 vtkActor* meshActor = vtkActor::New();
00450 meshActor->SetMapper( meshMapper );
00451
00452
00453 meshActor->GetProperty()->SetColor( 0.3, 1.0, 0.4 );
00454
00455 renderer->AddActor( meshActor );
00456
00457 renderer->ResetCamera();
00458 renderer->Render();
00459
00460 return;
00461 }
00462
00463 void
00464 DefOrgViewer
00465 ::ToggleVolumeRendering()
00466 {
00467 isVolumeRenderingOn = !isVolumeRenderingOn;
00468 (isVolumeRenderingOn) ? volume->VisibilityOn() : volume->VisibilityOff();
00469 }
00470
00471
00472 vtkUnstructuredGrid*
00473 DefOrgViewer
00474 ::MeshToUnstructuredGrid( MeshTypePointer mesh )
00475 {
00476
00477 int numPoints = mesh->GetNumberOfPoints();
00478 if(numPoints == 0)
00479 {
00480 mesh->Print(std::cerr);
00481 std::cerr << "no points in Grid " << std::endl;
00482 exit(-1);
00483 }
00484
00485 vtkUnstructuredGrid* vgrid = vtkUnstructuredGrid::New();
00486
00487
00488 vtkPoints* vpoints = vtkPoints::New();
00489 vpoints->SetNumberOfPoints(numPoints);
00490
00491
00492 MeshType::PointsContainer::Pointer points = mesh->GetPoints();
00493 for(MeshType::PointsContainer::Iterator i = points->Begin();
00494 i != points->End(); ++i)
00495 {
00496
00497 int idx = i->Index();
00498
00499
00500
00501 vpoints->SetPoint(idx, const_cast<DataType*>(i->Value().GetDataPointer()));
00502 }
00503
00504 vgrid->SetPoints(vpoints);
00505
00506
00507
00508 MeshType::CellType::MultiVisitor::Pointer mv =
00509 MeshType::CellType::MultiVisitor::New();
00510
00511 TriangleVisitor::Pointer tv = TriangleVisitor::New();
00512 QuadrilateralVisitor::Pointer qv = QuadrilateralVisitor::New();
00513
00514 int vtkCellCount = 0;
00515 int numCells = mesh->GetNumberOfCells();
00516 int *types = new int[numCells];
00517
00518 vtkCellArray* cells = vtkCellArray::New();
00519 cells->EstimateSize(numCells, 4);
00520
00521 tv->SetTypeArray(types);
00522 tv->SetCellCounter(&vtkCellCount);
00523 tv->SetCellArray(cells);
00524 qv->SetTypeArray(types);
00525 qv->SetCellCounter(&vtkCellCount);
00526 qv->SetCellArray(cells);
00527
00528 mv->AddVisitor(tv);
00529 mv->AddVisitor(qv);
00530
00531
00532
00533 mesh->Accept(mv);
00534
00535
00536 vgrid->SetCells(types, cells);
00537
00538
00539 cells->Delete();
00540 vpoints->Delete();
00541
00542 return vgrid;
00543 }
00544 void
00545 DefOrgViewer::TogglePlayPause()
00546 {
00547
00548 DefOrgViewerGUI::TogglePlayPause();
00549
00550
00551 if(orgNotSet)
00552 {
00553 orgNotSet = false;
00554 this->SetupOrganism();
00555 }
00556 }
00557
00558 void
00559 DefOrgViewer::SetupOrganism()
00560 {
00561
00562
00563
00564 testOrg = OrganismType::New();
00565 std::cout << "Organism created..." << std::endl;
00566 scheduleFileName = "data\\testSchedule3d.txt";
00567
00568
00569 GradientSensorType::sensorIn input;
00570
00571 input.sigma = 1.0;
00572 this->imageReader->Update();
00573 input.imageIn = this->imageReader->GetOutput();
00574 gradientSensor.run((void *)&input);
00575 std::cout << "Gradient sensor setup complete..." << std::endl;
00576 GradientSensorType::sensorOut * output = (GradientSensorType::sensorOut *) gradientSensor.getOuput();
00577
00578
00579
00580 eulerPhysLayerPointer = new EulerPhysicsType(0,0,10);
00581
00582
00583 eulerPhysLayerPointer->setExternalForces((void *) &(output->imageOut));
00584 eulerPhysLayerPointer->setGeometry(geomLayerPointer);
00585
00586 testOrg->setPhysicsLayer(eulerPhysLayerPointer);
00587 testOrg->setGeometricLayer(geomLayerPointer);
00588 std::cout << "Physics layer added..." << std::endl;
00589
00590
00591
00592
00593 cognitiveLayerPointer = new CognitiveType(5);
00594 beh1 = new Beh_TranslateAllType();
00595 def1 = new Def_TranslateAllType();
00596 cognitiveLayerPointer->setSchedule(scheduleFileName);
00597
00598
00599 this->testOrg->setCognitiveLayer(cognitiveLayerPointer);
00600 this->testOrg->addBehaviour(beh1);
00601 this->testOrg->addDeformation(def1);
00602
00603
00604 testOrg->SetInput(imageReader->GetOutput());
00605 }
00606 void
00607 DefOrgViewer
00608 ::UpdateOrganism()
00609 {
00610
00611
00612 testOrg->run();
00613
00614
00615 vtkUnstructuredGrid* vtkGrid = MeshToUnstructuredGrid( geomLayerPointer->theMesh );
00616
00617 meshMapper->SetInput( vtkGrid );
00618 renderer->Render();
00619 }
00620
00621 void
00622 DefOrgViewer
00623 ::ConnectPipelines( itkImageExportType::Pointer exporter,
00624 vtkImageImportType* importer)
00625 {
00626 importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
00627 importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
00628 importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
00629
00630
00631 importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
00632 importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
00633 importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
00634 importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
00635 importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
00636 importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
00637 importer->SetCallbackUserData(exporter->GetCallbackUserData());
00638 }