Beispiel #1
0
 /// get the triangle selector for this scene node, creating it if needed
 ITriangleSelector_IPtr SceneObject::GetTriangleSelector()
 {
     ITriangleSelector_IPtr tri_selector = mSceneNode->getTriangleSelector();
     if (tri_selector) {
         return tri_selector;
     } else {
         // create triangle selector
         if (mTerrSceneNode)
         {
             tri_selector = GetSceneManager()->createTerrainTriangleSelector(mTerrSceneNode.get());
             AssertMsg(tri_selector, "Could not create a collision object for id: " << GetId());
             mTerrSceneNode->setTriangleSelector(tri_selector.get());
             LOG_F_DEBUG("collision", "created terrain triangle selector for id: " << GetId());
         }
         else if (mAniSceneNode)
         {
             IMesh* mesh = mAniSceneNode->getMesh();
             tri_selector = GetSceneManager()->createTriangleSelector(mesh, mAniSceneNode.get());
             AssertMsg(tri_selector, "Could not create a collision object for id: " << GetId());
             mAniSceneNode->setTriangleSelector(tri_selector.get());
             LOG_F_DEBUG("collision", "creating mesh triangle selector for id: " << GetId());
         }
         else
         {
             tri_selector = GetSceneManager()->createTriangleSelectorFromBoundingBox(mSceneNode.get());
             AssertMsg(tri_selector, "Could not create a collision object for id: " << GetId());
             mSceneNode->setTriangleSelector(tri_selector.get());
             LOG_F_DEBUG("collision", "creating bounding box triangle selector for id: " << GetId());
         }
         return tri_selector;
     }
 }
Beispiel #2
0
MySceneManager::MySceneManager()
{
	auto pEngine = MyIrrlichtEngine::GetEngine();
	smgr	= pEngine->GetSceneManager();
	driver	= pEngine->GetVideoDriver();
	timer	= pEngine->GetDevice()->getTimer();
}
Beispiel #3
0
void Humanoid::InstantiateAtom()
{
	//a single cuboid girder to cover this cell
	Ogre::SceneManager& sceneManager = GetSceneManager();
	m_pAtomEntity = sceneManager.createEntity("human_" + num2string(m_AtomID), "ninja.mesh");
	m_pAtomEntitySceneNode->attachObject(m_pAtomEntity);
	m_pAtomEntitySceneNode->scale(0.004f, 0.004f, 0.004f);
	m_pAtomEntitySceneNode->setPosition(0, -0.4f, 0);
	
	//create physics collider
	btVector3 halfExtents = btVector3(0.15f, 0.4f, 0.1f);
	m_pCollisionShape = new btBoxShape(halfExtents);
	btDefaultMotionState* startMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), OGRE2BT(m_pAtomEntitySceneNode->_getDerivedPosition())));
	btScalar mass = 100.f;
	btVector3 fallInertia(0,0,0);
	m_pCollisionShape->calculateLocalInertia(mass,fallInertia);
	btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, startMotionState, m_pCollisionShape, fallInertia);
	m_pRigidBody = new btRigidBody(rigidBodyCI);
	m_pRigidBody->setUserPointer(this);
	m_pRigidBody->setAngularFactor(0);
	
	InitCollisionShapeDebugDraw(Ogre::ColourValue::Green);

	//todo: is this working?
	//m_pRigidBody->setCollisionFlags(m_pRigidBody->CF_NO_CONTACT_RESPONSE);

	//add new rigid body to world
	btDiscreteDynamicsWorld& dynamicsWorld = GetDynamicsWorld();
	dynamicsWorld.addRigidBody(m_pRigidBody, COLLISION_MOB, COLLISION_STRUCTURE|COLLISION_OBJ|COLLISION_MOB);
	
	Mob::InstantiateAtom();
}
Beispiel #4
0
 void SceneObject::SetText(const std::string& str)
 {
     if (str.empty())
     {
         if (mTextNode)
         {
             mTextNode->remove();
             mTextNode = NULL;
         }
     }
     else
     {
         if (!mTextNode)
         {
             Font* f = Kernel::GetSimContext()->GetFont();
             BBoxf bbox = mSceneNode->getTransformedBoundingBox();
             float dY = bbox.MaxEdge.Y - bbox.MinEdge.Y;
             mTextNode = GetSceneManager()->addTextSceneNode
                 (f, 
                  irr::core::stringw(str.c_str()).c_str(), 
                  SColor(255,255,255,255), 
                  mSceneNode.get(), 
                  Vector3f(0,1.25 * dY,0));
         }
         else
         {
             mTextNode->setText(irr::core::stringw(str.c_str()).c_str());
         }
     }
 }
Beispiel #5
0
VoodooEntityView::VoodooEntityView( Entity* Object, Ogre::SceneManager* Mgr )
	: BasicOgreEntityView( Object,Mgr ), mNode( 0 ), mOgreEntity( 0 )
{
	mNode = GetSceneManager()->getRootSceneNode()->createChildSceneNode();

	// only if Model is set yet...
	if (Object->GetAttribute( "Model" ) != 0)
		OnEntityAttributeChanged( Object,"Model",
			Object->GetAttribute( "Model" ));
}
Beispiel #6
0
VoodooEntityView::~VoodooEntityView()
{
	// Remove entity (if we got one)
	if ( mOgreEntity )
	{
		mNode->detachObject( mOgreEntity );
		GetSceneManager()->destroyEntity( mOgreEntity );
		mOgreEntity=0;
	}
}
Beispiel #7
0
    void TerrainWeightEditor::ApplyWeightTexture()
    {
        if(!GetSceneManager())
            return;

        QImage map  = CreateImageFromCanvases();
        if(map.isNull())
            return;
        
        if(map.format() != QImage::Format_ARGB32)
        {
            map = map.convertToFormat(QImage::Format_ARGB32/*,Qt::NoOpaqueDetection*/);
        }
        Ogre::Box bounds(0, 0, map.width(), map.height());
        Ogre::PixelBox bufbox(bounds, Ogre::PF_A8R8G8B8, (void *)map.bits());
        Scene::EntityList list = scene_manager_->GetEntitiesWithComponent("EC_Terrain");
        Scene::EntityList::const_iterator it = list.begin();
        while(it!= list.end())
        {
            boost::shared_ptr<EC_Terrain> ptr = (*it)->GetComponent<EC_Terrain>();
            QString texname;
            texname += (*it)->GetName();
            texname += ptr->TypeName();
            texname += ptr->Name();
            texname += ".png";
            Ogre::String str(texname.toStdString());
            Ogre::TextureManager::getSingleton().remove(str);
            Ogre::TexturePtr tex = Ogre::TextureManager::getSingleton().createManual(str, "General", Ogre::TEX_TYPE_2D, bufbox.getWidth(), bufbox.getHeight(),bufbox.getDepth(),0,bufbox.format,Ogre::TU_DYNAMIC_WRITE_ONLY);
            if(tex.get())
            {
                tex->getBuffer()->blitFromMemory(bufbox);
            }
            ptr->texture0.Set(AssetReference(texname/*, "OgreTexture"*/), AttributeChange::Disconnected);
            it++;

            ///For now we just save this to assets folder. Later on, this should be replicated to server/clients etc.
            QImageWriter writer("data/assets/" + texname);
            writer.setCompression(0);
            writer.write(map);
            
        }
    }
Beispiel #8
0
    void TerrainWeightEditor::SetUseWeights(bool val)
    {
        if(!GetSceneManager())
            return;

        Scene::EntityList list = scene_manager_->GetEntitiesWithComponent("EC_Terrain");
        Scene::EntityList::const_iterator it = list.begin();

        //Quick fix, we will clone a new material copy for each terrain and assume there does not exist previous material clones
        int i = 0;
        Ogre::String mat_name;
        while(it!= list.end())
        {
            boost::shared_ptr<EC_Terrain> ptr = (*it)->GetComponent<EC_Terrain>();
            if (val)
                ptr->material.Set(AssetReference("Rex/TerrainPCF_weighted"/*, "OgreMaterial"*/), AttributeChange::Disconnected);
            else
                ptr->material.Set(AssetReference("Rex/TerrainPCF"/*, "OgreMaterial"*/), AttributeChange::Disconnected);

            Ogre::MaterialPtr mat = Ogre::MaterialManager::getSingleton().getByName(mat_name);
            if(mat.get())
            {
                if(i>0)
                    //So we have several terrains, need to create more materials
                    mat_name += Ogre::StringConverter::toString(i);

                Ogre::MaterialPtr new_mat =Ogre::MaterialManager::getSingleton().getByName(mat_name);
                if(!new_mat.get())
                    new_mat =  mat->clone(mat_name);
                if(new_mat.get())
                    ptr->material.Set(QString(new_mat->getName().c_str()),AttributeChange::Default);
            }
            it++;
            i++;
        }
    }
void UnderlayPlating::InstantiateStructure(bool a_IsBuildPoint)
{
	//an overlay plate is essentially an "outer cover" for the tile in one of the six cardinal directions
	//system is currently setup to handle any combination of the six, but it probably shouldn't be
	m_IsBuildPoint = a_IsBuildPoint;
	Ogre::SceneManager& sceneManager = GetSceneManager();
	//std::cout << "instantiating UnderlayPlating with direction " << m_Direction << std::endl;
	
	m_AtomFlags = RCD_CAN_DESTROY;

	//create entity
	m_pAtomEntity = sceneManager.createEntity("UnderlayPlating_" + num2string(m_AtomID), "cell_underlay.mesh");
	m_pAtomEntitySceneNode->attachObject(m_pAtomEntity);
	StopFlashingColour();

	//set up the directional offsets
	Ogre::Vector3 offsetPos(0, 0, 0);
	Ogre::Vector3 lookatPos(0, 0, 0);
	btVector3 halfExtents(0.5f, 0.5f, 0.5f);
	//std::cout << "	new overlay plating" << std::endl;
	if(m_Direction & NORTH)
	{
		offsetPos.z += 0.395f;
		lookatPos.z += 1;
		halfExtents.setZ(0.005f);
		//std::cout << "NORTH " << (isPhysical ? "plating" : "trigger") << std::endl;
	}
	if(m_Direction & SOUTH)
	{
		offsetPos.z -= 0.395f;
		lookatPos.z -= 1;
		halfExtents.setZ(0.005f);
		//std::cout << "SOUTH " << (isPhysical ? "plating" : "trigger") << std::endl;
	}
	if(m_Direction & EAST)
	{
		offsetPos.x += 0.395f;
		lookatPos.x += 1;
		halfExtents.setX(0.005f);
		//std::cout << "EAST " << (isPhysical ? "plating" : "trigger") << std::endl;
	}
	if(m_Direction & WEST)
	{
		offsetPos.x -= 0.395f;
		lookatPos.x -= 1;
		halfExtents.setX(0.005f);
		//std::cout << "WEST " << (isPhysical ? "plating" : "trigger") << std::endl;
	}
	if(m_Direction & UP)
	{
		offsetPos.y += 0.395f;
		lookatPos.y += 1;
		halfExtents.setY(0.005f);
		//std::cout << "UP " << (isPhysical ? "plating" : "trigger") << std::endl;
	}
	if(m_Direction & DOWN)
	{
		offsetPos.y -= 0.395f;
		lookatPos.y -= 1;
		halfExtents.setY(0.005f);
		//std::cout << "DOWN " << (isPhysical ? "plating" : "trigger") << std::endl;
	}
	m_pAtomEntitySceneNode->setPosition(offsetPos);
	m_pAtomEntitySceneNode->lookAt(lookatPos, Ogre::Node::TS_LOCAL);
	m_pAtomEntitySceneNode->yaw(Ogre::Degree(90));
	
	//create physics body and initialise to starting position
	m_pCollisionShape = new btBoxShape(halfExtents);
	btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), OGRE2BT(m_pAtomEntitySceneNode->_getDerivedPosition())));
	btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0, groundMotionState, m_pCollisionShape, btVector3(0,0,0));
	m_pRigidBody = new btRigidBody(groundRigidBodyCI);
	m_pRigidBody->setUserPointer(this);

	//add new rigid body to world
	btDiscreteDynamicsWorld& dynamicsWorld = GetDynamicsWorld();
	if(m_IsBuildPoint)
	{
		SetEntityVisible(false);
		m_pAtomEntity->setMaterialName("cell_highlight_material");
		dynamicsWorld.addRigidBody(m_pRigidBody, COLLISION_BUILDPOINT, RAYCAST_BUILD);

		//todo: is this working?
		//m_pRigidBody->setCollisionFlags(m_pRigidBody->CF_NO_CONTACT_RESPONSE);
	}
	else
	{
		dynamicsWorld.addRigidBody(m_pRigidBody, COLLISION_STRUCTURE, RAYCAST_BUILD|COLLISION_OBJ|COLLISION_MOB);
	}
	InitCollisionShapeDebugDraw(Ogre::ColourValue::Red);
}
Beispiel #10
0
void VoodooEntityView::OnEntityAttributeChanged(
        Entity*                  Rhs,
        const std::string&       Name,
        const EntityVariantType* Attribute
        )
{
	if ( Name == "Position" )
	{
		// Set the position, if it is available
		const vec3* Data = boost::get<vec3>( Attribute );

		if ( Data )
			mNode->setPosition( *Data );
	}
	else if( Name == "Scale" )
	{
		// Set the scale, if it is available
		const vec3* Data = boost::get<vec3>( Attribute );

		if( Data )
			mNode->setScale( *Data );
	}
	else if ( Name == "Model" )
	{
		// Delete all old bone names
		if ( mOgreEntity )
		{
			typedef Ogre::SkeletonInstance::BoneIterator iterator;
			Ogre::SkeletonInstance* Skeleton=
			        mOgreEntity->getSkeleton();
			for ( iterator i=Skeleton->getBoneIterator();
			      i.hasMoreElements();
			      )
			{
				Ogre::Bone* Bone=i.getNext();
				GetDataEntity()->RemoveAttribute( Bone->getName());
			}

			mNode->detachObject( mOgreEntity );
			GetSceneManager()->destroyEntity( mOgreEntity );
			mOgreEntity=0;
		}



		const std::string* Data=boost::get<std::string>( Attribute );

		if (!Data)
			return;

		// Create and attach the model entity
		const std::string EntityName = "Entity:" +
		                               boost::lexical_cast<std::string>(
		        GetDataEntity() );
		mOgreEntity = GetSceneManager()->createEntity( EntityName,
			*Data );
		mNode->attachObject( mOgreEntity );

		// Get all bones as properties
		typedef Ogre::SkeletonInstance::BoneIterator iterator;
		Ogre::SkeletonInstance* Skeleton=mOgreEntity->getSkeleton();
		Skeleton->setBindingPose();
		for ( iterator i=Skeleton->getBoneIterator(); i.hasMoreElements(); )
		{
			Ogre::Bone* Bone=i.getNext();
			Bone->setManuallyControlled( true );
			const std::string Name=Bone->getName();

			const quat Val = Bone->getOrientation();

			// if this attribute has already a attribute, do not overwrite it and inform observers (to  get visualize the orientation here)
			if ( GetDataEntity()->GetAttribute( Name ) == 0 )
			{
				GetDataEntity()->Set<quat>( Name, Val );
			}
			else
			{
				GetDataEntity()->Changed( Name,
					GetDataEntity()->GetAttribute( Name ));
			}
		}
	}
	else if (Rhs->GetAttribute( "Model" ) != 0)
	{
		const Entity::AttributeType& Attributes=Rhs->GetAttributes();
		typedef Entity::AttributeType::value_type ValueType;

		// Check if this is an angle value and a bone of this name exists
		Ogre::SkeletonInstance* Skeleton=mOgreEntity->getSkeleton();
		const quat*             Val = boost::get<quat>( Attribute );

		if ( Val && Skeleton->hasBone( Name ) )
		{
			Ogre::Bone* Bone=Skeleton->getBone( Name );

			Ogre::Quaternion CorrectorX;
			CorrectorX.FromAngleAxis( Ogre::Radian( Ogre::Degree( -
						90 ) ), vec3( 1.f, 0.f, 0.f ) );
			Ogre::Quaternion CorrectorZ;
			CorrectorZ.FromAngleAxis( Ogre::Radian( Ogre::Degree(
						90 ) ), vec3( 0.f, 0.f, 1.f ) );

			Ogre::Quaternion Corrector = CorrectorX * CorrectorZ;

			Bone->setOrientation(
				Bone->getInitialOrientation() * Corrector *
				( *Val ) *
				Corrector.UnitInverse() );

			// FIXME: is this really needed?
			mOgreEntity->getAllAnimationStates()->_notifyDirty();
		}
	}
}
Beispiel #11
0
    /**
     * Load this object from a template
     * @param objTemplate template to load from
     * @return true if success
     */
    bool SceneObject::LoadFromTemplate( ObjectTemplatePtr objTemplate, const SimEntityData& data )
    {
        if( !objTemplate )
            return false;

        Assert( objTemplate->mpSimFactory );

        // cast to object template to the type we expect
        mSceneObjectTemplate = static_pointer_cast< SceneObjectTemplate, ObjectTemplate>( objTemplate );

        IrrFactory& irrFactory = mSceneObjectTemplate->mpSimFactory->getIrrFactory();

        // are we an animated mesh?
        if( mSceneObjectTemplate->mAniMesh )
        {
            mAniSceneNode = irrFactory.addAnimatedMeshSceneNode( mSceneObjectTemplate->mAniMesh.get() );
            if (mSceneObjectTemplate->mCastsShadow)
            {
                mAniSceneNode->addShadowVolumeSceneNode();
            }
            mFPSCamera = mSceneObjectTemplate->mFPSCamera; // reminder to attach camera later

			mAniSceneNode->setAnimationSpeed(0);
            mStartFrame = mAniSceneNode->getStartFrame();
            mEndFrame = mAniSceneNode->getEndFrame();
            mAniSceneNode->setFrameLoop(0,0);
            mAniSceneNode->setCurrentFrame(0);

			mSceneNode = mAniSceneNode;
        }

        // are we a terrain?
        else if( mSceneObjectTemplate->mHeightmap != "" )
        {
            mTerrSceneNode = irrFactory.addTerrainSceneNode( mSceneObjectTemplate->mHeightmap.c_str() );
            mSceneNode     = mTerrSceneNode;
            mTerrSceneNode->scaleTexture( mSceneObjectTemplate->mScaleTexture.X, mSceneObjectTemplate->mScaleTexture.Y );
        }

        // are we a particle system?
        else if( mSceneObjectTemplate->mParticleSystem != "" )
        {
            mParticleSystemNode = irrFactory.addParticleSystemNode( mSceneObjectTemplate->mParticleSystem );
            mSceneNode          = mParticleSystemNode;
            // don't add a triangle selector for a particle node
        }

        if( mSceneNode )
        {
            // assign the textures
            for( uint32_t i = 0; i < (uint32_t)mSceneObjectTemplate->mTextures.size(); ++i )
                mSceneNode->setMaterialTexture( i, mSceneObjectTemplate->mTextures[i].get() );

            // set the material flags
            std::vector<IrrMaterialFlag>::const_iterator flagItr = mSceneObjectTemplate->mMaterialFlags.begin();
            std::vector<IrrMaterialFlag>::const_iterator flagEnd = mSceneObjectTemplate->mMaterialFlags.end();
            for( ; flagItr != flagEnd; ++flagItr )
                mSceneNode->setMaterialFlag( flagItr->mFlag, flagItr->mValue );

            // set the material type
            mSceneNode->setMaterialType( mSceneObjectTemplate->mMaterialType );

            // set the node scale
            Vector3f scale = mSceneObjectTemplate->mScale;
            /// we can optionally multiply by a custom scale
            scale.X = scale.X * data.GetScale().X;
            scale.Y = scale.Y * data.GetScale().Y;
            scale.Z = scale.Z * data.GetScale().Z;
            mSceneNode->setScale( ConvertNeroToIrrlichtPosition(scale) );

            // make the id of the scene node the same as the SimId of our object
            mSceneNode->setID(ConvertSimIdToSceneId(data.GetId(), data.GetType()));

            // set the position of the object
            SetPosition( data.GetPosition() );

            // set the rotation of the object
            SetRotation( data.GetRotation() );

            // set up the triangle selector for this object
            //if (data.GetType() > 0) {
            {
                ITriangleSelector_IPtr tri_selector = GetTriangleSelector();
                if (!tri_selector) {
                    LOG_F_WARNING("collision", "could not create triangle selector for collisions with object " << GetId());
                }
            }
            //}

            // additionally, add a collision response animator
            if (canCollide()) {
                // the world will return the triangles that match the type mask
                ITriangleSelector* world = new CollideByTypeTriangleSelector(mSceneObjectTemplate->mCollisionMask);
                // get the axis-aligned bounding box for the node
                BBoxf box = mSceneNode->getBoundingBox();
                // use the aabbox to make the ellipsoid for the collision response animator
                Vector3f ellipsoid_radius = box.MaxEdge - box.getCenter();
                // TODO: might add gravity here
                Vector3f gravity(0,0,0);
                // ellipsoid translation relative to object coordinates
                Vector3f ellipsoid_translation(0,0,0);
                mCollider = GetSceneManager()->createCollisionResponseAnimator(
                    world, mSceneNode.get(), ellipsoid_radius, gravity, ellipsoid_translation);
                if (!mCollider) {
                    LOG_F_ERROR("collision", "could not create Collision Response Animator for object id: " << data.GetId());
                } else {
                    SafeIrrDrop(world); // we don't need the handle
                    mSceneNode->addAnimator(mCollider.get());
                    LOG_F_DEBUG("collision",
                        "added collision response animator for object id: "
                        << data.GetId() << " of type: " << data.GetType()
                        << " for collision with mask: " << mSceneObjectTemplate->mCollisionMask
                        << " with bounding ellipsoid: " << ellipsoid_radius);
                }
            }

#if SCENEOBJECT_ENABLE_STATS
            // debug information
            if( mTerrSceneNode )
            {
                const aabbox3df& bbox = mTerrSceneNode->getBoundingBox();

                vector3df  dim  = bbox.MaxEdge - bbox.MinEdge;

                float32_t vol = dim.X * dim.Y * dim.Z;
                vol = (vol<0) ? -vol : vol;

                LOG_F_MSG( "render", "Added terrain with heightmap: " << mSceneObjectTemplate->mHeightmap );
                LOG_F_MSG( "render", "   Dim: (" << dim.X << ", " << dim.Y << ", " << dim.Z << ")" );
                LOG_F_MSG( "render", "   Volume: " << vol );
            }
#endif // end SCENEOBJECT_ENABLE_STATS
        }

        return true;
    }
Beispiel #12
0
void CDemo::EnableInput(bool enabled)
{
	scene::ICameraSceneNode* camera = GetSceneManager()->getActiveCamera();
	camera->setInputReceiverEnabled(enabled);
}
Beispiel #13
0
bool CDemo::OnEvent(const SEvent& event)
{
	if (!device)
		return false;

	// Remember whether each key is down or up
	if (event.EventType == irr::EET_KEY_INPUT_EVENT)
		KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;

	if (event.EventType == EET_KEY_INPUT_EVENT &&
		event.KeyInput.Key == KEY_ESCAPE &&
		event.KeyInput.PressedDown == false)
	{
		// user wants to quit.
//		if (currentScene < 3)
//			timeForThisScene = 0;
//		else
			//device->closeDevice();

		// RakNet: Escape to get the mouse back
		if (GetSceneManager()->getActiveCamera()->isVisible())
		{
			device->getCursorControl()->setVisible(true);
			GetSceneManager()->getActiveCamera()->setVisible(false);
		}
		else
		{
			device->closeDevice();
		}
	}
	else
	if (
		// RakNet: Use space to jump, not shoot
//		(event.EventType == EET_KEY_INPUT_EVENT &&
//		event.KeyInput.Key == KEY_SPACE &&
//		event.KeyInput.PressedDown == false) ||
		(event.EventType == EET_MOUSE_INPUT_EVENT &&
		event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) &&
		//currentScene == 3
		currentScene == 1
		)
	{

		// RakNet: Click without focus to get focus back
		if (GetSceneManager()->getActiveCamera()->isVisible()==false)
		{
			device->getCursorControl()->setVisible(false);
			GetSceneManager()->getActiveCamera()->setVisible(true);
		}
		else
		{
			// shoot
			shoot();
		}
	}
	else
	if (event.EventType == EET_KEY_INPUT_EVENT &&
		event.KeyInput.Key == KEY_F9 &&
		event.KeyInput.PressedDown == false)
	{
		video::IImage* image = device->getVideoDriver()->createScreenShot();
		if (image)
		{
			device->getVideoDriver()->writeImageToFile(image, "screenshot.bmp");
			device->getVideoDriver()->writeImageToFile(image, "screenshot.png");
			device->getVideoDriver()->writeImageToFile(image, "screenshot.tga");
			device->getVideoDriver()->writeImageToFile(image, "screenshot.ppm");
			device->getVideoDriver()->writeImageToFile(image, "screenshot.jpg");
			device->getVideoDriver()->writeImageToFile(image, "screenshot.pcx");
			image->drop();
		}
	}
	else
	if (device->getSceneManager()->getActiveCamera())
	{
		device->getSceneManager()->getActiveCamera()->OnEvent(event);
		return true;
	}

	return false;
}