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/IvfComposite.h>
00020 #include <ivf/IvfTransform.h>
00021 #include <ivf/IvfLighting.h>
00022
00023 #include <ivffile/IvfAc3DReader.h>
00024
00025 #include <ivfctl/IvfControllerGroup.h>
00026 #include <ivfctl/IvfRotateController.h>
00027 #include <ivfctl/IvfCameraController.h>
00028 #include <ivfctl/IvfSlerpController.h>
00029
00030
00031
00032
00033
00034 IvfSmartPointer(CExampleWindow);
00035
00036 class CExampleWindow: public CIvfWindow {
00037 private:
00038 CIvfCameraPtr m_camera;
00039 CIvfCompositePtr m_scene;
00040 CIvfLightPtr m_light;
00041
00042 CIvfControllerGroupPtr m_controllers;
00043 CIvfRotateControllerPtr m_propCtl;
00044 CIvfRotateControllerPtr m_headCtl;
00045 CIvfCameraControllerPtr m_cameraCtl;
00046
00047 CIvfSlerpControllerPtr m_slerpCtl;
00048
00049 double m_angleX;
00050 double m_angleY;
00051 double m_moveX;
00052 double m_moveY;
00053 double m_zoomX;
00054 double m_zoomY;
00055
00056 int m_beginX;
00057 int m_beginY;
00058
00059 bool m_rotating;
00060
00061 public:
00062 CExampleWindow(int X, int Y, int W, int H)
00063 :CIvfWindow(X, Y, W, H) {};
00064
00065 virtual void onInit(int width, int height);
00066 virtual void onResize(int width, int height);
00067 virtual void onRender();
00068 virtual void onMouseDown(int x, int y);
00069 virtual void onMouseMove(int x, int y);
00070 virtual void onMouseUp(int x, int y);
00071 virtual bool onTimeout0();
00072 virtual void onKeyboard(int key, int x, int y);
00073 };
00074
00075
00076
00077
00078
00079 void CExampleWindow::onInit(int width, int height)
00080 {
00081
00082
00083 m_angleX = 0.0;
00084 m_angleY = 0.0;
00085 m_moveX = 0.0;
00086 m_moveY = 0.0;
00087 m_zoomX = 0.0;
00088 m_zoomY = 0.0;
00089
00090 m_rotating = false;
00091
00092
00093
00094 m_camera = new CIvfCamera();
00095 m_camera->setPosition(10.0, 20.0, 20.0);
00096 m_camera->setTarget(0.0, 8.0, 0.0);
00097
00098
00099
00100 CIvfMaterialPtr material = new CIvfMaterial();
00101 material->setDiffuseColor(0.0f, 1.0f, 0.0f, 1.0f);
00102 material->setSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
00103 material->setAmbientColor(0.0f, 0.5f, 0.0f, 1.0f);
00104
00105
00106
00107 m_scene = new CIvfComposite();
00108
00109
00110
00111 CIvfAc3DReaderPtr acReader = new CIvfAc3DReader();
00112
00113
00114
00115 acReader->setFileName("models/controllers.ac");
00116 acReader->setScaling(1.0);
00117
00118
00119
00120 acReader->read();
00121
00122
00123
00124 CIvfCompositePtr model = (CIvfComposite*)acReader->getShape();
00125
00126 CIvfShapePtr propeller = model->findShape("propeller");
00127 propeller->setRotationQuat(0.0, 0.0, 1.0, 0.0);
00128 CIvfShapePtr head = model->findShape("head");
00129 head->setRotationQuat(0.0, 1.0, 0.0, 0.0);
00130
00131
00132 m_propCtl = new CIvfRotateController();
00133 m_propCtl->setShape(propeller);
00134 m_propCtl->setRotationSpeed(100.0);
00135 m_propCtl->activate();
00136
00137 m_headCtl = new CIvfRotateController();
00138 m_headCtl->setShape(head);
00139 m_headCtl->setRotationSpeed(10.0);
00140 m_headCtl->activate();
00141
00142 CIvfSpline3dPtr positionSpline = new CIvfSpline3d();
00143 positionSpline->setSize(5);
00144 positionSpline->getPoint(0)->setComponents(15.0, 10.0, 15.0);
00145 positionSpline->getPoint(1)->setComponents(-15.0, 5.0, 15.0);
00146 positionSpline->getPoint(2)->setComponents(-15.0, 10.0, -15.0);
00147 positionSpline->getPoint(3)->setComponents( 15.0, 5.0, -15.0);
00148 positionSpline->getPoint(4)->setComponents( 15.0, 10.0, 15.0);
00149 positionSpline->update();
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 m_cameraCtl = new CIvfCameraController();
00163 m_cameraCtl->setCamera(m_camera);
00164 m_cameraCtl->setPath(positionSpline);
00165 m_cameraCtl->setFollowPath(false);
00166
00167 m_cameraCtl->setInitialSpeed(0.2);
00168
00169 m_cameraCtl->setEndActionType(CIvfCameraController::EA_RESET);
00170 m_cameraCtl->setStartActionType(CIvfCameraController::SA_RESET);
00171
00172
00173 m_cameraCtl->deactivate();
00174
00175 CIvfAxisPtr axis = new CIvfAxis();
00176 axis->setPosition(3.0, 3.0, 3.0);
00177 axis->setSize(2.0);
00178 m_scene->addChild(axis);
00179
00180 CIvfSlerpPtr slerp = new CIvfSlerp();
00181 slerp->setSize(4);
00182 slerp->setQuatAxisAngle(0, 0.0, 0.0, 1.0, 10.0);
00183 slerp->setQuatAxisAngle(1, 0.0, 0.0, 1.0, 90.0);
00184 slerp->setQuatAxisAngle(2, 1.0, 0.0, 0.0, 45.0);
00185 slerp->setQuatAxisAngle(3, 0.0, 1.0, 0.0, 30.0);
00186 slerp->update();
00187
00188 CIvfActionPtr action1 = new CIvfAction();
00189 action1->setActionType(IVF_ACTION_ACTIVATE);
00190 action1->setTarget(m_cameraCtl);
00191
00192 CIvfActionPtr action2 = new CIvfAction();
00193 action2->setActionType(IVF_ACTION_DEACTIVATE);
00194 action2->setTarget(m_cameraCtl);
00195
00196 m_slerpCtl = new CIvfSlerpController();
00197 m_slerpCtl->setSlerp(slerp);
00198 m_slerpCtl->setShape(axis);
00199 m_slerpCtl->setInitialSpeed(1.0);
00200 m_slerpCtl->setEndActionType(CIvfSlerpController::EA_REVERSE);
00201 m_slerpCtl->setEndAction(action1);
00202 m_slerpCtl->setStartActionType(CIvfSlerpController::SA_REVERSE);
00203 m_slerpCtl->setStartAction(action2);
00204 m_slerpCtl->activate();
00205
00206 m_controllers = new CIvfControllerGroup();
00207 m_controllers->addChild(m_propCtl);
00208 m_controllers->addChild(m_headCtl);
00209 m_controllers->addChild(m_cameraCtl);
00210 m_controllers->addChild(m_slerpCtl);
00211 m_controllers->activate();
00212
00213 m_scene->addChild(model);
00214
00215
00216
00217 CIvfLightingPtr lighting = CIvfLighting::getInstance();
00218
00219 m_light = lighting->getLight(0);
00220 m_light->setLightPosition(1.0, 1.0, 1.0, 0.0);
00221 m_light->setAmbientColor(0.2f, 0.2f, 0.2f, 1.0f);
00222 m_light->enable();
00223
00224 enableTimeout(0.01, 0);
00225 }
00226
00227
00228 void CExampleWindow::onResize(int width, int height)
00229 {
00230 m_camera->setPerspective(45.0, 0.1, 100.0);
00231 m_camera->setViewPort(width, height);
00232 m_camera->initialize();
00233 }
00234
00235
00236 void CExampleWindow::onRender()
00237 {
00238 m_light->render();
00239
00240 m_camera->rotatePositionY(m_angleX/100.0);
00241 m_camera->rotatePositionX(m_angleY/100.0);
00242 m_camera->moveSideways(m_moveX/100.0);
00243 m_camera->moveVertical(m_moveY/100.0);
00244 m_camera->moveDepth(m_zoomY/50.0);
00245 m_camera->render();
00246
00247 m_scene->render();
00248 }
00249
00250
00251 void CExampleWindow::onMouseDown(int x, int y)
00252 {
00253 m_beginX = x;
00254 m_beginY = y;
00255 }
00256
00257
00258 void CExampleWindow::onMouseMove(int x, int y)
00259 {
00260 m_angleX = 0.0;
00261 m_angleY = 0.0;
00262 m_moveX = 0.0;
00263 m_moveY = 0.0;
00264 m_zoomX = 0.0;
00265 m_zoomY = 0.0;
00266
00267 if (isLeftButtonDown())
00268 {
00269 m_angleX = (x - m_beginX);
00270 m_angleY = (y - m_beginY);
00271 m_beginX = x;
00272 m_beginY = y;
00273 redraw();
00274 }
00275
00276 if (isRightButtonDown())
00277 {
00278 if (getModifierKey() == CIvfWidgetBase::MT_SHIFT)
00279 {
00280 m_zoomX = (x - m_beginX);
00281 m_zoomY = (y - m_beginY);
00282 }
00283 else
00284 {
00285 m_moveX = (x - m_beginX);
00286 m_moveY = (y - m_beginY);
00287 }
00288 m_beginX = x;
00289 m_beginY = y;
00290
00291 redraw();
00292 }
00293 }
00294
00295
00296 void CExampleWindow::onMouseUp(int x, int y)
00297 {
00298 m_angleX = 0.0;
00299 m_angleY = 0.0;
00300 m_moveX = 0.0;
00301 m_moveY = 0.0;
00302 m_zoomX = 0.0;
00303 m_zoomY = 0.0;
00304 }
00305
00306
00307 bool CExampleWindow::onTimeout0()
00308 {
00309 m_controllers->update(0.01);
00310 redraw();
00311 return true;
00312 }
00313
00314
00315 void CExampleWindow::onKeyboard(int key, int x, int y)
00316 {
00317 switch (key) {
00318 case 'p' :
00319 if (m_propCtl->isActive())
00320 m_propCtl->deactivate();
00321 else
00322 m_propCtl->activate();
00323 break;
00324 case 'h' :
00325 if (m_headCtl->isActive())
00326 m_headCtl->deactivate();
00327 else
00328 m_headCtl->activate();
00329 break;
00330 case 'c' :
00331 if (m_cameraCtl->isActive())
00332 m_cameraCtl->deactivate();
00333 else
00334 m_cameraCtl->activate();
00335 break;
00336 default:
00337 break;
00338 }
00339 }
00340
00341
00342
00343
00344
00345 int main(int argc, char **argv)
00346 {
00347
00348
00349 CIvfApplicationPtr app = new CIvfApplication(IVF_DOUBLE|IVF_RGB);
00350
00351
00352
00353 CExampleWindowPtr window = new CExampleWindow(0, 0, 512, 512);
00354
00355
00356
00357 window->setWindowTitle("Ivf++ Controller example");
00358 window->show();
00359
00360
00361
00362 app->run();
00363
00364 return 0;
00365 }