Raycasting
float srcx = float( arg.state.X.abs ) / Ogre::Real(vp->getActualWidth());
float srcy = float( arg.state.Y.abs ) / Ogre::Real(vp->getActualHeight());
// out of viewport
if ( srcx < 0 || srcx > 1 || srcy < 0 || srcy > 1 ) {
return true;
}
Ogre::Ray r = mCamera->getCameraToViewportRay( srcx, srcy );
Ogre::RaySceneQuery* rquery = mSceneMgr->createRayQuery( r );
rquery->setSortByDistance( true );
Ogre::RaySceneQueryResult rresults = rquery->execute();
Ogre::SceneNode* newovered = 0;
Ogre::Real newd;
if ( rresults.size() > 0 ) {
newovered = rresults[0].movable->getParentSceneNode();
newd = rresults[0].distance;
}
// if ( newovered == groundNode ) newovered = 0;
overed = newovered;
if ( overed != 0 ) {
Ogre::Quaternion ho = overed->getPosition().getRotationTo( r.getPoint( newd ) );
overed->setOrientation( ho );
// cout << r.getOrigin().x << " / " << r.getOrigin().y << " / " << r.getOrigin().z << endl;
// cout << overed->getPosition().x << " / " << overed->getPosition().y << " / " << overed->getPosition().z << endl;
}
mSceneMgr->destroyQuery( rquery );