help with design[SOLVED]

For help with general CEGUI usage:
- Questions about the usage of CEGUI and its features, if not explained in the documentation.
- Problems with the CMAKE configuration or problems occuring during the build process/compilation.
- Errors or unexpected behaviour.

Moderators: CEGUI MVP, CEGUI Team

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

help with design[SOLVED]

Postby maori » Tue Apr 21, 2009 10:35

Hi Guys

i want to set up a joystick callibration inside my cegui application using dx9
but to be honest i'am not sure where to get started ie what widget / s to use etc ,etc

could someone point me in the ridght direction please


TIA
Last edited by maori on Tue Sep 27, 2011 16:47, edited 1 time in total.
trying to upgrade to 0.8.2 from 0.7.9 :D

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: help with design

Postby CrazyEddie » Tue Apr 21, 2009 18:15

Hi,

It largely depends on how you want it to look - you could do a calibration sequence using just plain text, or something with lots of UI. If you give some info (pictars, pls!) about the kind of general look you're after, it will be easier to make suggestions ;)

CE.

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Tue Apr 21, 2009 18:34

heya CE

what i have in mind is something simmiler to

http://img257.imageshack.us/my.php?image=97949185.jpg

and if you move the throttle or rudder
http://img26.imageshack.us/my.php?image=46036346.jpg

TIA
trying to upgrade to 0.8.2 from 0.7.9 :D

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: help with design

Postby CrazyEddie » Tue Apr 21, 2009 21:14

Ok, just a quickie as far as the UI aspects go - I want to go to bed!

For the throttle, a progress bar would do the job fine, and for the twist, two progress bars, side by side - the right one with regular operation, and the left one with reversed operation.

For the stick orientation indicator, I would suggest a StaticImage (no frame) that holds an image of a white background with the cross in the middle, this would be added as a child of some container window (maybe another StaticImage though this time with the frame). The window alignment on the 'embedded' static image should be centred in both axes, then use absolute offsets to move the child according to the stick positioning.

HTH

CE.

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Wed Apr 22, 2009 09:24

hiya CE

thanks for the tip will try to get this going :D
trying to upgrade to 0.8.2 from 0.7.9 :D

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Wed Jul 15, 2009 11:41

Heya

Me Agian :oops:

okidoki is there a way i can use a float value for the uvector2 ?


i have a "StaticImage (no frame) that holds an image of a white background with the cross in the middle"
but the code uses floats for the value of movement and am unable to change this :cry:


cheers
trying to upgrade to 0.8.2 from 0.7.9 :D

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: help with design

Postby CrazyEddie » Thu Jul 16, 2009 09:04

Hi,

To answer the easy bit first, using a float for a UVector2 value:

Code: Select all

// The UVector is built out of two UDim objects, each UDim object takes two
// float values; the first is a scale value, the second is an absolute pixel offset.
// either component can be set to zero if you just want one type of metric or
// the other.

// if you have a pixel float value, of say 100.0f...
float val = 100.0f;

// you can use this as input to a UVector2 like this...
UVector2 uvec2( UDim( 0.0f, val ), UDim( 0.0f, 0.0f ) );

// which sets the 'x' part of the vector to 100 and the 'y' part to zero.


I'm not quite sure how you have things arranged, what you're doing, or how you're doing it (so, off to a good start then! :mrgreen:).

The main uncertainty is as regards to what the float represents? Is it the deflection of the stick? So, perhaps it has a range of -1.0f to 1.0f? Or perhaps it has a different range, or even does not represent the deflection, hehe.

Basically, your cross is centred when the stick is centred - the first bit of info to consider is the position of the image when it is centred, meaning is it zero or some other value (such as half the width of the container). If this is not how you have things set up (which you may not, since it's probably not the 'best' way to do it), you'll have to adjust what follows.

Basically if your float is the deflection value, you can use it to scale some other value to calculate the position of the image. The example here is using absolute pixels and standard alignments, though there are numerous other ways to do this.

Say your container window for the cross is 200 pixels square. When the cross image is at position 0 it is centred. This means that to get a full left position, the image has to be moved left by 100 pixels (half the width of the container), and to get a full right deflection, the image has to be moved right by 100 pixels. If the float value represents the deflection of the stick in the -1 to +1 range, to calculate the final pixel position, just multiply the deflection value by the amount of pixel deflection needed - in this example 100. This means that if your stick deflection float is at -1.0 (for full left), you multiply this by 100 and get -100.0 back out which is the value to use for the image position. If the stick was half-way right, at +0.5f then multiplying this by 100 gives 50.0f which would put the cross at the desired position. And obviously the same for the vertical axis.

Now what do you do if your deflection value is not in the range -1.0 to +1.0? Well, the best way to proceed is to normalise it to that range. If your values are instead -500.0f to +500.0 then divide the value by 500.0f. If the range is something like 0.0f to 1000.0f then subtract half and then divide - so if you had a value of 0 (representing full left), you subtract half of the full range of 1000, which is 500 which gives -500, then divide by 500 which gives you -1.0f.

Hope this is helpful and that I put it in a way that's not more confusing :P If it is confusing, please let us know what the float you have represents, it's range (if appropriate), and how you're positioning the cross (basically, where the cross is at position (0,0) and the size of the container holding the image).

CE.

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Thu Jul 16, 2009 13:55

Thanks CE

That helped loads :pint:

just one quick Q
is there a way i can call my inject time pulse from within this window ?

from my render i have

Code: Select all

clock_t time_now = clock();
float elapsed = static_cast<float>( time_now - mLastTimeInjection ) / CLOCKS_PER_SEC;
mLastTimeInjection = time_now;
// inject time pulse into CEGUI
CEGUI::System::getSingleton().injectTimePulse( elapsed );


and declared at top like so

Code: Select all

clock_t mLastTimeInjection = clock();
clock_t time_now = clock();
bool injectTimePulse( float timeElapsed );


so i tried in the window where my stick inputs are

Code: Select all

clock_t time_now = clock();


to refresh the inputs but got a not declared error when compiling

what i'am trying to say is i need to call my

Code: Select all

void Refresh()
{
//Code to get the input values
}
function every 60 mseconds or so only when the joystick window is open

tia
trying to upgrade to 0.8.2 from 0.7.9 :D

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: help with design

Postby CrazyEddie » Fri Jul 17, 2009 08:42

I think what you want to do is subscribe to the window's EventWindowUpdated (which is passed a CEGUI::UpdateEventArgs as the args). In the handler you need to keep track of the elapsed time, and every 60ms do whatever you need. So your handler might look like this:

Code: Select all

bool MyClass::updateHandler(const CEGUI::EventArgs& args)
{
    // get the time elapsed since last frame from the event args
    float elapsed = static_cast<const CEGUI::UpdateEventArgs&>(args).d_timeSinceLastFrame;
    // add that elapsed time to the count that we weep in instances of MyClass (where d_totalElapsed is defined)
    d_totalElapsed += elapsed;

    // see if we need to do 'stuff'
    if (d_totalElapsed >= 0.06f)
    {
        // TODO: Poll the joystick or what have you here.

        // reset total elapsed
        d_totalElapsed = 0.0f;
    }

    return true;
}


CE

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Fri Jul 17, 2009 12:05

HIya CE

Thanks for your help sir

just one more though and i know i miss something easy but cant work out what :oops:

one my mainUI screen i have a button that opens up a new window this one has its own joy.cpp and .h file
and has load function

Code: Select all

bool  joy::LoadSetupWindow(const CEGUI::EventArgs& e)
{

   try
        {
         using namespace CEGUI;
      // load the layout
WindowManager& winMgr = WindowManager::getSingleton();
if (!winMgr.isWindowPresent("joywindow"))

  Window* JoySetup = winMgr.loadWindowLayout("joysetup.layout");

RefreshJoystick(e);// this calls the function for refreshing joy inputs

if (winMgr.isWindowPresent("background_wnd"))
  {
    Window* background = (winMgr.getWindow("background_wnd"));
    background->addChildWindow("joywindow");

}// catch any errors     
        catch (CEGUI::Exception)
        {
                MessageBox(NULL, "joywindow !", "Warning !",
            MB_ICONEXCLAMATION | MB_OK);
        return true;
        }

      
return true;
}
   
  }



then for test i have following

Code: Select all

bool Refresh(const CEGUI::EventArgs& e)
{
   using namespace CEGUI;
WindowManager& winMgr = WindowManager::getSingleton();

 // get the time elapsed since last frame from the event args
    float elapsed = static_cast<const CEGUI::UpdateEventArgs&>(e).d_timeSinceLastFrame;
    // add that elapsed time to the count that we weep in instances of MyClass (where d_totalElapsed is defined)
    d_totalElapsed += elapsed;

    // see if we need to do 'stuff'
    if (d_totalElapsed >= 0.08f)
    {
        // TODO: Poll the joystick or what have you here.
MessageBox(NULL, "Timer Test", "Timer Function!",
            MB_ICONEXCLAMATION | MB_OK);
        // reset total elapsed
        d_totalElapsed = 0.0f;
    }

return true;
            }



and i have bool d_totalElapsed; declared
this only works one time ie when i hit the joy button on mainUI kinda makes sense as RefreshJoystick(e); is only called on that so how can i make it be called continusly so that time function works as it should
hope i have'nt confussed you

TIA
trying to upgrade to 0.8.2 from 0.7.9 :D

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: help with design

Postby CrazyEddie » Fri Jul 17, 2009 12:31

Ummm... :mrgreen:

Three things:

I think you're missing subscribing to the event, in the joy::LoadSetupWindow function, after you load the layout, you need something like:

Code: Select all

JoySetup->subscribeEvent( Window::EventWindowUpdated, &RefreshJoystick);


I wouldn't call the RefreshJoystick function directly in the LoadSetupWindow handler, since the event args are incompatible types (kind of demonstrates why static_cast is unsafe, I guess!), once the event subscription above is made it should get invoked properly anyway.

and i have bool d_totalElapsed; declared

Not sure if it's a typo or not, but d_totalElapsed should be a float not a bool. Also, is that a global or a static or something? Since it's value needs to persist between calls to RefreshJoystick (which appears to be a stand alone function).

CE.

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Fri Jul 17, 2009 18:56

Thanks CE :pint:
trying to upgrade to 0.8.2 from 0.7.9 :D

maori
Just can't stay away
Just can't stay away
Posts: 161
Joined: Tue Sep 23, 2008 13:05
Location: Plumstead , UK

Re: help with design

Postby maori » Tue Sep 27, 2011 12:25

:oops:

Hi guys

ok as you can i did get this to work but now i upgraded to 0.7.5 it stopped working :(

all i have done is changed the ->refresh() to the new ->invalidate() ways

the refresh does get called when i first open the window but when i open anew tab in that window it stops and never gets recalled i have tried adding the call

Code: Select all

JoySetup->subscribeEvent( Window::EventWindowUpdated, &RefreshJoystick);

to the open tab function in the usally places it goes though but never goes to the function ?
been trying various things for the few days and i'am at a loss to what could be wrong

there is no errors in the log

NM was being blonde again :hammer: fixed
trying to upgrade to 0.8.2 from 0.7.9 :D


Return to “Help”

Who is online

Users browsing this forum: No registered users and 11 guests