Page 1 of 1

How to create a new imageset?

Posted: Sat Aug 02, 2008 18:11
by majc
I want to create a new imageset to load my crosshair instead of loading it in TaharezLook imageset.
Until now i did this:

Crosshair.imageset

Code: Select all

<?xml version="1.0" ?>

<Imageset Name="Crosshair" Imagefile="crossHair2.png" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true">
   <Image Name="crossHair2" XPos="0" YPos="0" Width="33" Height="33" />
</Imageset>


and i got this error:

CEGUI.log

Code: Select all

02/08/2008 18:58:42 (Error)   CEGUI::UnknownObjectException in file \Projects\CEGUI\cegui_mk2-v0-6-2003\src\CEGUIImagesetManager.cpp(183) : ImagesetManager::getImageset - No Imageset named 'Crosshair' is present in the system.


This error tells me that i have to target this new imageset file somehere else but where?
Do i have to create other file?

I tryed this:

Code: Select all

#include "cGUIInterface.h"

cGUIInterface::cGUIInterface(cGraphicalInterface *graphicalInterface)
{
   // setup GUI system
   mGraphInterface = graphicalInterface;
   mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mGraphInterface->getWindow() , Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mGraphInterface->getSceneManager());
   mGUISystem = new CEGUI::System(mGUIRenderer);
   mWindowManager = &CEGUI::WindowManager::getSingleton();
   CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
   CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
    (CEGUI::System::getSingleton().getResourceProvider());
   rp->setResourceGroupDirectory("imagesets", "./ogrenew/DarkFuture/Media/gui/Imagesets");
   Imageset* wlis = ImagesetManager::getSingleton().createImageset(
   "Crosshair.imageset", "imagesets");
}

void cGUIInterface::loadScheme()
{
   CEGUI::SchemeManager::getSingleton().loadScheme("TaharezLookSkin.scheme");
}
void cGUIInterface::setImage()
{
   MouseCursor::getSingleton().setImage("Crosshair", "crossHair2");
}

void cGUIInterface::setPosition()
{
   MouseCursor::getSingleton().setPosition(CEGUI::Point(385,285));
}

void cGUIInterface::createCrosshair()
{
   //loadScheme();
   setImage();
   setPosition();
}

cGUIInterface::~cGUIInterface()
{
}


and gave me a memory error in this line:

r

Code: Select all

p->setResourceGroupDirectory("imagesets", "./ogrenew/DarkFuture/Media/gui/Imagesets");


I think im not writing the correct path, i have the foler here:

Code: Select all

C:\ogrenew\DarkFuture\Media\gui\Imagesets


Can i use this kind of code with ogre or do i have to use ogre specific code like i see in a post that used ogre resource manager ( http://www.cegui.org.uk/phpBB2/viewtopic.php?t=3440 ) ?
Im asking this because i can get more information use only CEGUI code than use OGRE/CEGUI code


Thanks in advance!

Posted: Sun Aug 03, 2008 11:48
by daves
I create imagesets dynamically in a couple of ways (the first of these is the one that seems to be pertinent to you - the key is to create a scheme file and then load this scheme file).

Scenario 1:
The first way is to define a scheme file and to load it as follows:

Code: Select all

void Troupe::loadTargetIconScheme(const std::string& schemeName)
   {
      std::string schemeFileName(schemeName+".scheme");
      try
      {
         if( !CEGUI::SchemeManager::getSingleton().isSchemePresent(schemeFileName) )
         {
            CEGUI::Scheme* scheme = CEGUI::SchemeManager::getSingleton().loadScheme(schemeFileName);
            assert(scheme && "Troupe::loadTargetIconScheme: Failed to load scheme");

         }
      }
      catch(CEGUI::AlreadyExistsException aece)
      {
         // This is already loaded, no need to do it again.
      }
   }


The scheme file, in this case, might look like:

    <?xml version="1.0"?>
    <GUIScheme Name="TargetIcons">
    <Imageset Name="TargetIcons" Filename="TargetIcons.imageset"/>
    <LookNFeel Filename="TargetIcons.looknfeel"/>
    <WindowSet Filename="CEGUIFalagardWRBase"/>
    <FalagardMapping WindowType="TargetIcons/AircraftButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="AircraftIconButton"/>
    <FalagardMapping WindowType="TargetIcons/DirectionalButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="DirectionalIconButton"/>
    <FalagardMapping WindowType="TargetIcons/DirectionlessButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="DirectionlessIconButton"/>
    </GUIScheme>




loadScheme should do the work for you assuming that all the resources that relate to the imageset can be found.

Scenario 2:

In general you dont need to create imagsets in this fashion. The alternative simply relies on access to one or more images. In this case what I do is something along the lines of the following:

Code: Select all

void DisplayedImage::load(const std::string& imageName, const std::string& imageLabel, const std::string& imageFileName, const std::string& imageGroup)
   {
      assert(mImgWindow && "DisplayedImage::load: null image window");
      mImgsetName = imageName;
      mImgName = imageName;

      try
      {
         /*
         ** 1] Load an image from file
         ** 2] Create a texture from this loaded image
         ** 3] Create an imageset based on this texture
         ** 4] Define the image to be the entire imageset
         */
         Ogre::Image image;
         image.load(imageFileName, imageGroup);
         float w = image.getWidth();
         float h = image.getHeight();
         if(w <= 0 || h <= 0)
         {
            std::stringstream sserr;
            sserr << "Invalid image dimensions " << imageFileName;
            SVTConsole::getSingleton().printError(sserr.str());
         }
         mWidth = w;
         mHeight = h;

         mOgreTexture = Ogre::TextureManager::getSingleton().loadImage(imageName+".Texture", imageGroup, image);
         assert(!mOgreTexture.isNull() && "DisplayedImage::load: failed to load image");
         mCeguiTexture = GUIManager::getSingleton().getRenderer()->createTexture(mOgreTexture);
         assert(mCeguiTexture && "Template1Menu::load: failed to create cegui texture");
         mCeguiImageSet = CEGUI::ImagesetManager::getSingleton().createImageset(mImgsetName, mCeguiTexture);
         assert(mCeguiImageSet && "Template1Menu::load: failed to create imageset");
         mCeguiImageSet->defineImage(mImgName, CEGUI::Point(0.0f, 0.0f),   
                                 CEGUI::Size(mWidth, mHeight), CEGUI::Point(0.0f,0.0f));
      
         
      }
      catch (CEGUI::Exception ce)
      {
         SVTConsole::getSingleton().printError(ce);
      }
      catch (Ogre::Exception oe)
      {
         SVTConsole::getSingleton().printError(oe);
      }
   }


Notice with this approach that I load the image into a texture, and then create the imageset from the texture.

In summary:
The first scenario seems to make more sense for you. You have your image files pre-defined, and should define a scheme file that references your imageset. Then you should load the scheme file

Posted: Sun Aug 03, 2008 11:57
by majc
you are right, the first scenario makes more sense for me but i have one problem, can i define a scheme file without:

Code: Select all

 <FalagardMapping WindowType="TargetIcons/AircraftButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="AircraftIconButton"/>
<FalagardMapping WindowType="TargetIcons/DirectionalButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="DirectionalIconButton"/>
<FalagardMapping WindowType="TargetIcons/DirectionlessButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="DirectionlessIconButton"/>


?

because i only want to display an image without any kind of buttons.
Thanks for your reply :)

Posted: Sun Aug 03, 2008 11:59
by daves
Yes you can. You dont need the looknfeel line. This was just a quick example I grabbed.

Posted: Sun Aug 03, 2008 12:00
by daves
Keep in mind if you are already using an application scheme (e.g. windowslook) it already references an imageset. Just add the imageset declaration to that file and this will also work.

Posted: Sun Aug 03, 2008 12:01
by daves
Example:

Code: Select all

<?xml version="1.0" ?>
<GUIScheme Name="SVTLookSkin">
   <Imageset Name="SVTLook" Filename="SVTLook.imageset" />
  <Imageset Name="SVTSplashScreenLook" Filename="SVTSplashScreenLook.imageset" />
  <Imageset Name="SVTColorChooserLook" Filename="SVTColorChooserLook.imageset" />
  <Imageset Name="SensisLogos" Filename="SensisLogos.imageset" />
  <Imageset Name="SVTSymbols" Filename="SVTSymbols.imageset" />
  <Font Name="Tahoma-12" Filename="tahoma-12.font" />
  <Font Name="Tahoma-10" Filename="tahoma-10.font" />
  <Font Name="Tahoma-8" Filename="tahoma-8.font" />
   <LookNFeel Filename="SVTLook.looknfeel" />
   <WindowSet Filename="CEGUIFalagardWRBase" />

 ...
 
</GUIScheme>



See multiple imagesets referenced in one scheme.

Posted: Mon Aug 04, 2008 01:22
by majc
Thanks alot for your help :)