handlers.cpp

This is an example of how handler classes can be used.

00001 // ------------------------------------------------------------
00002 //
00003 // Ivf++ Ac3D file reader example
00004 //
00005 // ------------------------------------------------------------
00006 //
00007 // Author: Jonas Lindemann
00008 //
00009 
00010 // ------------------------------------------------------------
00011 // Include files
00012 // ------------------------------------------------------------
00013 
00014 #include <ivfui/IvfApplication.h>
00015 #include <ivfui/IvfWindow.h>
00016 
00017 #include <ivf/IvfCamera.h>
00018 #include <ivf/IvfAxis.h>
00019 #include <ivf/IvfScene.h>
00020 #include <ivf/IvfLight.h>
00021 #include <ivf/IvfCube.h>
00022 #include <ivf/IvfSphere.h>
00023 #include <ivf/IvfCylinder.h>
00024 
00025 #include <ivfwidget/IvfMouseViewHandler.h>
00026 #include <ivfwidget/IvfSelectionHandler.h>
00027 #include <ivfwidget/IvfFlyHandler.h>
00028 #include <ivfwidget/IvfSceneHandler.h>
00029 
00030 using namespace std;
00031 
00032 // ------------------------------------------------------------
00033 // Window class definition
00034 // ------------------------------------------------------------
00035 
00036 IvfSmartPointer(CExampleWindow);
00037 
00038 class CExampleWindow: public CIvfWindow,
00039         CIvfInitEvent,
00040         CIvfKeyboardEvent,
00041         CIvfTimeoutEvent,
00042         CIvfSingleSelectionEvent,
00043         CIvfMultipleSelectionEvent
00044 {
00045 private:
00046         CIvfCameraPtr           m_camera;
00047         CIvfScenePtr            m_scene;
00048         CIvfLightPtr            m_light;
00049 
00050         CIvfMouseViewHandlerPtr m_mouseHandler;
00051         CIvfSelectionHandlerPtr m_selectionHandler;
00052         CIvfFlyHandlerPtr               m_flyHandler;
00053         CIvfSceneHandlerPtr             m_sceneHandler;
00054 
00055         double m_angleX;
00056         double m_angleY;
00057         double m_moveX;
00058         double m_moveY;
00059         double m_zoomX;
00060         double m_zoomY;
00061 
00062         int m_beginX;
00063         int m_beginY;
00064 
00065         bool m_rotating;
00066 
00067 public:
00068         CExampleWindow(int X, int Y, int W, int H);
00069 
00070         virtual void onInit(int width, int height);
00071         virtual void onKeyboard(int key, int x, int y);
00072         virtual bool onTimeout();
00073         virtual void onSelect(CIvfShape* shape);
00074         virtual void onSelectMultiple(CIvfSelectedShapesVector& shapes);
00075 };
00076 
00077 // ------------------------------------------------------------
00078 // Window class implementation
00079 // ------------------------------------------------------------
00080 
00081 CExampleWindow::CExampleWindow(int X, int Y, int W, int H)
00082         :CIvfWindow(X, Y, W, H) 
00083 {
00084         addInitEvent(this);
00085         addKeyboardEvent(this);
00086         assignTimeoutEvent(0, this);
00087 }
00088 
00089 void CExampleWindow::onInit(int width, int height)
00090 {
00091         // Initialize variables
00092 
00093         m_angleX = 0.0;
00094         m_angleY = 0.0;
00095         m_moveX = 0.0;
00096         m_moveY = 0.0;
00097         m_zoomX = 0.0;
00098         m_zoomY = 0.0;
00099 
00100         m_rotating = false;
00101 
00102         // Initialize Ivf++ camera
00103 
00104         m_camera = new CIvfCamera();
00105         m_camera->setPerspective(45.0, 0.1, 100.0);
00106         m_camera->setPosition(-0.0, 3.0, 5.0);
00107         m_camera->setTarget(-0.0, 0.0, 0.0);
00108 
00109         // Create scene
00110 
00111         m_scene = new CIvfScene();
00112         m_scene->setView(m_camera);
00113 
00114         // Create a materials
00115 
00116         CIvfMaterialPtr redMaterial = new CIvfMaterial();
00117         redMaterial->setDiffuseColor(1.0f, 0.0f, 0.0f, 1.0f);
00118         redMaterial->setSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
00119         redMaterial->setAmbientColor(0.5f, 0.0f, 0.0f, 1.0f);
00120 
00121         CIvfMaterialPtr greenMaterial = new CIvfMaterial();
00122         greenMaterial->setDiffuseColor(0.0f, 1.0f, 0.0f, 1.0f);
00123         greenMaterial->setSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
00124         greenMaterial->setAmbientColor(0.0f, 0.5f, 0.0f, 1.0f);
00125         
00126         CIvfMaterialPtr blueMaterial = new CIvfMaterial();
00127         blueMaterial->setDiffuseColor(0.0f, 0.0f, 1.0f, 1.0f);
00128         blueMaterial->setSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
00129         blueMaterial->setAmbientColor(0.0f, 0.0f, 0.5f, 1.0f);
00130 
00131         CIvfMaterialPtr yellowMaterial = new CIvfMaterial();
00132         yellowMaterial->setDiffuseColor(1.0f, 1.0f, 0.0f, 1.0f);
00133         yellowMaterial->setSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
00134         yellowMaterial->setAmbientColor(0.5f, 0.5f, 0.0f, 1.0f);
00135 
00136         // Create objects
00137         
00138         CIvfCubePtr cube = new CIvfCube();
00139         cube->setMaterial(redMaterial);
00140         cube->setPosition(2.0, 0.0, 2.0);
00141         m_scene->addChild(cube);
00142 
00143         CIvfSpherePtr sphere = new CIvfSphere();
00144         sphere->setMaterial(greenMaterial);
00145         sphere->setPosition(-2.0, 0.0, 2.0);
00146         m_scene->addChild(sphere);
00147 
00148         CIvfCylinderPtr cylinder = new CIvfCylinder();
00149         cylinder->setMaterial(blueMaterial);
00150         cylinder->setPosition(-2.0, 0.0, -2.0);
00151         m_scene->addChild(cylinder);
00152 
00153         CIvfConePtr cone = new CIvfCone();
00154         cone->setMaterial(yellowMaterial);
00155         cone->setPosition(2.0, 0.0, -2.0);
00156         cone->setRotationQuat(0.0, 0.0, 1.0, 45.0);
00157         m_scene->addChild(cone);
00158 
00159         CIvfAxisPtr axis = new CIvfAxis();
00160         m_scene->addChild(axis);
00161 
00162         // Create a light
00163 
00164         CIvfLightingPtr lighting = CIvfLighting::getInstance();
00165         lighting->enable();
00166 
00167         m_light = lighting->getLight(0);
00168         m_light->setLightPosition(1.0, 1.0, 1.0, 0.0);
00169         m_light->setDiffuseColor(1.0f, 1.0f, 1.0f, 1.0f);
00170         m_light->setAmbientColor(0.2f, 0.2f, 0.2f, 1.0f); 
00171         m_light->enable();
00172 
00173         // Create event handlers
00174 
00175         m_mouseHandler = new CIvfMouseViewHandler(this, m_camera);
00176         m_mouseHandler->deactivate();
00177         
00178         m_selectionHandler = new CIvfSelectionHandler(this, m_scene);
00179         m_selectionHandler->setSingleSelectionEvent(this);
00180         m_selectionHandler->setMultipleSelectionEvent(this);
00181         m_selectionHandler->activate();
00182         
00183         m_flyHandler = new CIvfFlyHandler(this, m_camera);
00184         m_flyHandler->deactivate();
00185 
00186         m_sceneHandler = new CIvfSceneHandler(this, m_scene);
00187         m_sceneHandler->activate();
00188 
00189         enableTimeout(0.01, 0);
00190 }
00191 
00192 // ------------------------------------------------------------
00193 bool CExampleWindow::onTimeout()
00194 {
00195         if (m_flyHandler->isActive())
00196                 redraw();
00197 
00198         m_flyHandler->update();
00199 
00200         return true;
00201 }
00202 
00203 // ------------------------------------------------------------
00204 void CExampleWindow::onSelect(CIvfShape* shape)
00205 {
00206         if (shape!=NULL)
00207                 cout << shape->getClassName() << " selected." << endl;
00208         else
00209                 cout << "Nothingness selected." << endl;
00210 }
00211 
00212 // ------------------------------------------------------------
00213 void CExampleWindow::onSelectMultiple(CIvfSelectedShapesVector& shapes)
00214 {
00215         CIvfSelectedShapesIterator it;
00216 
00217         cout << "Multiple selection:" << endl;
00218         for (it=shapes.begin(); it!=shapes.end(); it++)
00219         {
00220                 CIvfShapePtr shape = *it;
00221                 cout << "\t" << shape->getClassName() << " selected." << endl;
00222         }
00223 }
00224 
00225 // ------------------------------------------------------------
00226 void CExampleWindow::onKeyboard(int key, int x, int y)
00227 {
00228         switch (key) {
00229         case '1' :
00230                 m_mouseHandler->activate();
00231                 m_selectionHandler->deactivate();
00232                 m_flyHandler->deactivate();
00233                 break;
00234         case '2' :
00235                 m_mouseHandler->deactivate();
00236                 m_selectionHandler->activate();
00237                 m_flyHandler->deactivate();
00238                 break;
00239         case '3' :
00240                 m_mouseHandler->deactivate();
00241                 m_selectionHandler->deactivate();
00242                 m_flyHandler->activate();
00243                 break;
00244         default:
00245                 break;
00246         }
00247 }
00248 
00249 // ------------------------------------------------------------
00250 // Main program
00251 // ------------------------------------------------------------
00252 
00253 int main(int argc, char **argv) 
00254 {
00255         // Create Ivf++ application object.
00256 
00257         CIvfApplicationPtr app = new CIvfApplication(IVF_DOUBLE|IVF_RGB);
00258 
00259         // Create a window
00260 
00261         CExampleWindowPtr window = new CExampleWindow(0, 0, 512, 512);
00262 
00263         // Set window title and show window
00264 
00265         window->setWindowTitle("Ivf++ event handler examples");
00266         window->show();
00267 
00268         // Enter main application loop
00269 
00270         app->run();
00271 
00272         return 0;
00273 }

Generated on Fri Sep 1 15:36:44 2006 for Interactive Visualisation Framework - Ivf++ by  doxygen 1.4.6-NO