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 }