fshake3d  0.0.1
FreeformDensity3DSurfaceEditor
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines
ui_SceneEditor.cpp
Go to the documentation of this file.
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 }