+#ifdef __ANDROID__
+ const GLubyte* renderstr = glGetString(GL_RENDERER);
+ std::string renderer((char*) renderstr);
+
+ // use no render to texture hack
+ if (
+ (renderer.find("Adreno") != std::string::npos) ||
+ (renderer.find("Mali") != std::string::npos) ||
+ (renderer.find("Immersion") != std::string::npos) ||
+ (renderer.find("Tegra") != std::string::npos) ||
+ g_settings->getBool("inventory_image_hack")
+ ) {
+ // Get a scene manager
+ scene::ISceneManager *smgr_main = m_device->getSceneManager();
+ assert(smgr_main);
+ scene::ISceneManager *smgr = smgr_main->createNewSceneManager();
+ assert(smgr);
+
+ const float scaling = 0.2;
+
+ scene::IMeshSceneNode* meshnode =
+ smgr->addMeshSceneNode(params.mesh, NULL,
+ -1, v3f(0,0,0), v3f(0,0,0),
+ v3f(1.0 * scaling,1.0 * scaling,1.0 * scaling), true);
+ meshnode->setMaterialFlag(video::EMF_LIGHTING, true);
+ meshnode->setMaterialFlag(video::EMF_ANTI_ALIASING, true);
+ meshnode->setMaterialFlag(video::EMF_TRILINEAR_FILTER, m_setting_trilinear_filter);
+ meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, m_setting_bilinear_filter);
+ meshnode->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, m_setting_anisotropic_filter);
+
+ scene::ICameraSceneNode* camera = smgr->addCameraSceneNode(0,
+ params.camera_position, params.camera_lookat);
+ // second parameter of setProjectionMatrix (isOrthogonal) is ignored
+ camera->setProjectionMatrix(params.camera_projection_matrix, false);
+
+ smgr->setAmbientLight(params.ambient_light);
+ smgr->addLightSceneNode(0,
+ params.light_position,
+ params.light_color,
+ params.light_radius*scaling);
+
+ core::dimension2d<u32> screen = driver->getScreenSize();
+
+ // Render scene
+ driver->beginScene(true, true, video::SColor(0,0,0,0));
+ driver->clearZBuffer();
+ smgr->drawAll();
+
+ core::dimension2d<u32> partsize(screen.Width * scaling,screen.Height * scaling);
+
+ irr::video::IImage* rawImage =
+ driver->createImage(irr::video::ECF_A8R8G8B8, partsize);
+
+ u8* pixels = static_cast<u8*>(rawImage->lock());
+ if (!pixels)
+ {
+ rawImage->drop();
+ return NULL;
+ }
+
+ core::rect<s32> source(
+ screen.Width /2 - (screen.Width * (scaling / 2)),
+ screen.Height/2 - (screen.Height * (scaling / 2)),
+ screen.Width /2 + (screen.Width * (scaling / 2)),
+ screen.Height/2 + (screen.Height * (scaling / 2))
+ );
+
+ glReadPixels(source.UpperLeftCorner.X, source.UpperLeftCorner.Y,
+ partsize.Width, partsize.Height, GL_RGBA,
+ GL_UNSIGNED_BYTE, pixels);
+
+ driver->endScene();
+
+ // Drop scene manager
+ smgr->drop();
+
+ unsigned int pixelcount = partsize.Width*partsize.Height;
+
+ u8* runptr = pixels;
+ for (unsigned int i=0; i < pixelcount; i++) {
+
+ u8 B = *runptr;
+ u8 G = *(runptr+1);
+ u8 R = *(runptr+2);
+ u8 A = *(runptr+3);
+
+ //BGRA -> RGBA
+ *runptr = R;
+ runptr ++;
+ *runptr = G;
+ runptr ++;
+ *runptr = B;
+ runptr ++;
+ *runptr = A;
+ runptr ++;
+ }
+
+ video::IImage* inventory_image =
+ driver->createImage(irr::video::ECF_A8R8G8B8, params.dim);
+
+ rawImage->copyToScaling(inventory_image);
+ rawImage->drop();
+
+ video::ITexture *rtt = driver->addTexture(params.rtt_texture_name.c_str(), inventory_image);
+ inventory_image->drop();
+
+ if (rtt == NULL) {
+ errorstream << "TextureSource::generateTextureFromMesh(): failed to recreate texture from image: " << params.rtt_texture_name << std::endl;
+ return NULL;
+ }
+
+ driver->makeColorKeyTexture(rtt, v2s32(0,0));
+
+ if(params.delete_texture_on_shutdown)
+ m_texture_trash.push_back(rtt);
+
+ return rtt;
+ }
+#endif
+