OK, so this is a first vision of animation editor for my GSoC project.
I'm new to cegui and i have tons of beginner`s problems. some are not solved so stuff is quite buggy. sorry. i give it just to show where i`m going and that I'm actually doing something;) and to establish ground for discussion.
few remarks before you run it:
1. what it does:
so far not much. lets you select a mesh, two animations(small models to the sides), and gives you result of their combination given joint weights.
2. controls:
left, right = rotation
up, down = scale models
to change the mesh + animations click buttons...
3. IMPORTANT. bugs and limitations.
as i said before they are serious.
a). i have problems with resetList() method, it crashes the system if i apply it so i do NOT clear combo boxes after changing the mesh. result is that new animations for selected models are just added after the old ones so the list is getting big and if you try to select animation name from old mesh you kill the program. bad. i know. have to wait until i discover how to clean combo box without a crash
b). i do not know how to make a window with joint names and editable weights so for now these are just hard coded to work with robot.mesh(first half is for lower body the other for upper i believe). if you use other mesh it will work but it will always take half joints from 1st and half from 2nd animation. the result normally sucks.
Conclusion from a) + b) = you can check other meshes but i`d only play with robot for now.
c). so far it only works with animations that have a mesh so i excluded all others from resources.
d). there is a mistake in my addAnimations method. i apply operation for all the joints but looks like i miss some info from original animations. works ok for most but if you apply die animation to a robot for example you will see that some main rotation/transition coping is not working well. will look soon into that.
e)when you exit it crushes:). sorry again:). i was always leaving anyway when this happened so it had low priority, did n`t investigate it yet.
4. where I'm going:
i want to have editor for building and traversing the tree(in a window where a combobox is right now) to build animation tree like in the project discription. one will be able to build a hierarchy of animations play with parameters to see results "on line" and save stuff for external usage when finished.
first steps:
- eliminate bugs(any ideas about resetList crush??).
- make joint weight editor(if anyone knows how to do window with list of editable real elements, please let me know, code examples very welcome)
- save/load weights + everything else
- edition of tree
Thanks to KungFooMasta and my mentor Tuan Kuranes for help and tips.
Code: Select all
#include "StdAfx.h"
using namespace std;
string debug;
void displayDebug()
{
OverlayElement* guiDebug = OverlayManager::getSingleton().getOverlayElement("Core/BestFps");
guiDebug->setCaption(debug);
};
//anim.cpp
void addAnimations(Entity *ent1, Entity *ent2, Entity *result)
{
int joints = ent1->getSkeleton()->getNumBones();
string *s = new string[joints];
Quaternion *r = new Quaternion[joints];
Vector3 *p = new Vector3[joints];
//float angle[108];
;
Skeleton *skel = ent1->getSkeleton();//walk
Skeleton::BoneIterator bi = skel->getBoneIterator();
for (int j = 0; j < joints/2; j++)
{
r[j] = bi.peekNext()->getOrientation();
p[j] = bi.peekNext()->getPosition();
s[j] = bi.peekNext()->getName();
bi.moveNext();
};
skel = ent2->getSkeleton();//idle
bi = skel->getBoneIterator();
for (int j = 0; j < joints/2; j++){bi.moveNext();};
for (int j = joints/2; j < joints; j++)
{
r[j] = bi.peekNext()->getOrientation();
p[j] = bi.peekNext()->getPosition();
s[j] = bi.peekNext()-> getName();
bi.moveNext();
};
skel = result->getSkeleton();
bi = skel->getBoneIterator();
for (int j = 0; j < joints; j++)
{
bi.peekNext()->setManuallyControlled(true);
bi.peekNext()->setOrientation(r[j]);
bi.peekNext()->setPosition(p[j]);
//calculate diffrence angle
//q = q.Inverse() * r[j];
//angle[j] = 2*Math::ACos(q.w).valueDegrees();*/
bi.moveNext();
};
delete[] s;
delete[] r;
delete[] p;
};
//convert.cpp
#define LOOKNFEEL "TaharezLook"
#define BRUSH "ClientBrush"
#define SELECTED_COLOR CEGUI::colour(0.0, 1, 0.0)
#define BASIC_COLOR CEGUI::colour(1.0, 1.0, 1.0)
CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
{
using namespace OIS;
switch (buttonID)
{
case OIS::MB_Left:
return CEGUI::LeftButton;
case OIS::MB_Right:
return CEGUI::RightButton;
case OIS::MB_Middle:
return CEGUI::MiddleButton;
// Not sure what to do with this one...
// case MouseEvent::BUTTON3_MASK:
// return CEGUI::X1Button;
default:
return CEGUI::LeftButton;
}
}
//listener
class GuiFrameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
private:
AnimationState *mAnimationState1, *mAnimationState2;
Entity *model1, *model2, *resultModel;
SceneNode *node1, *node2, *node3;
SceneManager* mSceneMgr;
CEGUI::OgreCEGUIRenderer* mGUIRenderer;
CEGUI::System* mGUISystem;
CEGUI::Window* mEditorGuiSheet;
bool mShutdownRequested;
public:
GuiFrameListener(RenderWindow* win, Camera* cam, SceneManager* _mSceneMgr):
ExampleFrameListener(win, cam, true, true),
mShutdownRequested(false),
mSceneMgr(_mSceneMgr),
mGUIRenderer(0),
mGUISystem(0),
mEditorGuiSheet(0)
{
mMouse->setEventCallback( this );
mKeyboard->setEventCallback( this );
setupGUI();
//create mesh points
node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Anim Node 1", Vector3(-150.0, 0.0, 0.0));
node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Result Node", Vector3(150.0, 0.0, 0.0));
node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Anim Node 2", Vector3(0.0, 0.0, 0.0));
node2->yaw(Ogre::Radian(-0.2));
node3->scale(1.3, 1.3, 1.3);
modelSelection("robot.mesh");
//animation setup
mAnimationState1 = model1->getAnimationState("Walk");
mAnimationState1 -> setEnabled(true);
mAnimationState1 -> setLoop(true);
mAnimationState2 = model2->getAnimationState("Idle");
mAnimationState2 -> setEnabled(true);
mAnimationState2 -> setLoop(true);
//animationBoxUpdate();
};
~GuiFrameListener()
{
if(mEditorGuiSheet)
{
CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);
}
if(mGUISystem)
{
delete mGUISystem;
mGUISystem = 0;
}
if(mGUIRenderer)
{
delete mGUIRenderer;
mGUIRenderer = 0;
}
}
void handleKeyboard(float time)
{
float scaleUp = 1 + time;
float scaleDown = 1 - time;
float turn = 2 * time;
if (mKeyboard->isKeyDown(OIS::KC_UP))
{
node1->scale(scaleUp, scaleUp, scaleUp) ;
node2->scale(scaleUp, scaleUp, scaleUp) ;
node3->scale(scaleUp, scaleUp, scaleUp) ;
};
if (mKeyboard->isKeyDown(OIS::KC_DOWN))
{
node1->scale(scaleDown, scaleDown, scaleDown) ;
node2->scale(scaleDown, scaleDown, scaleDown) ;
node3->scale(scaleDown, scaleDown, scaleDown) ;
};
if (mKeyboard->isKeyDown(OIS::KC_RIGHT))
{
node1->yaw(Ogre::Radian(turn));
node2->yaw(Ogre::Radian(turn));
node3->yaw(Ogre::Radian(turn));
}
if (mKeyboard->isKeyDown(OIS::KC_LEFT))
{
node1->yaw(Ogre::Radian(-turn));
node2->yaw(Ogre::Radian(-turn));
node3->yaw(Ogre::Radian(-turn));
}
}
void modelSelection(string name)
{
if (model1) mSceneMgr->destroyEntity("model1");
if (model2) mSceneMgr->destroyEntity("model2");
if (resultModel) mSceneMgr->destroyEntity("resultModel");
model1 = mSceneMgr->createEntity("model1", name);
node1->attachObject(model1);
if (model1->getAllAnimationStates())
{
mAnimationState1 = model1->getAllAnimationStates()->getAnimationStateIterator().getNext();
mAnimationState1 -> setEnabled(true);
mAnimationState1 -> setLoop(true);
} else mAnimationState1 = 0;
model2 = mSceneMgr->createEntity("model2", name);
node2->attachObject(model2);
if (model1->getAllAnimationStates())
{
mAnimationState2 = model2->getAllAnimationStates()->getAnimationStateIterator().getNext();
mAnimationState2 -> setEnabled(true);
mAnimationState2 -> setLoop(true);
} else mAnimationState2 = 0;
resultModel = mSceneMgr->createEntity("resultModel", name);
node3->attachObject(resultModel);
animationBoxUpdate();
jointBoxUpdate();
}
//CEGUI communication
bool handleMeshSelect(const CEGUI::EventArgs& e)
{
using namespace CEGUI;
const WindowEventArgs& wEventArgs = static_cast<const WindowEventArgs&>(e);
ListboxItem* item = static_cast<Combobox*>(wEventArgs.window)->getSelectedItem();
if (! item)
return false;
modelSelection(item->getText().c_str());
return true;
}
bool handleModel1Select(const CEGUI::EventArgs& e)
{
using namespace CEGUI;
const WindowEventArgs& wEventArgs = static_cast<const WindowEventArgs&>(e);
ListboxItem* item = static_cast<Combobox*>(wEventArgs.window)->getSelectedItem();
if (! item)
return false;
mAnimationState1 = model1->getAnimationState(item->getText().c_str());
mAnimationState1 -> setEnabled(true);
mAnimationState1 -> setLoop(true);
return true;
}
bool handleModel2Select(const CEGUI::EventArgs& e)
{
using namespace CEGUI;
const WindowEventArgs& wEventArgs = static_cast<const WindowEventArgs&>(e);
ListboxItem* item = static_cast<Combobox*>(wEventArgs.window)->getSelectedItem();
if (! item)
return false;
mAnimationState2 = model2->getAnimationState(item->getText().c_str());
mAnimationState2 -> setEnabled(true);
mAnimationState2 -> setLoop(true);
return true;
}
//example frame listener
bool frameStarted(const Ogre::FrameEvent &evt)
{
if (mAnimationState1) mAnimationState1->addTime( evt.timeSinceLastFrame );
if (mAnimationState2) mAnimationState2->addTime( evt.timeSinceLastFrame );
//displayDebug();
addAnimations(model1, model2, resultModel);
handleKeyboard(evt.timeSinceLastFrame);
return ExampleFrameListener::frameStarted( evt );
}
bool frameEnded(const FrameEvent& evt)
{
if (mShutdownRequested)
return false;
else
return ExampleFrameListener::frameEnded(evt);
}
//CEGUI creation and update
void setupGUI()
{
//CEGUI settings
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseMoveCursor");
mGUISystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12");
mEditorGuiSheet= CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)"DefaultWindow", (CEGUI::utf8*)"Sheet");
mGUISystem->setGUISheet(mEditorGuiSheet);
mEditorGuiSheet = CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)"Tutorial Gui.xml");
mGUISystem->setGUISheet(mEditorGuiSheet);
//CEGUI::PushButton* quitButton = (CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().getWindow((CEGUI::utf8*)"Quit");
ResourceGroupManager *rsm = ResourceGroupManager::getSingletonPtr();
CEGUI::WindowManager& wMgr = CEGUI::WindowManager::getSingleton();
StringVector groupNamesList = rsm->getResourceGroups();
{
std::vector<Ogre::String>::iterator itGroup = groupNamesList.begin();
for(; itGroup != groupNamesList.end(); ++itGroup)
{
try
{
rsm->initialiseResourceGroup (*itGroup);
}
catch(...)
{
}
}
}
// All Mesh From all corresponding Groups
CEGUI::Combobox* cMeshBox = (CEGUI::Combobox*) wMgr.getWindow("MeshViewer/MeshBox");
cMeshBox->resetList ();
std::vector<Ogre::String>::const_iterator itGroup = groupNamesList.begin();
while (itGroup != groupNamesList.end())
{
StringVectorPtr resourceNames =
ResourceGroupManager::getSingleton().findResourceNames(*itGroup,
"*.mesh" );
std::vector<Ogre::String>::const_iterator itResourceName = resourceNames->begin();
while ( itResourceName != resourceNames->end() )
{
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem(*itResourceName);
item->setSelectionBrushImage(LOOKNFEEL, BRUSH);
item->setSelectionColours(SELECTED_COLOR);
item->setTextColours (BASIC_COLOR);
cMeshBox->addItem(item);
++itResourceName;
}
++itGroup;
}
//register listiner functions
CEGUI::WindowManager::getSingletonPtr()->getWindow("MeshViewer/MeshBox")->subscribeEvent(
CEGUI::Combobox::EventListSelectionAccepted,
CEGUI::Event::Subscriber(&GuiFrameListener::handleMeshSelect, this));
CEGUI::WindowManager::getSingletonPtr()->getWindow("MeshViewer/Animation1")->subscribeEvent(
CEGUI::Combobox::EventListSelectionAccepted,
CEGUI::Event::Subscriber(&GuiFrameListener::handleModel1Select, this));
CEGUI::WindowManager::getSingletonPtr()->getWindow("MeshViewer/Animation2")->subscribeEvent(
CEGUI::Combobox::EventListSelectionAccepted,
CEGUI::Event::Subscriber(&GuiFrameListener::handleModel2Select, this));
}
void animationBoxUpdate()
{
CEGUI::Combobox* combo1 = (CEGUI::Combobox*) CEGUI::WindowManager::getSingleton().getWindow("MeshViewer/Animation1");
CEGUI::Combobox* combo2 = (CEGUI::Combobox*) CEGUI::WindowManager::getSingleton().getWindow("MeshViewer/Animation2");
//combo1->resetList();
//combo2->resetList();
AnimationStateSet* mAnimStateSet = model1->getAllAnimationStates();
int mNumAnimation = 0;
if (mAnimStateSet)
{
AnimationStateIterator itr = mAnimStateSet->getAnimationStateIterator();
while (itr.hasMoreElements ())
{
AnimationState* aState = itr.getNext ();
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem(aState->getAnimationName());
item->setSelectionBrushImage(LOOKNFEEL, BRUSH);
item->setSelectionColours(SELECTED_COLOR);
item->setTextColours (BASIC_COLOR);
combo1->addItem(item);
combo2->addItem(item);
mNumAnimation++;
}
}
};
void jointBoxUpdate()
{
CEGUI::Combobox* combo = (CEGUI::Combobox*) CEGUI::WindowManager::getSingleton().getWindow("MeshViewer/Joints");
Skeleton *skel = model1->getSkeleton();
Skeleton::BoneIterator bi = skel->getBoneIterator();
int joints = skel->getNumBones();
string i;
for (int j = 0; j < joints/2; j++)
{
i = bi.peekNext()->getName() + " weights: ............. 1.0 : 0.0";
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem(i);
item->setSelectionBrushImage(LOOKNFEEL, BRUSH);
item->setSelectionColours(SELECTED_COLOR);
item->setTextColours (BASIC_COLOR);
combo->addItem(item);
bi.moveNext();
};
for (int j = joints/2; j < joints; j++)
{
i = bi.peekNext()->getName() + " weights: ............. 0.0 : 1.0";
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem(i);
item->setSelectionBrushImage(LOOKNFEEL, BRUSH);
item->setSelectionColours(SELECTED_COLOR);
item->setTextColours (BASIC_COLOR);
combo->addItem(item);
bi.moveNext();
};
}
//mouse listener
bool mouseMoved( const OIS::MouseEvent &e )
{
using namespace OIS;
CEGUI::System::getSingleton().injectMouseMove(
e.state.X.rel,e.state.Y.rel);
return true;
}
bool mousePressed (const OIS::MouseEvent &e, OIS::MouseButtonID id)
{
CEGUI::System::getSingleton().injectMouseButtonDown(
convertOgreButtonToCegui(id));
return true;
}
bool mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id )
{
CEGUI::System::getSingleton().injectMouseButtonUp(
convertOgreButtonToCegui(id));
return true;
}
//key listener
bool keyPressed( const OIS::KeyEvent &e )
{
if(e.key == OIS::KC_ESCAPE)
{
mShutdownRequested = true;
return true;
}
CEGUI::System::getSingleton().injectKeyDown(e.key);
CEGUI::System::getSingleton().injectChar(e.text);
return true;
}
bool keyReleased( const OIS::KeyEvent &e )
{
CEGUI::System::getSingleton().injectKeyUp(e.key);
return true;
}
};
//Application
class RoboApplication : public ExampleApplication
{
public:
RoboApplication()
{
}
~RoboApplication()
{
};
void createCamera(void)
{
// create camera, but leave at default position
mCamera = mSceneMgr->createCamera("PlayerCam");
mCamera->setNearClipDistance(5);
mCamera->lookAt(Vector3(0,-50,-300));
SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "CamNode", Vector3( 0, 0, 500 ) );
node = node->createChildSceneNode( "PitchNode" );// Create the pitch node
node->attachObject( mCamera );
}
void createScene(void)
{
// create the light
Light *light = mSceneMgr->createLight( "Light" );
light->setType( Light::LT_POINT );
light->setPosition( Vector3(250, 150, 250) );
light->setDiffuseColour( ColourValue::White );
light->setSpecularColour( ColourValue::White );
mSceneMgr->setAmbientLight( ColourValue( 0.25, 0.25, 0.25 ) );
// setupGUI();
}
void createFrameListener(void)
{
// Create the FrameListener
mFrameListener = new GuiFrameListener(mWindow, mCamera, mSceneMgr);
mRoot->addFrameListener(mFrameListener);
// Do not show the frame stats overlay
mFrameListener->showDebugOverlay(false);
}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
RoboApplication app;
try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBoxA( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
}
return 0;
}
in your "StdAfx.h":
Code: Select all
#include "ExampleApplication.h"
#include <deque>
#include <map>
#include <vector>
#include <OgreNoMemoryMacros.h>
#include <CEGUI/CEGUIImageset.h>
#include <CEGUI/CEGUISystem.h>
#include <CEGUI/CEGUILogger.h>
#include <CEGUI/CEGUISchemeManager.h>
#include <CEGUI/CEGUIWindowManager.h>
#include <CEGUI/CEGUIWindow.h>
#include "OgreCEGUIRenderer.h"
#include "OgreCEGUIResourceProvider.h"
//regular mem handler
#include <OgreMemoryMacros.h>
#include <CEGUI/elements/CEGUIPushButton.h>
#include <CEGUI/elements/CEGUIListboxTextItem.h>
#include <CEGUI/elements/CEGUIListbox.h>
#include <CEGUI/elements/CEGUICombobox.h>
place "Tutorial Gui.xml" like below in media\gui:
Code: Select all
<?xml version="1.0" ?>
<GUILayout>
<Window Type="DefaultWindow" Name="Tutorial Gui">
<Window Type="TaharezLook/Combobox" Name="MeshViewer/MeshBox" >
<Property Name="ActiveEditSelectionColour" Value="FF607FFF" />
<Property Name="InactiveEditSelectionColour" Value="FFFFFFFF" />
<Property Name="MaxEditTextLength" Value="1073741823" />
<Property Name="NormalEditTextColour" Value="AAAAAAFF" />
<Property Name="ReadOnly" Value="True" />
<Property Name="SelectedEditTextColour" Value="FFFFFFFF" />
<Property Name="Text" Value="Select Mesh" />
<Property Name="UnifiedAreaRect" Value="{{0.00,0.0},{0.0,0.005},{0.14,0.0},{0.82,0.0}}" />
<Property Name="UnifiedMaxSize" Value="{{1.000000,0.000000},{1.000000,0.000000}}" />
</Window>
<Window Type="TaharezLook/Combobox" Name="MeshViewer/Animation1" >
<Property Name="ActiveEditSelectionColour" Value="FF607FFF" />
<Property Name="InactiveEditSelectionColour" Value="FFFFFFFF" />
<Property Name="MaxEditTextLength" Value="1073741823" />
<Property Name="NormalEditTextColour" Value="AAAAAAFF" />
<Property Name="ReadOnly" Value="True" />
<Property Name="SelectedEditTextColour" Value="FFFFFFFF" />
<Property Name="Text" Value="Select 1st Animation" />
<Property Name="UnifiedAreaRect" Value="{{0.26,0.0},{0.0,0.005},{0.45,0.0},{0.35,0.0}}" />
<Property Name="UnifiedMaxSize" Value="{{1.000000,0.000000},{1.000000,0.000000}}" />
</Window>
<Window Type="TaharezLook/Combobox" Name="MeshViewer/Animation2" >
<Property Name="ActiveEditSelectionColour" Value="FF607FFF" />
<Property Name="InactiveEditSelectionColour" Value="FFFFFFFF" />
<Property Name="MaxEditTextLength" Value="1073741823" />
<Property Name="NormalEditTextColour" Value="AAAAAAFF" />
<Property Name="ReadOnly" Value="True" />
<Property Name="SelectedEditTextColour" Value="FFFFFFFF" />
<Property Name="Text" Value="Select 2nd Animation" />
<Property Name="UnifiedAreaRect" Value="{{0.56,0.0},{0.0,0.005},{0.75,0.0},{0.35,0.0}}" />
<Property Name="UnifiedMaxSize" Value="{{1.000000,0.000000},{1.000000,0.000000}}" />
</Window>
<Window Type="TaharezLook/Combobox" Name="MeshViewer/Joints" >
<Property Name="ActiveEditSelectionColour" Value="FF607FFF" />
<Property Name="InactiveEditSelectionColour" Value="FFFFFFFF" />
<Property Name="MaxEditTextLength" Value="1073741823" />
<Property Name="NormalEditTextColour" Value="AAAAAAFF" />
<Property Name="ReadOnly" Value="True" />
<Property Name="SelectedEditTextColour" Value="FFFFFFFF" />
<Property Name="Text" Value="Joint Weights... (Anim1 : Anim2)" />
<Property Name="UnifiedAreaRect" Value="{{0.15,0.0},{0.4,0.005},{0.45,0.0},{0.95,0.0}}" />
<Property Name="UnifiedMaxSize" Value="{{1.000000,0.000000},{1.000000,0.000000}}" />
</Window>
<Window Type="TaharezLook/Combobox" Name="MeshViewer/AminTree" >
<Property Name="ActiveEditSelectionColour" Value="FF607FFF" />
<Property Name="InactiveEditSelectionColour" Value="FFFFFFFF" />
<Property Name="MaxEditTextLength" Value="1073741823" />
<Property Name="NormalEditTextColour" Value="AAAAAAFF" />
<Property Name="ReadOnly" Value="True" />
<Property Name="SelectedEditTextColour" Value="FFFFFFFF" />
<Property Name="Text" Value="Animation tree here..." />
<Property Name="UnifiedAreaRect" Value="{{0.5,0.0},{0.4,0.005},{0.9,0.0},{0.95,0.0}}" />
<Property Name="UnifiedMaxSize" Value="{{1.000000,0.000000},{1.000000,0.000000}}" />
</Window>
</Window>
</GUILayout>
in your your resource cfg comment out last lines:
Code: Select all
#Zip=../../media/packs/cubemap.zip
#Zip=../../media/packs/cubemapsJS.zip
#Zip=../../media/packs/dragon.zip
#Zip=../../media/packs/fresneldemo.zip
#Zip=../../media/packs/ogretestmap.zip
#Zip=../../media/packs/skybox.zip
and remove all mesh files that do NOT have a skeleton file matching in media/models(like you have robot.mesh and robot.skeleton)
this is to avoid loading meshes without skeletons if you choose to load such a mesh in a program it will crash. will solve it soon.
Please let me know if you have problems with running it. Most of the time after the exams was spend on learning CEGUI and making it work. Let me know how if you have any info on my lame bugs and if you like the plan of making this a first step of hierarhical animation editor.