00001
00023
00165
00166
00167
00168
00232
00233
00234
00235 #ifndef _vuMarchingCubesUtility_h_
00236 #define _vuMarchingCubesUtility_h_
00237
00238 #include <wx/textctrl.h>
00239 #include <wx/checkbox.h>
00240 #include <wx/button.h>
00241 #include <wx/notebook.h>
00242 #include <wx/artprov.h>
00243 #include <wx/colour.h>
00244 #include <wx/colordlg.h>
00245 #include <wx/cmndata.h>
00246 #include <wx/imaglist.h>
00247 #include <wx/dcclient.h>
00248
00249 #include <math.h>
00250 #include <stdlib.h>
00251 #include <map>
00252
00253 #include "../vuBasicUtility.h"
00254 #include "../../wxUIElements/vuTransferDialog.h"
00255 #include "Volume/Regular/Unimodal/3d/2B/Threshold/MarchingCubes/MarchingCubes.h"
00256 #include "vuTFunc/vuTFDesign.h"
00257 #include "vuVector.h"
00258
00259
00260
00261
00262
00271 template<class t>
00272 class vuMCDecorator
00273 {
00274
00275 public:
00276
00278 virtual void operator()(t val) = 0;
00279
00280 };
00281
00282
00283
00284
00285
00286
00287
00288
00290 #define VU_MC_MAX_WIDGETS 100
00291
00292
00316 class vuMCWidget : public wxPanel
00317 {
00318
00319 public:
00320
00321 enum {
00322 typeBox,
00323 typeStaticBox,
00324 typeGrid
00325 };
00326
00327 private:
00328
00329 int _sizerType;
00330
00331 wxSizer* _sizer;
00332
00333 public:
00334
00336 vuMCWidget() {}
00337 vuMCWidget(wxWindow* p, int orient=wxVERTICAL, int type=typeBox, int hgap=5, int cols=4, int vgap=0);
00339 virtual ~vuMCWidget();
00340
00341 wxSizer* Sizer();
00342
00343 public:
00344 DECLARE_DYNAMIC_CLASS(vuMCWidget);
00345 DECLARE_EVENT_TABLE();
00346
00347 };
00348
00349
00354 class vuMCKeyValue : public vuMCWidget
00355 {
00356
00357 private:
00358
00360 GLfloat _value;
00362 wxStaticText* _key;
00364 wxStaticText* _valueText;
00365
00366 protected:
00367
00369 const char* _format;
00370
00371 private:
00372
00373 public:
00374
00376 vuMCKeyValue() {}
00377 vuMCKeyValue(wxWindow* p, const char* key, const char* format, GLfloat val=0);
00379 virtual ~vuMCKeyValue();
00380
00382 virtual void operator=(GLfloat v);
00383 virtual void operator+=(GLfloat v);
00384 virtual void operator-=(GLfloat v);
00386 void Label(wxString txt);
00387
00389 inline operator GLfloat();
00390
00391 public:
00392 DECLARE_DYNAMIC_CLASS(vuMCKeyValue);
00393 DECLARE_EVENT_TABLE();
00394
00395 };
00396
00397
00398 #define VU_MCKV_MAX_SIZE 8
00399
00411 class vuMCKeyVector : public vuMCKeyValue
00412 {
00413 private:
00414
00415 GLfloat _vector[VU_MCKV_MAX_SIZE];
00416
00418 int _size;
00423 int _pos;
00424
00425 wxString _mylabel;
00426
00428 void _updateLabel();
00429
00430 public:
00431
00433 vuMCKeyVector() {}
00435 vuMCKeyVector(wxWindow* p, const char* key, int size, const char* format);
00437 virtual ~vuMCKeyVector();
00438
00440 void operator()(int n, GLfloat val);
00441 GLfloat Get(int i);
00442
00444 operator const GLfloat*();
00445
00447 void Inc(int n, GLfloat val);
00448
00454 vuMCKeyVector& operator[](int n);
00455
00457 virtual void operator=(GLfloat v);
00458
00460 void operator+=(GLfloat val);
00462 void operator-=(GLfloat val);
00463
00464 public:
00465 DECLARE_DYNAMIC_CLASS(vuMCKeyVector);
00466 DECLARE_EVENT_TABLE();
00467
00468 };
00469
00470
00472 #define VU_MCBF_MAX_SIZE 32
00473
00474
00481 class vuMCBitField : public vuMCWidget
00482 {
00483 public:
00484
00485 enum {
00486 idMCBFCheckboxes = 13000,
00487 idMCBFSlider = idMCBFCheckboxes+VU_MCBF_MAX_SIZE,
00488 idMCBFLast
00489 };
00490
00491 private:
00492
00494 vuMCDecorator<int>* _callback;
00496 const char* _titleString;
00498 wxStaticText* _title;
00500 int _size;
00502 wxCheckBox* _checkboxes[VU_MCBF_MAX_SIZE];
00508 wxSlider* _slider;
00514 int _pos;
00515
00516 void _setTitle(int val);
00518 void _setCheckboxes(int val);
00519
00520 public:
00521
00523 vuMCBitField() {}
00525 vuMCBitField(wxWindow* p, const char* title, vuMCDecorator<int>* cb, int size, int init);
00527 virtual ~vuMCBitField();
00528
00530 void operator=(int val);
00532 void operator()(int n, bool val);
00534 operator int();
00536 vuMCBitField& operator[](int n);
00538 void operator=(bool val);
00539
00541 void OnCheckboxClicked(wxCommandEvent& event);
00543 void OnScroll(wxScrollEvent& event);
00544
00545 public:
00546 DECLARE_DYNAMIC_CLASS(vuMCBitField);
00547 DECLARE_EVENT_TABLE();
00548
00549 };
00550
00551
00555 #define VU_MCGC_SLIDER_MAX 100
00556
00557
00564 class vuMCGrayColor : public vuMCWidget
00565 {
00566
00567 public:
00568
00569 enum {
00570 idMCGCSlider = vuMCBitField::idMCBFLast,
00571 idMCGCLast
00572 };
00573
00574 private:
00575
00577 float _glColor[4];
00579 wxStaticText* _title;
00581 wxPanel* _color;
00583 wxStaticText* _colorText;
00585 wxSlider* _slider;
00587 vuMCDecorator<float>* _callback;
00588
00589 void _setColor(float col);
00590
00591 public:
00592
00594 vuMCGrayColor() {}
00595 vuMCGrayColor(wxWindow* p, const char* title,
00596 vuMCDecorator<float>* cb, float color);
00598 virtual ~vuMCGrayColor();
00599
00601 operator float*();
00602
00603 void OnScroll(wxScrollEvent& event);
00604
00605 public:
00606 DECLARE_DYNAMIC_CLASS(vuMCGrayColor);
00607 DECLARE_EVENT_TABLE();
00608
00609 };
00610
00611
00612 #define VU_MCRGB_SLIDER_MAX 100
00613
00620 class vuMCRGBColor : public vuMCWidget
00621 {
00622
00623 public:
00624
00625 enum {
00626 idMCRGBSlider = vuMCGrayColor::idMCGCLast,
00627 idMCRGBButton,
00628 idMCRGBLast
00629 };
00630
00631 private:
00632
00633 GLfloat _glColor[4];
00634
00635 wxStaticText* _title;
00636 wxButton* _color;
00637 wxSlider* _slider;
00638 wxStaticText* _colorText;
00639
00640 vuMCDecorator<float>* _callback;
00641
00642
00643 void _setColor(wxColour& col);
00644 void _setColor();
00645 void _setText();
00646
00647 void _OnScroll(wxCommandEvent& event);
00648
00649 public:
00650
00652 vuMCRGBColor() {}
00653 vuMCRGBColor(wxWindow* p, const char* title,
00654 vuMCDecorator<float>* cb, wxColour c, float a);
00656 virtual ~vuMCRGBColor();
00657
00659 void operator=(wxColour& c);
00661 operator GLfloat*();
00662 vuVector tovuVector();
00663
00664 GLfloat Red();
00665 GLfloat Green();
00666 GLfloat Blue();
00667 GLfloat Alpha();
00668
00669 void OnButton(wxCommandEvent& event);
00670 void OnScroll(wxScrollEvent& event);
00671
00672 public:
00673 DECLARE_DYNAMIC_CLASS(vuMCRGBColor);
00674 DECLARE_EVENT_TABLE();
00675
00676 };
00677
00678
00679 #define VU_MCS_SLIDER_MAX 100
00680 #define VU_MCS_CONTINUOUS_UPDATE true
00681 #define VU_MCS_END_UPDATE false
00682
00687 class vuMCSlider : public vuMCWidget
00688 {
00689
00690 public:
00691
00692 enum {
00693 idMCSSlider = vuMCRGBColor::idMCRGBLast,
00694 idMCSLast
00695 };
00696
00697 private:
00698
00699 float _min;
00700 float _max;
00701 int _slMax;
00702
00703 wxStaticText* _title;
00704 const char* _format;
00705 wxStaticText* _value;
00706 wxSlider* _slider;
00707
00708 vuMCDecorator<float>* _callback;
00709
00710 bool _updateMode;
00711
00712 void _setText(float val);
00713 void _setValue(float val);
00714 float _getValue();
00715
00716 public:
00717
00719 vuMCSlider() {}
00720 vuMCSlider(wxWindow* p, const char* title, const char* format,
00721 vuMCDecorator<float>* cb, float min, float max, float val,
00722 int slMax = VU_MCS_SLIDER_MAX, bool cont = VU_MCS_CONTINUOUS_UPDATE);
00724 virtual ~vuMCSlider();
00725
00727 operator float();
00729 void operator=(float val);
00730
00732 float Min();
00734 void Min(float min);
00735
00737 float Max();
00739 void Max(float max);
00740
00742 const char* Format();
00744 void Format(const char* f);
00745
00747 bool UpdateMode();
00749 void UpdateMode(bool mode);
00750
00751 void OnScroll(wxScrollEvent& event);
00752
00753 public:
00754 DECLARE_DYNAMIC_CLASS(vuMCSlider);
00755 DECLARE_EVENT_TABLE();
00756
00757 };
00758
00759
00760 class vuMCHistogram;
00761
00762
00766 #define HC_UPDATE_WATERMARK 500
00767
00768
00774 class _HistoCanvas : public wxPanel
00775 {
00776
00777 private:
00778
00783 int _min;
00788 int _max;
00793 int _vmax;
00795 float _vpp;
00797 float _ppe;
00799 map<int, int> _histo;
00801 vuMCHistogram* _callback;
00803 int _updateCounter;
00806 bool _delayedUpdate;
00808 int _idx;
00810 int _selected;
00812 wxColour _selColor;
00813
00814 public:
00815
00817 _HistoCanvas();
00818 _HistoCanvas(vuMCHistogram* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition,
00819 const wxSize& size = wxDefaultSize);
00820 virtual ~_HistoCanvas();
00821
00825 void Reset();
00840 void Inc(int n, int val);
00841
00842 void SetSelColor(wxColour &c);
00843
00844 void Select(int idx);
00845
00846 void DelayedUpdate(bool m);
00847 bool DelayedUpdate();
00848
00849 void OnPaint(wxPaintEvent& event);
00850
00851 void OnMotion(wxMouseEvent& event);
00852
00853 void OnMouse(wxMouseEvent& event);
00854
00855 DECLARE_DYNAMIC_CLASS(_HistoCanvas);
00856 DECLARE_EVENT_TABLE();
00857
00858 };
00859
00860
00865 class vuMCHistogram : public vuMCWidget
00866 {
00867
00868 public:
00869
00870 enum {
00871 idMCHPaint = vuMCSlider::idMCSLast,
00872 idCbxDelayedUpdate,
00873 idClkHistogram,
00874 idMCHLast
00875 };
00876
00877 private:
00878
00880 wxCheckBox *_delayedUpdate;
00882 wxWindow *_parent;
00884 _HistoCanvas *_histoDC;
00887 wxStaticText *_desc;
00888
00889 vuMCDecorator<int>* _callback;
00890
00891 public:
00892
00894 vuMCHistogram() {}
00895
00896 vuMCHistogram(wxWindow* p, wxSize size, vuMCDecorator<int>* cb = NULL);
00898 virtual ~vuMCHistogram();
00899
00900 void Clear();
00901
00902 void Flush();
00903
00904 void Inc(int i, int val=1);
00905
00906 void SetSelColor(vuVector c);
00907 void SetSelColor(wxColour &c);
00908
00909 void Select(int type);
00910
00911 void OnTextChange(wxString txt);
00912
00913 void OnClicked(int idx);
00914
00915 void OnDelayedUpdateChecked(wxCommandEvent &event);
00916
00917 DECLARE_DYNAMIC_CLASS(vuMCHistogram);
00918 DECLARE_EVENT_TABLE();
00919
00920 };
00921
00922
00923
00924
00925
00926
00927
00928 class vuMCMCBProgressCallback;
00929
00930 class vuMCMCBHistoCallback;
00931
00932 #define MC_DEFAULT_LIGHT1_ENABLED false
00933 #define MC_DEFAULT_FPS_WATERMARK 10
00934 #define MC_DEFAULT_DRAW_FRAME true
00935 #define MC_DEFAULT_DRAW_NORMALS false
00936
00957 class vuMarchingCubes : public vuBasicUtility
00958 {
00959 private:
00960 friend class vuMCMCBProgressCallback;
00961 friend class vuMCMCBHistoCallback;
00962
00963 public:
00964 enum {
00965 idMCFirst = vuMCHistogram::idMCHLast,
00966 idMCCbxCubeEnabled,
00967 idMCCbxLight1Enabled,
00968 idMCCbxDrawFrame,
00969 idMCCbxDrawLines,
00970 idMCRbxRotate,
00971 idMCCbxCullLinesFrontBack,
00972 idMCCbxUpdateMode,
00973 idMCCbxMeshStatisitcs,
00974 idMCCbxDrawNormals,
00975 idMCBtnUpdate
00976 };
00977
00978 public:
00980 vuMarchingCubes();
00982 virtual ~vuMarchingCubes();
00983
00985 static const char* getFileType();
00986
00987 public:
00989 bool init(const char* DataFile);
00991 virtual void addTop(wxSizer *sizer);
00993 virtual void addRight(wxSizer *sizer);
00995 wxPanel* createInfoNotebook(wxNotebook* nb);
00996 wxPanel* createSettingsNotebook(wxNotebook* nb);
00997 wxPanel* createGLNotebook(wxNotebook* nb);
00998 wxPanel* createHelpNotebook(wxNotebook* nb);
00999
01001 virtual vuCamera* getCamera ();
01003 void setCamera(vuCamera* cam);
01005 virtual vuImage* getCurrentImage ();
01007 virtual void DrawFromImage ();
01009 virtual void DrawAgain ();
01010
01011 protected:
01012
01014 vu1 *vuMarchingCubes::getVolume();
01015
01017 bool glInit();
01019 void glResize();
01022 void glRender();
01023
01024 private:
01026 vu1* m_Data;
01033 MarchingCubesBase *m_base;
01034
01036 MCGlobalData m_gd;
01037
01039 wxImageList *m_imageList;
01040
01042 vuMCSlider *m_thres;
01043 #if defined LINUX
01044
01045 wxButton *m_update;
01046 #endif
01047
01048 vuMCKeyValue *m_cubesTotal;
01050 vuMCKeyValue *m_cube0;
01052 vuMCKeyValue *m_cube255;
01054 vuMCKeyValue *m_cubeOther;
01056 vuMCHistogram *m_cubeHist;
01057 vuMCKeyVector *m_size;
01059 vuMCKeyVector *m_angle;
01061 vuMCKeyVector *m_pos;
01062 vuMCKeyValue *m_zoom;
01064 vuMCKeyVector *m_light0Pos;
01066 wxCheckBox *m_light1Enabled;
01068 vuMCKeyVector *m_light1Pos;
01069 vuMCKeyValue *m_numTriangles;
01070 vuMCKeyValue *m_numVertices;
01071 vuMCKeyValue *m_numIndices;
01073 vuMCKeyValue *m_meshSize;
01074
01076 wxStaticText *m_statusText;
01077 wxGauge *m_status;
01078
01080 vuMCRGBColor *m_backColor;
01081 vuMCRGBColor *m_lightColor;
01082 vuMCGrayColor *m_lightDiffuse;
01083 vuMCGrayColor *m_lightSpecular;
01084 vuMCGrayColor *m_lightShiny;
01085 vuMCRGBColor *m_frameColor;
01086 vuMCRGBColor *m_lineColor;
01087 vuMCRGBColor *m_selectColor;
01088 vuMCRGBColor *m_objectColor;
01089 vuMCGrayColor *m_objectDiffuse;
01090 vuMCGrayColor *m_objectSpecular;
01091 vuMCGrayColor *m_objectShiny;
01092
01093 vuMCSlider *m_mouseSpeed;
01094 wxCheckBox *m_drawFrame;
01095 wxCheckBox *m_cullBack;
01096 wxCheckBox *m_cullFront;
01097 wxCheckBox *m_linesBack;
01098 wxCheckBox *m_linesFront;
01099 vuMCSlider *m_frameRadius;
01100 wxRadioBox *m_rotateX;
01101 wxRadioBox *m_rotateY;
01102 wxRadioBox *m_rotateZ;
01103 wxCheckBox *m_updateMode;
01104 wxCheckBox *m_doMeshStatistics;
01105 wxCheckBox *m_cubeEnabled;
01107 vuMCBitField *m_cube;
01108 wxCheckBox *m_drawNormals;
01109 vuMCSlider *m_drawNormalsSize;
01110 vuMCSlider *m_cubeSizeX;
01111 vuMCSlider *m_cubeSizeY;
01112 vuMCSlider *m_cubeSizeZ;
01113
01114 int m_fpsTime;
01115 int m_fpsCount;
01116 vuMCSlider *m_fpsWatermark;
01117 float m_fps;
01118 float m_avgFps;
01119
01120 GLdouble x1, y1, z1;
01121 GLdouble x2, y2, z2;
01122
01123 protected:
01124
01126 void OnChar(wxKeyEvent& event);
01128 void glOnMouse(wxMouseEvent &event);
01139 void onMouseLeftMoving(wxMouseEvent &event);
01140 void onMouseRightMoving(wxMouseEvent &event);
01141 void onMouseDown(wxMouseEvent &event);
01142 void onMouseUp(wxMouseEvent &event);
01149 void onDblClick(wxMouseEvent &event);
01150
01151 void OnLight1Checked(wxCommandEvent &event);
01152 void OnCubeEnabledChecked(wxCommandEvent &event);
01153 void OnFrameChecked(wxCommandEvent &event);
01154 void OnRotateChecked(wxCommandEvent &event);
01155 void OnCullLinesFrontBackChecked(wxCommandEvent &event);
01156 void OnUpdateModeChecked(wxCommandEvent &event);
01157 #ifdef LINUX
01158 void OnUpdateClicked(wxCommandEvent &event);
01159 #endif
01160 void OnDrawNormalsChecked(wxCommandEvent &event);
01161
01162 public:
01163
01165 void redraw();
01167 void resize();
01169 void OnCubeChange(int val);
01170
01171 void setBackground();
01172
01174 void OnProgress(float v);
01176 void OnChangeFrame();
01177 void OnThresChange();
01178 void OnNormalLengthChange(float l);
01179 void OnSetObjectColor();
01180 void OnSetLineColor();
01181 void OnCubeSizeChange();
01182 void OnSelectType(int n);
01183
01184 private:
01185
01187 void rotate(float ax, float ay);
01188
01190 inline wxString format(double val) { return wxString::Format("%0.3f", val); }
01191
01192 void doThresChange();
01193 void doResetThres();
01194
01199 inline int outside(vuVector &point, double *size);
01200
01201 public:
01202
01203 DECLARE_EVENT_TABLE()
01204
01205 };
01206
01210 class vuMCMCBProgressCallback : public MCBProgressCallback
01211 {
01212 private:
01213
01214 vuMarchingCubes *_mc;
01215
01216 public:
01217
01218 vuMCMCBProgressCallback(vuMarchingCubes *mc);
01219
01220 virtual void SetText(const char *txt);
01221 virtual void Start();
01222 virtual void Update(int val);
01223 virtual void End();
01224
01225 };
01226
01227 class vuMCMCBHistoCallback : public MCBHistoCallback
01228 {
01229
01230 private:
01231
01232 vuMarchingCubes *_mc;
01233
01234 public:
01235
01236 vuMCMCBHistoCallback(vuMarchingCubes *mc);
01237
01238 virtual void Clear();
01239 virtual void Inc(int idx, int val = 1);
01240 virtual void Flush();
01241
01242 };
01243
01244
01245
01246
01247
01248
01249
01250 class vuMCCubeChange : public vuMCDecorator<int>
01251 {
01252
01253 private:
01254
01255 vuMarchingCubes* _mc;
01256
01257 public:
01258
01260 vuMCCubeChange(vuMarchingCubes* mc);
01261
01263 virtual void operator()(int c);
01264
01265 };
01266
01267
01268 class vuMCRender : public vuMCDecorator<float>
01269 {
01270
01271 private:
01272
01273 vuMarchingCubes* _mc;
01274
01276 vuMCRender() {}
01277
01278 public:
01279
01281 vuMCRender(vuMarchingCubes* mc);
01282
01284 virtual void operator()(float);
01285
01286 };
01287
01288
01289 class vuMCResize : public vuMCDecorator<int>
01290 {
01291
01292 private:
01293
01294 vuMarchingCubes* _mc;
01295
01297 vuMCResize() {}
01298
01299 public:
01300
01302 vuMCResize(vuMarchingCubes* mc);
01303
01305 virtual void operator()(int);
01306
01307 };
01308
01309
01310 class vuMCBackgroundChange : public vuMCDecorator<float>
01311 {
01312
01313 private:
01314
01315 vuMarchingCubes* _mc;
01316
01318 vuMCBackgroundChange() {}
01319
01320 public:
01321
01323 vuMCBackgroundChange(vuMarchingCubes* mc);
01324
01326 virtual void operator()(float);
01327
01328 };
01329
01330
01331 class vuMCProgress : public vuMCDecorator<float>
01332 {
01333
01334 private:
01335
01336 vuMarchingCubes* _mc;
01337
01339 vuMCProgress() {}
01340
01341 public:
01342
01343 vuMCProgress(vuMarchingCubes* mc);
01344
01345 virtual void operator()(float);
01346
01347 };
01348
01349
01350 class vuMCFrameChange : public vuMCDecorator<float>
01351 {
01352
01353 private:
01354
01355 vuMarchingCubes* _mc;
01356
01358 vuMCFrameChange() {}
01359
01360 public:
01361
01362 vuMCFrameChange(vuMarchingCubes* mc);
01363
01364 virtual void operator()(float);
01365
01366 };
01367
01368
01369 class vuMCThresChange : public vuMCDecorator<float>
01370 {
01371
01372 private:
01373
01374 vuMarchingCubes* _mc;
01375
01377 vuMCThresChange();
01378
01379 public:
01380
01381 vuMCThresChange(vuMarchingCubes* mc);
01382
01383 virtual void operator()(float);
01384
01385 };
01386
01387
01388 class vuMCNormalLengthChange : public vuMCDecorator<float>
01389 {
01390
01391 private:
01392
01393 vuMarchingCubes* _mc;
01394
01396 vuMCNormalLengthChange();
01397
01398 public:
01399
01400 vuMCNormalLengthChange(vuMarchingCubes* mc);
01401
01402 virtual void operator()(float);
01403
01404 };
01405
01406
01407 class vuMCObjectColorChange : public vuMCDecorator<float>
01408 {
01409
01410 private:
01411
01412 vuMarchingCubes* _mc;
01413
01415 vuMCObjectColorChange();
01416
01417 public:
01418
01419 vuMCObjectColorChange(vuMarchingCubes* mc);
01420
01421 virtual void operator()(float);
01422
01423 };
01424
01425
01426 class vuMCLineColorChange : public vuMCDecorator<float>
01427 {
01428
01429 private:
01430
01431 vuMarchingCubes* _mc;
01432
01434 vuMCLineColorChange();
01435
01436 public:
01437
01438 vuMCLineColorChange(vuMarchingCubes* mc);
01439
01440 virtual void operator()(float);
01441
01442 };
01443
01444
01445 class vuMCCubeSizeChange : public vuMCDecorator<float>
01446 {
01447
01448 private:
01449
01450 vuMarchingCubes* _mc;
01451
01453 vuMCCubeSizeChange();
01454
01455 public:
01456
01457 vuMCCubeSizeChange(vuMarchingCubes* mc);
01458
01459 virtual void operator()(float);
01460
01461 };
01462
01463
01464 class vuMCSelectType : public vuMCDecorator<int>
01465 {
01466
01467 private:
01468
01469 vuMarchingCubes* _mc;
01470
01472 vuMCSelectType() {}
01473
01474 public:
01475
01477 vuMCSelectType(vuMarchingCubes* mc);
01478
01480 virtual void operator()(int);
01481
01482 };
01483
01484
01485
01486
01487
01488 #endif
01489
01490
01491