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 #include <ivf/IvfCube.h>
00023
00024 #include <ivffile/IvfAc3DReader.h>
00025
00026 #include <ivfctl/IvfControllerGroup.h>
00027 #include <ivfctl/IvfActionController.h>
00028 #include <ivfctl/IvfRotateController.h>
00029 #include <ivfctl/IvfCameraController.h>
00030 #include <ivfctl/IvfSlerpController.h>
00031 #include <ivfctl/IvfPathController.h>
00032
00033
00034
00035
00036
00037 IvfSmartPointer(CExampleWindow);
00038
00039 class CExampleWindow: public CIvfWindow {
00040 private:
00041 CIvfCameraPtr m_camera;
00042 CIvfCompositePtr m_scene;
00043 CIvfLightPtr m_light;
00044
00045 CIvfActionControllerPtr m_controllers;
00046
00047 double m_angleX;
00048 double m_angleY;
00049 double m_moveX;
00050 double m_moveY;
00051 double m_zoomX;
00052 double m_zoomY;
00053
00054 int m_beginX;
00055 int m_beginY;
00056
00057 bool m_rotating;
00058
00059 public:
00060 CExampleWindow(int X, int Y, int W, int H)
00061 :CIvfWindow(X, Y, W, H) {};
00062
00063 virtual void onInit(int width, int height);
00064 virtual void onResize(int width, int height);
00065 virtual void onRender();
00066 virtual void onMouseDown(int x, int y);
00067 virtual void onMouseMove(int x, int y);
00068 virtual void onMouseUp(int x, int y);
00069 virtual bool onTimeout0();
00070 virtual void onKeyboard(int key, int x, int y);
00071 };
00072
00073
00074
00075
00076
00077 void CExampleWindow::onInit(int width, int height)
00078 {
00079
00080
00081 m_angleX = 0.0;
00082 m_angleY = 0.0;
00083 m_moveX = 0.0;
00084 m_moveY = 0.0;
00085 m_zoomX = 0.0;
00086 m_zoomY = 0.0;
00087
00088 m_rotating = false;
00089
00090 int i, j;
00091
00092
00093
00094 m_camera = new CIvfCamera();
00095 m_camera->setPosition(8.0, 8.0, 8.0);
00096 m_camera->setTarget(0.0, 0.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 CIvfCubePtr cube = new CIvfCube();
00110 cube->setMaterial(material);
00111
00112 CIvfAxisPtr axis = new CIvfAxis();
00113 axis->setPosition(0.0, 0.0, 0.0);
00114 axis->setSize(2.0);
00115 m_scene->addChild(axis);
00116
00117
00118
00119 m_controllers = new CIvfActionController();
00120 m_controllers->activate();
00121
00122 for (i=0; i<5; i++)
00123 for (j=0; j<5; j++)
00124 {
00125 CIvfTransformPtr tf = new CIvfTransform();
00126 tf->addChild(cube);
00127 tf->setPosition(-5.0+2.5*(double)i, 0.0, -5.0+2.5*(double)j);
00128 m_scene->addChild(tf);
00129
00130 CIvfRotateControllerPtr ctl = new CIvfRotateController();
00131 ctl->setShape(tf);
00132 ctl->setRotationSpeed(45.0*3.0/10.0);
00133 ctl->activate();
00134
00135 CIvfSpline3dPtr path = new CIvfSpline3d();
00136 path->setSize(2);
00137 path->getPoint(0)->setComponents(-5.0+2.5*(double)i, 0.0, -5.0+2.5*(double)j);
00138 path->getPoint(1)->setComponents(-5.0+2.5*(double)i, 3.0, -5.0+2.5*(double)j);
00139 path->update();
00140
00141 CIvfPathControllerPtr pathCtl = new CIvfPathController();
00142 pathCtl->setPath(path);
00143 pathCtl->setShape(tf);
00144 pathCtl->setInitialSpeed(0.1);
00145 pathCtl->activate();
00146
00147 CIvfControllerGroupPtr groupCtl = new CIvfControllerGroup();
00148 groupCtl->addChild(ctl);
00149 groupCtl->addChild(pathCtl);
00150
00151
00152 m_controllers->addChild(groupCtl);
00153
00154 CIvfActionPtr action = new CIvfAction();
00155 action->setActionType(IVF_ACTION_ACTIVATE);
00156 action->setTarget(groupCtl);
00157 action->setTime(1.0+1.0*(double)(i*5+j));
00158
00159 m_controllers->addAction(action);
00160
00161 action = new CIvfAction();
00162 action->setActionType(IVF_ACTION_DEACTIVATE);
00163 action->setTarget(ctl);
00164 action->setTime(1.0+1.0*(double)(i*5+j)+10.0);
00165
00166 m_controllers->addAction(action);
00167 }
00168
00169
00170
00171 CIvfLightingPtr lighting = CIvfLighting::getInstance();
00172
00173 m_light = lighting->getLight(0);;
00174 m_light->setLightPosition(1.0, 1.0, 1.0, 0.0);
00175 m_light->setAmbientColor(0.2f, 0.2f, 0.2f, 1.0f);
00176 m_light->enable();
00177
00178 enableTimeout(0.01, 0);
00179 }
00180
00181
00182 void CExampleWindow::onResize(int width, int height)
00183 {
00184 m_camera->setPerspective(45.0, 0.1, 100.0);
00185 m_camera->setViewPort(width, height);
00186 m_camera->initialize();
00187 }
00188
00189
00190 void CExampleWindow::onRender()
00191 {
00192 m_light->render();
00193
00194 m_camera->rotatePositionY(m_angleX/100.0);
00195 m_camera->rotatePositionX(m_angleY/100.0);
00196 m_camera->moveSideways(m_moveX/100.0);
00197 m_camera->moveVertical(m_moveY/100.0);
00198 m_camera->moveDepth(m_zoomY/50.0);
00199 m_camera->render();
00200
00201 m_scene->render();
00202 }
00203
00204
00205 void CExampleWindow::onMouseDown(int x, int y)
00206 {
00207 m_beginX = x;
00208 m_beginY = y;
00209 }
00210
00211
00212 void CExampleWindow::onMouseMove(int x, int y)
00213 {
00214 m_angleX = 0.0;
00215 m_angleY = 0.0;
00216 m_moveX = 0.0;
00217 m_moveY = 0.0;
00218 m_zoomX = 0.0;
00219 m_zoomY = 0.0;
00220
00221 if (isLeftButtonDown())
00222 {
00223 m_angleX = (x - m_beginX);
00224 m_angleY = (y - m_beginY);
00225 m_beginX = x;
00226 m_beginY = y;
00227 redraw();
00228 }
00229
00230 if (isRightButtonDown())
00231 {
00232 if (getModifierKey() == CIvfWidgetBase::MT_SHIFT)
00233 {
00234 m_zoomX = (x - m_beginX);
00235 m_zoomY = (y - m_beginY);
00236 }
00237 else
00238 {
00239 m_moveX = (x - m_beginX);
00240 m_moveY = (y - m_beginY);
00241 }
00242 m_beginX = x;
00243 m_beginY = y;
00244
00245 redraw();
00246 }
00247 }
00248
00249
00250 void CExampleWindow::onMouseUp(int x, int y)
00251 {
00252 m_angleX = 0.0;
00253 m_angleY = 0.0;
00254 m_moveX = 0.0;
00255 m_moveY = 0.0;
00256 m_zoomX = 0.0;
00257 m_zoomY = 0.0;
00258 }
00259
00260
00261 bool CExampleWindow::onTimeout0()
00262 {
00263 m_controllers->update(0.01);
00264 redraw();
00265 return true;
00266 }
00267
00268
00269 void CExampleWindow::onKeyboard(int key, int x, int y)
00270 {
00271 }
00272
00273
00274
00275
00276
00277 int main(int argc, char **argv)
00278 {
00279
00280
00281 CIvfApplicationPtr app = new CIvfApplication(IVF_DOUBLE|IVF_RGB);
00282
00283
00284
00285 CExampleWindowPtr window = new CExampleWindow(0, 0, 512, 512);
00286
00287
00288
00289 window->setWindowTitle("Ivf++ Controller example");
00290 window->show();
00291
00292
00293
00294 app->run();
00295
00296 return 0;
00297 }