fshake3d
0.0.1
FreeformDensity3DSurfaceEditor
|
00001 #include "ui_SceneEditor.hpp" 00002 #include "ui_SceneView.hpp" 00003 00004 SceneEditor::SceneEditor(Scene* pScene) 00005 : mpScene(pScene) 00006 , mViewSize(1.0) 00007 { 00008 SceneViewOrtho* pView0 = new SceneViewOrtho(); 00009 pView0->setScene(pScene); 00010 pView0->setDirection( Vec3d(0,1,0) ); 00011 pView0->setUp( Vec3d(0,0,1) ); 00012 pView0->setDirectionX( Vec3d(1,0,0) ); 00013 pView0->setDirectionY( Vec3d(0,0,1) ); 00014 pView0->setXAxis(0); 00015 pView0->setYAxis(2); 00016 pView0->setFocusPointVar(&mFocusPoint); 00017 pView0->setZoomVar(&mViewSize); 00018 00019 SceneViewOrtho* pView1 = new SceneViewOrtho(); 00020 pView1->setScene(pScene); 00021 pView1->setDirection( Vec3d(-1,0,0) ); 00022 pView1->setUp( Vec3d(0,0,1) ); 00023 00024 pView1->setDirectionX( Vec3d(0,1,0) ); 00025 pView1->setDirectionY( Vec3d(0,0,1) ); 00026 pView1->setXAxis(1); 00027 pView1->setYAxis(2); 00028 pView1->setFocusPointVar(&mFocusPoint); 00029 pView1->setZoomVar(&mViewSize); 00030 00031 00032 SceneViewOrtho* pView2 = new SceneViewOrtho(); 00033 pView2->setScene(pScene); 00034 pView2->setDirection( Vec3d(0,0,-1) ); 00035 pView2->setUp( Vec3d(0,1,0) ); 00036 00037 pView2->setDirectionX( Vec3d(1,0,0) ); 00038 pView2->setDirectionY( Vec3d(0,1,0) ); 00039 pView2->setXAxis(0); 00040 pView2->setYAxis(1); 00041 pView2->setFocusPointVar(&mFocusPoint); 00042 pView2->setZoomVar(&mViewSize); 00043 00044 00045 mpView3 = new SceneViewPerspective(); 00046 mpView3->setScene(pScene); 00047 mpView3->setDirection( Vec3d(0,1,0) ); 00048 mpView3->setUp( Vec3d(0,0,1) ); 00049 mpView3->setFocusPointVar(&mFocusPoint); 00050 mpView3->setZoomVar(&mViewSize); 00051 00052 Vec3d viewBG(0.3,0.4,0.5); 00053 // Vec3d viewBG(0.8,0.8,0.8); 00054 // Vec3d viewBG(0.0,0.0,0.0); 00055 00056 pView0->setBGColor( viewBG ); 00057 pView1->setBGColor( viewBG ); 00058 pView2->setBGColor( viewBG ); 00059 mpView3->setBGColor( viewBG ); 00060 00061 setChildView(0, pView0); 00062 setChildView(1, pView1); 00063 setChildView(2, pView2); 00064 setChildView(3, mpView3); 00065 } 00066 void SceneEditor::setScene(Scene* pScene) 00067 { 00068 mpScene = pScene; 00069 } 00070 void SceneEditor::layoutChildren() 00071 { 00072 CrossSplitter::layoutChildren(); 00073 00074 // get index of biggest child view (determined by split weight) 00075 // will propagate the width/height to its vertical/horizontal neighbors. 00076 00077 int maxIndex; 00078 00079 maxIndex = (mSplit[0] > 0.5) ? 0 : 1; 00080 maxIndex |= (mSplit[1] > 0.5) ? 0 : 2; 00081 00082 SceneView* pMainView = static_cast<SceneView*>( mViews[maxIndex] ); 00083 SceneView* pHNeighbor = static_cast<SceneView*>( mViews[maxIndex^1] ); 00084 SceneView* pVNeighbor = static_cast<SceneView*>( mViews[maxIndex^2] ); 00085 SceneView* pOpposite = static_cast<SceneView*>( mViews[maxIndex^3] ); 00086 00087 double aspect = 1.0; 00088 if (pMainView) 00089 { 00090 aspect = double( pMainView->width() ) / double( pMainView->height() ); 00091 } 00092 00093 double w, h; 00094 00095 if (aspect > 1.0) 00096 { 00097 w = aspect*mViewSize; 00098 h = mViewSize; 00099 } 00100 else 00101 { 00102 w = mViewSize; 00103 h = mViewSize/aspect; 00104 } 00105 00106 if (pMainView) 00107 pMainView -> setProjectionViewSize (Vec2d(w,h)); 00108 if (pHNeighbor) 00109 pHNeighbor -> setProjectionViewHeight(h); 00110 if (pVNeighbor) 00111 pVNeighbor -> setProjectionViewWidth (w); 00112 if ( (pOpposite) && (pHNeighbor) && (pVNeighbor) ) 00113 pOpposite -> setProjectionViewSize (Vec2d( pHNeighbor -> getProjection().getViewWidth(), pVNeighbor -> getProjection().getViewHeight())); 00114 00115 } 00116 00117 void SceneEditor::moveLocal(const Vec3d& direction) 00118 { 00119 00120 Matrix44d t = mpView3->getLookAt().getInverseMatrix(); 00121 Vec3d v = t * direction * getViewSize() * 0.1; 00122 mFocusPoint += v; 00123 } 00124 00125 void SceneEditor::setViewSize(double viewsize) 00126 { 00127 mViewSize = viewsize; 00128 layoutChildren(); 00129 } 00130 00131 void SceneEditor::display() 00132 { 00133 // mpView3->setCameraOffset( Point3d(0, 0, -mpView3->getProjection().getZNear() ) ); 00134 layoutChildren(); 00135 CrossSplitter::display(); 00136 } 00137 00138 void SceneEditor::setRulersVisible(bool visible) 00139 { 00140 for (int i=0;i<3;++i) 00141 if (mViews[i]) 00142 static_cast<SceneViewOrtho*>(mViews[i])->getRuler().setVisible(visible); 00143 }