World(irr::scene::ISceneManager* mgr) : IEmptySceneNode(mgr->getRootSceneNode(), mgr, -1, core::vector3df(0,0,0)), m_tunnel(this, mgr), m_animator(irr::core::vector3df(0,0,1), -400) { addAnimator(&m_animator); m_Instance = this; }
void CMazeGameEngine::addFinishPoint() { auto prizeLocation = _worldModel.getFinishPoint(); auto prizeSceneNode = _sceneManager->addBillboardSceneNode(_mazeRootSceneNode, irr::core::dimension2df(0.5f, 0.5f), irr::core::vector3df(static_cast<float>(prizeLocation.first) - 0.5f, 0.75f, static_cast<float>(prizeLocation.second) - 0.5f)); prizeSceneNode->setMaterialFlag(irr::video::EMF_LIGHTING, false); prizeSceneNode->setMaterialType(irr::video::EMT_TRANSPARENT_ADD_COLOR); prizeSceneNode->setMaterialTexture(0, _videoDriver->getTexture("../media/particle.bmp")); _sceneManager->addLightSceneNode(prizeSceneNode, irr::core::vector3df(), irr::video::SColorf(1.0f, 0.0f, 0.5f), 1.0f); auto animator = _sceneManager->createFlyCircleAnimator( irr::core::vector3df(static_cast<float>(prizeLocation.first) - 0.5f, 0.75f, static_cast<float>(prizeLocation.second) - 0.5f), 0.2f); prizeSceneNode->addAnimator(animator); animator->drop(); auto miniPrizeSceneNode = _sceneManager->addBillboardSceneNode(prizeSceneNode, irr::core::dimension2df(0.3f, 0.3f)); miniPrizeSceneNode->setMaterialFlag(irr::video::EMF_LIGHTING, false); miniPrizeSceneNode->setMaterialType(irr::video::EMT_TRANSPARENT_ADD_COLOR); miniPrizeSceneNode->setMaterialTexture(0, _videoDriver->getTexture("../media/portal2.bmp")); animator = _sceneManager->createFlyCircleAnimator(irr::core::vector3df(), 0.15f,0.015f); miniPrizeSceneNode->addAnimator(animator); animator->drop(); }
TextureProjectorNode::TextureProjectorNode( Texture* texture, SceneManagerptr sceneManagerPtr, Nodeptr parent ) :Node(parent , sceneManagerPtr) { this->texture = texture; projectionPolicy = PROJECTION_POLICY_PROJECTOR; projectorPosition.x = 15.0f; projectorPosition.y = 16.0f; projectorPosition.z = -12.0f; projectorTarget.x = 0.0f; projectorTarget.y = 0.0f; projectorTarget.z = 0.0f; projectorUp.x = 0.0f; projectorUp.y =1.0f; projectorUp.z = 0.0f; textureProjector = new TextureProjector(sceneManager->getActiveCamera() , projectorPosition, projectorTarget, projectorUp); projectorUpdator = new ProjectorUpdater(textureProjector); addAnimator(projectorUpdator); projectorTexUnitState = new TextureUnitState(texture); projectorTexUnitState->getTextureAttributes()->texture_mode = ETEXM_MODULATE; projectorTexUnitState->getTexCoordGeneration()->bEnable = true; projectorTexUnitState->getTexCoordGeneration()->texGenMode = ETGM_EYE_LINEAR; projectorTexUnitState->getTexCoordGeneration()->texComponentFormat = ETCF_4; projectorUpdator->projectorTextureAttributes = projectorTexUnitState->getTextureAttributes(); Vector3 dir, right, upVector; dir.sub( projectorTarget, projectorPosition); dir.normalize(); CameraNode* camera = sceneManager->getActiveCamera(); float fov = camera->getFOV(); dir.scale( camera->getNearPlane() ); Matrix4f& view = textureProjector->getViewMatrix(); right.x = view.m00; right.y = view.m01;right.z = view.m02; upVector.x = view.m10; upVector.x = view.m11; upVector.x = view.m12; float height = 2.0f*camera->getNearPlane()*tan(fov/2.0f); float width = height* camera->getAspectRatio(); width = height = 1.0f; n1.x = projectorPosition.x + dir.x + 0.5f*width*right.x + 0.5f*height*upVector.x; n1.y = projectorPosition.y + dir.y + 0.5f*width*right.y + 0.5f*height*upVector.y; n1.z = projectorPosition.z + dir.z + 0.5f*width*right.z + 0.5f*height*upVector.z; n2.x = projectorPosition.x + dir.x + 0.5f*width*right.x - 0.5f*height*upVector.x; n2.y = projectorPosition.y + dir.y + 0.5f*width*right.y - 0.5f*height*upVector.y; n2.z = projectorPosition.z + dir.z + 0.5f*width*right.z - 0.5f*height*upVector.z; n3.x = projectorPosition.x + dir.x - 0.5f*width*right.x + 0.5f*height*upVector.x; n3.y = projectorPosition.y + dir.y - 0.5f*width*right.y + 0.5f*height*upVector.y; n3.z = projectorPosition.z + dir.z - 0.5f*width*right.z + 0.5f*height*upVector.z; n4.x = projectorPosition.x + dir.x - 0.5f*width*right.x - 0.5f*height*upVector.x; n4.y = projectorPosition.y + dir.y - 0.5f*width*right.y - 0.5f*height*upVector.y; n4.z = projectorPosition.z + dir.z - 0.5f*width*right.z - 0.5f*height*upVector.z; }
void AbstractHMDSequence::enableCollision() { scene::ITriangleSelector *selector = nullptr; irr::scene::IMeshSceneNode *q3node = static_cast<irr::scene::IMeshSceneNode*>(Lib::smgr->getSceneNodeFromId(kIDLevel)); if(q3node) { selector = Lib::smgr->createOctreeTriangleSelector(q3node->getMesh(), q3node, 128); q3node->setTriangleSelector(selector); } auto camera = Lib::smgr->getActiveCamera(); if(selector) { scene::ISceneNodeAnimator *anim = Lib::smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(30, 50, 30), core::vector3df(0, -10, 0), core::vector3df(0, 30, 0)); selector->drop(); camera->addAnimator(anim); anim->drop(); } }
int main(int argc, char* argv[]){ // Check fullscreen for (int i=1;i<argc;i++) fullscreen |= !strcmp("-f", argv[i]); MyEventReceiver receiver; std::shared_ptr<irr::IrrlichtDevice> device( createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(SCREEN_WIDTH, SCREEN_HEIGHT), 16, fullscreen, false, vsync, &receiver), [](irr::IrrlichtDevice *p){ p->drop(); } ); receiver.device = device.get(); auto cursor=device->getCursorControl(); receiver.cursor = cursor; irr::video::IVideoDriver* driver = device->getVideoDriver(); irr::scene::ISceneManager* smgr = device->getSceneManager(); irr::gui::IGUIEnvironment* guienv = device->getGUIEnvironment(); irr::video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices(); HMDDescriptor HMD; // Parameters from the Oculus Rift DK1 HMD.hResolution = 1280; HMD.vResolution = 800; HMD.hScreenSize = 0.14976; HMD.vScreenSize = 0.0936; HMD.interpupillaryDistance = 0.064; HMD.lensSeparationDistance = 0.064; HMD.eyeToScreenDistance = 0.041; HMD.distortionK[0] = 1.0; HMD.distortionK[1] = 0.22; HMD.distortionK[2] = 0.24; HMD.distortionK[3] = 0.0; HMDStereoRender renderer(device.get(), HMD, 10); // load the quake map device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3"); irr::scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp"); irr::scene::IMeshSceneNode* q3node = 0; if (q3levelmesh){ q3node = smgr->addOctreeSceneNode(q3levelmesh->getMesh(0), 0, -1); } if(!q3node){ return 1; } irr::scene::ITriangleSelector* selector = 0; if (q3node) { q3node->setPosition(irr::core::vector3df(-1350,-130,-1400)); selector = smgr->createOctreeTriangleSelector( q3node->getMesh(), q3node, 128); if(!selector){ return 2; } q3node->setTriangleSelector(selector); // We're not done with this selector yet, so don't drop it. } // Create world irr::core::array<irr::SKeyMap> keymaps; keymaps.push_back(irr::SKeyMap(irr::EKA_MOVE_FORWARD, irr::KEY_KEY_W)); keymaps.push_back(irr::SKeyMap(irr::EKA_MOVE_BACKWARD, irr::KEY_KEY_S)); keymaps.push_back(irr::SKeyMap(irr::EKA_STRAFE_LEFT, irr::KEY_KEY_A)); keymaps.push_back(irr::SKeyMap(irr::EKA_STRAFE_RIGHT, irr::KEY_KEY_D)); keymaps.push_back(irr::SKeyMap(irr::EKA_JUMP_UP, irr::KEY_SPACE)); auto camera= irr::scene::CSceneNodeAnimatorCameraOculusOnFPS::addCameraSceneNodeOclusOnFPS( smgr, cursor, 0, 80.0f, .1f, -1, keymaps.pointer(), keymaps.size(), true, .5f, false, true); camera->setPosition(irr::core::vector3df(50,50,-60)); camera->setTarget(irr::core::vector3df(-70,30,-60)); { irr::scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( selector, camera, irr::core::vector3df(30,50,30), irr::core::vector3df(0,-10,0), irr::core::vector3df(0,30,0)); selector->drop(); // As soon as we're done with the selector, drop it. camera->addAnimator(anim); anim->drop(); // And likewise, drop the animator when we're done referring to it. } // load a faerie auto faerie = smgr->getMesh(MEDIA_PATH "faerie.md2"); auto faerieNode = smgr->addAnimatedMeshSceneNode(faerie); faerieNode->setMaterialTexture(0, driver->getTexture(MEDIA_PATH "faerie2.bmp")); faerieNode->setMaterialFlag(irr::video::EMF_LIGHTING, false); faerieNode->setPosition(irr::core::vector3df(40,190,-1030)); faerieNode->setRotation(irr::core::vector3df(0,-90,0)); faerieNode->setMD2Animation(irr::scene::EMAT_SALUTE); // load a dwarf auto dwarf = smgr->getMesh(MEDIA_PATH "dwarf.x"); auto dwarfNode = smgr->addAnimatedMeshSceneNode(dwarf); dwarfNode->setPosition(irr::core::vector3df(40,-25,20)); device->getCursorControl()->setVisible(false); // Render loop irr::core::vector3df rot; while(device->run()){ driver->beginScene(true,true,irr::video::SColor(0,100,100,100)); renderer.drawAll(smgr); // end scene driver->endScene(); } return 0; }