void DotSceneLoader::processCamera(rapidxml::xml_node<>* XMLNode, Ogre::SceneNode *pParent) { // Process attributes Ogre::String name = getAttrib(XMLNode, "name"); Ogre::String id = getAttrib(XMLNode, "id"); // Ogre::Real fov = getAttribReal(XMLNode, "fov", 45); // Ogre::Real aspectRatio = getAttribReal(XMLNode, "aspectRatio", 1.3333); Ogre::String projectionType = getAttrib(XMLNode, "projectionType", "perspective"); // Create the camera Ogre::Camera *pCamera = mSceneMgr->createCamera(name); // Set the projection type if (projectionType == "perspective") pCamera->setProjectionType(Ogre::PT_PERSPECTIVE); else if (projectionType == "orthographic") pCamera->setProjectionType(Ogre::PT_ORTHOGRAPHIC); rapidxml::xml_node<>* pElement; // Process clipping (?) pElement = XMLNode->first_node("clipping"); if (pElement) { Ogre::Real nearDist = getAttribReal(pElement, "near"); if (nearDist > 0) pCamera->setNearClipDistance(nearDist); Ogre::Real farDist = getAttribReal(pElement, "far"); pCamera->setFarClipDistance(farDist); } // Process position (?) pElement = XMLNode->first_node("position"); if (pElement) pCamera->setPosition(parseVector3(pElement)); // Process rotation (?) pElement = XMLNode->first_node("rotation"); if (pElement) pCamera->setOrientation(parseQuaternion(pElement)); // construct a scenenode is no parent if (!pParent) { Ogre::SceneNode* pNode = mAttachNode->createChildSceneNode(name); pNode->setPosition(pCamera->getPosition()); pNode->setOrientation(pCamera->getOrientation()); pNode->scale(1, 1, 1); } }
void ReliefApp::GenerateRelief() { //Get depth data Ogre::TexturePtr depthTex = Ogre::TextureManager::getSingleton().createManual( "DepthTexture", // name Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, // type 512, // width 512, // height 0, // number of mipmaps //Ogre::PF_B8G8R8A8, // pixel format Ogre::PF_FLOAT32_R, Ogre::TU_RENDERTARGET ); Ogre::RenderTarget* pTarget = depthTex->getBuffer()->getRenderTarget(); Ogre::Camera* pOrthCam = MagicCore::RenderSystem::GetSingleton()->GetMainCamera(); pOrthCam->setProjectionType(Ogre::PT_ORTHOGRAPHIC); pOrthCam->setOrthoWindow(3, 3); pOrthCam->setPosition(0, 0, 3); pOrthCam->lookAt(0, 0, 0); pOrthCam->setAspectRatio(1.0); pOrthCam->setNearClipDistance(0.5); pOrthCam->setFarClipDistance(5); Ogre::Viewport* pViewport = pTarget->addViewport(pOrthCam); pViewport->setDimensions(0, 0, 1, 1); MagicCore::RenderSystem::GetSingleton()->RenderLightMesh3D("RenderMesh", "Depth", mpLightMesh); MagicCore::RenderSystem::GetSingleton()->Update(); Ogre::Image img; depthTex->convertToImage(img); std::vector<double> heightField(512 * 512); for(int x = 0; x < 512; x++) { for(int y = 0; y < 512; y++) { heightField.at(x * 512 + y) = (img.getColourAt(x, 511 - y, 0))[1]; } } Ogre::TextureManager::getSingleton().remove("DepthTexture"); // MagicDGP::LightMesh3D* pReliefMesh = MagicDGP::ReliefGeneration::PlaneReliefFromHeightField(heightField, 511, 511); //MagicDGP::LightMesh3D* pReliefMesh = MagicDGP::ReliefGeneration::CylinderReliefFromHeightField(heightField, 511, 511); if (pReliefMesh != NULL) { delete mpLightMesh; mpLightMesh = pReliefMesh; mpLightMesh->UnifyPosition(2); mpLightMesh->UpdateNormal(); } MagicCore::RenderSystem::GetSingleton()->SetupCameraDefaultParameter(); MagicCore::RenderSystem::GetSingleton()->RenderLightMesh3D("RenderMesh", "MyCookTorrance", mpLightMesh); }
void CinematicManager::createOrthoCamera(Ogre::Real windowW, Ogre::Real windowH, const Ogre::Vector3 &initialPos, const Ogre::Quaternion &initialOrient, Control* control) { Ogre::Camera* cam = _scnMgr->createCamera(ORTHO_CAM_NAME + Ogre::StringConverter::toString(_camCurId)); cam->setProjectionType(Ogre::PT_ORTHOGRAPHIC); cam->setOrthoWindow(100, 50); cam->setNearClipDistance(1); cam->setPosition(0.0f, 0.0f, 0.0f); //cam->setFarClipDistance(100.0f); cam->setFOVy(Ogre::Radian(Ogre::Math::PI / 2.0f)); Ogre::SceneNode* defaultNode = _scnMgr->createSceneNode(); defaultNode->setPosition(initialPos); defaultNode->setOrientation(initialOrient); defaultNode->attachObject(cam); _camsVec.push_back(new ZCameraInfo(_camsVec.size(), "ORTHOGRAPHIC", cam->getName(), control, cam)); }
/** * This is the most basic "triangle" example, done as a Scene in Ogre. */ Ogre::SceneManager* createTriangleScene() { Ogre::SceneManager* scene = mRoot->createSceneManager(Ogre::ST_GENERIC); // Configure camera (~ view & projection transforms, i.e. gluLookAt + glOrtho) Ogre::Camera* camera = scene->createCamera("MainCamera"); // We can use an arbitrary name here camera->setProjectionType(Ogre::PT_ORTHOGRAPHIC); camera->setOrthoWindow(2, 2); // ~ glOrtho(-1, 1, -1, 1) camera->setAspectRatio((float) mWindow->getWidth() / mWindow->getHeight()); camera->setNearClipDistance(0.5); camera->setPosition(Ogre::Vector3(0,0,1)); // Move camera away from (0, 0, 0), otherwise the triangle at z=0 will be clipped // Now add some geometry to the scene Ogre::ManualObject* triangle = scene->createManualObject("Triangle"); // ~ glBegin, glVertex, glEnd // "BaseWhiteNoLighting" is a built-in name for a basic non-lit material triangle->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST); triangle->position(0, 0.5, 0); // ~ glVertex. // Contrary to OpenGL we *first* must create the vertex triangle->colour(Ogre::ColourValue::Red); // .. and then provide its attributes such as color (~ glColor) triangle->position(-0.5, -0.5, 0); triangle->colour(Ogre::ColourValue::Green); triangle->position(0.5, -0.5, 0); triangle->colour(Ogre::ColourValue::Blue); triangle->end(); // Add the created triangle object to the scene graph // For this we create a SceneNode object, which will combine information about // the object's geometry with its modeling transform // (see frameRenderingQueued to understand how to rotate the triangle by changing this transform) scene->getRootSceneNode()->createChildSceneNode("Triangle")->attachObject(triangle); // Exercise 1: Create new object, add vertices, attach the object to a new SceneNode // ... return scene; }
void DotSceneLoader::processCamera(rapidxml::xml_node<>* XMLNode, Ogre::SceneNode *pParent) { // Process attributes Ogre::String name = getAttrib(XMLNode, "name"); Ogre::String id = getAttrib(XMLNode, "id"); Ogre::Real fov = getAttribReal(XMLNode, "fov", 45); Ogre::Real aspectRatio = getAttribReal(XMLNode, "aspectRatio", 1.3333); Ogre::String projectionType = getAttrib(XMLNode, "projectionType", "perspective"); // Create the camera Ogre::Camera *pCamera = mSceneMgr->createCamera(name); //TODO: make a flag or attribute indicating whether or not the camera should be attached to any parent node. //if(pParent) // pParent->attachObject(pCamera); // Set the field-of-view //! @todo Is this always in degrees? //pCamera->setFOVy(Ogre::Degree(fov)); // Set the aspect ratio //pCamera->setAspectRatio(aspectRatio); // Set the projection type if (projectionType == "perspective") pCamera->setProjectionType(Ogre::PT_PERSPECTIVE); else if (projectionType == "orthographic") pCamera->setProjectionType(Ogre::PT_ORTHOGRAPHIC); rapidxml::xml_node<>* pElement; // Process clipping (?) pElement = XMLNode->first_node("clipping"); if (pElement) { Ogre::Real nearDist = getAttribReal(pElement, "near"); pCamera->setNearClipDistance(nearDist); Ogre::Real farDist = getAttribReal(pElement, "far"); pCamera->setFarClipDistance(farDist); } // Process position (?) pElement = XMLNode->first_node("position"); if (pElement) pCamera->setPosition(parseVector3(pElement)); // Process rotation (?) pElement = XMLNode->first_node("rotation"); if (pElement) pCamera->setOrientation(parseQuaternion(pElement)); // Process normal (?) pElement = XMLNode->first_node("normal"); if (pElement) ;//!< @todo What to do with this element? // Process lookTarget (?) pElement = XMLNode->first_node("lookTarget"); if (pElement) ;//!< @todo Implement the camera look target // Process trackTarget (?) pElement = XMLNode->first_node("trackTarget"); if (pElement) ;//!< @todo Implement the camera track target // Process userDataReference (?) pElement = XMLNode->first_node("userDataReference"); if (pElement) ;//!< @todo Implement the camera user data reference // construct a scenenode is no parent if (!pParent) { Ogre::SceneNode* pNode = mAttachNode->createChildSceneNode(name); pNode->setPosition(pCamera->getPosition()); pNode->setOrientation(pCamera->getOrientation()); pNode->scale(1, 1, 1); } }
//! //! Clones an Ogre::MovableObject. //! //! Is needed because OGRE does not provide clone functions for cameras and //! lights. //! //! \param movableObject The object to clone. //! \param name The name to use for the object. //! \param sceneManager The scene manager to use for creating the object. //! \return The cloned object. //! Ogre::MovableObject * OgreTools::cloneMovableObject ( Ogre::MovableObject *movableObject, const QString &name, Ogre::SceneManager *sceneManager /* = 0 */ ) { // make sure the given object is valid if (!movableObject) { Log::error("The given movable object is invalid.", "OgreTools::cloneMovableObject"); return 0; } // make sure a valid scene manager is available if (!sceneManager) sceneManager = movableObject->_getManager(); if (!sceneManager) { Log::error("No valid scene manager available.", "OgreTools::cloneMovableObject"); return 0; } Ogre::MovableObject *result = 0; Ogre::String typeName = movableObject->getMovableType(); if (typeName == "Entity") { // clone entity Ogre::Entity *entity = dynamic_cast<Ogre::Entity *>(movableObject); //movableObjectCopy = entity->clone(name.toStdString()); Ogre::Entity *entityCopy = sceneManager->createEntity(name.toStdString(), entity->getMesh()->getName()); Ogre::AnimationStateSet *animationStateSet = entity->getAllAnimationStates(); Ogre::AnimationStateSet *animationStateSetCopy = entityCopy->getAllAnimationStates(); // set the same blend mode on entity copy if (entity && entityCopy) { if (entity->hasSkeleton() && entityCopy->hasSkeleton()) { Ogre::Skeleton *skeleton = entity->getSkeleton(); Ogre::Skeleton *skeletonCopy = entityCopy->getSkeleton(); skeletonCopy->setBlendMode(skeleton->getBlendMode()); } } // copy all animation states if (animationStateSet && animationStateSetCopy) { Ogre::AnimationStateIterator animationStateIter = animationStateSet->getAnimationStateIterator(); Ogre::AnimationStateIterator animationStateCopyIter = animationStateSetCopy->getAnimationStateIterator(); while (animationStateIter.hasMoreElements()) { if (!animationStateCopyIter.hasMoreElements()) break; Ogre::AnimationState *animationState = animationStateIter.getNext(); Ogre::AnimationState *animationStateCopy = animationStateCopyIter.getNext(); animationStateCopy->setLoop(animationState->getLoop()); //bool enabled = animationState->getEnabled(); //animationStateCopy->setEnabled(animationState->getEnabled()); animationStateCopy->setEnabled(true); animationStateCopy->setTimePosition(animationState->getTimePosition()); } } // create a new container for the cloned entity OgreContainer *entityCopyContainer = new OgreContainer(entityCopy); entityCopy->setUserAny(Ogre::Any(entityCopyContainer)); if (!entity->getUserAny().isEmpty()) { OgreContainer *entityContainer = Ogre::any_cast<OgreContainer *>(entity->getUserAny()); if (entityContainer) { QObject::connect(entityContainer, SIGNAL(animationStateUpdated(const QString &, double)), entityCopyContainer, SLOT(updateAnimationState(const QString &, double))); QObject::connect(entityContainer, SIGNAL(boneTransformUpdated(const QString &, double, double, double, double, double, double)), entityCopyContainer, SLOT(updateBoneTransform(const QString &, double, double, double, double, double, double))); } } result = dynamic_cast<Ogre::MovableObject *>(entityCopy); } else if (typeName == "Light") { // clone light Ogre::Light *light = dynamic_cast<Ogre::Light *>(movableObject); Ogre::Light *lightCopy = sceneManager->createLight(name.toStdString()); lightCopy->setType(light->getType()); lightCopy->setDiffuseColour(light->getDiffuseColour()); lightCopy->setSpecularColour(light->getSpecularColour()); lightCopy->setAttenuation(light->getAttenuationRange(), light->getAttenuationConstant(), light->getAttenuationLinear(), light->getAttenuationQuadric()); lightCopy->setPosition(light->getPosition()); lightCopy->setDirection(light->getDirection()); if (lightCopy->getType() == Ogre::Light::LT_SPOTLIGHT) lightCopy->setSpotlightRange(light->getSpotlightInnerAngle(), light->getSpotlightOuterAngle(), light->getSpotlightFalloff()); lightCopy->setPowerScale(light->getPowerScale()); lightCopy->setCastShadows(light->getCastShadows()); // create a new container for the cloned light OgreContainer *lightCopyContainer = new OgreContainer(lightCopy); lightCopy->setUserAny(Ogre::Any(lightCopyContainer)); if (!light->getUserAny().isEmpty()) { OgreContainer *lightContainer = Ogre::any_cast<OgreContainer *>(light->getUserAny()); if (lightContainer) QObject::connect(lightContainer, SIGNAL(sceneNodeUpdated()), lightCopyContainer, SLOT(updateLight())); } result = dynamic_cast<Ogre::MovableObject *>(lightCopy); } else if (typeName == "Camera") { // clone camera Ogre::Camera *camera = dynamic_cast<Ogre::Camera *>(movableObject); Ogre::Camera *cameraCopy = sceneManager->createCamera(name.toStdString()); //cameraCopy->setCustomParameter(0, camera->getCustomParameter(0)); cameraCopy->setAspectRatio(camera->getAspectRatio()); cameraCopy->setAutoAspectRatio(camera->getAutoAspectRatio()); //cameraCopy->setAutoTracking(...); cameraCopy->setCastShadows(camera->getCastsShadows()); //cameraCopy->setCullingFrustum(camera->getCullingFrustum()); //cameraCopy->setCustomParameter(...); //cameraCopy->setCustomProjectionMatrix(..); //cameraCopy->setCustomViewMatrix(..); //cameraCopy->setDebugDisplayEnabled(...); //cameraCopy->setDefaultQueryFlags(...); //cameraCopy->setDefaultVisibilityFlags(...); cameraCopy->setDirection(camera->getDirection()); //cameraCopy->setFixedYawAxis(...); cameraCopy->setFocalLength(camera->getFocalLength()); cameraCopy->setFOVy(camera->getFOVy()); //Ogre::Real left; //Ogre::Real right; //Ogre::Real top; //Ogre::Real bottom; //camera->getFrustumExtents(left, right, top, bottom); //cameraCopy->setFrustumExtents(left, right, top, bottom); //cameraCopy->setFrustumOffset(camera->getFrustumOffset()); //cameraCopy->setListener(camera->getListener()); cameraCopy->setLodBias(camera->getLodBias()); //cameraCopy->setLodCamera(camera->getLodCamera()); cameraCopy->setNearClipDistance(camera->getNearClipDistance()); cameraCopy->setFarClipDistance(camera->getFarClipDistance()); cameraCopy->setOrientation(camera->getOrientation()); //cameraCopy->setOrthoWindow(...); //cameraCopy->setOrthoWindowHeight(...); //cameraCopy->setOrthoWindowWidth(...); cameraCopy->setPolygonMode(camera->getPolygonMode()); cameraCopy->setPolygonModeOverrideable(camera->getPolygonModeOverrideable()); cameraCopy->setPosition(camera->getPosition()); cameraCopy->setProjectionType(camera->getProjectionType()); cameraCopy->setQueryFlags(camera->getQueryFlags()); cameraCopy->setRenderingDistance(camera->getRenderingDistance()); cameraCopy->setRenderQueueGroup(camera->getRenderQueueGroup()); //cameraCopy->setRenderSystemData(camera->getRenderSystemData()); cameraCopy->setUseIdentityProjection(camera->getUseIdentityProjection()); cameraCopy->setUseIdentityView(camera->getUseIdentityView()); //cameraCopy->setUserAny(camera->getUserAny()); cameraCopy->setUseRenderingDistance(camera->getUseRenderingDistance()); //cameraCopy->setUserObject(camera->getUserObject()); cameraCopy->setVisibilityFlags(camera->getVisibilityFlags()); cameraCopy->setVisible(camera->getVisible()); //cameraCopy->setWindow(...); if (!movableObject->getUserAny().isEmpty()) { CameraInfo *sourceCameraInfo = Ogre::any_cast<CameraInfo *>(movableObject->getUserAny()); if (sourceCameraInfo) { CameraInfo *targetCameraInfo = new CameraInfo(); targetCameraInfo->width = sourceCameraInfo->width; targetCameraInfo->height = sourceCameraInfo->height; dynamic_cast<Ogre::MovableObject *>(cameraCopy)->setUserAny(Ogre::Any(targetCameraInfo)); } } //// Setup connections for instances //SceneNode *targetSceneNode = new SceneNode(cameraCopy); //((Ogre::MovableObject *)cameraCopy)->setUserAny(Ogre::Any(targetSceneNode)); //if (!((Ogre::MovableObject *)camera)->getUserAny().isEmpty()) { // SceneNode *sourceSceneNode = Ogre::any_cast<SceneNode *>(((Ogre::MovableObject *)camera)->getUserAny()); // if (sourceSceneNode) { // QObject::connect(sourceSceneNode, SIGNAL(sceneNodeUpdated()), targetSceneNode, SLOT(updateSceneNode())); // } //} result = dynamic_cast<Ogre::MovableObject *>(cameraCopy); } if (!result) Log::error(QString("Could not clone movable object \"%1\" of type \"%2\".").arg(movableObject->getName().c_str()).arg(typeName.c_str()), "OgreTools::cloneMovableObject"); return result; }
int initOgreAR(aruco::CameraParameters camParams, unsigned char* buffer, std::string resourcePath) { /// INIT OGRE FUNCTIONS #ifdef _WIN32 root = new Ogre::Root(resourcePath + "plugins_win.cfg", resourcePath + "ogre_win.cfg"); #elif __x86_64__ || __ppc64__ root = new Ogre::Root(resourcePath + "plugins_x64.cfg", resourcePath + "ogre.cfg"); #else root = new Ogre::Root(resourcePath + "plugins.cfg", resourcePath + "ogre.cfg"); #endif if (!root->showConfigDialog()) return -1; Ogre::SceneManager* smgr = root->createSceneManager(Ogre::ST_GENERIC); /// CREATE WINDOW, CAMERA AND VIEWPORT Ogre::RenderWindow* window = root->initialise(true); Ogre::Camera *camera; Ogre::SceneNode* cameraNode; camera = smgr->createCamera("camera"); camera->setNearClipDistance(0.01f); camera->setFarClipDistance(10.0f); camera->setProjectionType(Ogre::PT_ORTHOGRAPHIC); camera->setPosition(0, 0, 0); camera->lookAt(0, 0, 1); double pMatrix[16]; camParams.OgreGetProjectionMatrix(camParams.CamSize,camParams.CamSize, pMatrix, 0.05,10, false); Ogre::Matrix4 PM(pMatrix[0], pMatrix[1], pMatrix[2] , pMatrix[3], pMatrix[4], pMatrix[5], pMatrix[6] , pMatrix[7], pMatrix[8], pMatrix[9], pMatrix[10], pMatrix[11], pMatrix[12], pMatrix[13], pMatrix[14], pMatrix[15]); camera->setCustomProjectionMatrix(true, PM); camera->setCustomViewMatrix(true, Ogre::Matrix4::IDENTITY); window->addViewport(camera); cameraNode = smgr->getRootSceneNode()->createChildSceneNode("cameraNode"); cameraNode->attachObject(camera); /// CREATE BACKGROUND FROM CAMERA IMAGE int width = camParams.CamSize.width; int height = camParams.CamSize.height; // create background camera image mPixelBox = Ogre::PixelBox(width, height, 1, Ogre::PF_R8G8B8, buffer); // Create Texture mTexture = Ogre::TextureManager::getSingleton().createManual("CameraTexture",Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D,width,height,0,Ogre::PF_R8G8B8,Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE); //Create Camera Material Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("CameraMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); Ogre::Technique *technique = material->createTechnique(); technique->createPass(); material->getTechnique(0)->getPass(0)->setLightingEnabled(false); material->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); material->getTechnique(0)->getPass(0)->createTextureUnitState("CameraTexture"); Ogre::Rectangle2D* rect = new Ogre::Rectangle2D(true); rect->setCorners(-1.0, 1.0, 1.0, -1.0); rect->setMaterial("CameraMaterial"); // Render the background before everything else rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_BACKGROUND); // Hacky, but we need to set the bounding box to something big, use infinite AAB to always stay visible Ogre::AxisAlignedBox aabInf; aabInf.setInfinite(); rect->setBoundingBox(aabInf); // Attach background to the scene Ogre::SceneNode* node = smgr->getRootSceneNode()->createChildSceneNode("Background"); node->attachObject(rect); /// CREATE SIMPLE OGRE SCENE // add sinbad.mesh Ogre::ResourceGroupManager::getSingleton().addResourceLocation(resourcePath + "Sinbad.zip", "Zip", "Popular"); Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); for(int i=0; i<MAX_MARKERS; i++) { Ogre::String entityName = "Marker_" + Ogre::StringConverter::toString(i); Ogre::Entity* ogreEntity = smgr->createEntity(entityName, "Sinbad.mesh"); Ogre::Real offset = ogreEntity->getBoundingBox().getHalfSize().y; ogreNode[i] = smgr->getRootSceneNode()->createChildSceneNode(); // add entity to a child node to correct position (this way, entity axis is on feet of sinbad) Ogre::SceneNode *ogreNodeChild = ogreNode[i]->createChildSceneNode(); ogreNodeChild->attachObject(ogreEntity); // Sinbad is placed along Y axis, we need to rotate to put it along Z axis so it stands up over the marker // first rotate along X axis, then add offset in Z dir so it is over the marker and not in the middle of it ogreNodeChild->rotate(Ogre::Vector3(1,0,0), Ogre::Radian(Ogre::Degree(90))); ogreNodeChild->translate(0,0,offset,Ogre::Node::TS_PARENT); // mesh is too big, rescale! const float scale = 0.006675f; ogreNode[i]->setScale(scale, scale, scale); // Init animation ogreEntity->getSkeleton()->setBlendMode(Ogre::ANIMBLEND_CUMULATIVE); if(i==0) { baseAnim[i] = ogreEntity->getAnimationState("HandsClosed"); topAnim[i] = ogreEntity->getAnimationState("HandsRelaxed"); } else if(i==1) { baseAnim[i] = ogreEntity->getAnimationState("Dance"); topAnim[i] = ogreEntity->getAnimationState("Dance"); } else if(i==2) { baseAnim[i] = ogreEntity->getAnimationState("RunBase"); topAnim[i] = ogreEntity->getAnimationState("RunTop"); } else { baseAnim[i] = ogreEntity->getAnimationState("IdleBase"); topAnim[i] = ogreEntity->getAnimationState("IdleTop"); } baseAnim[i]->setLoop(true); topAnim[i]->setLoop(true); baseAnim[i]->setEnabled(true); topAnim[i]->setEnabled(true); } /// KEYBOARD INPUT READING size_t windowHnd = 0; window->getCustomAttribute("WINDOW", &windowHnd); im = OIS::InputManager::createInputSystem(windowHnd); keyboard = static_cast<OIS::Keyboard*>(im->createInputObject(OIS::OISKeyboard, true)); return 1; }