/// 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; } }
MySceneManager::MySceneManager() { auto pEngine = MyIrrlichtEngine::GetEngine(); smgr = pEngine->GetSceneManager(); driver = pEngine->GetVideoDriver(); timer = pEngine->GetDevice()->getTimer(); }
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(); }
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()); } } }
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" )); }
VoodooEntityView::~VoodooEntityView() { // Remove entity (if we got one) if ( mOgreEntity ) { mNode->detachObject( mOgreEntity ); GetSceneManager()->destroyEntity( mOgreEntity ); mOgreEntity=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); } }
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); }
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(); } } }
/** * 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; }
void CDemo::EnableInput(bool enabled) { scene::ICameraSceneNode* camera = GetSceneManager()->getActiveCamera(); camera->setInputReceiverEnabled(enabled); }
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; }