00001
00002
00003
00004 #include "stdafx.h"
00005 #include "vtkSq3Subdivision.h"
00006 #include "vtkSq3SubdivisionDoc.h"
00007 #include "vtkSq3SubdivisionView.h"
00008 #include "VTK3DSOurImporter.h"
00009 #include "vtkConeSource.h"
00010 #include "vtkPolyDataMapper.h"
00011 #include "vtkRenderWindow.h"
00012 #include "vtkLoopSubdivisionFilter.h"
00013 #include "vtkTriangleFilter.h"
00014 #include "vtkActorCollection.h"
00015 #include "vtkPolyData.h"
00016 #include "vtkRenderWindowInteractor.h"
00017 #include "vtkRenderer.h"
00018 #include "vtkCellArray.h"
00019 #include "vtkCommand.h"
00020 #include "MainFrm.h"
00021 #include "vtkLoopSubdivisionFilter.h"
00022 #include "vtkLinearSubdivisionFilter.h"
00023 #include "vtkButterflySubdivisionFilter.h"
00024 #include "vtkSQ3SubdivisionFilter.h"
00025
00026 #ifdef _DEBUG
00027 #define new DEBUG_NEW
00028 #endif
00029
00030 bool first = TRUE;
00031
00032
00033
00034
00035 IMPLEMENT_DYNCREATE(CvtkSq3SubdivisionView, CView)
00036
00037 BEGIN_MESSAGE_MAP(CvtkSq3SubdivisionView, CView)
00038
00039 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
00040 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
00041 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
00042 ON_WM_CREATE()
00043 ON_WM_SIZE()
00044 ON_WM_ERASEBKGND()
00045 ON_WM_HSCROLL()
00046 ON_BN_CLICKED(IDC_BUTTON1, OnClick)
00047 ON_BN_CLICKED(IDC_BUTTON2, OnClick)
00048 ON_BN_CLICKED(IDC_BUTTON3, OnClick)
00049 ON_BN_CLICKED(IDC_BUTTON4, OnClick)
00050 END_MESSAGE_MAP()
00051
00052
00053
00054 CvtkSq3SubdivisionView::CvtkSq3SubdivisionView()
00055 {
00056 first = TRUE;
00057 }
00058
00059 CvtkSq3SubdivisionView::~CvtkSq3SubdivisionView()
00060 {
00061
00062 if (!first)
00063 {this->ren->Delete();
00064 this->iren->Delete();
00065 this->renWin->Delete();
00066 this->loopFilter->Delete();
00067 this->linearFilter->Delete();
00068 this->butterflyFilter->Delete();
00069 this->sq3Filter->Delete();
00070 this->ac->Delete();
00071 }
00072
00073 }
00074
00075 BOOL CvtkSq3SubdivisionView::PreCreateWindow(CREATESTRUCT& cs)
00076 {
00077
00078
00079
00080 return CView::PreCreateWindow(cs);
00081 }
00082
00083
00084
00085 void CvtkSq3SubdivisionView::OnDraw(CDC* pDC)
00086 {
00087 CvtkSq3SubdivisionDoc* pDoc = GetDocument();
00088 ASSERT_VALID(pDoc);
00089
00090 if (first)
00091 {
00092
00093 this->ren = vtkRenderer::New();
00094 this->renWin = vtkWin32OpenGLRenderWindow::New();
00095 this->iren = vtkWin32RenderWindowInteractor::New();
00096
00097
00098 {
00099 importer = VTK3DSOurImporter::New();
00100 importer->SetPolys("triangle");
00101 importer->ComputeNormalsOn();
00102 importer->SetFileName(pDoc->fname);
00103 importer->Read();
00104
00105 ac = importer->GetRenderer()->GetActors();
00106
00107 ac->InitTraversal();
00108 vtkActor *dsActor=ac->GetNextActor();
00109
00110 loopFilter = vtkLoopSubdivisionFilter::New();
00111 linearFilter = vtkLinearSubdivisionFilter::New();
00112 butterflyFilter = vtkButterflySubdivisionFilter::New();
00113 sq3Filter = vtkSQ3SubdivisionFilter::New();
00114
00115 while (dsActor!=NULL) {
00116 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00117
00118 loopFilter->SetInput(polyData);
00119 loopFilter->SetNumberOfSubdivisions(0);
00120 linearFilter->SetInput(polyData);
00121 linearFilter->SetNumberOfSubdivisions(0);
00122 butterflyFilter->SetInput(polyData);
00123 butterflyFilter->SetNumberOfSubdivisions(0);
00124 sq3Filter->SetInput(polyData);
00125 sq3Filter->SetNumberOfSubdivisions(0);
00126
00127 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00128 mapper->SetInput(butterflyFilter->GetOutput());
00129 vtkActor *actor = vtkActor::New();
00130
00131 actor->SetMapper(mapper);
00132 actor->SetProperty(dsActor->GetProperty());
00133 ren->AddActor(actor);
00134 dsActor=ac->GetNextActor();
00135 }
00136 }
00137
00138 this->renWin->AddRenderer(this->ren);
00139
00140 this->renWin->SetParentId(this->m_hWnd);
00141 this->iren->SetRenderWindow(this->renWin);
00142
00143 first = FALSE;
00144
00145
00146 }
00147
00148 if ( !this->iren->GetInitialized() )
00149 {
00150 CRect rect;
00151
00152 this->GetClientRect(&rect);
00153 this->iren->Initialize();
00154 this->renWin->SetSize(rect.right-rect.left,rect.bottom-rect.top);
00155 this->renWin->SetPosition(0,0);
00156
00157 this->ren->ResetCamera();
00158 }
00159
00160
00161 Pipeline();
00162
00163 this->renWin->Render();
00164
00165 }
00166
00167
00168
00169
00170 BOOL CvtkSq3SubdivisionView::OnPreparePrinting(CPrintInfo* pInfo)
00171 {
00172
00173 return DoPreparePrinting(pInfo);
00174 }
00175
00176 void CvtkSq3SubdivisionView::OnBeginPrinting(CDC* , CPrintInfo* )
00177 {
00178
00179 }
00180
00181 void CvtkSq3SubdivisionView::OnEndPrinting(CDC* , CPrintInfo* )
00182 {
00183
00184 }
00185
00186
00187
00188
00189 #ifdef _DEBUG
00190 void CvtkSq3SubdivisionView::AssertValid() const
00191 {
00192 CView::AssertValid();
00193 }
00194
00195 void CvtkSq3SubdivisionView::Dump(CDumpContext& dc) const
00196 {
00197 CView::Dump(dc);
00198 }
00199
00200 CvtkSq3SubdivisionDoc* CvtkSq3SubdivisionView::GetDocument() const
00201 {
00202 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CvtkSq3SubdivisionDoc)));
00203 return (CvtkSq3SubdivisionDoc*)m_pDocument;
00204 }
00205 #endif //_DEBUG
00206
00207
00208 int CvtkSq3SubdivisionView::OnCreate(LPCREATESTRUCT lpCreateStruct)
00209 {
00210 if (CView::OnCreate(lpCreateStruct) == -1)
00211 return -1;
00212
00213 m_trackbar.Create(WS_CHILD|WS_VISIBLE|TBS_AUTOTICKS|TBS_BOTTOM|TBS_HORZ, CRect(0,0,150,33), this, IDC_TRACKBAR);
00214 m_trackbar.SetRange(0,5,TRUE);
00215 m_trackbar.SetTicFreq(1);
00216 m_trackbar.SetLineSize(1);
00217 m_trackbar.SetPageSize(1);
00218 m_button1.Create("Linear", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(150,0,250,33), this, IDC_BUTTON1);
00219 m_button2.Create("Butterfly", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(250,0,350,33), this, IDC_BUTTON2);
00220 m_button3.Create("Loop", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(350,0,450,33), this, IDC_BUTTON3);
00221 m_button4.Create("Square3", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(450,0,550,33), this, IDC_BUTTON4);
00222 CheckDlgButton(IDC_BUTTON1, BST_CHECKED);
00223
00224
00225
00226
00227
00228
00229
00230 return 0;
00231 }
00232
00233 void CvtkSq3SubdivisionView::OnSize(UINT nType, int cx, int cy)
00234 {
00235 CView::OnSize(nType, cx, cy);
00236
00237 CRect rect;
00238 if (!first)
00239 {this->GetClientRect(&rect);
00240 this->renWin->SetSize(rect.right-rect.left,rect.bottom-rect.top);
00241 }
00242 }
00243
00244 BOOL CvtkSq3SubdivisionView::OnEraseBkgnd(CDC* pDC)
00245 {
00246
00247
00248
00249 return TRUE;
00250 }
00251
00252 LRESULT CvtkSq3SubdivisionView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
00253 {
00254 switch (message)
00255 {
00256
00257 case WM_LBUTTONDOWN:
00258 case WM_LBUTTONUP:
00259 case WM_MBUTTONDOWN:
00260 case WM_MBUTTONUP:
00261 case WM_RBUTTONDOWN:
00262 case WM_RBUTTONUP:
00263 case WM_MOUSEMOVE:
00264 case WM_CHAR:
00265 case WM_TIMER:
00266 if (!first)
00267 {if (this->iren->GetInitialized())
00268 {
00269 return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam, this->iren);
00270 }}
00271 break;
00272 }
00273
00274
00275 return CView::WindowProc(message, wParam, lParam);
00276 }
00277
00278 void CvtkSq3SubdivisionView::Pipeline ( void )
00279 {
00280 }
00281
00282
00283 void CvtkSq3SubdivisionView::OnClick ()
00284 {
00285 if (m_button1.GetState() != 0)
00286 {
00287 linearFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00288 linearFilter->Update();
00289 ac = ren->GetActors();
00290 ac->InitTraversal();
00291 vtkActor *dsActor2=ac->GetNextActor();
00292
00293
00294 ac = importer->GetRenderer()->GetActors();
00295 ac->InitTraversal();
00296 vtkActor *dsActor=ac->GetNextActor();
00297
00298 while (dsActor!=NULL) {
00299 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00300
00301 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00302 mapper->SetInput(linearFilter->GetOutput());
00303 vtkActor *actor = vtkActor::New();
00304
00305 dsActor2->SetMapper(mapper);
00306 dsActor2->SetProperty(dsActor->GetProperty());
00307
00308 dsActor=ac->GetNextActor();
00309 }
00310
00311 Invalidate();
00312 }
00313
00314 if (m_button2.GetState() != 0)
00315 {
00316 butterflyFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00317 butterflyFilter->Update();
00318 ac = ren->GetActors();
00319 ac->InitTraversal();
00320 vtkActor *dsActor2=ac->GetNextActor();
00321
00322
00323 ac = importer->GetRenderer()->GetActors();
00324 ac->InitTraversal();
00325 vtkActor *dsActor=ac->GetNextActor();
00326
00327 while (dsActor!=NULL) {
00328 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00329
00330 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00331 mapper->SetInput(butterflyFilter->GetOutput());
00332 vtkActor *actor = vtkActor::New();
00333
00334 dsActor2->SetMapper(mapper);
00335 dsActor2->SetProperty(dsActor->GetProperty());
00336
00337 dsActor=ac->GetNextActor();
00338 }
00339
00340 Invalidate();
00341 }
00342
00343 if (m_button3.GetState() != 0)
00344 {
00345 loopFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00346 loopFilter->Update();
00347 ac = ren->GetActors();
00348 ac->InitTraversal();
00349 vtkActor *dsActor2=ac->GetNextActor();
00350
00351
00352 ac = importer->GetRenderer()->GetActors();
00353 ac->InitTraversal();
00354 vtkActor *dsActor=ac->GetNextActor();
00355
00356 while (dsActor!=NULL) {
00357 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00358
00359 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00360 mapper->SetInput(loopFilter->GetOutput());
00361 vtkActor *actor = vtkActor::New();
00362
00363 dsActor2->SetMapper(mapper);
00364 dsActor2->SetProperty(dsActor->GetProperty());
00365
00366 dsActor=ac->GetNextActor();
00367 }
00368
00369 Invalidate();
00370 }
00371
00372 if (m_button4.GetState() != 0)
00373 {
00374 loopFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00375 loopFilter->Update();
00376 ac = ren->GetActors();
00377 ac->InitTraversal();
00378 vtkActor *dsActor2=ac->GetNextActor();
00379
00380
00381 ac = importer->GetRenderer()->GetActors();
00382 ac->InitTraversal();
00383 vtkActor *dsActor=ac->GetNextActor();
00384
00385 while (dsActor!=NULL) {
00386 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00387
00388 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00389 mapper->SetInput(sq3Filter->GetOutput());
00390 vtkActor *actor = vtkActor::New();
00391
00392 dsActor2->SetMapper(mapper);
00393 dsActor2->SetProperty(dsActor->GetProperty());
00394
00395 dsActor=ac->GetNextActor();
00396 }
00397
00398 Invalidate();
00399 }
00400
00401 }
00402
00403 void CvtkSq3SubdivisionView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
00404 {
00405
00406
00407 int currentNumber = loopFilter->GetNumberOfSubdivisions();
00408
00409
00410 {
00411 if (m_button1.GetState() != 0)
00412 {
00413 linearFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00414 linearFilter->Update();
00415 ac = ren->GetActors();
00416 ac->InitTraversal();
00417 vtkActor *dsActor2=ac->GetNextActor();
00418
00419
00420 ac = importer->GetRenderer()->GetActors();
00421 ac->InitTraversal();
00422 vtkActor *dsActor=ac->GetNextActor();
00423
00424 while (dsActor!=NULL) {
00425 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00426
00427 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00428 mapper->SetInput(linearFilter->GetOutput());
00429 vtkActor *actor = vtkActor::New();
00430
00431 dsActor2->SetMapper(mapper);
00432 dsActor2->SetProperty(dsActor->GetProperty());
00433
00434 dsActor=ac->GetNextActor();
00435 }
00436
00437 Invalidate();
00438 }
00439
00440 if (m_button2.GetState() != 0)
00441 {
00442 butterflyFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00443 butterflyFilter->Update();
00444 ac = ren->GetActors();
00445 ac->InitTraversal();
00446 vtkActor *dsActor2=ac->GetNextActor();
00447
00448
00449 ac = importer->GetRenderer()->GetActors();
00450 ac->InitTraversal();
00451 vtkActor *dsActor=ac->GetNextActor();
00452
00453 while (dsActor!=NULL) {
00454 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00455
00456 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00457 mapper->SetInput(butterflyFilter->GetOutput());
00458 vtkActor *actor = vtkActor::New();
00459
00460 dsActor2->SetMapper(mapper);
00461 dsActor2->SetProperty(dsActor->GetProperty());
00462
00463 dsActor=ac->GetNextActor();
00464 }
00465
00466 Invalidate();
00467 }
00468
00469 if (m_button3.GetState() != 0)
00470 {
00471 loopFilter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00472 loopFilter->Update();
00473 ac = ren->GetActors();
00474 ac->InitTraversal();
00475 vtkActor *dsActor2=ac->GetNextActor();
00476
00477
00478 ac = importer->GetRenderer()->GetActors();
00479 ac->InitTraversal();
00480 vtkActor *dsActor=ac->GetNextActor();
00481
00482 while (dsActor!=NULL) {
00483 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00484
00485 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00486 mapper->SetInput(loopFilter->GetOutput());
00487 vtkActor *actor = vtkActor::New();
00488
00489 dsActor2->SetMapper(mapper);
00490 dsActor2->SetProperty(dsActor->GetProperty());
00491
00492 dsActor=ac->GetNextActor();
00493 }
00494
00495 Invalidate();
00496 }
00497
00498 if (m_button4.GetState() != 0)
00499 {
00500 sq3Filter->SetNumberOfSubdivisions(m_trackbar.GetPos());
00501 sq3Filter->Update();
00502 ac = ren->GetActors();
00503 ac->InitTraversal();
00504 vtkActor *dsActor2=ac->GetNextActor();
00505
00506
00507 ac = importer->GetRenderer()->GetActors();
00508 ac->InitTraversal();
00509 vtkActor *dsActor=ac->GetNextActor();
00510
00511 while (dsActor!=NULL) {
00512 vtkPolyData *polyData = (vtkPolyData*)(dsActor->GetMapper()->GetInputAsDataSet());
00513
00514 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
00515 mapper->SetInput(sq3Filter->GetOutput());
00516 vtkActor *actor = vtkActor::New();
00517
00518 dsActor2->SetMapper(mapper);
00519 dsActor2->SetProperty(dsActor->GetProperty());
00520
00521 dsActor=ac->GetNextActor();
00522 }
00523
00524 Invalidate();
00525 }
00526 }
00527
00528 CView::OnHScroll(nSBCode, nPos, pScrollBar);
00529 }