Qt version 4.7.0 & QKeyEvent(camera move)

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
Serge
Posts: 8
Joined: Mon Jan 31, 2011 8:53 am

Qt version 4.7.0 & QKeyEvent(camera move)

Post by Serge »

Hi ALL. Sorry for my english, but i need help :) with irrlicht and Qt.
Mouse events work excellent :

Code: Select all

void Terrain3D::mouseMoveEvent(QMouseEvent *event)
{
  switch(mousePressedBtn){
  case Qt::LeftButton:{
      if(mousePressed){
        irr::SEvent irrEvent;
        irrEvent.EventType = irr::EET_MOUSE_INPUT_EVENT;
        if(m_IrrDevice){
          irrEvent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;

          irrEvent.MouseInput.X = event->x();
          irrEvent.MouseInput.Y = event->y();
          irrEvent.MouseInput.Wheel = 0.0f;

          m_IrrDevice->postEventFromUser(irrEvent);
        }
        update();
      }
    }
    break;
  default: break;
  }
}
But key event dont'work.
Му class:

Code: Select all

class Terrain3D : public QWidget
{
  Q_OBJECT
public:
  irr::IrrlichtDevice *m_IrrDevice;
  irr::video::E_DRIVER_TYPE m_DriverType;
  irr::video::SColor m_ClearColor;
  ...
  ...
  ...
protected:
  virtual QPaintEngine * paintEngine() const;
  virtual void resizeEvent(QResizeEvent *event);
  virtual void paintEvent(QPaintEvent *event);
  virtual void mousePressEvent(QMouseEvent *event);
  virtual void mouseReleaseEvent(QMouseEvent *event);
  virtual void mouseMoveEvent(QMouseEvent *event);
  virtual void wheelEvent(QWheelEvent *);
  virtual void keyPressEvent(QKeyEvent *event);
  virtual void keyReleaseEvent(QKeyEvent *event);
};

Code: Select all

void Terrain3D::keyPressEvent(QKeyEvent * event)
{
  irr::SEvent::SKeyInput evt;
  evt.Key = irr::KEY_UP;
  irr::SEvent wrapper;
  wrapper.KeyInput = evt;
  wrapper.EventType = EET_KEY_INPUT_EVENT;
  wrapper.KeyInput.PressedDown = true;
  qDebug() << m_IrrDevice->postEventFromUser(wrapper);
  update();
};
m_IrrDevice->postEventFromUser(wrapper) - return TRUE, but camera don't move.
Creating terrain and camera:

Code: Select all

  if(m_IrrDevice == 0){
    QMessageBox::critical(this, "Критическая ошибка", "Irrlicht небыл проинициализирован.");
    return;
  }

  video::IVideoDriver* driver = m_IrrDevice->getVideoDriver();
  scene::ISceneManager* smgr  = m_IrrDevice->getSceneManager();
  gui::IGUIEnvironment* env   = m_IrrDevice->getGUIEnvironment();

  driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);

  SKeyMap keyMap[8];
  keyMap[0].Action = EKA_MOVE_FORWARD;
  keyMap[0].KeyCode = irr::KEY_UP;
  keyMap[1].Action = EKA_MOVE_FORWARD;
  keyMap[1].KeyCode = KEY_KEY_W;

  keyMap[2].Action = EKA_MOVE_BACKWARD;
  keyMap[2].KeyCode = irr::KEY_DOWN;
  keyMap[3].Action = EKA_MOVE_BACKWARD;
  keyMap[3].KeyCode = KEY_KEY_S;

  keyMap[4].Action = EKA_STRAFE_LEFT;
  keyMap[4].KeyCode = KEY_LEFT;
  keyMap[5].Action = EKA_STRAFE_LEFT;
  keyMap[5].KeyCode = KEY_KEY_A;

  keyMap[6].Action = EKA_STRAFE_RIGHT;
  keyMap[6].KeyCode = KEY_RIGHT;
  keyMap[7].Action = EKA_STRAFE_RIGHT;
  keyMap[7].KeyCode = KEY_KEY_D;

  terrain = smgr->addTerrainSceneNode(filename.toAscii().data(),
                                      0,					// parent node
                                      -1,					// node id
                                      core::vector3df(0.f, 0.f, 0.f),		// position
                                      core::vector3df(0.f, 0.f, 0.f),		// rotation
                                      core::vector3df(40.f, 10.f, 40.f),	// scale
                                      video::SColor ( 255, 255, 255, 255 ),	// vertexColor
                                      5,					// maxLOD
                                      scene::ETPS_17,				// patchSize
                                      4					// smoothFactor
                                      );
  terrain->setMaterialFlag(video::EMF_LIGHTING, false);

  terrain->setMaterialTexture(0, driver->getTexture("media/k372_texture_full_1.png"));

  terrain->setMaterialType(video::EMT_DETAIL_MAP);

  terrain->scaleTexture(1.0f, 20.0f);

  //
  scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.f, 100.f, -1, keyMap, 8, false, 0.f, false, true);//, false, 0, false, true);//addCameraSceneNodeFPS(0,100.0f,1.2f);
  camera->setInputReceiverEnabled(true);

  camera->setPosition(core::vector3df(2700*2, /*255*2*/terrain->getHeight(2700*2, 2600*2) * 2, 2600*2));
  camera->setTarget(core::vector3df(2397*2, /*343*2*/terrain->getHeight(2700*2, 2700*2)*2, 2700*2));
  camera->setFarValue(42000.0f);

  scene::ITriangleSelector * selector = smgr->createTerrainTriangleSelector(terrain, 0);
  terrain->setTriangleSelector(selector);

  scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(60,100,60), core::vector3df(0,0,0), core::vector3df(0,50,0));
  selector->drop();
  camera->addAnimator(anim);
  anim->drop();

  scene::CDynamicMeshBuffer* buffer = new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
  terrain->getMeshBufferForLOD(*buffer, 0);
  video::S3DVertex2TCoords* data = (video::S3DVertex2TCoords*)buffer->getVertexBuffer().getData();
  // Work on data or get the IndexBuffer with a similar call.
  buffer->drop(); // When done drop the buffer again.

Code: Select all

Terrain3D::Terrain3D(QWidget *parent, irr::video::E_DRIVER_TYPE driverType) :
    QWidget(parent)
{
  setAttribute(Qt::WA_PaintOnScreen, true);
  setAttribute(Qt::WA_OpaquePaintEvent, true);
  setFocus(Qt::ActiveWindowFocusReason);

  m_IrrDevice = 0;// По умолчанию 0, для того чтобы при инициализации не произошло создания более одного устройства
  m_DriverType = driverType;

  translateSpeed = 100.f;

  setClearColor(irr::video::SColorf(0.2f, 0.2f, 0.2f));

  mousePressedBtn = Qt::NoButton;
  mousePressed    = false;

//  camFOV = 0.f;

//  setMouseTracking(true);
}
xirtamatrix
Posts: 219
Joined: Fri Feb 19, 2010 4:03 pm
Location: Estonia

Post by xirtamatrix »

humn... this has been done before, did you search the forums??


Anyways, here you go :
http://irrlicht.sourceforge.net/phpBB2/ ... ichtwidget

This should sort out all your problems.
to live, is natural; to die, is not!
Serge
Posts: 8
Joined: Mon Jan 31, 2011 8:53 am

Post by Serge »

xirtamatrix wrote:humn... this has been done before, did you search the forums??


Anyways, here you go :
http://irrlicht.sourceforge.net/phpBB2/ ... ichtwidget

This should sort out all your problems.
yes, i read this topic long time ago. but this don't help me.
I will repeat, m_IrrDevice->postEventFromUser(wrapper) return TRUE, event means has left to Irrlicht device, and i can catch event in

Code: Select all

class MyEventReceiver : public IEventReceiver
{
public:
  // keyboard registry
  bool keys[irr::KEY_KEY_CODES_COUNT];

   virtual bool OnEvent(const SEvent& event)
   {
      if(event.EventType == irr::EET_KEY_INPUT_EVENT)
      {
         keys[event.KeyInput.Key] = event.KeyInput.PressedDown;
         qDebug() << event.KeyInput.Key;
         return false;
      }
      return false;
   }
};
void Terrain3DTiled::initialize()
{
  if(m_IrrDevice != 0) // Чтобы не инициализировать дважды
    return;

  // Создаем Irrlicht устойство в первый раз
  irr::SIrrlichtCreationParameters createParams;
  createParams.DriverType = m_DriverType;
  createParams.WindowSize = irr::core::dimension2d<irr::u32>( size().width(), size().height() );
  createParams.Stencilbuffer = true;
  createParams.IgnoreInput = false;
  createParams.Fullscreen = false;

  reciever = new MyEventReceiver;
  createParams.EventReceiver = reciever;

  createParams.WindowId = (void*) winId();

  qDebug() << "   render size           = " << createParams.WindowSize.Width << " x " << createParams.WindowSize.Height;
  qDebug() << "   native window ID      = " << (void*) createParams.WindowId;

  if((m_IrrDevice = irr::createDeviceEx( createParams)) == 0)
      throw( "failed to create Irrlicht device" );
}
But FPS camera don't move.
Rotate camera no problem.
Serge
Posts: 8
Joined: Mon Jan 31, 2011 8:53 am

Post by Serge »

I resolve this problem. Read api: void* irr::SIrrlichtCreationParameters::WindowId and findedd where i mistake.
In Qt(and in others gui probably) we mast paint in recursive, and increase the timer.
My paintEven

Code: Select all

void Terrain3DTiled::paintEvent(QPaintEvent */*event*/)
{
  if(m_IrrDevice == 0)
    return;
  if(isActiveWindow()){
    timer->tick();
    m_IrrDevice->getVideoDriver()->beginScene(true, true, m_ClearColor);
    m_IrrDevice->getSceneManager()->drawAll();
    m_IrrDevice->getGUIEnvironment()->drawAll();
    m_IrrDevice->getVideoDriver()->endScene();
    int fps = m_IrrDevice->getVideoDriver()->getFPS();
    ((QWidget*)parent())->setWindowTitle(QString("FPS: %1").arg(fps));
    update();
  }
}
Now FPS camera move well.
Post Reply