00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
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
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
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
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
00110
00111 m_scene = new CIvfScene();
00112 m_scene->setView(m_camera);
00113
00114
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
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
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
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
00251
00252
00253 int main(int argc, char **argv)
00254 {
00255
00256
00257 CIvfApplicationPtr app = new CIvfApplication(IVF_DOUBLE|IVF_RGB);
00258
00259
00260
00261 CExampleWindowPtr window = new CExampleWindow(0, 0, 512, 512);
00262
00263
00264
00265 window->setWindowTitle("Ivf++ event handler examples");
00266 window->show();
00267
00268
00269
00270 app->run();
00271
00272 return 0;
00273 }