+ /*
+ [inventorycube{topimage{leftimage{rightimage
+ In every subimage, replace ^ with &.
+ Create an "inventory cube".
+ NOTE: This should be used only on its own.
+ Example (a grass block (not actually used in game):
+ "[inventorycube{grass.png{mud.png&grass_side.png{mud.png&grass_side.png"
+ */
+ else if(part_of_name.substr(0,14) == "[inventorycube")
+ {
+ if(baseimg != NULL)
+ {
+ dstream<<"WARNING: getTextureIdDirect(): baseimg!=NULL "
+ <<"for part_of_name="<<part_of_name
+ <<", cancelling."<<std::endl;
+ return false;
+ }
+
+ str_replace_char(part_of_name, '&', '^');
+ Strfnd sf(part_of_name);
+ sf.next("{");
+ std::string imagename_top = sf.next("{");
+ std::string imagename_left = sf.next("{");
+ std::string imagename_right = sf.next("{");
+
+#if 1
+ //TODO
+
+ if(driver->queryFeature(video::EVDF_RENDER_TO_TARGET) == false)
+ {
+ dstream<<"WARNING: getTextureIdDirect(): EVDF_RENDER_TO_TARGET"
+ " not supported. Creating fallback image"<<std::endl;
+ baseimg = generate_image_from_scratch(
+ imagename_top, device);
+ return true;
+ }
+
+ u32 w0 = 64;
+ u32 h0 = 64;
+ dstream<<"INFO: inventorycube w="<<w0<<" h="<<h0<<std::endl;
+ core::dimension2d<u32> dim(w0,h0);
+
+ // Generate images for the faces of the cube
+ video::IImage *img_top = generate_image_from_scratch(
+ imagename_top, device);
+ video::IImage *img_left = generate_image_from_scratch(
+ imagename_left, device);
+ video::IImage *img_right = generate_image_from_scratch(
+ imagename_right, device);
+ assert(img_top && img_left && img_right);
+
+ // TODO: Create textures from images
+ video::ITexture *texture_top = driver->addTexture(
+ (imagename_top + "__temp__").c_str(), img_top);
+ assert(texture_top);
+
+ // Drop images
+ img_top->drop();
+ img_left->drop();
+ img_right->drop();
+
+ // Create render target texture
+ video::ITexture *rtt = NULL;
+ std::string rtt_name = part_of_name + "_RTT";
+ rtt = driver->addRenderTargetTexture(dim, rtt_name.c_str(),
+ video::ECF_A8R8G8B8);
+ assert(rtt);
+
+ // Set render target
+ driver->setRenderTarget(rtt, true, true,
+ video::SColor(0,0,0,0));
+
+ // Get a scene manager
+ scene::ISceneManager *smgr_main = device->getSceneManager();
+ assert(smgr_main);
+ scene::ISceneManager *smgr = smgr_main->createNewSceneManager();
+ assert(smgr);
+
+ /*
+ Create scene:
+ - An unit cube is centered at 0,0,0
+ - Camera looks at cube from Y+, Z- towards Y-, Z+
+ NOTE: Cube has to be changed to something else because
+ the textures cannot be set individually (or can they?)
+ */
+
+ scene::ISceneNode* cube = smgr->addCubeSceneNode(1.0, NULL, -1,
+ v3f(0,0,0), v3f(0, 45, 0));
+ // Set texture of cube
+ cube->setMaterialTexture(0, texture_top);
+ //cube->setMaterialFlag(video::EMF_LIGHTING, false);
+ cube->setMaterialFlag(video::EMF_ANTI_ALIASING, false);
+ cube->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
+
+ scene::ICameraSceneNode* camera = smgr->addCameraSceneNode(0,
+ v3f(0, 1.0, -1.5), v3f(0, 0, 0));
+ // Set orthogonal projection
+ core::CMatrix4<f32> pm;
+ pm.buildProjectionMatrixOrthoLH(1.65, 1.65, 0, 100);
+ camera->setProjectionMatrix(pm, true);
+
+ /*scene::ILightSceneNode *light =*/ smgr->addLightSceneNode(0,
+ v3f(-50, 100, 0), video::SColorf(0.5,0.5,0.5), 1000);
+
+ smgr->setAmbientLight(video::SColorf(0.2,0.2,0.2));
+
+ // Render scene
+ driver->beginScene(true, true, video::SColor(0,0,0,0));
+ smgr->drawAll();
+ driver->endScene();
+
+ // NOTE: The scene nodes should not be dropped, otherwise
+ // smgr->drop() segfaults
+ /*cube->drop();
+ camera->drop();
+ light->drop();*/
+ // Drop scene manager
+ smgr->drop();
+
+ // Unset render target
+ driver->setRenderTarget(0, true, true, 0);
+
+ //TODO: Free textures of images
+ driver->removeTexture(texture_top);
+
+ // Create image of render target
+ video::IImage *image = driver->createImage(rtt, v2s32(0,0), dim);
+
+ assert(image);
+
+ baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
+
+ if(image)
+ {
+ image->copyTo(baseimg);
+ image->drop();
+ }
+#endif
+ }