// %flair:license{ // This file is part of the Flair framework distributed under the // CECILL-C License, Version 1.0. // %flair:license} // created: 2016/09/01 // filename: VisualizationCamera.cpp // // author: Guillaume Sanahuja // Copyright Heudiasyc UMR UTC/CNRS 7253 // // version: $Id: $ // // purpose: class for a visualization camera in the gui // /*********************************************************************/ #ifdef GL #include "VisualizationCamera.h" #include "Simulator.h" #include "Model.h" #include "Model_impl.h" #include "Gui.h" #include "Gui_impl.h" #include #include #include #include using namespace irr; using namespace gui; using namespace core; using namespace scene; using namespace video; namespace flair { namespace simulator { VisualizationCamera::VisualizationCamera(std::string inName) { name=inName; currentZoom = 0; LMouseKey = false; // camera for visualization camera = getGui()->getSceneManager()->addCameraSceneNode(); camera->setAspectRatio(getGui()->getAspectRatio()); // on force a cause du view port camera->setUpVector(vector3df(0, 0, 1)); camera->addAnimator(this); camera->setFarValue(8000); getGui()->pimpl_->AddVisualizationCamera(this); // camera to draw axis, in a new dedicated scene manager axis_scenemanager=getGui()->getSceneManager()->createNewSceneManager(); axis_camera = axis_scenemanager->addCameraSceneNode(); axis_camera->setAspectRatio(1); // same as texture ratio, TODO: get it from texture in renderAxisToTexture axis_camera->setUpVector(vector3df(0, 0, 1)); axis_camera->setFOV(PI / 2.5f); axis_scenemanager->setActiveCamera(axis_camera); prendre en compte le yaw monde/optitrack (rotation de axis_scenemanager?) IAnimatedMesh* arrowMeshRed = axis_scenemanager->addArrowMesh( "x_axisArrow",video::SColor(255, 255, 0, 0),video::SColor(255, 255, 0, 0)); nodeX = axis_scenemanager->addMeshSceneNode(arrowMeshRed); nodeX->setMaterialFlag(video::EMF_LIGHTING, false); nodeX->setRotation(vector3df(0,0,-90)); nodeX->setScale(vector3df(1,3,1)); IAnimatedMesh* arrowMeshGreen = axis_scenemanager->addArrowMesh( "y_axisArrow",video::SColor(255, 0, 255, 0),video::SColor(255, 0, 255, 0)); nodeY = axis_scenemanager->addMeshSceneNode(arrowMeshGreen); nodeY->setMaterialFlag(video::EMF_LIGHTING, false); nodeY->setScale(vector3df(1,3,1)); IAnimatedMesh* arrowMeshBlue = axis_scenemanager->addArrowMesh( "z_axisArrow",video::SColor(255, 0, 0, 255),video::SColor(255, 0, 0, 255)); nodeZ = axis_scenemanager->addMeshSceneNode(arrowMeshBlue); nodeZ->setMaterialFlag(video::EMF_LIGHTING, false); nodeZ->setRotation(vector3df(-90,0,0));//irrlicht is left handed, draw a right handed axis nodeZ->setScale(vector3df(1,3,1)); } VisualizationCamera::~VisualizationCamera() {} void VisualizationCamera::renderAxisToTexture(ITexture* texture) { //put axis at a "normalized" distance vector3df direction=camera->getTarget()-camera->getPosition(); direction.normalize(); nodeX->setPosition(camera->getPosition()+direction*6); nodeY->setPosition(camera->getPosition()+direction*6); nodeZ->setPosition(camera->getPosition()+direction*6); axis_camera->setPosition(camera->getPosition()); axis_camera->setRotation(camera->getRotation()); axis_camera->setTarget(camera->getTarget()); axis_scenemanager->getVideoDriver()->setRenderTarget(texture, true, true, SColor(0,0,0,0)); axis_scenemanager->drawAll(); axis_scenemanager->getVideoDriver()->setRenderTarget(0, true, true, 0); } std::string VisualizationCamera::getName(void) { return name; } ICameraSceneNode *VisualizationCamera::getCameraSceneNode(void) { return camera; } ISceneNodeAnimator *VisualizationCamera::createClone(ISceneNode *node, ISceneManager *newManager) { return NULL; } bool VisualizationCamera::OnEvent(const irr::SEvent& event) { if (event.EventType != EET_MOUSE_INPUT_EVENT) return false; switch (event.MouseInput.Event) { case EMIE_MOUSE_WHEEL: currentZoom -= event.MouseInput.Wheel; break; case EMIE_LMOUSE_PRESSED_DOWN: LMouseKey = true; break; case EMIE_LMOUSE_LEFT_UP: LMouseKey = false; break; case EMIE_MOUSE_MOVED: MousePos = getGui()->getDevice()->getCursorControl()->getRelativePosition(); break; default: return false; break; } return true; } } // end namespace simulator } // end namespace flair #endif // GL